0b9cb03bae
Downloads latest script from server if outdated (10 seconds) Server sends encrypted token to client to keep session new and rejects ..old tokens This allows updating the script in this repository
137 lines
3.7 KiB
Lua
137 lines
3.7 KiB
Lua
local secretToken = "$TOKEN"
|
|
local connectionUri = "ws://ws.cnml.de:8081"
|
|
local waitSeconds = 5
|
|
|
|
local function chunkString(value, chunkSize)
|
|
if not chunkSize then chunkSize = 10000 end
|
|
local length = value:len()
|
|
local total = math.ceil(length / chunkSize)
|
|
local chunks = {}
|
|
local i = 1
|
|
for i=1,total do
|
|
local pos = 1 + ((i - 1) * chunkSize)
|
|
chunks[i] = value:sub(pos, pos + chunkSize - 1)
|
|
end
|
|
return total, chunks
|
|
end
|
|
|
|
local function sendJson(socket, message)
|
|
return socket.send(textutils.serializeJSON(message))
|
|
end
|
|
|
|
local function sendResponse(socket, id, result, success)
|
|
if success == nil then success = true end
|
|
|
|
if not success then
|
|
sendJson(socket, { id = id, result = result, success = success })
|
|
return
|
|
end
|
|
|
|
local total, chunks = chunkString(result)
|
|
for i, chunk in pairs(chunks) do
|
|
sendJson(socket, { id = id, result = chunk, chunk = i, total = total, success = success })
|
|
end
|
|
end
|
|
|
|
-- error: no rs system
|
|
-- return rssystem rs
|
|
local function getPeripheral(name)
|
|
local dev = peripheral.find(name)
|
|
if not dev then error("No peripheral '"..name.."' attached to the computer!") end
|
|
return dev
|
|
end
|
|
|
|
-- error: any error during execution
|
|
-- return string result
|
|
local function getResponse(parsed)
|
|
if parsed.method == "energyusage" then
|
|
return tostring(getPeripheral("rsBridge").getEnergyUsage())
|
|
elseif parsed.method == "energystorage" then
|
|
return tostring(getPeripheral("rsBridge").getEnergyStorage())
|
|
elseif parsed.method == "listitems" then
|
|
return textutils.serializeJSON(getPeripheral("rsBridge").listItems())
|
|
elseif parsed.method == "listfluids" then
|
|
return textutils.serializeJSON(getPeripheral("rsBridge").listFluids())
|
|
elseif parsed.method == "craft" then
|
|
return tostring(getPeripheral("rsBridge").craftItem(parsed.params))
|
|
end
|
|
|
|
error("No message handler for method: "..parsed.method.."!")
|
|
end
|
|
|
|
local function logJSON(json, prefix)
|
|
if not prefix then prefix = "" end
|
|
for k,v in pairs(json) do
|
|
local key = prefix..k
|
|
if type(v) == "table" then
|
|
logJSON(v, key..".")
|
|
else
|
|
print(key, "=", textutils.serializeJSON(v))
|
|
end
|
|
end
|
|
end
|
|
|
|
-- return bool success
|
|
local function handleMessage(socket, message)
|
|
local parsed, reason = textutils.unserializeJSON(message)
|
|
if not parsed then
|
|
print("Received message:", message)
|
|
printError("Message could not be parsed:", reason)
|
|
return false
|
|
end
|
|
|
|
pcall(function() print("Received JSON:") logJSON(parsed) end)
|
|
|
|
if parsed.type == "request" then
|
|
local success, result = pcall(function() return getResponse(parsed) end)
|
|
sendResponse(socket, parsed.id, result, success)
|
|
return true
|
|
end
|
|
|
|
printError("Invalid message type:", parsed.type)
|
|
return false
|
|
end
|
|
|
|
local function socketClient()
|
|
print("Connecting to the socket server at "..connectionUri.."...")
|
|
local socket, reason = http.websocket(connectionUri)
|
|
if not socket then error("Socket server could not be reached: "..reason) end
|
|
print("Connection successful!")
|
|
|
|
socket.send("login="..secretToken)
|
|
while true do
|
|
local message, binary = socket.receive()
|
|
if not not message and not binary then
|
|
if message == "outdated" then
|
|
printError("Current script is outdated! Please update from the host!")
|
|
return
|
|
end
|
|
handleMessage(socket, message)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function termWaiter()
|
|
os.pullEvent("terminate")
|
|
end
|
|
|
|
local function services()
|
|
parallel.waitForAny(termWaiter, function()
|
|
parallel.waitForAll(socketClient)
|
|
end)
|
|
end
|
|
|
|
local function main()
|
|
while true do
|
|
local status, error = pcall(services)
|
|
if status then break end
|
|
printError("An uncaught exception was raised:", error)
|
|
printError("Restarting in", waitSeconds, "seconds...")
|
|
sleep(waitSeconds)
|
|
end
|
|
end
|
|
|
|
local oldPullEvent = os.pullEvent
|
|
os.pullEvent = os.pullEventRaw
|
|
pcall(main)
|
|
os.pullEvent = oldPullEvent |