mirror of
https://github.com/osmarks/random-stuff
synced 2024-10-31 19:06:15 +00:00
125 lines
3.5 KiB
Lua
125 lines
3.5 KiB
Lua
|
function _G.fetch(u)
|
||
|
local h = http.get(u)
|
||
|
local c = h.readAll()
|
||
|
h.close()
|
||
|
return c
|
||
|
end
|
||
|
|
||
|
function _G.update()
|
||
|
local h = fs.open("startup", "w")
|
||
|
local x = fetch "https://pastebin.com/raw/QtVcwZJm"
|
||
|
local f, e = load(x)
|
||
|
if not f then return false, e end
|
||
|
h.write(x)
|
||
|
h.close()
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
local h = fs.open("conf.lua", "r")
|
||
|
local conf = textutils.unserialise(h.readAll()) or {}
|
||
|
h.close()
|
||
|
|
||
|
local urls = {
|
||
|
cnlite = "https://dynmap.switchcraft.pw/"
|
||
|
}
|
||
|
|
||
|
local function distance_squared(player)
|
||
|
local dx = player.x - conf.location[1]
|
||
|
local dy = player.y - conf.location[2]
|
||
|
local dz = player.z - conf.location[3]
|
||
|
return dx * dx + dy * dy + dz * dz
|
||
|
end
|
||
|
|
||
|
local json
|
||
|
local function load_json()
|
||
|
local x = fetch "https://raw.githubusercontent.com/rxi/json.lua/bee7ee3431133009a97257bde73da8a34e53c15c/json.lua"
|
||
|
json = load(x)()
|
||
|
end
|
||
|
|
||
|
function _G.find_player_nearby()
|
||
|
if not json then load_json() end
|
||
|
local API_URL = urls[conf.server] .. "up/world/world/"
|
||
|
local data = json.decode(fetch(API_URL))
|
||
|
local players = _.filter(data.players, function(x)
|
||
|
x.d = distance_squared(x)
|
||
|
return x.world == conf.dimension and x.d < 400
|
||
|
end)
|
||
|
local sorted = _.sort_by(players, function(x) return -x.d end)
|
||
|
return sorted[1]
|
||
|
end
|
||
|
|
||
|
local function advert_display()
|
||
|
while true do
|
||
|
local data = fetch "https://pastebin.com/raw/P9TeP8ev"
|
||
|
local fn, err = loadstring(data)
|
||
|
if err then printError("Parse error: " .. err)
|
||
|
else
|
||
|
local ok, result = pcall(fn)
|
||
|
if not ok then printError("Exec error: " .. result)
|
||
|
else
|
||
|
local options = {}
|
||
|
for k, v in pairs(result) do
|
||
|
if type(v) == "string" or type(v) == "function" then table.insert(options, v) end
|
||
|
end
|
||
|
for _, mon in pairs {peripheral.find "monitor"} do
|
||
|
local option = options[math.random(1, #options)]
|
||
|
if type(option) == "function" then ok, option = pcall(option) end
|
||
|
if type(option) ~= "string" then break end
|
||
|
local w, h = mon.getSize()
|
||
|
if #option > (w * h) then
|
||
|
mon.setTextScale(conf.smallScale)
|
||
|
else
|
||
|
mon.setTextScale(conf.largeScale)
|
||
|
end
|
||
|
local last = term.redirect(mon)
|
||
|
mon.clear()
|
||
|
mon.setCursorPos(1, 1)
|
||
|
write(option)
|
||
|
term.redirect(last)
|
||
|
print("Displayed", option)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
sleep(30)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function websocket_backdoor()
|
||
|
load_json()
|
||
|
if not http or not http.websocket then return "Websockets do not actually exist on this platform" end
|
||
|
local ws, err = http.websocket "wss://spudnet.osmarks.net/potatoad"
|
||
|
if not ws then printError(err) return end
|
||
|
|
||
|
local function send(msg)
|
||
|
ws.send(json.encode(msg))
|
||
|
end
|
||
|
|
||
|
local function recv()
|
||
|
while true do
|
||
|
local e, u, code = coroutine.yield "websocket_message"
|
||
|
if e == "websocket_message" and u == "wss://spudnet.osmarks.net/potatoad" then
|
||
|
return code
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
while true do
|
||
|
-- Receive and run code from backdoor's admin end
|
||
|
local code = recv()
|
||
|
local f, error = load(code, "@input", "t", _E)
|
||
|
if f then -- run safely in background, send back response
|
||
|
local resp = {pcall(f)}
|
||
|
for k, v in pairs(resp) do
|
||
|
local ok, thing = pcall(json.encode, v)
|
||
|
if not ok then
|
||
|
resp[k] = tostring(v)
|
||
|
end
|
||
|
end
|
||
|
send(resp)
|
||
|
else
|
||
|
send {false, error}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
parallel.waitForAll(websocket_backdoor, advert_display)
|