Add more ways to pass data to check_player_privs

The callback can now be invoked with either the player object or name as
the first parameter, and with either a table or a list of strings, like
this:

    minetest.check_player_privs(player_name, { shout = true, fly = true })
    minetest.check_player_privs(player_name, "shout", "fly")
    minetest.check_player_privs(player, { shout = true, fly = true })
    minetest.check_player_privs(player, "shout", "fly")
This commit is contained in:
Robert Zenz 2015-09-03 21:28:38 +02:00 committed by est31
parent 37c1e20127
commit c32847838d
2 changed files with 29 additions and 7 deletions

@ -74,18 +74,37 @@ function core.after(time, func, ...)
} }
end end
function core.check_player_privs(name, privs) function core.check_player_privs(player_or_name, ...)
local name = player_or_name
-- Check if we have been provided with a Player object.
if type(name) ~= "string" then
name = name:get_player_name()
end
local requested_privs = {...}
local player_privs = core.get_player_privs(name) local player_privs = core.get_player_privs(name)
local missing_privileges = {} local missing_privileges = {}
for priv, val in pairs(privs) do
if val if type(requested_privs[1]) == "table" then
and not player_privs[priv] then -- We were provided with a table like { privA = true, privB = true }.
for priv, value in pairs(requested_privs[1]) do
if value and not player_privs[priv] then
table.insert(missing_privileges, priv) table.insert(missing_privileges, priv)
end end
end end
else
-- Only a list, we can process it directly.
for key, priv in pairs(requested_privs) do
if not player_privs[priv] then
table.insert(missing_privileges, priv)
end
end
end
if #missing_privileges > 0 then if #missing_privileges > 0 then
return false, missing_privileges return false, missing_privileges
end end
return true, "" return true, ""
end end

@ -1924,8 +1924,11 @@ Call these functions only at load time!
* `minetest.set_player_privs(name, {priv1=true,...})` * `minetest.set_player_privs(name, {priv1=true,...})`
* `minetest.get_player_privs(name) -> {priv1=true,...}` * `minetest.get_player_privs(name) -> {priv1=true,...}`
* `minetest.auth_reload()` * `minetest.auth_reload()`
* `minetest.check_player_privs(name, {priv1=true,...})`: returns `bool, missing_privs` * `minetest.check_player_privs(player_or_name, ...)`: returns `bool, missing_privs`
* A quickhand for checking privileges * A quickhand for checking privileges.
* `player_or_name`: Either a Player object or the name of a player.
* `...` is either a list of strings, e.g. `"priva", "privb"` or
a table, e.g. `{ priva = true, privb = true }`.
* `minetest.get_player_ip(name)`: returns an IP address string * `minetest.get_player_ip(name)`: returns an IP address string
`minetest.set_player_password`, `minetest_set_player_privs`, `minetest_get_player_privs` `minetest.set_player_password`, `minetest_set_player_privs`, `minetest_get_player_privs`