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
|