3.6 KiB
title | layout | root |
---|---|---|
Privileges | default | ../ |
Introduction
Privileges allow server owners to grant or revoke the right to do certain actions.
- When should a priv be used?
- Checking for privileges
- Getting and Setting
When should a priv be used?
A privilege should give a player the right to do something. They are not for indicating class or status.
The main admin of a server (the name set by the name
setting) has all privileges
given to them.
Good:
- interact
- shout
- noclip
- fly
- kick
- ban
- vote
- worldedit
- area_admin - admin functions of one mod is ok
Bad:
- moderator
- admin
- elf
- dwarf
Declaring a privilege
{% highlight lua %} minetest.register_privilege("vote", { description = "Can vote on issues", give_to_singleplayer = true }) {% endhighlight %}
If give_to_singleplayer
is true, then you can remove it as that's the default
value when not specified:
{% highlight lua %} minetest.register_privilege("vote", { description = "Can vote on issues" }) {% endhighlight %}
Checking for privileges
There is a quicker way of checking that a player has all the required privileges:
{% highlight lua %} local has, missing = minetest.check_player_privs(player_or_name, { interact = true, vote = true }) {% endhighlight %}
has
is true if the player has all the privileges needed.\
If has
is false, then missing
will contain a dictionary
of missing privileges[checking needed].
{% highlight lua %} if minetest.check_player_privs(name, {interact=true, vote=true}) then print("Player has all privs!") else print("Player is missing some privs!") end
local has, missing = minetest.check_player_privs(name, { interact = true, vote = true }) if has then print("Player has all privs!") else print("Player is missing privs: " .. dump(missing)) end {% endhighlight %}
Getting and Setting
You can get a table containing a player's privileges using minetest.get_player_privs
:
{% highlight lua %} local privs = minetest.get_player_privs(name) print(dump(privs)) {% endhighlight %}
This works whether or not a player is logged in.\ Running that example may give the following:
{% highlight lua %} { fly = true, interact = true, shout = true } {% endhighlight %}
To set a player's privs, you use minetest.set_player_privs
:
{% highlight lua %} minetest.set_player_privs(name, { interact = true, shout = true }) {% endhighlight %}
To grant a player some privs, you would use a mixture of those two:
{% highlight lua %} local privs = minetest.get_player_privs(name) privs.vote = true minetest.set_player_privs(name, privs) {% endhighlight %}
Adding privileges to basic_privs
Workaround / PR pending
This is a workaround for a missing feature.
I have submitted a
<a href="https://github.com/minetest/minetest/pull/3976">pull request / patch</a>
to make it so you don't need to edit builtin to add a priv to basic_privs.
To allow people with basic_privs to grant and revoke your priv, you'll need to edit builtin/game/chatcommands.lua:
In both grant and revoke, change the following if statement:
{% highlight lua %} if priv ~= "interact" and priv ~= "shout" and not core.check_player_privs(name, {privs=true}) then return false, "Your privileges are insufficient." end {% endhighlight %}
For example, to add vote:
{% highlight lua %} if priv ~= "interact" and priv ~= "shout" and priv ~= "vote" and not core.check_player_privs(name, {privs=true}) then return false, "Your privileges are insufficient." end {% endhighlight %}