]> git.lizzy.rs Git - elidragon_v2.git/blob - mods/elidragon_ranks/init.lua
Improvements and fixes to the rank system
[elidragon_v2.git] / mods / elidragon_ranks / init.lua
1 local playerdb = elidragon.playerdb
2
3 local ranks = {}
4
5 local players = playerdb.players
6 local admin = minetest.settings:get("name")
7 local server = minetest.settings:get("server_name")
8 playerdb.initial_data.rank = "player"
9
10 function ranks.get(name)
11         local rank
12         if name == "rpc" then
13                 rank = "system"
14         else
15                 local playerdata = players[name]
16                 if playerdata then
17                         rank = playerdata.rank
18                 else
19                         rank = name == admin and "console" or "offline"
20                 end
21         end
22         return rank, ranks.defs[rank]
23 end
24
25 function ranks.get_player_name(name, brackets)
26         local _, def = ranks.get(name)
27         brackets = brackets or {"", ""}
28         return minetest.colorize("#" .. def.color, def.tag) .. brackets[1] .. name .. brackets[2]
29 end
30
31 function ranks.reload(player)
32         local name = player:get_player_name()
33         local rank, def = ranks.get(name)
34         player:set_nametag_attributes({text = rank == "system" and "" or ranks.get_player_name(name)})
35         minetest.set_player_privs(name, assert(def.privs))
36 end
37
38 function ranks.set(name, rank)
39         if name == "rpc" then
40                 return false, "The rank of the rpc player cannot be changed."
41         end
42         local rank_def = ranks.defs[rank]
43         if not rank_def or rank_def.can_assign == false then
44                 return false, "Invalid rank."
45         end
46         local player = minetest.get_player_by_name(name)
47         if not player then
48                 return false, name .. " is not online."
49         end
50         local playerdata = players[name]
51         playerdata.rank = rank
52         playerdata:save()
53         ranks.reload(player)
54 end
55
56 minetest.register_on_joinplayer(ranks.reload)
57
58 function minetest.send_join_message(name)
59         if name ~= "rpc" then
60                 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " joined " .. server .. ".")
61         end
62 end
63
64 function minetest.send_leave_message(name, timed_out)
65         if name ~= "rpc" then
66                 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " left " .. server .. (timed_out and " (timed out)" or "") .. ".")
67         end
68 end
69
70 minetest.register_on_chat_message(function(name, message)
71         if not minetest.check_player_privs(name, {shout = true}) then
72                 return
73         end
74         minetest.chat_send_all(ranks.get_player_name(name, {"<", ">"}) .. " " .. message)
75         return true
76 end)
77
78 minetest.register_chatcommand("rank", {
79         params = "<player> <rank>",
80         description = "Set a player's rank",
81         privs = {privs = true},
82         func = function(name, param)
83                 local target = param:split(" ")[1] or ""
84                 local rank = param:split(" ")[2] or ""
85                 return ranks.set(target, rank)
86         end,
87 })
88
89 local function get_privs_setting(setting, tbl)
90         local privs = minetest.string_to_privs(minetest.settings:get(setting))
91         if tbl then
92                 for k, v in pairs(tbl) do
93                         privs[k] = v
94                 end
95         end
96         return privs
97 end
98
99 minetest.register_on_mods_loaded(function()
100         local all_privs = minetest.registered_privileges
101         local default_privs = get_privs_setting("default_privs")
102         local moderator_privs = get_privs_setting("moderator_privs", default_privs)
103         local vip_privs = get_privs_setting("vip_privs", default_privs)
104         local mvp_privs = get_privs_setting("mvp_privs", vip_privs)
105
106
107         ranks.defs = {
108                 developer = {
109                         tag = "[Developer]",
110                         color = "900A00",
111                         description = "The Developer rank is for the admins who maintain the server software.",
112                         privs = all_privs,
113                 },
114                 admin = {
115                         tag = "[Admin]",
116                         color = "FF2D8D",
117                         description = "The Admin rank is for people with ssh access to the server, they have all privileges. They are members of the Elidragon group.",
118                         privs = all_privs,
119                 },
120                 moderator = {
121                         tag = "[Moderator]",
122                         color = "006BFF",
123                         description = "People who moderate the server.",
124                         privs = moderator_privs,
125                 },
126                 contributor = {
127                         tag = "[Contributor]",
128                         color = "9D00FF",
129                         description = "The Contributor rank is for people that contribute to the server software. It has the same privs as the MVP rank.",
130                         privs = mvp_privs,
131                 },
132                 builder = {
133                         tag = "[Builder]",
134                         color = "FF9C00",
135                         description = "The Builder rank is for people that have helped constructing the buildings in the lobby etc. It has the same privs as the MVP rank.",
136                         privs = mvp_privs,
137                 },
138                 mvp = {
139                         tag = "[MVP]",
140                         color = "0CDCD8",
141                         description = "The MVP rank can be purchased in out store (upcoming). It is purely cosmetic.",
142                         privs = mvp_privs,
143                 },
144                 vip = {
145                         tag = "[VIP]",
146                         color = "2BEC37",
147                         description = "The VIP rank can be purchased in out store (upcoming). It is purely cosmetic.",
148                         privs = vip_privs,
149                 },
150                 player = {
151                         tag = "",
152                         color = "FFFFFF",
153                         description = "This is the rank for normal players.",
154                         privs = default_privs,
155                 },
156                 console = {
157                         tag = "[Console]",
158                         color = "000000",
159                         description = "This is an offline rank for the console.",
160                         can_assign = false,
161                 },
162                 offline = {
163                         tag = "[Offline]",
164                         color = "969696",
165                         description = "This is the default offline rank.",
166                         can_assign = false,
167                 },
168                 system = {
169                         tag = "[System]",
170                         color = "505050",
171                         description = "This is the rank for the rpc player, which is a bot.",
172                         privs = {},
173                         can_assign = false,
174                 },
175         }
176 end)