mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 03:25:23 +09:00
Add Clusterio Plugins
This commit is contained in:
125
exp_groups/module/control.lua
Normal file
125
exp_groups/module/control.lua
Normal file
@@ -0,0 +1,125 @@
|
||||
local clusterio_api = require("modules/clusterio/api")
|
||||
local Global = require("modules/exp_util/global")
|
||||
local Groups = require("modules/exp_groups")
|
||||
|
||||
local pending_updates = {}
|
||||
Global.register(pending_updates, function(tbl)
|
||||
pending_updates = tbl
|
||||
end)
|
||||
|
||||
local function on_permission_group_added(event)
|
||||
if not event.player_index then return end
|
||||
pending_updates[event.group.name] = {
|
||||
created = true,
|
||||
sync_all = true,
|
||||
tick = event.tick,
|
||||
permissions = {},
|
||||
players = {},
|
||||
}
|
||||
end
|
||||
|
||||
local function on_permission_group_deleted(event)
|
||||
if not event.player_index then return end
|
||||
local existing = pending_updates[event.group_name]
|
||||
pending_updates[event.group_name] = nil
|
||||
if not existing or not existing.created then
|
||||
clusterio_api.send_json("exp_groups-permission_group_delete", {
|
||||
group = event.group_name,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
local function on_permission_group_edited(event)
|
||||
if not event.player_index then return end
|
||||
local pending = pending_updates[event.group.name]
|
||||
if not pending then
|
||||
pending = {
|
||||
tick = event.tick,
|
||||
permissions = {},
|
||||
players = {},
|
||||
}
|
||||
pending_updates[event.group.name] = pending
|
||||
end
|
||||
pending.tick = event.tick
|
||||
|
||||
if event.type == "add-permission" then
|
||||
if not pending.sync_all then
|
||||
pending.permissions[event.action] = true
|
||||
end
|
||||
elseif event.type == "remove-permission" then
|
||||
if not pending.sync_all then
|
||||
pending.permissions[event.action] = false
|
||||
end
|
||||
elseif event.type == "enable-all" then
|
||||
pending.sync_all = true
|
||||
elseif event.type == "disable-all" then
|
||||
pending.sync_all = true
|
||||
elseif event.type == "add-player" then
|
||||
local player = game.get_player(event.other_player_index) --- @cast player -nil
|
||||
pending.players[player.name] = true
|
||||
elseif event.type == "remove-player" then
|
||||
local player = game.get_player(event.other_player_index) --- @cast player -nil
|
||||
pending.players[player.name] = nil
|
||||
elseif event.type == "rename" then
|
||||
pending.created = true
|
||||
pending.sync_all = true
|
||||
local old = pending_updates[event.old_name]
|
||||
if old then pending.players = old.players end
|
||||
on_permission_group_deleted{
|
||||
tick = event.tick, player_index = event.player_index, group_name = event.old_name
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local function send_updates()
|
||||
local tick = game.tick - 600 -- 10 Seconds
|
||||
local done = {}
|
||||
for group_name, pending in pairs(pending_updates) do
|
||||
if pending.tick < tick then
|
||||
done[group_name] = true
|
||||
if pending.sync_all then
|
||||
clusterio_api.send_json("exp_groups-permission_group_create", {
|
||||
group = group_name, defiantion = Groups.get_group(group_name):to_json(true)
|
||||
})
|
||||
else
|
||||
if next(pending.players) then
|
||||
clusterio_api.send_json("exp_groups-permission_group_edit", {
|
||||
type = "assign_players", group = group_name, changes = table.get_keys(pending.players)
|
||||
})
|
||||
end
|
||||
local add, remove = {}, {}
|
||||
for permission, state in pairs(pending.permissions) do
|
||||
if state then
|
||||
add[#add + 1] = permission
|
||||
else
|
||||
remove[#remove + 1] = permission
|
||||
end
|
||||
end
|
||||
if next(add) then
|
||||
clusterio_api.send_json("exp_groups-permission_group_edit", {
|
||||
type = "add_permissions", group = group_name, changes = Groups.actions_to_names(add)
|
||||
})
|
||||
end
|
||||
if next(remove) then
|
||||
clusterio_api.send_json("exp_groups-permission_group_edit", {
|
||||
type = "remove_permissions", group = group_name, changes = Groups.actions_to_names(remove)
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
for group_name in pairs(done) do
|
||||
pending_updates[group_name] = nil
|
||||
end
|
||||
end
|
||||
|
||||
return {
|
||||
events = {
|
||||
[defines.events.on_permission_group_added] = on_permission_group_added,
|
||||
[defines.events.on_permission_group_deleted] = on_permission_group_deleted,
|
||||
[defines.events.on_permission_group_edited] = on_permission_group_edited,
|
||||
},
|
||||
on_nth_tick = {
|
||||
[300] = send_updates,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user