2024-05-27 08:59:28 -07:00

76 lines
3.5 KiB
Lua

--local bc = better_commands--local bc = better_commands
local S = minetest.get_translator(minetest.get_current_modname())
better_commands.register_command("ability", {
params = S("<player> <priv> [value]"),
description = S("Sets <priv> of <player> to [value] (true/false). If [value] is not supplied, returns the existing value of <priv>"),
privs = {privs = true},
func = function(name, param, context)
local split_param = better_commands.parse_params(param)
if not split_param[1] then
return false, nil, 0
end
local set = split_param[3] and split_param[3][3]:lower()
if set and set ~= "true" and set ~= "false" then
return false, better_commands.error(S("[value] must be true or false (or missing), not '@1'", set)), 0
end
local targets, err = better_commands.parse_selector(split_param[1], context, true)
if err or not targets then return false, better_commands.error(err), 0 end
local priv = split_param[2] and split_param[2][3]
local target = targets[1]
if target.is_player and target:is_player() then
local target_name = target:get_player_name()
local privs = minetest.get_player_privs(target_name)
if not set then
if not priv then
local message = ""
local first = true
local count = 0
local sortable_privs = {}
for player_priv, value in pairs(privs) do
if value then
table.insert(sortable_privs, player_priv)
count = count + 1
end
end
table.sort(sortable_privs)
for _, player_priv in ipairs(sortable_privs) do
if not first then message = message..", " else first = false end
message = message..player_priv
end
return true, message, count
else
if minetest.registered_privileges[priv] then
return true, S("@1 = @2", priv, tostring(privs[priv])), 1
else
return false, better_commands.error(S("Invalid privilege '@1'", priv)), 0
end
end
else
if not minetest.registered_privileges[priv] then
return false, better_commands.error(S("Invalid privilege '@1'", priv)), 0
else
if set == "true" then
privs[priv] = true
else
privs[priv] = nil
end
minetest.set_player_privs(target_name, privs)
minetest.chat_send_player(target_name, S(
"@1 privilege @2 by @3",
priv,
set == "true" and "granted" or "revoked",
better_commands.format_name(name)
))
return true, S(
"@1 privilege @2 for @3",
set == "true" and "Granted" or "Revoked",
priv,
better_commands.format_name(name)
), 1
end
end
end
return false, better_commands.error(S("No entity was found")), 0
end
})