aboutsummaryrefslogtreecommitdiff
path: root/src/main/ranks.lua
blob: a8dbc2b644893a697fdebab36346763dbac56201 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
skycraft.ranks = {
	player = {
        privs = {"interact", "shout", "skycraft"},
        color = "#FFFFFF",
        tag = "",
    },
    vip = {
		color = "#4FFF00",
		tag = "[VIP]",
	},
    mvp = {
		color = "#00B6B3",
		tag = "[MVP]",
	},
	creative = {
		privs = {"give", "fly", "fast"},
		color = "#FF9C00",
		tag = "[Creative]",
	},
	mod = {
		privs = {"kick", "ban", "noclip", "settime", "teleport", "bring", "protection_bypass", "worldedit"},
		color = "#006BFF",
		tag = "[Moderator]",
	},
	dev = {
		privs = {"server", "privs"},
		color = "#9D00FF",
		tag = "[Developer]",
	},
	admin = {
		color = "#FF001C",
		tag = "[Admin]",
	},
	owner = {
		color = "#D90059",
		tag = "[Owner]",
	},
}

skycraft.offline_ranks = {
	offline = {
		color = "#969696",
		tag = "[Offline]",
	},
	console = {
		color = "#000000",
		tag = "[Console]",
	},
}

function skycraft.get_rank(name)
	local player = minetest.get_player_by_name(name)
	if not player then
		return skycraft.offline_ranks[(minetest.settings:get("name") == name) and "console" or "offline"]
	end
	local rank = player:get_meta():get_string("rank")
	rank = (rank == "") and "player" or rank
	return skycraft.ranks[rank]
end

function skycraft.get_player_name(name, brackets)
    local rank = skycraft.get_rank(name)
    local rank_tag = minetest.colorize(rank.color, rank.tag)
	if not brackets then 
		brackets = {"",""}
	end
	return rank_tag .. brackets[1] .. name .. brackets[2]
end

function skycraft.update_nametag(player)
	player:set_nametag_attributes({color = skycraft.get_rank(player:get_player_name()).color})
end

minetest.register_on_joinplayer(function(player)
	skycraft.update_nametag(player)
end)

minetest.register_on_leaveplayer(function(player)
    minetest.chat_send_all(skycraft.get_player_name(player:get_player_name()) .. " left the Server")
    skycraft.update_nametag(player)
end)

minetest.register_on_chat_message(function(name, message)
    minetest.chat_send_all(skycraft.get_player_name(name, {"<", ">"}) .. " " .. message)
    return true
end)

minetest.register_chatcommand("rank", {
	params = "<player> <rank>",
	description = "Set a player's rank (owner|admin|dev|mod|creative|mvp|vip|player)",
	privs = {privs = true},
	func = function(name, param)
		local target = param:split(" ")[1] or ""
		local target_ref = minetest.get_player_by_name(target)
		local rank = param:split(" ")[2] or ""
		local rank_ref = skycraft.ranks[rank]
		if not rank_ref then 
			return false, "Invalid Rank '" .. rank .. "'."
		elseif not target_ref then
			return false, "Player '" .. target .. "' is not online."
        else
			local privs = {}
			for k, v in pairs(skycraft.ranks) do
				for _, priv in pairs(v.privs or {}) do
					privs[priv] = true
				end
				if k == rank then
					break
				end
			end
			target_ref:get_meta():set_string("rank", rank)
			minetest.set_player_privs(target, privs)
			skycraft.update_nametag(target_ref)
			return true, "The rank of '" .. target .. "' has been updated to '" .. rank .. "'." 
		end
	end,
})