mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-12 07:04:52 +09:00
Review feedback from Cooldude2606: UDP is most useful for arbitrary blobs, so send_udp now takes any string and the packet is just "channel?payload". Plugins get it as a udp-<channel> event with the payload as a Buffer, or through handleUdp which logs handler errors like handle does for ipc events. The host socket is now opened when the RCON client is started and closed where the RCON client is ended, matching how the RCON client is handled, instead of being bound in start() and closed by _resetState. The integration round trip moved to the FactorioServer tests, where it sends a packet each way through a real server without the module. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
81 lines
1.9 KiB
Lua
81 lines
1.9 KiB
Lua
-- Important: Keep this API in sync with modules/clusterio/api.lua
|
|
local compat = require("compat")
|
|
local api = {}
|
|
|
|
|
|
local initialized = false
|
|
function api.init()
|
|
if initialized then
|
|
return
|
|
end
|
|
initialized = true
|
|
|
|
if remote.interfaces.clusterio_api then
|
|
api.events = remote.call("clusterio_api", "get_events")
|
|
else
|
|
local null_event = script.generate_event_name()
|
|
api.events = {
|
|
on_instance_updated = null_event,
|
|
on_server_startup = null_event,
|
|
}
|
|
end
|
|
end
|
|
|
|
local function call_api(fn, ...)
|
|
if remote.interfaces.clusterio_api and remote.interfaces.clusterio_api[fn] then
|
|
return remote.call("clusterio_api", fn, ...)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
function api.get_instance_name()
|
|
return call_api("get_instance_name")
|
|
end
|
|
|
|
function api.get_instance_id()
|
|
return call_api("get_instance_id")
|
|
end
|
|
|
|
|
|
local function escape_channel(channel)
|
|
-- Escape bad characters. The question mark is used for separating the
|
|
-- channel name from the payload.
|
|
return channel:gsub("([\x00-\x1f?\\])", function(match)
|
|
return "\\x" .. string.format("%02x", match:byte())
|
|
end)
|
|
end
|
|
|
|
function api.send_json(channel, data)
|
|
if not remote.interfaces.clusterio_api then
|
|
return
|
|
end
|
|
|
|
channel = escape_channel(channel)
|
|
data = compat.table_to_json(data)
|
|
|
|
-- If there's more than about 4kB of data users running with the Windows
|
|
-- console open will start to experience stuttering, otherwise we could
|
|
-- output about 1 MB of data at a time through stdout.
|
|
if #data < 4000 then
|
|
print("\f$ipc:" .. channel .. "?j" .. data)
|
|
else
|
|
local file_no = remote.call("clusterio_api", "get_file_no")
|
|
local file_name = "clst_" .. file_no .. ".json"
|
|
compat.write_file(file_name, data, false, 0)
|
|
print("\f$ipc:" .. channel .. "?f" .. file_name)
|
|
end
|
|
end
|
|
|
|
function api.send_udp(channel, data)
|
|
local port = call_api("get_host_udp_port")
|
|
if not port then
|
|
return -- Lua UDP is not enabled for this instance
|
|
end
|
|
|
|
helpers.send_udp(port, escape_channel(channel) .. "?" .. data, 0)
|
|
end
|
|
|
|
|
|
return api
|