mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 03:25:23 +09:00
128 lines
4.4 KiB
Lua
128 lines
4.4 KiB
Lua
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,
|
|
},
|
|
}
|