SHOW:
|
|
- or go back to the newest paste.
1 | -- **************************************************************** -- | |
2 | -- local variables | |
3 | -- **************************************************************** -- | |
4 | ||
5 | local w,h = term.getSize() -- 51, 19 | |
6 | local select = 1 | |
7 | local verNum = 1.01 | |
8 | local m,s, timeUpdated = "00","00", false | |
9 | local logs = {} | |
10 | local firstTime = not fs.exists('STARGATE') | |
11 | local gates = { } | |
12 | ||
13 | -- **************************************************************** -- | |
14 | -- Download and load apis, files, and directories | |
15 | -- **************************************************************** -- | |
16 | ||
17 | if not http then | |
18 | print("Stargate DHD requires http API") | |
19 | print("Set enableAPI_http to true in ComputerCraft.cfg") | |
20 | return | |
21 | end | |
22 | ||
23 | function Initialize() | |
24 | if not fs.exists("dropbox") then | |
25 | shell.run('pastebin get L9iRRjg6 dropbox') | |
26 | term.clear() -- **** need to fix GUI prob **** -- | |
27 | table.insert(logs, 'Downloaded Dropbox Downloader') | |
28 | rollingLogs() | |
29 | end | |
30 | if not fs.exists('STARGATE') then | |
31 | fs.makeDir('STARGATE') | |
32 | table.insert(logs, 'Creating directory STARGATE') | |
33 | rollingLogs() | |
34 | end | |
35 | if not fs.exists('STARGATE/apis') then | |
36 | fs.makeDir('STARGATE/apis') | |
37 | table.insert(logs, 'Creating directory apis') | |
38 | rollingLogs() | |
39 | end | |
40 | if not fs.exists('STARGATE/Settings') then | |
41 | fs.makeDir('STARGATE/Settings') | |
42 | table.insert(logs, 'Creating directory Settings') | |
43 | rollingLogs() | |
44 | end | |
45 | if not fs.exists("STARGATE/apis/wrap") then | |
46 | shell.run("dropbox Simple%20Wrap.lua CC%20Porgrams 126735377 STARGATE/apis/wrap") | |
47 | table.insert(logs, 'Downloading api: Simple Wrap.lua from dropbox') | |
48 | rollingLogs() | |
49 | end | |
50 | if not fs.exists("STARGATE/apis/Downloader") then | |
51 | shell.run("dropbox Downloader.lua CC%20Porgrams 126735377 STARGATE/apis/Downloader") | |
52 | table.insert(logs, 'Downloading api: Downloader.lua from dropbox') | |
53 | rollingLogs() | |
54 | end | |
55 | os.loadAPI("STARGATE/apis/wrap") | |
56 | table.insert(logs, 'Loading api: wrap') | |
57 | rollingLogs() | |
58 | os.loadAPI("STARGATE/apis/Downloader") | |
59 | table.insert(logs, 'Loading api: Downloader') | |
60 | rollingLogs() | |
61 | if not fs.exists('STARGATE/Settings/Timing') then | |
62 | local f = fs.open('STARGATE/Settings/Timing', 'w') | |
63 | f.writeLine(14) | |
64 | f.close() | |
65 | table.insert(logs, 'Setting cumulative update time to 15 min') | |
66 | rollingLogs() | |
67 | end | |
68 | if not fs.exists('STARGATE/Settings/onlineInfo') then | |
69 | local f = fs.open('STARGATE/Settings/onlineInfo', 'w') | |
70 | f.writeLine("Dropbox or Pastebin") | |
71 | f.writeLine("link or code") | |
72 | f.close() | |
73 | table.insert(logs, 'Setting online cumulative update location') | |
74 | rollingLogs() | |
75 | end | |
76 | if not fs.exists('STARGATE/Settings/AddressList') then | |
77 | local f = fs.open('STARGATE/Settings/AddressList', 'w') | |
78 | f.writeLine("Stargate_Address_List = {") | |
79 | f.writeLine("}") | |
80 | f.close() | |
81 | table.insert(logs, 'Making blank Address List') | |
82 | rollingLogs() | |
83 | end | |
84 | end | |
85 | ||
86 | -- **************************************************************** -- | |
87 | -- Some Functions | |
88 | -- **************************************************************** -- | |
89 | ||
90 | function dial(address) | |
91 | local gate = wrap.attach("Abstract Bus Adapter") | |
92 | if gate then | |
93 | gate.sendPacket("FFFF", "action: dial", "address: "..address) | |
94 | end | |
95 | end | |
96 | ||
97 | function disconnect() | |
98 | local gate = wrap.attach("Abstract Bus Adapter") | |
99 | if gate then | |
100 | gate.sendPacket("FFFF", "action: disconnect") | |
101 | end | |
102 | end | |
103 | ||
104 | function settings_Timing(newTime) | |
105 | if newTime then | |
106 | local f = fs.open('STARGATE/Settings/Timing', 'w') | |
107 | f.writeLine(newTime) | |
108 | f.close() | |
109 | m, s, timeUpdated = newTime, "00", true | |
110 | else | |
111 | local f = fs.open('STARGATE/Settings/Timing', 'r') | |
112 | local Time = f.readLine() | |
113 | f.close() | |
114 | return math.floor(Time) | |
115 | end | |
116 | end | |
117 | ||
118 | function settings_OnlineInfo(Dropbox_Pastebin, info) | |
119 | if info then | |
120 | local f = fs.open('STARGATE/Settings/onlineInfo', 'w') | |
121 | if Dropbox_Pastebin == "Dropbox" and string.find(info,"www.") then | |
122 | local str = strsplit("www.", info) | |
123 | info = str[1].."dl."..str[2] | |
124 | end | |
125 | f.writeLine(Dropbox_Pastebin) | |
126 | f.writeLine(info) | |
127 | f.close() | |
128 | else | |
129 | local f = fs.open('STARGATE/Settings/onlineInfo', 'r') | |
130 | local Paste_Drop = f.readLine() | |
131 | local location = f.readLine() | |
132 | f.close() | |
133 | return Paste_Drop, location | |
134 | end | |
135 | end | |
136 | ||
137 | function updateAdressList() | |
138 | os.unloadAPI("STARGATE/Settings/AddressList") | |
139 | local name, info = settings_OnlineInfo() | |
140 | Downloader.get(name, info) | |
141 | os.loadAPI("STARGATE/Settings/AddressList") | |
142 | if AddressList.Stargate_Address_List then | |
143 | gates = AddressList.Stargate_Address_List | |
144 | end | |
145 | updateGateMenu() | |
146 | end | |
147 | ||
148 | function updateSG_DHD() | |
149 | local file = http.get("https://dl.dropboxusercontent.com/u/126735377/CC%20Porgrams/Stargate%20DHD.lua") | |
150 | local program = file.readAll() | |
151 | file.close() | |
152 | if not string.find(program,"local verNum = "..verNum) then | |
153 | term.clear() | |
154 | drawHeaderFooter() | |
155 | printCentered("O----------------O", 7, 1) | |
156 | printCentered("O----------------O", 9, 1) | |
157 | local update = {". ",".. ","... ","...."} | |
158 | for i=1,#update do | |
159 | printCentered("| updating"..update[i].." |", 8, 1) | |
160 | sleep(1) | |
161 | end | |
162 | local dir = shell.getRunningProgram() | |
163 | fs.delete(dir) | |
164 | local f = fs.open(dir, "w") | |
165 | f.write(program) | |
166 | f.close() | |
167 | shell.run(dir) | |
168 | end | |
169 | end | |
170 | ||
171 | function strsplit( pat, str ) | |
172 | local t = {} | |
173 | local fpat = "(.-)" .. pat | |
174 | local last_end = 1 | |
175 | local s, e, cap = str:find(fpat, 1) | |
176 | while s do | |
177 | if s ~= 1 or cap ~= "" then | |
178 | table.insert(t,cap) | |
179 | end | |
180 | last_end = e+1 | |
181 | s, e, cap = str:find(fpat, last_end) | |
182 | end | |
183 | if last_end <= #str then | |
184 | cap = str:sub(last_end) | |
185 | table.insert(t, cap) | |
186 | end | |
187 | return t | |
188 | end | |
189 | ||
190 | function rollingLogs() | |
191 | if firstTime then | |
192 | term.clear() | |
193 | drawHeaderFooter() | |
194 | printCentered("Doing some things...",8, 1) | |
195 | printCentered("O"..string.rep("-", w-6).."O",9, 1) | |
196 | for i=1, 3 do | |
197 | printCentered("|"..string.rep(" ", w-6).."|",9+i, 1) | |
198 | end | |
199 | printCentered("O"..string.rep("-", w-6).."O",13, 1) | |
200 | while #logs > 3 do | |
201 | table.remove(logs, 1) | |
202 | end | |
203 | for i=1, #logs do | |
204 | printCentered(logs[i], 9+i, 1) | |
205 | end | |
206 | sleep(1) | |
207 | end | |
208 | end | |
209 | ||
210 | -- **************************************************************** -- | |
211 | -- GUI | |
212 | -- **************************************************************** -- | |
213 | ||
214 | --Some draw functions to get us started | |
215 | function printCentered(str, ypos, offset) | |
216 | if not offset then offset = 0 end | |
217 | term.setCursorPos(w/2 - #str/2+offset, ypos) | |
218 | term.write(str) | |
219 | end | |
220 | ||
221 | function printRight(str, ypos) | |
222 | term.setCursorPos(w - #str, ypos) | |
223 | term.write(str) | |
224 | end | |
225 | ||
226 | function printCollumRow(str, ypos, num, offset) | |
227 | if num == 1 then | |
228 | term.setCursorPos(1+offset,ypos) | |
229 | term.write(str) | |
230 | elseif num == 2 then | |
231 | term.setCursorPos(w/2 - #str/2, ypos) | |
232 | term.write(str) | |
233 | elseif num == 3 then | |
234 | term.setCursorPos((w - #str)-offset+1, ypos) | |
235 | term.write(str) | |
236 | end | |
237 | end | |
238 | ||
239 | --draw menu functions | |
240 | function drawHeaderFooter() | |
241 | printCentered("O"..string.rep("-", w-2).."O", 1, 1) | |
242 | printCentered("O Stargate D.H.D. O", 1) | |
243 | printCentered("| Cumulative Update |", 2) | |
244 | printCentered("O-----< "..m..":"..s.." >-----O", 3) | |
245 | printCentered("O"..string.rep("-", w-2).."O", h-1, 1) | |
246 | for i=2, h-2 do | |
247 | term.setCursorPos(1,i) | |
248 | term.write("|") | |
249 | term.setCursorPos(w,i) | |
250 | term.write("|") | |
251 | end | |
252 | term.setCursorPos(2,h) | |
253 | term.write("By: PaintPauller") | |
254 | printRight("Version: "..verNum, h) | |
255 | end | |
256 | ||
257 | function drawMain() | |
258 | local toPrint = { "Dial Stargate", "Disconnect Stargate", "Settings", "Force Update"} | |
259 | local num = 1 | |
260 | for i=6, #toPrint*4, 3 do | |
261 | printCentered(toPrint[num], i) | |
262 | if select == num then | |
263 | printCentered("O"..string.rep("-", #toPrint[num]).."O", i+1) | |
264 | end | |
265 | num = num + 1 | |
266 | end | |
267 | printRight("Quit", h-2) | |
268 | if select == #toPrint+1 then | |
269 | printRight("> Quit <", h-2) | |
270 | end | |
271 | end | |
272 | ||
273 | function drawDiall() | |
274 | local collum = 1 | |
275 | local row = 5 | |
276 | for i=1, #gates do | |
277 | if i>18 then break end | |
278 | printCollumRow(gates[i].name, row, collum, 2) | |
279 | if select == i then | |
280 | printCollumRow("O"..string.rep("-", #gates[i].name).."O", row+1, collum, 1) | |
281 | end | |
282 | row = row + 2 | |
283 | if row >= 16 then | |
284 | row = 5 | |
285 | collum = collum + 1 | |
286 | end | |
287 | end | |
288 | printRight("Back", h-2) | |
289 | if select == #gates+1 or select == 19 then | |
290 | printRight("> Back <", h-2) | |
291 | end | |
292 | end | |
293 | ||
294 | function drawSettingsEditor() | |
295 | printCentered("O"..string.rep("-", 42).."O", h-6, 1) | |
296 | printCentered("|"..string.rep(" ", 42).."|", h-5, 1) | |
297 | printCentered("O"..string.rep("-", 42).."O", h-4, 1) | |
298 | end | |
299 | ||
300 | function drawSettings() | |
301 | local name, location = settings_OnlineInfo() | |
302 | if #location > 31 then | |
303 | location = string.sub(location, 1, 30).."..." | |
304 | end | |
305 | printCollumRow("Change Cumulative Update Timing", 5, 1, 3) | |
306 | printCollumRow("Change Online Location", 8, 1, 3) | |
307 | ||
308 | printCollumRow("Minutes: "..settings_Timing()+1, 6, 1, 5) | |
309 | printCollumRow(name, 9, 1, 5) | |
310 | printCollumRow("Location: "..location, 10, 1, 5) | |
311 | printRight("Back", h-2) | |
312 | settings_OnlineInfo(Dropbox_Pastebin, info) | |
313 | if select == 1 then | |
314 | printCollumRow("> Minutes: "..settings_Timing()+1, 6, 1, 3) | |
315 | elseif select == 2 then | |
316 | printCollumRow("> "..name, 9, 1, 3) | |
317 | elseif select == 3 then | |
318 | printCollumRow("> Location: "..location, 10, 1, 3) | |
319 | elseif select == 4 then | |
320 | printRight("> Back <", h-2) | |
321 | end | |
322 | end | |
323 | ||
324 | -- Menu state | |
325 | local menustate = "Main" | |
326 | local menuOpt = { | |
327 | ['Main'] = { | |
328 | options = { "Dial a Stargate", "Disconnect Stargate", "Settings", "Force Update", "Quit" }, | |
329 | draw = drawMain | |
330 | }, | |
331 | ["Dial a Stargate"] = { | |
332 | options = { }, --filled in later | |
333 | draw = drawDiall | |
334 | }, | |
335 | ['Settings'] = { | |
336 | options = { "Minute", "DropBox_Pastebin", "Online Location", "Main" }, | |
337 | draw = drawSettings | |
338 | }, | |
339 | } | |
340 | ||
341 | function updateGateMenu() | |
342 | menuOpt["Dial a Stargate"].options = { } | |
343 | for i=1, #gates do | |
344 | if i>18 then break end | |
345 | table.insert(menuOpt["Dial a Stargate"].options, gates[i].name) | |
346 | end | |
347 | table.insert(menuOpt["Dial a Stargate"].options, 'Main') | |
348 | end | |
349 | updateGateMenu() | |
350 | ||
351 | -- Run | |
352 | function timer() | |
353 | while true do | |
354 | updateAdressList() | |
355 | for mc=settings_Timing(), 0, -1 do | |
356 | for sc =60, 0, -1 do | |
357 | m = mc | |
358 | s = sc | |
359 | if s < 10 then s = tostring("0"..s) end | |
360 | if m < 10 then m = tostring("0"..m) end | |
361 | local old_x, old_y = term.getCursorPos() | |
362 | printCentered("O-----< "..m..":"..s.." >-----O", 3) | |
363 | term.setCursorPos(old_x, old_y) | |
364 | if not timeUpdated then sleep(1) end | |
365 | end | |
366 | if timeUpdated then sleep(.00001) end | |
367 | end | |
368 | timeUpdated = false | |
369 | end | |
370 | end | |
371 | ||
372 | function runMenu() | |
373 | while true do | |
374 | local acted = false | |
375 | term.clear() | |
376 | drawHeaderFooter() | |
377 | menuOpt[menustate].draw() | |
378 | ||
379 | --[[ -- Debug Start -- | |
380 | term.setCursorPos(1,h) | |
381 | term.clearLine() | |
382 | printRight(menustate, h) | |
383 | term.setCursorPos(2,h) | |
384 | term.write(tostring(menuOpt[menustate].options[select])..": "..select) | |
385 | --]] -- Debug End -- | |
386 | ||
387 | local id, key = os.pullEvent("key") | |
388 | -- 203: left, 205: right, 200: up, 208: down, 28: enter | |
389 | ||
390 | if key == 200 and select > 1 then | |
391 | select = select-1 | |
392 | elseif key == 200 and select == 1 then | |
393 | select = #menuOpt[menustate].options | |
394 | elseif key == 208 and select < #menuOpt[menustate].options then | |
395 | select = select+1 | |
396 | elseif key == 208 and select == #menuOpt[menustate].options then | |
397 | select = 1 | |
398 | elseif key == 203 and select == 19 and menustate == "Dial a Stargate" then | |
399 | select = 1 | |
400 | elseif key == 203 and select < 7 and menustate == "Dial a Stargate" then | |
401 | select = select+12 | |
402 | if select > #menuOpt[menustate].options then select = #menuOpt[menustate].options end | |
403 | elseif key == 203 and select > 6 and menustate == "Dial a Stargate" then | |
404 | select = select-6 | |
405 | elseif key == 205 and select == 19 and menustate == "Dial a Stargate" then | |
406 | select = 1 | |
407 | elseif key == 205 and select < 13 and menustate == "Dial a Stargate" then | |
408 | select = select+6 | |
409 | if select > #menuOpt[menustate].options then select = #menuOpt[menustate].options end | |
410 | elseif key == 205 and select > 12 and menustate == "Dial a Stargate" then | |
411 | select = select-12 | |
412 | elseif key == 28 then | |
413 | if menuOpt[menustate].options[select] == "Quit" then break end | |
414 | if menuOpt[menustate].options[select] == "Force Update" then | |
415 | updateAdressList() | |
416 | acted = true | |
417 | end disconnect() | |
418 | if menuOpt[menustate].options[select] == "Disconnect Stargate" and not acted then | |
419 | disconnect() | |
420 | acted = true | |
421 | end | |
422 | for name, info in pairs(menuOpt) do | |
423 | if menuOpt[menustate].options[select] == name and not acted then | |
424 | menustate = menuOpt[menustate].options[select] | |
425 | select = 1 | |
426 | acted = true | |
427 | end | |
428 | end | |
429 | if menustate == "Dial a Stargate" and not acted then | |
430 | dial(gates[select].address) | |
431 | sleep(1) | |
432 | menustate = "Main" | |
433 | acted = true | |
434 | ||
435 | end | |
436 | if menustate == "Settings" and not acted then | |
437 | if select == 1 then | |
438 | drawSettingsEditor() | |
439 | term.setCursorPos(5,h-5) | |
440 | local command = tostring(read()) | |
441 | local Ncommand = tonumber(command) | |
442 | if type(Ncommand) == 'number' and Ncommand <= 99 and Ncommand >= 1 then | |
443 | term.setCursorPos(5,h-5) | |
444 | term.write('Updateing...') | |
445 | settings_Timing(math.floor(Ncommand-1)) | |
446 | while timeUpdated do sleep(.00001) end | |
447 | else | |
448 | term.setCursorPos(5,h-5) | |
449 | term.write('Invalid number!') | |
450 | sleep(1) | |
451 | end | |
452 | acted = true | |
453 | elseif select == 2 then | |
454 | local name, location = settings_OnlineInfo() | |
455 | if name == "Dropbox" then | |
456 | settings_OnlineInfo("Pastebin", location) | |
457 | else | |
458 | settings_OnlineInfo("Dropbox", location) | |
459 | end | |
460 | acted = true | |
461 | elseif select == 3 then | |
462 | local name, location = settings_OnlineInfo() | |
463 | drawSettingsEditor() | |
464 | term.setCursorPos(5,h-7) | |
465 | if name == "Dropbox" then | |
466 | term.write("Paste the Dropbox link below.") | |
467 | elseif name == "Pastebin" then | |
468 | term.write("Paste the Pastebin code below.") | |
469 | end | |
470 | term.setCursorPos(5,h-5) | |
471 | local command = tostring(read()) | |
472 | drawSettings() | |
473 | drawSettingsEditor() | |
474 | term.setCursorPos(5,h-5) | |
475 | term.write('Updateing...') | |
476 | settings_OnlineInfo(name, command) | |
477 | sleep(1) | |
478 | updateAdressList() | |
479 | acted = true | |
480 | end | |
481 | end | |
482 | end | |
483 | end | |
484 | end | |
485 | ||
486 | Initialize() | |
487 | updateSG_DHD() | |
488 | if settings_OnlineInfo() == "Dropbox or Pastebin" then | |
489 | menustate = "Settings" | |
490 | select = 2 | |
491 | end | |
492 | parallel.waitForAny( timer, runMenu ) | |
493 | term.clear() | |
494 | term.setCursorPos(1,1) |