SHOW:
|
|
- or go back to the newest paste.
1 | state1 = "Actions: [Download] Run Cancel" | |
2 | state2 = "Actions: Download [Run] Cancel" | |
3 | state3 = "Actions: Download Run [Cancel]" | |
4 | welcome1 = "[Previous] Enter URL Server List Exit" | |
5 | welcome2 = " Previous [Enter URL] Server List Exit" | |
6 | welcome3 = " Previous Enter URL [Server List] Exit" | |
7 | welcome4 = " Previous Enter URL Server List [Exit]" | |
8 | remove1 = "Remove server? [Yes] No" | |
9 | remove2 = "Remove server? Yes [No]" | |
10 | local items = {} | |
11 | local types = {} | |
12 | local href = {} | |
13 | local selection = nil | |
14 | local title = nil | |
15 | local url = nil | |
16 | local scroll = nil | |
17 | local home = nil | |
18 | local start = nil | |
19 | ||
20 | function welcomeSelect(wSel) | |
21 | if wSel == 1 then | |
22 | term.setCursorPos(5, 8) | |
23 | term.clearLine() | |
24 | write(welcome1) | |
25 | event, key = os.pullEvent("key") | |
26 | if key == 205 then | |
27 | return welcomeSelect(2) | |
28 | elseif key == 28 then | |
29 | return 1 | |
30 | else | |
31 | return welcomeSelect(1) | |
32 | end | |
33 | elseif wSel == 2 then | |
34 | term.setCursorPos(5, 8) | |
35 | term.clearLine() | |
36 | write(welcome2) | |
37 | event, key = os.pullEvent("key") | |
38 | if key == 203 then | |
39 | return welcomeSelect(1) | |
40 | elseif key == 205 then | |
41 | return welcomeSelect(3) | |
42 | elseif key == 28 then | |
43 | return 2 | |
44 | else | |
45 | return welcomeSelect(2) | |
46 | end | |
47 | elseif wSel == 3 then | |
48 | term.setCursorPos(5, 8) | |
49 | term.clearLine() | |
50 | write(welcome3) | |
51 | event, key = os.pullEvent("key") | |
52 | if key == 203 then | |
53 | return welcomeSelect(2) | |
54 | elseif key == 205 then | |
55 | return welcomeSelect(4) | |
56 | elseif key == 28 then | |
57 | return 3 | |
58 | else | |
59 | return welcomeSelect(3) | |
60 | end | |
61 | elseif wSel == 4 then | |
62 | term.setCursorPos(5, 8) | |
63 | term.clearLine() | |
64 | write(welcome4) | |
65 | event, key = os.pullEvent("key") | |
66 | if key == 203 then | |
67 | return welcomeSelect(3) | |
68 | elseif key == 28 then | |
69 | return 4 | |
70 | else | |
71 | return welcomeSelect(4) | |
72 | end | |
73 | end | |
74 | end | |
75 | ||
76 | ||
77 | ||
78 | function debug(msg) | |
79 | term.setCursorPos(1,1) | |
80 | term.clearLine() | |
81 | write(msg) | |
82 | sleep(2) | |
83 | end | |
84 | ||
85 | local function contains(string, pattern) | |
86 | local a = string.find(string, pattern) | |
87 | if a ~= nil then | |
88 | return true | |
89 | else | |
90 | return false | |
91 | end | |
92 | end | |
93 | ||
94 | local function downloadrun(side) | |
95 | term.setCursorPos(1, 1) | |
96 | term.clearLine() | |
97 | if side == "state1" then | |
98 | write(state1) | |
99 | event, key = os.pullEvent("key") | |
100 | if key == 205 then | |
101 | return downloadrun("state2") | |
102 | elseif key == 28 then | |
103 | return "download" | |
104 | else | |
105 | return downloadrun("state1") | |
106 | end | |
107 | elseif side == "state2" then | |
108 | write(state2) | |
109 | event, key = os.pullEvent("key") | |
110 | if key == 203 then | |
111 | return downloadrun("state1") | |
112 | elseif key == 205 then | |
113 | return downloadrun("state3") | |
114 | elseif key == 28 then | |
115 | return "run" | |
116 | else | |
117 | return downloadrun("state2") | |
118 | end | |
119 | elseif side == "state3" then | |
120 | write(state3) | |
121 | event, key = os.pullEvent("key") | |
122 | if key == 203 then | |
123 | return downloadrun("state2") | |
124 | elseif key == 28 then | |
125 | return "cancel" | |
126 | else | |
127 | return downloadrun("state3") | |
128 | end | |
129 | end | |
130 | end | |
131 | ||
132 | local function drawGUI(items, scroll, selection, title, types) | |
133 | while true do | |
134 | term.clear() | |
135 | term.setCursorPos(1,1) | |
136 | write(title) | |
137 | term.setCursorPos(1,2) | |
138 | write("=================================================") | |
139 | for i = 1+scroll, #types do | |
140 | term.setCursorPos(45, (i+2)-scroll) | |
141 | write(types[i]) | |
142 | end | |
143 | for d = 1+scroll, #items do | |
144 | term.setCursorPos(3, (d+2)-scroll) | |
145 | write(items[d]) | |
146 | end | |
147 | local length = string.len(items[selection]) | |
148 | term.setCursorPos(2, (selection+2)-scroll) | |
149 | term.write("[") | |
150 | term.setCursorPos(3+length, (selection+2)-scroll) | |
151 | term.write("]") | |
152 | event, key = os.pullEvent("key") | |
153 | if key == 208 then | |
154 | term.setCursorPos(2, (selection+2)-scroll) | |
155 | term.write(" ") | |
156 | term.setCursorPos(3+length, (selection+2)-scroll) | |
157 | term.write(" ") | |
158 | if selection == #items then | |
159 | elseif selection == scroll+16 then | |
160 | selection = selection+1 | |
161 | scroll = scroll+1 | |
162 | else | |
163 | selection = selection+1 | |
164 | end | |
165 | elseif key == 200 then | |
166 | term.setCursorPos(2, (selection+2)-scroll) | |
167 | term.write(" ") | |
168 | term.setCursorPos(3+length, (selection+2)-scroll) | |
169 | term.write(" ") | |
170 | if selection == 1 then | |
171 | elseif selection == scroll+1 then | |
172 | selection = selection-1 | |
173 | scroll = scroll-1 | |
174 | else | |
175 | selection = selection-1 | |
176 | end | |
177 | elseif key == 28 then | |
178 | return(items[selection]) | |
179 | elseif key == 16 then | |
180 | sleep(0.2) | |
181 | return("Press Q to Exit") | |
182 | else | |
183 | end | |
184 | end | |
185 | end | |
186 | ||
187 | local function serverDrawGUI(items, scroll, selection, title) | |
188 | while true do | |
189 | term.clear() | |
190 | term.setCursorPos(1,1) | |
191 | write(title) | |
192 | term.setCursorPos(1,2) | |
193 | write("=================================================") | |
194 | for d = 1+scroll, #items do | |
195 | term.setCursorPos(3, (d+2)-scroll) | |
196 | write(items[d]) | |
197 | end | |
198 | local length = string.len(items[selection]) | |
199 | term.setCursorPos(2, (selection+2)-scroll) | |
200 | term.write("[") | |
201 | term.setCursorPos(3+length, (selection+2)-scroll) | |
202 | term.write("]") | |
203 | event, key = os.pullEvent("key") | |
204 | if key == 208 then | |
205 | term.setCursorPos(2, (selection+2)-scroll) | |
206 | term.write(" ") | |
207 | term.setCursorPos(3+length, (selection+2)-scroll) | |
208 | term.write(" ") | |
209 | if selection == #items then | |
210 | elseif selection == scroll+16 then | |
211 | selection = selection+1 | |
212 | scroll = scroll+1 | |
213 | else | |
214 | selection = selection+1 | |
215 | end | |
216 | elseif key == 200 then | |
217 | term.setCursorPos(2, (selection+2)-scroll) | |
218 | term.write(" ") | |
219 | term.setCursorPos(3+length, (selection+2)-scroll) | |
220 | term.write(" ") | |
221 | if selection == 1 then | |
222 | elseif selection == scroll+1 then | |
223 | selection = selection-1 | |
224 | scroll = scroll-1 | |
225 | else | |
226 | selection = selection-1 | |
227 | end | |
228 | elseif key == 28 then | |
229 | return(items[selection]) | |
230 | elseif key == 16 then | |
231 | sleep(0.2) | |
232 | return("exit") | |
233 | elseif key == 19 and selection ~= #items then | |
234 | return "remove", selection | |
235 | end | |
236 | end | |
237 | end | |
238 | ||
239 | local function process() | |
240 | local f= io.open("/.tmpdata", "r") | |
241 | f:read("*l") | |
242 | f:read("*l") | |
243 | f:read("*l") | |
244 | f:read("*l") | |
245 | f:read("*l") | |
246 | f:read("*l") | |
247 | local data = f:read("*l") | |
248 | if data == nil then | |
249 | term.setCursorPos(1,1) | |
250 | term.clearLine() | |
251 | print("Not an Apache File Server! [Ok]") | |
252 | os.pullEvent("key") | |
253 | return "error" | |
254 | end | |
255 | local titlestart = nil | |
256 | local derp = nil | |
257 | if string.find(data, "<h1>") == nil then | |
258 | term.setCursorPos(1,1) | |
259 | term.clearLine() | |
260 | print("Not an Apache File Server! [Ok]") | |
261 | os.pullEvent("key") | |
262 | return "error" | |
263 | end | |
264 | titlestart = (string.find(data, "<h1>")+4) | |
265 | local titleend = (string.find(data, "</h1>")-1) | |
266 | title = string.sub(data, titlestart, titleend) | |
267 | items = {} | |
268 | types = {} | |
269 | href = {} | |
270 | local line = f:read("*l") | |
271 | apachev = 1 | |
272 | if contains(line, "<table><tr><th>") then | |
273 | apachev = 2 | |
274 | line = f:read("*l") | |
275 | end | |
276 | while contains(line, "<li>") or contains(line, "</td><td>") do | |
277 | rStart = (string.find(line, "<a href=")-4) | |
278 | lStart = string.find(line, "\"> ", rStart) | |
279 | if apachev == 2 then | |
280 | lStart = (string.find(line, "\">", rStart) + 2) | |
281 | else | |
282 | lStart = (string.find(line, "\"> ", rStart)+3) | |
283 | end | |
284 | lEnd = (string.find(line, "</a>", rStart) - 1) | |
285 | lData = string.sub(line, lStart, lEnd) | |
286 | table.insert(items, lData) | |
287 | hStart = (string.find(line, "<a href=\"", rStart) + 9) | |
288 | hEnd = (string.find(line, "\">", rStart) - 1) | |
289 | hData = string.sub(line, hStart, hEnd) | |
290 | table.insert(href, hData) | |
291 | if contains(lData, "Parent Directory") then | |
292 | lPStart = (string.find(line, "<a href=\"", rStart) + 9) | |
293 | lPEnd = (string.find(line, "\">", rStart) - 1) | |
294 | lPData = string.sub(line, lPStart, lPEnd) | |
295 | table.insert(types, "back") | |
296 | elseif contains(lData, "/") then | |
297 | table.insert(types, "dir") | |
298 | else | |
299 | table.insert(types, "file") | |
300 | end | |
301 | line = f:read("*l") | |
302 | end | |
303 | return title, items, types | |
304 | end | |
305 | ||
306 | local function isFile(filename, items, types) | |
307 | for i = 1, #items do | |
308 | if filename == items[i] and types[i] == "file" then | |
309 | return true | |
310 | end | |
311 | end | |
312 | return false | |
313 | end | |
314 | ||
315 | local function gethref(ref) | |
316 | for i = 1, #items do | |
317 | if items[i] == ref then | |
318 | return href[i] | |
319 | end | |
320 | end | |
321 | end | |
322 | ||
323 | ||
324 | local function loadPage(url) | |
325 | term.setCursorBlink(false) | |
326 | term.setCursorPos(1, 1) | |
327 | term.clearLine() | |
328 | write("Connecting...") | |
329 | http.request(url) | |
330 | while true do | |
331 | event, a, code = os.pullEvent() | |
332 | if event == "http_failure" then | |
333 | term.setCursorPos(1,1) | |
334 | term.clearLine() | |
335 | print("Connection failed! [Ok]") | |
336 | os.pullEvent("key") | |
337 | return "error" | |
338 | elseif event == "http_success" then | |
339 | break | |
340 | elseif event == "key" and a == 16 then | |
341 | return "error" | |
342 | end | |
343 | end | |
344 | if code == nil then | |
345 | term.setCursorPos(1, 1) | |
346 | term.clearLine() | |
347 | print("Page not found! [Ok]") | |
348 | os.pullEvent("key") | |
349 | return "error" | |
350 | end | |
351 | f = io.open("/.tmpdata", "w") | |
352 | f:write(code:readAll()) | |
353 | f:close() | |
354 | code:close() | |
355 | title, items, types = process() | |
356 | if title == "error" then | |
357 | return "error" | |
358 | end | |
359 | newpage = drawGUI(items, 0, 1, title, types) | |
360 | if isFile(newpage, items, types) then | |
361 | npage = gethref(newpage) | |
362 | dr = downloadrun("state1") | |
363 | if dr == "download" then | |
364 | term.setCursorPos(1, 1) | |
365 | term.clearLine() | |
366 | write("Download as: ") | |
367 | saveas = read() | |
368 | if contains(saveas, " ") or saveas == "" then | |
369 | return(url) | |
370 | else | |
371 | if contains(saveas, "/") then | |
372 | local reverse = string.reverse(saveas) | |
373 | local fDir = (string.len(saveas) - string.find(reverse, "/")) | |
374 | local cDir = string.sub(saveas, 1, fDir) | |
375 | if fs.exists(cDir) then | |
376 | local tmpF = http.get(url .. npage) | |
377 | local code = tmpF:readAll() | |
378 | tmpF:close() | |
379 | f = io.open(saveas , "w") | |
380 | f:write(code) | |
381 | f:close() | |
382 | return(url) | |
383 | else | |
384 | term.setCursorPos(1,1) | |
385 | term.clearLine() | |
386 | write("Directory does not exist! Press any key...") | |
387 | os.pullEvent("key") | |
388 | return(url) | |
389 | end | |
390 | end | |
391 | local tmpF = http.get(url .. npage) | |
392 | local code = tmpF:readAll() | |
393 | tmpF:close() | |
394 | f = io.open(saveas , "w") | |
395 | f:write(code) | |
396 | f:close() | |
397 | return(url) | |
398 | end | |
399 | elseif dr == "run" then | |
400 | local tmpF = http.get(url .. npage) | |
401 | local code = tmpF:readAll() | |
402 | tmpF:close() | |
403 | f = io.open("/.tmprun" , "w") | |
404 | f:write(code) | |
405 | f:close() | |
406 | term.clear() | |
407 | term.setCursorPos(1, 1) | |
408 | shell.run("/.tmprun") | |
409 | x, y = term.getCursorPos() | |
410 | if x > 6 then | |
411 | if y == 18 then | |
412 | term.setCursorPos(1, y) | |
413 | term.clearLine() | |
414 | else | |
415 | term.setCursorPos(1, y+1) | |
416 | end | |
417 | end | |
418 | print("Program ended. Press any key to continue") | |
419 | os.pullEvent("key") | |
420 | return(url) | |
421 | else | |
422 | return url | |
423 | end | |
424 | else | |
425 | if newpage == "Parent Directory" then | |
426 | return(start .. lPData) | |
427 | elseif newpage == "Press Q to Exit" then | |
428 | return("exitcode") | |
429 | else | |
430 | npage = gethref(newpage) | |
431 | return(url .. npage) | |
432 | end | |
433 | end | |
434 | end | |
435 | ||
436 | ||
437 | function main() | |
438 | start = string.sub(home, 1, string.len(home)-1) | |
439 | f = io.open("/.previous", "w") | |
440 | f:write(home) | |
441 | f:close() | |
442 | rhome = home | |
443 | hTest = string.gsub(home, "http://", "") | |
444 | a, b = string.find(hTest, "/") | |
445 | if b ~= nil then home = string.sub(home, 1, a+7) | |
446 | start = string.sub(home, 1, string.len(home)-1) | |
447 | end | |
448 | finish = loadPage(rhome) | |
449 | if finish == "error" then | |
450 | return "error" | |
451 | end | |
452 | while true do | |
453 | if finish == "exitcode" then | |
454 | term.clear() | |
455 | welcome() | |
456 | break | |
457 | end | |
458 | finish = loadPage(finish) | |
459 | if finish == "error" then | |
460 | return "error" | |
461 | end | |
462 | end | |
463 | end | |
464 | ||
465 | function removeSel(rSel) | |
466 | if rSel == 1 then | |
467 | term.setCursorPos(1,1) | |
468 | term.clearLine() | |
469 | write(remove1) | |
470 | event, key = os.pullEvent("key") | |
471 | if key == 205 then | |
472 | return removeSel(2) | |
473 | elseif key == 28 then | |
474 | return true | |
475 | else | |
476 | return removeSel(1) | |
477 | end | |
478 | elseif rSel == 2 then | |
479 | term.setCursorPos(1,1) | |
480 | term.clearLine() | |
481 | write(remove2) | |
482 | event, key = os.pullEvent("key") | |
483 | if key == 203 then | |
484 | return removeSel(1) | |
485 | elseif key == 28 then | |
486 | return false | |
487 | else | |
488 | return removeSel(2) | |
489 | end | |
490 | end | |
491 | end | |
492 | ||
493 | function saveList(fsList) | |
494 | f = io.open("/.serverlist", "w") | |
495 | toWrite = textutils.serialize(fsList) | |
496 | f:write(toWrite) | |
497 | f:close() | |
498 | end | |
499 | ||
500 | function serverList() | |
501 | if not fs.exists("/.serverlist") then | |
502 | f = io.open("/.serverlist", "w") | |
503 | serTable = textutils.serialize({"Add new server"}) | |
504 | serverNew = true | |
505 | f:write(serTable) | |
506 | f:close() | |
507 | end | |
508 | f = io.open("/.serverlist", "r") | |
509 | - | serStart = f:read("*l") |
509 | + | serStart = f:read("*a") |
510 | f:close() | |
511 | serList = textutils.unserialize(serStart) | |
512 | if type(serList) == "table" then | |
513 | local toRemove = nil | |
514 | serReturn, toRemove = serverDrawGUI(serList, 0, 1, "Server List") | |
515 | if serReturn == "Add new server" then | |
516 | term.setCursorPos(1, 1) | |
517 | write("Add: http://") | |
518 | local newAddress = read() | |
519 | start = ("http://" .. newAddress) | |
520 | if string.sub(string.len(start), string.len(start)) == "/" then | |
521 | home = start | |
522 | else | |
523 | home = (start .. "/") | |
524 | end | |
525 | table.insert(serList, 1, home) | |
526 | saveList(serList) | |
527 | return serverList() | |
528 | elseif serReturn == "remove" then | |
529 | rRemove = removeSel(1) | |
530 | if rRemove then table.remove(serList, toRemove) | |
531 | saveList(serList) | |
532 | end | |
533 | return serverList() | |
534 | elseif serReturn == "exit" then | |
535 | term.clear() | |
536 | welcome() | |
537 | else | |
538 | home = serReturn | |
539 | if main() == "error" then | |
540 | return "error" | |
541 | end | |
542 | ||
543 | end | |
544 | else | |
545 | term.setCursorPos(1, 1) | |
546 | term.clearLine() | |
547 | print("Server list is corrupted! [Ok]") | |
548 | os.pullEvent("key") | |
549 | return "error" | |
550 | end | |
551 | end | |
552 | ||
553 | function welcome() | |
554 | term.clear() | |
555 | term.setCursorPos(1, 1) | |
556 | print("Welcome!") | |
557 | print("=================================================") | |
558 | print("Use the arrow keys to navigate") | |
559 | print("Press enter to download/run files or open folders") | |
560 | print("Press \"Q\" to exit the browser") | |
561 | print("Press \"R\" to remove servers in the server list") | |
562 | print(" ") | |
563 | welRe = welcomeSelect(1) | |
564 | if welRe == 1 then | |
565 | if not fs.exists("/.previous") then | |
566 | f = io.open("/.previous", "w") | |
567 | f:write("http://previous") | |
568 | f:close() | |
569 | end | |
570 | f = io.open("/.previous", "r") | |
571 | home = f:read("*l") | |
572 | f:close() | |
573 | if main() == "error" then return | |
574 | welcome() end | |
575 | elseif welRe == 2 then | |
576 | term.setCursorPos(1, 8) | |
577 | term.clearLine() | |
578 | print("Server Address:") | |
579 | write("http://") | |
580 | local address = read() | |
581 | start = ("http://" .. address) | |
582 | if string.sub(string.len(start), string.len(start)) == "/" then | |
583 | home = start | |
584 | else | |
585 | home = (start .. "/") | |
586 | end | |
587 | f = io.open("/.previous", "w") | |
588 | f:write(home) | |
589 | f:close() | |
590 | if main() == "error" then return welcome() end | |
591 | elseif welRe == 3 then | |
592 | if serverList() == "error" then return welcome() end | |
593 | else | |
594 | term.clear() | |
595 | term.setCursorPos(1, 1) | |
596 | return "end" | |
597 | end | |
598 | end | |
599 | ||
600 | welcome() |