]> git.lizzy.rs Git - elidragon_v2.git/blob - mods/elidragon_ranks/init.lua
a8fa335615d79848ea0ce4ad7f5948f850f5818f
[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 _, rank_def = ranks.get(name)
27         brackets = brackets or {"", ""}
28         return minetest.colorize("#" .. rank_def.color, rank_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, 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(rank_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 local function filter_rpc(func)
57         for _, player in ipairs(minetest.get_connected_players()) do
58                 local name = player:get_player_name()
59                 if name ~= "rpc" then
60                         func(player, name)
61                 end
62         end
63 end
64
65 function playerlist.iterator()
66         local players = {}
67         filter_rpc(function(player, name)
68                 local _, rank_def = ranks.get(name)
69                 table.insert(players, {
70                         ref = player,
71                         color = tonumber(rank_def.color, 16),
72                         value = rank_def.value,
73                 })
74         end)
75         table.sort(players, function(a, b)
76                 return a.value > b.value
77         end)
78         local i = 0
79         return function()
80                 i = i + 1
81                 local player = players[i]
82                 if player then
83                         return i, player.ref, player.color
84                 end
85         end
86 end
87
88 function playerlist.count()
89         local count = 0
90         filter_rpc(function()
91                 count = count + 1
92         end)
93         return count
94 end
95
96 minetest.register_on_joinplayer(ranks.reload)
97
98 function minetest.send_join_message(name)
99         if name ~= "rpc" then
100                 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " joined " .. server .. ".")
101         end
102 end
103
104 function minetest.send_leave_message(name, timed_out)
105         if name ~= "rpc" then
106                 minetest.chat_send_all("*** " .. ranks.get_player_name(name) .. " left " .. server .. (timed_out and " (timed out)" or "") .. ".")
107         end
108 end
109
110 minetest.register_on_chat_message(function(name, message)
111         if not minetest.check_player_privs(name, {shout = true}) then
112                 return
113         end
114         minetest.chat_send_all(ranks.get_player_name(name, {"<", ">"}) .. " " .. message)
115         return true
116 end)
117
118 minetest.register_chatcommand("rank", {
119         params = "<player> <rank>",
120         description = "Set a player's rank",
121         privs = {privs = true},
122         func = function(name, param)
123                 local target = param:split(" ")[1] or ""
124                 local rank = param:split(" ")[2] or ""
125                 return ranks.set(target, rank)
126         end,
127 })
128
129 local function get_privs_setting(setting, tbl)
130         local privs = minetest.string_to_privs(minetest.settings:get(setting))
131         if tbl then
132                 for k, v in pairs(tbl) do
133                         privs[k] = v
134                 end
135         end
136         return privs
137 end
138
139 minetest.register_on_mods_loaded(function()
140         local all_privs = minetest.registered_privileges
141         local default_privs = get_privs_setting("default_privs")
142         local moderator_privs = get_privs_setting("moderator_privs", default_privs)
143         local vip_privs = get_privs_setting("vip_privs", default_privs)
144         local mvp_privs = get_privs_setting("mvp_privs", vip_privs)
145
146
147         ranks.defs = {
148                 developer = {
149                         tag = "[Developer]",
150                         color = "900A00",
151                         description = "The Developer rank is for the admins who maintain the server software.",
152                         privs = all_privs,
153                         value = 7,
154                 },
155                 admin = {
156                         tag = "[Admin]",
157                         color = "FF2D8D",
158                         description = "The Admin rank is for people with ssh access to the server, they have all privileges. They are members of the Elidragon group.",
159                         privs = all_privs,
160                         value = 6,
161                 },
162                 moderator = {
163                         tag = "[Moderator]",
164                         color = "006BFF",
165                         description = "People who moderate the server.",
166                         privs = moderator_privs,
167                         value = 5,
168                 },
169                 contributor = {
170                         tag = "[Contributor]",
171                         color = "9D00FF",
172                         description = "The Contributor rank is for people that contribute to the server software. It has the same privs as the MVP rank.",
173                         privs = mvp_privs,
174                         value = 4,
175                 },
176                 builder = {
177                         tag = "[Builder]",
178                         color = "FF9C00",
179                         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.",
180                         privs = mvp_privs,
181                         value = 3,
182                 },
183                 mvp = {
184                         tag = "[MVP]",
185                         color = "0CDCD8",
186                         description = "The MVP rank can be purchased in out store (upcoming). It is purely cosmetic.",
187                         privs = mvp_privs,
188                         value = 2,
189                 },
190                 vip = {
191                         tag = "[VIP]",
192                         color = "2BEC37",
193                         description = "The VIP rank can be purchased in out store (upcoming). It is purely cosmetic.",
194                         privs = vip_privs,
195                         value = 1,
196                 },
197                 player = {
198                         tag = "",
199                         color = "FFFFFF",
200                         description = "This is the rank for normal players.",
201                         privs = default_privs,
202                         value = 0,
203                 },
204                 console = {
205                         tag = "[Console]",
206                         color = "000000",
207                         description = "This is an offline rank for the console.",
208                         can_assign = false,
209                 },
210                 offline = {
211                         tag = "[Offline]",
212                         color = "969696",
213                         description = "This is the default offline rank.",
214                         can_assign = false,
215                 },
216                 system = {
217                         tag = "[System]",
218                         color = "505050",
219                         description = "This is the rank for the rpc player, which is a bot.",
220                         privs = {},
221                         can_assign = false,
222                 },
223         }
224 end)
225
226 elidragon.ranks = ranks