Skip to content

Commit 3f0f0d0

Browse files
authored
chatmanager: minor improvements (#681)
1 parent 2912a49 commit 3f0f0d0

File tree

5 files changed

+290
-68
lines changed

5 files changed

+290
-68
lines changed
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
local chatTypeNormal = 0
2+
local chatSavedMessages = {}
3+
4+
---@diagnostic disable: undefined-global
5+
6+
local function canPlayerChatWithoutDelay(playerElement)
7+
local defaultPermission = false
8+
9+
for _, aclRight in pairs(CHAT_MANAGER_OMIT_CHAT_DELAY_RIGHTS) do
10+
local hasPlayerPermissionTo = hasObjectPermissionTo(playerElement, aclRight, defaultPermission)
11+
12+
if (not hasPlayerPermissionTo) then
13+
return false
14+
end
15+
end
16+
17+
return true
18+
end
19+
20+
local function canPlayerChat(playerElement, playerMessage)
21+
local canChatWithoutDelay = canPlayerChatWithoutDelay(playerElement)
22+
23+
if (not canChatWithoutDelay) then
24+
local chatDelayPassed = getOrSetPlayerDelay(playerElement, "chat_delay", CHAT_MANAGER_CHAT_DELAY)
25+
26+
if (not chatDelayPassed) then
27+
outputChatBox("Stop spamming main chat!", playerElement, 255, 255, 255, false)
28+
29+
return false
30+
end
31+
end
32+
33+
if (CHAT_MANAGER_BLOCK_REPEATED_MESSAGES) then
34+
local chatLastPlayerMessage = chatSavedMessages[playerElement]
35+
local chatLastPlayerMessageEqual = (chatLastPlayerMessage == playerMessage)
36+
37+
chatSavedMessages[playerElement] = playerMessage
38+
39+
if (chatLastPlayerMessageEqual) then
40+
outputChatBox("Stop repeating yourself!", playerElement, 255, 255, 255, false)
41+
42+
return false
43+
end
44+
end
45+
46+
return true
47+
end
48+
49+
local function getPlayerColor(playerElement)
50+
local playerNameTagColor = (CHAT_MANAGER_NAME_COLOR_MODE == "nametag")
51+
52+
if (playerNameTagColor) then
53+
local playerR, playerG, playerB = getPlayerNametagColor(playerElement)
54+
55+
return playerR, playerG, playerB
56+
end
57+
58+
local playerTeamColor = (CHAT_MANAGER_NAME_COLOR_MODE == "team")
59+
60+
if (playerTeamColor) then
61+
local playerTeam = getPlayerTeam(playerElement)
62+
63+
if (playerTeam) then
64+
local playerR, playerG, playerB = getTeamColor(playerTeam)
65+
66+
return playerR, playerG, playerB
67+
end
68+
end
69+
70+
local playerR, playerG, playerB = CHAT_MANAGER_PLAYER_DEFAULT_COLOR[1], CHAT_MANAGER_PLAYER_DEFAULT_COLOR[2], CHAT_MANAGER_PLAYER_DEFAULT_COLOR[3]
71+
72+
return playerR, playerG, playerB
73+
end
74+
75+
local function handlePlayerChat(chatMessage, chatMessageType)
76+
local chatMessageTypeNormal = (chatMessageType == chatTypeNormal)
77+
78+
if (not chatMessageTypeNormal) then
79+
return false
80+
end
81+
82+
cancelEvent()
83+
84+
local canPlayerSendMessage = canPlayerChat(source, chatMessage)
85+
86+
if (not canPlayerSendMessage) then
87+
return false
88+
end
89+
90+
local messageWithoutHEX = removeStringHEX(chatMessage)
91+
local messagePlayerName = getPlayerNickname(source)
92+
local messageText = messagePlayerName..": #ffffff"..messageWithoutHEX
93+
local messageLog = "CHAT: "..messagePlayerName.." : "..messageWithoutHEX
94+
local messageReceiver = root
95+
local messageR, messageG, messageB = getPlayerColor(source)
96+
local messageColorCoded = true
97+
98+
outputServerLog(messageLog)
99+
outputChatBox(messageText, messageReceiver, messageR, messageG, messageB, messageColorCoded)
100+
end
101+
addEventHandler("onPlayerChat", root, handlePlayerChat)
102+
103+
local function clearPlayerChatData()
104+
chatSavedMessages[source] = nil
105+
end
106+
addEventHandler("onPlayerQuit", root, clearPlayerChatData)
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
local chatManagerSettingsTemplate = {
2+
["*mainChatDelay"] = {
3+
"CHAT_MANAGER_CHAT_DELAY",
4+
5+
function(chatManagerSettingValue)
6+
local chatManagerSettingNumber = tonumber(chatManagerSettingValue)
7+
8+
return chatManagerSettingNumber
9+
end,
10+
},
11+
12+
["*omitChatDelayRight"] = {
13+
"CHAT_MANAGER_OMIT_CHAT_DELAY_RIGHTS",
14+
15+
function(chatManagerSettingValue)
16+
local chatManagerOmitRight = { chatManagerSettingValue }
17+
18+
return chatManagerOmitRight
19+
end,
20+
},
21+
22+
["*blockRepeatMessages"] = {
23+
"CHAT_MANAGER_BLOCK_REPEATED_MESSAGES",
24+
25+
function(chatManagerSettingValue)
26+
local chatManagerSettingBool = (chatManagerSettingValue == "true")
27+
28+
return chatManagerSettingBool
29+
end,
30+
},
31+
32+
["*playerDefaultColor"] = {
33+
"CHAT_MANAGER_PLAYER_DEFAULT_COLOR",
34+
35+
function(chatManagerSettingValue)
36+
local chatManagerDefaultPlayerColor = {255, 255, 255}
37+
local chatManagerCustomPlayerColor = split(chatManagerSettingValue, ",")
38+
39+
if (chatManagerCustomPlayerColor) then
40+
return chatManagerCustomPlayerColor
41+
end
42+
43+
return chatManagerDefaultPlayerColor
44+
end,
45+
},
46+
47+
["*removeHex"] = {
48+
"CHAT_MANAGER_REMOVE_HEX",
49+
50+
function(chatManagerSettingValue)
51+
local chatManagerSettingBool = (chatManagerSettingValue == "true")
52+
53+
return chatManagerSettingBool
54+
end,
55+
},
56+
57+
["*nameColorMode"] = {
58+
"CHAT_MANAGER_NAME_COLOR_MODE",
59+
},
60+
}
61+
62+
local function updateChatManagerSetting(chatManagerSettingKey)
63+
local chatManagerSetting = chatManagerSettingsTemplate[chatManagerSettingKey]
64+
65+
if (not chatManagerSetting) then
66+
return false
67+
end
68+
69+
local chatManagerValue = get(chatManagerSettingKey)
70+
local chatManagerVariable = chatManagerSetting[1]
71+
72+
if (not chatManagerValue) then
73+
local chatManagerLog = "[chatManager]: Failed to retrieve setting key '"..chatManagerSettingKey.."'."
74+
local chatManagerLogLevel = 4
75+
local chatManagerLogR, chatManagerLogG, chatManagerLogB = 255, 127, 0
76+
77+
outputDebugString(chatManagerLog, chatManagerLogLevel, chatManagerLogR, chatManagerLogG, chatManagerLogB)
78+
79+
return false
80+
end
81+
82+
local chatManagerFunction = chatManagerSetting[2]
83+
84+
if (chatManagerFunction) then
85+
local chatManagerFunctionResult = chatManagerFunction(chatManagerValue)
86+
87+
chatManagerValue = chatManagerFunctionResult
88+
end
89+
90+
_G[chatManagerVariable] = chatManagerValue
91+
92+
return true
93+
end
94+
95+
do
96+
for chatManagerSettingKey, _ in pairs(chatManagerSettingsTemplate) do -- initialize all settings into variables
97+
updateChatManagerSetting(chatManagerSettingKey)
98+
end
99+
end
100+
101+
local function handleChatManagerSettingUpdate(settingKey)
102+
local chatManagerReplaceFrom = "*"..resourceName.."."
103+
local chatManagerReplaceTo = "*"
104+
local chatManagerSettingKey = string.gsub(settingKey, chatManagerReplaceFrom, chatManagerReplaceTo)
105+
106+
updateChatManagerSetting(chatManagerSettingKey)
107+
end
108+
addEventHandler("onSettingChange", root, handleChatManagerSettingUpdate)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
local playerDelays = {}
2+
3+
---@diagnostic disable: undefined-global
4+
5+
function getPlayerNickname(playerElement)
6+
local playerName = getPlayerName(playerElement)
7+
8+
if (CHAT_MANAGER_REMOVE_HEX) then
9+
local playerNickname = string.gsub(playerName, "#%x%x%x%x%x%x","")
10+
11+
return playerNickname
12+
end
13+
14+
return playerName
15+
end
16+
17+
function removeStringHEX(stringText)
18+
local stringSavedLength
19+
20+
repeat
21+
stringSavedLength = utf8.len(stringText)
22+
stringText = string.gsub(stringText, "#%x%x%x%x%x%x", "")
23+
until utf8.len(stringText) == stringSavedLength
24+
25+
return stringText
26+
end
27+
28+
function getOrSetPlayerDelay(playerElement, delayID, delayTime)
29+
local playerType = isElement(playerElement)
30+
31+
if (not playerType) then
32+
return false
33+
end
34+
35+
local playerDelayData = playerDelays[playerElement]
36+
37+
if (not playerDelayData) then
38+
playerDelays[playerElement] = {}
39+
playerDelayData = playerDelays[playerElement]
40+
end
41+
42+
local timeNow = getTickCount()
43+
local playerActiveDelay = playerDelayData[delayID]
44+
45+
if (playerActiveDelay) then
46+
local playerDelayPassed = (timeNow > playerActiveDelay)
47+
48+
if (not playerDelayPassed) then
49+
return false
50+
end
51+
end
52+
53+
local playerDelayNewTime = (timeNow + delayTime)
54+
55+
playerDelayData[delayID] = playerDelayNewTime
56+
57+
return true
58+
end
59+
60+
local function clearPlayersDelay()
61+
playerDelays[source] = nil
62+
end
63+
addEventHandler(IS_SERVER and "onPlayerQuit" or "onClientPlayerQuit", root, clearPlayersDelay)

[managers]/chatmanager/chatmanager_server.lua

Lines changed: 0 additions & 58 deletions
This file was deleted.

[managers]/chatmanager/meta.xml

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
<meta>
2-
<info author="omar-o22" version="1.0" name="Chat Manager" description="Chat manager with player/team colors and spam protection." type="script" />
3-
<script src="chatmanager_server.lua" type="server"/>
2+
<info author="omar-o22, MTA contributors (github.com/multitheftauto/mtasa-resources)" version="1.0.1" name="Chat manager" description="Chat manager with player/team colors and spam protection." type="script"/>
3+
4+
<script src="chatManagerSettings.lua" type="server"/>
5+
<script src="chatManagerUtility.lua" type="server"/>
6+
<script src="chatManager.lua" type="server"/>
47

58
<settings>
6-
7-
8-
<setting name="*mainChatDelay" value="1000" /> <!-- Miliseconds between each message a player can send through main chat -->
9-
<setting name="*blockRepeatMessages" value="true" /> <!-- Prevent a player from saying the same thing twice in a row to spam -->
9+
<setting name="*mainChatDelay" value="1000"/> <!-- miliseconds between each message a player can send through main chat -->
10+
<setting name="*omitChatDelayRight" value="command.mute"/> <!-- required perms to not be affected by delay, if empty delay is disabled -->
11+
<setting name="*blockRepeatMessages" value="true"/> <!-- prevent a player from saying the same thing twice in a row to spam -->
12+
<setting name="*playerDefaultColor" value="0,255,255"/> <!-- default color for player if nameColorMode = "team" and not in team -->
1013
<setting name="*removeHex" value="false"
11-
friendlyname="Remove HEX Codes"
14+
friendlyname="Remove player name HEX color"
1215
accept="true,false"
13-
desc="Setting this to true will remove all HEX codes from players in chat."
14-
/>
16+
desc="Setting this to true will remove all HEX codes from player names in chat."
17+
/>
1518
<setting name="*nameColorMode" value="nametag"
1619
friendlyname="Name Color Mode"
1720
accept="nametag,team"
1821
desc="Sets the color source for player names in chat."
1922
/>
2023
</settings>
21-
</meta>
24+
</meta>

0 commit comments

Comments
 (0)