ThePython10110 f302f1f073 New stuff
2024-05-29 17:33:04 -07:00

160 lines
7.0 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> <privilege> [<value>]"),
description = S("Sets <privilege> of <player> to <value> (true/false). If <value> is not supplied, returns the existing value of <privilege>"),
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
})
better_commands.register_command("op", {
params = "[<targets>]",
description = "Grants all privileges to the player(s)",
privs = {privs = true},
func = function (name, param, context)
local split_param = better_commands.parse_params(param)
local selector = split_param[1]
local targets = {context.executor}
if selector then
local err
targets, err = better_commands.parse_selector(selector, context)
if err or not targets then return false, better_commands.error(err), 0 end
end
local count = 0
local last
if #targets > 0 then
local privs = {}
for priv in pairs(minetest.registered_privileges) do
privs[priv] = true
end
for _, target in ipairs(targets) do
if target.is_player and target:is_player() then
count = count + 1
last = better_commands.get_entity_name(target)
-- not sure whether I need to copy it or not
minetest.set_player_privs(target:get_player_name(), table.copy(privs))
end
end
end
if count < 1 then
return false, better_commands.error(S("No player was found")), 0
elseif count == 1 then
return true, S("Granted all privileges to @1", last), 1
else
return true, S("Granted all privileges to @1 players", count), count
end
end
})
better_commands.register_command("deop", {
params = "[<targets>]",
description = "Grants all privileges to the player(s)",
privs = {privs = true},
func = function (name, param, context)
local split_param = better_commands.parse_params(param)
local selector = split_param[1]
local targets = {context.executor}
if selector then
local err
targets, err = better_commands.parse_selector(selector, context)
if err or not targets then return false, better_commands.error(err), 0 end
end
local count = 0
local last
if #targets > 0 then
local default_privs_string = minetest.settings:get("default_privs")
local default_privs = {}
if not default_privs_string or default_privs_string == "" then
default_privs = {interact = true, shout = true}
else
local split_privs = string.split(default_privs_string, "%W", false, -1, true)
for _, priv in ipairs(split_privs) do
default_privs[priv] = true
end
end
for _, target in ipairs(targets) do
if target.is_player and target:is_player() then
count = count + 1
last = better_commands.get_entity_name(target)
-- not sure whether I need to copy it or not
minetest.set_player_privs(target:get_player_name(), table.copy(default_privs))
end
end
end
if count < 1 then
return false, better_commands.error(S("No player was found")), 0
elseif count == 1 then
return true, S("Revoked all privileges from to @1", last), 1
else
return true, S("Revoked all privileges from @1 players", count), count
end
end
})