mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
Add a library mod for wrapping the Clusterio remote API and providing related utilities. This eases development of Clusterio related Lua code by providing the same interface for both mods and modules and also makes the serialize library available without having to duplicate it. It is not possible to implement this through save patching as mods cannot load Lua code from the level code like they can with code from other mods.
68 lines
1.8 KiB
Lua
68 lines
1.8 KiB
Lua
-- Important: Keep this API in sync with modules/clusterio/api.lua
|
|
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
|
|
|
|
|
|
function api.send_json(channel, data)
|
|
if not remote.interfaces.clusterio_api then
|
|
return
|
|
end
|
|
|
|
-- Escape bad characters. The question mark is used for separating the
|
|
-- channel name from the payload.
|
|
channel = channel:gsub("([\x00-\x1f?\\])", function(match)
|
|
return "\\x" .. string.format("%02x", match:byte())
|
|
end)
|
|
|
|
data = game.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"
|
|
game.write_file(file_name, data, false, 0)
|
|
print("\f$ipc:" .. channel .. "?f" .. file_name)
|
|
end
|
|
end
|
|
|
|
|
|
return api
|