1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/features/permissions.lua
2024-10-18 12:39:52 +02:00

121 lines
3.3 KiB
Lua

local Command = require 'utils.command'
local Event = require 'utils.event'
local Ranks = require 'resources.ranks'
local Global = require 'utils.global'
local data = {
initialized_permissions = false,
}
Global.register(data, function(tbl)
data = tbl
end)
local config = storage.config.permissions
local Public = {}
-- defines.input_action listed at https://lua-api.factorio.com/latest/defines.html#defines.input_action
local DEFAULT_PRESETS_ACTIONS = {
no_blueprints = {
[defines.input_action.import_blueprint] = false,
[defines.input_action.import_blueprint_string] = false,
[defines.input_action.import_blueprints_filtered] = false,
[defines.input_action.import_permissions_string] = false,
[defines.input_action.open_blueprint_library_gui] = false,
[defines.input_action.open_blueprint_record] = false,
[defines.input_action.upgrade_opened_blueprint_by_record] = false,
},
no_handcraft= {
[defines.input_action.craft] = false,
}
}
for preset_name, preset_actions in pairs(DEFAULT_PRESETS_ACTIONS) do
config.modes[preset_name] = config.modes[preset_name] or preset_actions
end
---Returns config.preset.any(true)
---@return boolean
function Public.any_preset()
for preset_name, is_enabled in pairs(config.presets or {}) do
if is_enabled and config.modes[preset_name] ~= nil then return true end
end
return false
end
---Sets all permissions for the "Default" group to true
function Public.reset_all_permissions()
local Default = game.permissions.get_group("Default")
for _, action_ID in pairs(defines.input_action) do
Default.set_allows_action(action_ID, true)
end
end
---Sets permissions for the "Default" group
---@param params config.permissions
function Public.set_permissions(params)
if params then
for name, actions in pairs(params.modes or {}) do
config.modes[name] = actions
end
for name, is_enabled in pairs(params.presets or {}) do
config.presets[name] = is_enabled
end
end
local Default = game.permissions.get_group("Default")
for name, actions in pairs(config.modes or {}) do
if config.presets[name] then
for action, is_allowed in pairs(actions or {}) do
Default.set_allows_action(action, is_allowed)
end
end
end
end
---Init permissions for multiplayer servers
--- 'game.is_multiplayer()' is not available on 'on_init'
Event.add(defines.events.on_player_joined_game, function()
if config.enabled
and not data.initialized_permissions
and game.is_multiplayer()
and Public.any_preset()
then
Public.set_permissions()
data.initialized_permissions = true
end
end)
---Use "/permissions-reset" to reset all players' permissions to default for the "Default" group (admin/server only)
Command.add(
'permissions-reset',
{
description = {'command_description.permissions_reset'},
arguments = {},
required_rank = Ranks.admin,
allowed_by_server = true
},
function()
Public.reset_all_permissions()
end
)
---Use "/permissions-set-scenario" to reapply scenario's permissions, if any, for the "Default" group (admin/server only)
Command.add(
'permissions-set-scenario',
{
description = {'command_description.permissions_set_scenario'},
arguments = {},
required_rank = Ranks.admin,
allowed_by_server = true
},
function()
Public.set_permissions()
end
)
return Public