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