Skip to content

Instantly share code, notes, and snippets.

@PJB3005
Created September 15, 2017 20:51
Show Gist options
  • Save PJB3005/1d51277d4f874afb74240f42d6db46f6 to your computer and use it in GitHub Desktop.
Save PJB3005/1d51277d4f874afb74240f42d6db46f6 to your computer and use it in GitHub Desktop.
MC OpenComputers SS13 server status poller.
-- I HAVE IMPORTED THE INTERWEB
local internet = require("internet")
local struct = require("struct")
local hex = require("hex")
local urlparse = require("urlparse")
local tprint = require("tprint")
local term = require("term")
local arg = {...}
function make_byond_request(address, port, message)
-- Packet must always start with "?"
if message:sub(1, 1) ~= "?" then
message = "?" .. message
end
-- Build actual packet
local packet = "\x00\x83"
packet = packet .. struct.pack(">H", 6 + string.len(message))
packet = packet .. "\x00\x00\x00\x00\x00"
packet = packet .. message
packet = packet .. "\x00"
-- Write packet to BYOND server.
local socket = internet.open(address, port)
-- print(hex(packet))
socket:setTimeout(2)
socket:write(packet)
socket:flush()
local error = nil
local error_handler = function(e)
error = e
end
local read_response = function()
if socket:read(2) ~= "\x00\x83" then
error("Packet is not a valid BYOND response")
end
local packet_size = struct.unpack(">H", socket:read(2))
local id_byte = socket:read(1)
local received_packet = socket:read(packet_size-1)
if id_byte == "\x2A" then
-- Number, TODO
error("Returning numbers is not supported yet")
elseif id_byte == "\x06" then
-- List!
-- print(received_packet)
response = urlparse(received_packet)
-- tprint(response)
else
error("Unknown ID byte")
end
end
local status = xpcall(read_response, error_handler)
socket:close()
if status then
return response, nil
else
return nil, error
end
end
URL = "baystation12.net"
port = 8000
if #arg == 2 then
URL = arg[1]
port = tonumber(arg[2])
end
while true do
-- print("tock")
local response, err = make_byond_request(URL, port, "?status")
-- print("tick")
term.clear()
if err ~= nil then
print("Unable to fetch status: "..err)
else
print("Player count: "..response.players)
if response.active_players ~= nil then
print("Active players: "..response.active_players)
end
if response.map_name ~= nil then
print("Map: "..response.map_name)
end
if response.map ~= nil then
print("Map: "..response.map)
end
-- print("Revision: "..response.revision)
-- print("Version: "..response.version)
end
os.sleep(5)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment