· 5 years ago · Apr 10, 2020, 07:52 AM
1--Sets all the requires and such idk what these are actually called
2local event = require("event")
3local os = require("os")
4local serialization = require("serialization")
5local component = require("component")
6local modem = component.modem
7local running = true
8local dbUser = "root"
9local dbPass = "password"
10local currentGateType = ""
11local db = require("db")
12local sg = component.stargate
13local split = require("split")
14
15local function unknownEvent()
16 -- do nothing
17end
18
19--Sets up tables to be filled
20local ports = {}
21local databases = {}
22local eventIDs = {}
23local gateTypes = {}
24local glyphConversion = {}
25local errors = {}
26local eventHandlers =
27 setmetatable(
28 {},
29 {
30 __index = function()
31 return unknownEvent
32 end
33 }
34)
35
36--Sets up all network related things
37local function mainSetup()
38 --The main ports the dialing server uses
39 ports.dial = 69
40 ports.gateSignals = 70
41 ports.DB = 126
42
43 --The name of the address database
44 databases.storedAddressesName = "sgAddresses"
45
46 --Creates the table where the database is stored
47 databases.storedAddresses = {}
48
49 --Creates all the gate types
50 gateTypes.MILKYWAY = "MW"
51 gateTypes.PEGASUS = "PG"
52 gateTypes.UNIVERSE = "UN"
53
54 --Creates the tables where the glyph conversions are stored for each type
55 glyphConversion.MW = {}
56 glyphConversion.PG = {}
57 glyphConversion.UN = {}
58
59 --Same glyph conversion as the one devised by FlamePoint#8908
60 glyphConversion.MW["q"] = "Point of Origin"
61 glyphConversion.MW["w"] = "Crater"
62 glyphConversion.MW["e"] = "Virgo"
63 glyphConversion.MW["r"] = "Bootes"
64 glyphConversion.MW["t"] = "Centaurus"
65 glyphConversion.MW["y"] = "Libra"
66 glyphConversion.MW["u"] = "Serpens Caput"
67 glyphConversion.MW["i"] = "Norma"
68 glyphConversion.MW["o"] = "Scorpius"
69 glyphConversion.MW["p"] = "Corona Australis"
70 glyphConversion.MW["["] = "Scutum"
71 glyphConversion.MW["]"] = "Sagittarius"
72 glyphConversion.MW["\\"] = "Aquila"
73 glyphConversion.MW["a"] = "Microscopium"
74 glyphConversion.MW["s"] = "Capricornus"
75 glyphConversion.MW["d"] = "Piscis Austrinus"
76 glyphConversion.MW["f"] = "Equuleus"
77 glyphConversion.MW["g"] = "Aquarius"
78 glyphConversion.MW["h"] = "Pegasus"
79 glyphConversion.MW["j"] = "Sculptor"
80 glyphConversion.MW["k"] = "Pisces"
81 glyphConversion.MW["l"] = "Andromeda"
82 glyphConversion.MW[";"] = "Triangulum"
83 glyphConversion.MW["'"] = "Aries"
84 glyphConversion.MW["z"] = "Perseus"
85 glyphConversion.MW["x"] = "Cetus"
86 glyphConversion.MW["c"] = "Taurus"
87 glyphConversion.MW["v"] = "Auriga"
88 glyphConversion.MW["b"] = "Eridanus"
89 glyphConversion.MW["n"] = "Orion"
90 glyphConversion.MW["m"] = "Canis Minor"
91 glyphConversion.MW[","] = "Monoceros"
92 glyphConversion.MW["."] = "Gemini"
93 glyphConversion.MW["/"] = "Hydra"
94 glyphConversion.MW["1"] = "Lynx"
95 glyphConversion.MW["2"] = "Cancer"
96 glyphConversion.MW["3"] = "Sextans"
97 glyphConversion.MW["4"] = "Leo Minor"
98 glyphConversion.MW["5"] = "Leo"
99
100 --New pegasus glyph conversion devised by me
101 glyphConversion.PG["q"] = "Subido"
102 glyphConversion.PG["w"] = "Aaxel"
103 glyphConversion.PG["e"] = "Abrin"
104 glyphConversion.PG["r"] = "Acjesis"
105 glyphConversion.PG["t"] = "Aldeni"
106 glyphConversion.PG["y"] = "Alura"
107 glyphConversion.PG["u"] = "Amiwill"
108 glyphConversion.PG["i"] = "Arami"
109 glyphConversion.PG["o"] = "Avoniv"
110 glyphConversion.PG["p"] = "Baselai"
111 glyphConversion.PG["["] = "Bydo"
112 glyphConversion.PG["]"] = "Ca Po"
113 glyphConversion.PG["\\"] = "Danami"
114 glyphConversion.PG["a"] = "Dawnre"
115 glyphConversion.PG["s"] = "Ecrumig"
116 glyphConversion.PG["d"] = "Elenami"
117 glyphConversion.PG["f"] = "Gilltin"
118 glyphConversion.PG["g"] = "Hacemill"
119 glyphConversion.PG["h"] = "Hamlinto"
120 glyphConversion.PG["j"] = "Illume"
121 glyphConversion.PG["k"] = "Laylox"
122 glyphConversion.PG["l"] = "Lenchan"
123 glyphConversion.PG[";"] = "Olavii"
124 glyphConversion.PG["'"] = "Once el"
125 glyphConversion.PG["z"] = "Poco re"
126 glyphConversion.PG["x"] = "Ramnon"
127 glyphConversion.PG["c"] = "Recktic"
128 glyphConversion.PG["v"] = "Robandus"
129 glyphConversion.PG["b"] = "Roehi"
130 glyphConversion.PG["n"] = "Salma"
131 glyphConversion.PG["m"] = "Sandovi"
132 glyphConversion.PG[","] = "Setas"
133 glyphConversion.PG["."] = "Sibbron"
134 glyphConversion.PG["/"] = "Tahnan"
135 glyphConversion.PG["1"] = "Zamilloz"
136 glyphConversion.PG["2"] = "Zeo"
137
138 --New universe glyph conversion devised by me
139 glyphConversion.UN["q"] = 17
140 glyphConversion.UN["w"] = 1
141 glyphConversion.UN["e"] = 2
142 glyphConversion.UN["r"] = 3
143 glyphConversion.UN["t"] = 4
144 glyphConversion.UN["y"] = 5
145 glyphConversion.UN["u"] = 6
146 glyphConversion.UN["i"] = 7
147 glyphConversion.UN["o"] = 8
148 glyphConversion.UN["p"] = 9
149 glyphConversion.UN["["] = 10
150 glyphConversion.UN["]"] = 11
151 glyphConversion.UN["\\"] = 12
152 glyphConversion.UN["a"] = 13
153 glyphConversion.UN["s"] = 14
154 glyphConversion.UN["d"] = 15
155 glyphConversion.UN["f"] = 16
156 glyphConversion.UN["g"] = 18
157 glyphConversion.UN["h"] = 19
158 glyphConversion.UN["j"] = 20
159 glyphConversion.UN["k"] = 21
160 glyphConversion.UN["l"] = 22
161 glyphConversion.UN[";"] = 23
162 glyphConversion.UN["'"] = 24
163 glyphConversion.UN["z"] = 25
164 glyphConversion.UN["x"] = 26
165 glyphConversion.UN["c"] = 27
166 glyphConversion.UN["v"] = 28
167 glyphConversion.UN["b"] = 29
168 glyphConversion.UN["n"] = 30
169 glyphConversion.UN["m"] = 31
170 glyphConversion.UN[","] = 32
171 glyphConversion.UN["."] = 33
172 glyphConversion.UN["/"] = 34
173 glyphConversion.UN["1"] = 35
174 glyphConversion.UN["2"] = 36
175
176 --Gets the current gate type and sets currentGateType to the proper acronym for the gate
177 currentGateType = gateTypes[sg.getGateType()]
178 print("gate type is", currentGateType)
179
180 --Opens all ports in the ports table
181 for k, v in pairs(ports) do
182 --Opens the ports
183 modem.open(ports[k])
184 end
185
186 --Gets the address database from the database server
187 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
188 db.get_database(dbUser, dbPass, databases.storedAddressesName)
189
190 local requestData = serialization.unserialize(requestdataRaw)
191
192 --Prints the data got back from the database server
193 print(useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
194
195 --Checks if the database does not exist
196 if requestData == nil then
197 print("The database does not exist")
198
199 --If it does not exist create it
200 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
201 db.create_database(dbUser, dbPass, databases.storedAddressesName)
202
203 print("create_database", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
204 end
205
206 --After making sure that the database exists and if not creating it, get the database to check for the sample address
207 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
208 db.get_database(dbUser, dbPass, databases.storedAddressesName)
209
210 local requestData = serialization.unserialize(requestdataRaw)
211
212 --Checks if the sample address does not exist
213 if type(requestData.sample) == "nil" then
214 print("The sample entry does not exist")
215
216 --If not create it
217 print(
218 db.insert_entry(
219 dbUser,
220 dbPass,
221 databases.storedAddressesName,
222 "sample",
223 {["MW"] = "wertyu", ["PG"] = "wertyu", ["UN"] = "wertyu"}
224 )
225 )
226
227 print("insert_entry", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
228 end
229end
230
231--This function dials an address
232local function dialAddress(address)
233 --Broadcasts on the gateSignals port that a dialing sequence has begun
234 modem.broadcast(ports.gateSignals, "begin_dial_sequence", serialization.serialize(address), #address)
235
236 for i = 1, #address do
237 --Engages the symbol
238 local engageOutput = sg.engageSymbol(address[i])
239 if engageOutput == "stargate_spin" then
240 local _, _, _, symbolCount, lock, symbolName = event.pull("stargate_spin_chevron_engaged")
241
242 --Broadcast on the gateSignals port that another symbol was dialed
243 modem.broadcast(ports.gateSignals, "symbol_dialed", i, #address)
244
245 print(symbolCount, lock, symbolName)
246 end
247 end
248
249 --After dialing engage the gate
250 print(sg.engageGate())
251end
252
253--Handles modem messages
254function eventHandlers.modem_message(_, origin, port, _, requestType, ...)
255 print(origin, port, requestType, ...)
256 --Creates a table for storing functions
257 local requests =
258 setmetatable(
259 {},
260 {
261 __index = function()
262 return unknownEvent
263 end
264 }
265 )
266
267 --Creates a blank error
268 errors.noerror = ""
269
270 --The function for getting the address database
271 function requests.get_database()
272 print("getting database")
273 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
274 db.get_database(dbUser, dbPass, databases.storedAddressesName)
275
276 print("database got", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
277
278 return useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw
279 end
280
281 --The function for closing the gate
282 function requests.close_gate()
283 print("closing gate")
284 sg.disengageGate()
285 end
286
287 --The function for dialing the gate from a manual address
288 function requests.dial_address(address)
289 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw = true, true, true, true, false
290
291 --convert address to the correct format
292 local convertedAddress = split(address, "")
293
294 table.insert(convertedAddress, "q")
295
296 for i = 1, #convertedAddress do
297 convertedAddress[i] = glyphConversion[currentGateType][convertedAddress[i]]
298 end
299 --end convert
300
301 dialAddress(convertedAddress)
302
303 return useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw
304 end
305
306 --The function for dialing the gate from the database
307 function requests.dial_database(addressName)
308 addressName = addressName:gsub("%s+", "")
309
310 print("getting database")
311 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
312 db.get_database(dbUser, dbPass, databases.storedAddressesName)
313
314 print("database got", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
315
316 local databaseData = serialization.unserialize(requestdataRaw)
317
318 print(requestdataRaw, addressName)
319
320 print(serialization.serialize(databaseData[addressName]))
321
322 if type(databaseData[addressName]) ~= "nil" then
323 --convert address to the correct format
324 local convertedAddress = split(databaseData[addressName][currentGateType], "")
325
326 table.insert(convertedAddress, "q")
327
328 for i = 1, #convertedAddress do
329 convertedAddress[i] = glyphConversion[currentGateType][convertedAddress[i]]
330 end
331 --end convert
332
333 --Dials address
334 dialAddress(convertedAddress)
335 end
336 end
337
338 --The function for adding an address to the database
339 function requests.add_address(addressName, addressMW, addressPG, addressUN)
340 print("adding entry to database", addressName, addressMW, addressPG, addressUN)
341
342 addressName = addressName:gsub("%s+", "")
343
344 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
345 db.insert_entry(
346 dbUser,
347 dbPass,
348 databases.storedAddressesName,
349 addressName,
350 {["MW"] = addressMW, ["PG"] = addressPG, ["UN"] = addressUN}
351 )
352
353 print("inserted got", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
354
355 return useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw
356 end
357
358 --The function for removing an address from the database
359 function requests.remove_address(addressName)
360 print("removing entry from database")
361
362 addressName = addressName:gsub("%s+", "")
363
364 local useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw =
365 db.remove_entry(dbUser, dbPass, databases.storedAddressesName, addressName)
366
367 print("removed", useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw)
368
369 return useraccepted, passaccepted, requestcompleted, requesterror, requestdataRaw
370 end
371
372 --The function for getting the power data from the gate
373 function requests.get_power_data()
374 local storedEnergy = sg.getEnergyStored()
375 local maxEnergy = sg.getMaxEnergyStored()
376 local capacitorsInstalled = sg.getCapacitorsInstalled()
377
378 print(storedEnergy, maxEnergy, capacitorsInstalled)
379
380 return true, true, true, false, serialization.serialize({storedEnergy, maxEnergy, capacitorsInstalled})
381 end
382
383 --The function for getting the gate type
384 function requests.get_gate_type()
385 return true, true, true, false, sg.getGateType()
386 end
387
388 --Runs the correct function and gets the correct output
389 local userAccepted, passAccepted, requestCompleted, requestError, requestDataOutput = requests[requestType](...)
390
391 --Prints the completed response to console
392 print(requestType, origin, ports.dial, requestDataOutput)
393 --Sends the completed response back to the origin
394 modem.send(origin, ports.dial, requestDataOutput)
395end
396
397--Stops the program if the interrupted event gets triggered
398function eventHandlers.interrupted()
399 print("Server stopped")
400 running = false
401end
402
403--Broadcasts on the gateSignals port that a chevron was engaged
404function eventHandlers.stargate_spin_chevron_engaged(_, _, symbolCount, lock, symbolName)
405 modem.broadcast(ports.gateSignals, "stargate_spin_chevron_engaged", symbolCount, lock, symbolName)
406end
407
408--Broadcasts on the gateSignals port that there is an incoming wormhole
409function eventHandlers.stargate_incoming_wormhole(_, _, dialedAddressSize)
410 modem.broadcast(ports.gateSignals, "stargate_incoming_wormhole", dialedAddressSize)
411end
412
413--Broadcasts on the gateSignals port that the gate is opening
414function eventHandlers.stargate_open(_, _, isInitiating)
415 modem.broadcast(ports.gateSignals, "stargate_open", isInitiating)
416end
417
418--Broadcasts on the gateSignals port that the gate closed
419function eventHandlers.stargate_close(_, _)
420 modem.broadcast(ports.gateSignals, "stargate_close")
421end
422
423--Broadcasts on the gateSignals port that the gate failed
424function eventHandlers.stargate_failed(_, _)
425 modem.broadcast(ports.gateSignals, "stargate_failed")
426end
427
428--Broadcasts on the gateSignals port that there is a traveler
429function eventHandlers.stargate_traveler(_, _, inbound, player)
430 modem.broadcast(ports.gateSignals, "stargate_traveler", inbound, player)
431end
432
433-- The main event handler as function to separate eventID from the remaining arguments
434local function handleEvent(eventID, ...)
435 if (eventID) then -- can be nil if no event was pulled for some time
436 eventHandlers[eventID](...) -- call the appropriate event handler with all remaining arguments
437 end
438end
439
440--Sets up a lot of things
441mainSetup()
442
443--Registers all the event listeners
444eventIDs.interrupted = event.listen("interrupted", handleEvent)
445eventIDs.modem_message = event.listen("modem_message", handleEvent)
446eventIDs.stargate_spin_chevron_engaged = event.listen("stargate_spin_chevron_engaged", handleEvent)
447eventIDs.stargate_incoming_wormhole = event.listen("stargate_incoming_wormhole", handleEvent)
448eventIDs.stargate_open = event.listen("stargate_open", handleEvent)
449eventIDs.stargate_close = event.listen("stargate_close", handleEvent)
450eventIDs.stargate_failed = event.listen("stargate_failed", handleEvent)
451eventIDs.stargate_traveler = event.listen("stargate_traveler", handleEvent)
452
453--Prints to console that the server has successfully started
454print("Server started")
455
456--Continues looping until running == false, which only occurs after an interrupted event
457while running do
458 os.sleep(0.1)
459end
460
461--Cancells all event listeners
462for k, v in pairs(eventIDs) do
463 print("cancel " .. k, event.ignore(k, handleEvent))
464end