mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
121 lines
3.3 KiB
Lua
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
|