-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathchat.lua
More file actions
175 lines (140 loc) · 5.21 KB
/
chat.lua
File metadata and controls
175 lines (140 loc) · 5.21 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
--[[
Mod MultiChat para Minetest
Copyright (C) 2017 BrunoMine (https://github.com/BrunoMine)
Recebeste uma cópia da GNU Lesser General
Public License junto com esse software,
se não, veja em <http://www.gnu.org/licenses/>.
Chat
]]
local S = multichat.S
minetest.register_privilege("chat_admin", S("Usar chat como administrador"))
minetest.register_privilege("chat_staff", S("Usar chat como moderador"))
-- Grupos privados de cada jogador
multichat.grupos = {}
-- Pegar prefixos
S = multichat.Sfake
multichat.admin_prefix = minetest.setting_get("multichat_admin_prefix") or S("ADMIN")
multichat.staff_prefix = minetest.setting_get("multichat_staff_prefix") or S("MODERADOR")
S = multichat.S
local tocar_som = function(player) minetest.sound_play("multichat_aviso", {object = player,gain = 0.5,max_hear_distance = 1}) end
local tocar_chamada = function(player) minetest.sound_play("multichat_chamada", {object = player,gain = 0.5,max_hear_distance = 1}) end
-- Emitir som de aviso
multichat.som_avisar = function(name, msg)
local player = minetest.get_player_by_name(name)
-- Verificar se vai ser som de chamada
if msg
and player:get_attribute("multichat_chamada") ~= "false"
and string.find(msg, name) ~= nil
then
tocar_chamada(player)
-- Verifica se vai ser som normal
elseif player:get_attribute("multichat_som") ~= "false" then
tocar_som(player)
end
end
local som_avisar = multichat.som_avisar
-- Pegar prefixo
multichat.prefixo = function(name)
if minetest.check_player_privs(name, {chat_admin=true}) then return "["..S(multichat.admin_prefix).."]" end
if minetest.check_player_privs(name, {chat_staff=true}) then return "["..S(multichat.staff_prefix).."]" end
return ""
end
-- Enviar mensagem para jogador
local enviar_msg = function(name, msg, falante)
local player = minetest.get_player_by_name(name)
if player == nil then return end
local status = player:get_attribute("multichat_status")
-- Verifica se o jogador está no bate-papo público
if status == nil or status == "pub" then
minetest.chat_send_player(name, "<"..multichat.prefixo(falante)..falante.."> "..msg)
-- Evita avisar a si mesmo
if name ~= falante then
som_avisar(name, msg)
else
som_avisar(name)
end
-- Verificar se está desativado
elseif status == "off" then
return
-- Verifica se o jogador está ouvindo apenas seu grupo de guilda
elseif status == "guilda" then
minetest.chat_send_player(name, "<"..multichat.prefixo(falante)..falante.."> "..msg)
-- Evita avisar a si mesmo
if name ~= falante then
som_avisar(name, msg)
else
som_avisar(name)
end
-- Verifica se jogador está ouvindo apenas seu grupo privado
elseif status == "grupo" and multichat.grupos[name] then
-- Verifica se falante está no grupo
if multichat.grupos[name][falante] then
minetest.chat_send_player(name, "<"..multichat.prefixo(falante)..falante.."> "..msg)
som_avisar(name, msg)
end
end
end
-- Chamada para envio de mensagens de jogadores
local function on_chat_message(name, msg)
-- Verifica se tem privilegio para falar
if msg:sub(1, 1) == "/" or not minetest.get_player_by_name(name) then
return
end
if not minetest.check_player_privs(name, {shout=true}) then return true end
local player = minetest.get_player_by_name(name)
local status = player:get_attribute("multichat_status")
-- Verifica se o jogador está no bate-papo público
if status == nil or status == "pub" then
-- Envia a mensagem para todos os jogadores
for _,player in ipairs(minetest.get_connected_players()) do
enviar_msg(player:get_player_name(), msg, name)
end
if minetest.get_modpath("irc") then
irc.say("<" .. name.. "> " .. msg)
end
-- Verificar se está desativado
elseif status == "off" then
minetest.chat_send_player(name, "Bate-papo desativado")
-- Verifica se jogador está falando apenas com seu grupo
elseif status == "guilda" then
-- Verifica se o recurso esta ativo
if not multichat.guild then return true end
-- Mod manipulus
if multichat.mod_guild == "manipulus" then
-- Guilda do ouvinte
local mg = manipulus.get_player_grupo(name)
-- Verifica se guilda ainda existe
if mg == nil or not manipulus.existe_grupo(mg) then return true end
-- Envia a mensagem para todos os jogadores
for _,player in ipairs(minetest.get_connected_players()) do
local n = player:get_player_name()
if manipulus.get_player_grupo(n) == mg then
enviar_msg(n, msg, name)
end
end
end
-- Verifica se jogador está falando apenas com seu grupo privado
elseif status == "grupo" then
-- Envia a mensagem para todos os jogadores do grupo
for np,v in pairs(multichat.grupos[name] or {}) do
enviar_msg(np, msg, name)
end
-- Envia a si mesmo tambem para aparecer no console
minetest.chat_send_player(name, "<"..multichat.prefixo(name)..name.."> "..msg)
som_avisar(name)
end
return true
end
if minetest.get_modpath("irc") then
table.insert(minetest.registered_on_chat_messages, 2, on_chat_message)
minetest.callback_origins[on_chat_message] = {
mod = "multichat",
name = "on_chat_message"
}
else
minetest.register_on_chat_message(on_chat_message)
end
-- Verificador de jogadores offline para remover grupos
minetest.register_on_leaveplayer(function(player)
multichat.grupos[player:get_player_name()] = nil
end)