Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 106 additions & 0 deletions [managers]/chatmanager/chatManager.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
local chatTypeNormal = 0
local chatSavedMessages = {}

---@diagnostic disable: undefined-global

local function canPlayerChatWithoutDelay(playerElement)
local defaultPermission = false

for _, aclRight in pairs(CHAT_MANAGER_OMIT_CHAT_DELAY_RIGHTS) do
local hasPlayerPermissionTo = hasObjectPermissionTo(playerElement, aclRight, defaultPermission)

if (not hasPlayerPermissionTo) then
return false
end
end

return true
end

local function canPlayerChat(playerElement, playerMessage)
local canChatWithoutDelay = canPlayerChatWithoutDelay(playerElement)

if (not canChatWithoutDelay) then
local chatDelayPassed = getOrSetPlayerDelay(playerElement, "chat_delay", CHAT_MANAGER_CHAT_DELAY)

if (not chatDelayPassed) then
outputChatBox("Stop spamming main chat!", playerElement, 255, 255, 255, false)

return false
end
end

if (CHAT_MANAGER_BLOCK_REPEATED_MESSAGES) then
local chatLastPlayerMessage = chatSavedMessages[playerElement]
local chatLastPlayerMessageEqual = (chatLastPlayerMessage == playerMessage)

chatSavedMessages[playerElement] = playerMessage

if (chatLastPlayerMessageEqual) then
outputChatBox("Stop repeating yourself!", playerElement, 255, 255, 255, false)

return false
end
end

return true
end

local function getPlayerColor(playerElement)
local playerNameTagColor = (CHAT_MANAGER_NAME_COLOR_MODE == "nametag")

if (playerNameTagColor) then
local playerR, playerG, playerB = getPlayerNametagColor(playerElement)

return playerR, playerG, playerB
end

local playerTeamColor = (CHAT_MANAGER_NAME_COLOR_MODE == "team")

if (playerTeamColor) then
local playerTeam = getPlayerTeam(playerElement)

if (playerTeam) then
local playerR, playerG, playerB = getTeamColor(playerTeam)

return playerR, playerG, playerB
end
end

local playerR, playerG, playerB = CHAT_MANAGER_PLAYER_DEFAULT_COLOR[1], CHAT_MANAGER_PLAYER_DEFAULT_COLOR[2], CHAT_MANAGER_PLAYER_DEFAULT_COLOR[3]

return playerR, playerG, playerB
end

local function handlePlayerChat(chatMessage, chatMessageType)
local chatMessageTypeNormal = (chatMessageType == chatTypeNormal)

if (not chatMessageTypeNormal) then
return false
end

cancelEvent()

local canPlayerSendMessage = canPlayerChat(source, chatMessage)

if (not canPlayerSendMessage) then
return false
end

local messageWithoutHEX = removeStringHEX(chatMessage)
local messagePlayerName = getPlayerNickname(source)
local messageText = messagePlayerName..": #ffffff"..messageWithoutHEX
local messageLog = "CHAT: "..messagePlayerName.." : "..messageWithoutHEX
local messageReceiver = root
local messageR, messageG, messageB = getPlayerColor(source)
local messageColorCoded = true

outputServerLog(messageLog)
outputChatBox(messageText, messageReceiver, messageR, messageG, messageB, messageColorCoded)
end
addEventHandler("onPlayerChat", root, handlePlayerChat)

local function clearPlayerChatData()
chatSavedMessages[source] = nil
end
addEventHandler("onPlayerQuit", root, clearPlayerChatData)
108 changes: 108 additions & 0 deletions [managers]/chatmanager/chatManagerSettings.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
local chatManagerSettingsTemplate = {
["*mainChatDelay"] = {
"CHAT_MANAGER_CHAT_DELAY",

function(chatManagerSettingValue)
local chatManagerSettingNumber = tonumber(chatManagerSettingValue)

return chatManagerSettingNumber
end,
},

["*omitChatDelayRight"] = {
"CHAT_MANAGER_OMIT_CHAT_DELAY_RIGHTS",

function(chatManagerSettingValue)
local chatManagerOmitRight = { chatManagerSettingValue }

return chatManagerOmitRight
end,
},

["*blockRepeatMessages"] = {
"CHAT_MANAGER_BLOCK_REPEATED_MESSAGES",

function(chatManagerSettingValue)
local chatManagerSettingBool = (chatManagerSettingValue == "true")

return chatManagerSettingBool
end,
},

["*playerDefaultColor"] = {
"CHAT_MANAGER_PLAYER_DEFAULT_COLOR",

function(chatManagerSettingValue)
local chatManagerDefaultPlayerColor = {255, 255, 255}
local chatManagerCustomPlayerColor = split(chatManagerSettingValue, ",")

if (chatManagerCustomPlayerColor) then
return chatManagerCustomPlayerColor
end

return chatManagerDefaultPlayerColor
end,
},

["*removeHex"] = {
"CHAT_MANAGER_REMOVE_HEX",

function(chatManagerSettingValue)
local chatManagerSettingBool = (chatManagerSettingValue == "true")

return chatManagerSettingBool
end,
},

["*nameColorMode"] = {
"CHAT_MANAGER_NAME_COLOR_MODE",
},
}

local function updateChatManagerSetting(chatManagerSettingKey)
local chatManagerSetting = chatManagerSettingsTemplate[chatManagerSettingKey]

if (not chatManagerSetting) then
return false
end

local chatManagerValue = get(chatManagerSettingKey)
local chatManagerVariable = chatManagerSetting[1]

if (not chatManagerValue) then
local chatManagerLog = "[chatManager]: Failed to retrieve setting key '"..chatManagerSettingKey.."'."
local chatManagerLogLevel = 4
local chatManagerLogR, chatManagerLogG, chatManagerLogB = 255, 127, 0

outputDebugString(chatManagerLog, chatManagerLogLevel, chatManagerLogR, chatManagerLogG, chatManagerLogB)

return false
end

local chatManagerFunction = chatManagerSetting[2]

if (chatManagerFunction) then
local chatManagerFunctionResult = chatManagerFunction(chatManagerValue)

chatManagerValue = chatManagerFunctionResult
end

_G[chatManagerVariable] = chatManagerValue

return true
end

do
for chatManagerSettingKey, _ in pairs(chatManagerSettingsTemplate) do -- initialize all settings into variables
updateChatManagerSetting(chatManagerSettingKey)
end
end

local function handleChatManagerSettingUpdate(settingKey)
local chatManagerReplaceFrom = "*"..resourceName.."."
local chatManagerReplaceTo = "*"
local chatManagerSettingKey = string.gsub(settingKey, chatManagerReplaceFrom, chatManagerReplaceTo)

updateChatManagerSetting(chatManagerSettingKey)
end
addEventHandler("onSettingChange", root, handleChatManagerSettingUpdate)
63 changes: 63 additions & 0 deletions [managers]/chatmanager/chatManagerUtility.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
local playerDelays = {}

---@diagnostic disable: undefined-global

function getPlayerNickname(playerElement)
local playerName = getPlayerName(playerElement)

if (CHAT_MANAGER_REMOVE_HEX) then
local playerNickname = string.gsub(playerName, "#%x%x%x%x%x%x","")

return playerNickname
end

return playerName
end

function removeStringHEX(stringText)
local stringSavedLength

repeat
stringSavedLength = utf8.len(stringText)
stringText = string.gsub(stringText, "#%x%x%x%x%x%x", "")
until utf8.len(stringText) == stringSavedLength

return stringText
end

function getOrSetPlayerDelay(playerElement, delayID, delayTime)
local playerType = isElement(playerElement)

if (not playerType) then
return false
end

local playerDelayData = playerDelays[playerElement]

if (not playerDelayData) then
playerDelays[playerElement] = {}
playerDelayData = playerDelays[playerElement]
end

local timeNow = getTickCount()
local playerActiveDelay = playerDelayData[delayID]

if (playerActiveDelay) then
local playerDelayPassed = (timeNow > playerActiveDelay)

if (not playerDelayPassed) then
return false
end
end

local playerDelayNewTime = (timeNow + delayTime)

playerDelayData[delayID] = playerDelayNewTime

return true
end

local function clearPlayersDelay()
playerDelays[source] = nil
end
addEventHandler(IS_SERVER and "onPlayerQuit" or "onClientPlayerQuit", root, clearPlayersDelay)
58 changes: 0 additions & 58 deletions [managers]/chatmanager/chatmanager_server.lua

This file was deleted.

23 changes: 13 additions & 10 deletions [managers]/chatmanager/meta.xml
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
<meta>
<info author="omar-o22" version="1.0" name="Chat Manager" description="Chat manager with player/team colors and spam protection." type="script" />
<script src="chatmanager_server.lua" type="server"/>
<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"/>

<script src="chatManagerSettings.lua" type="server"/>
<script src="chatManagerUtility.lua" type="server"/>
<script src="chatManager.lua" type="server"/>

<settings>


<setting name="*mainChatDelay" value="1000" /> <!-- Miliseconds between each message a player can send through main chat -->
<setting name="*blockRepeatMessages" value="true" /> <!-- Prevent a player from saying the same thing twice in a row to spam -->
<setting name="*mainChatDelay" value="1000"/> <!-- miliseconds between each message a player can send through main chat -->
<setting name="*omitChatDelayRight" value="command.mute"/> <!-- required perms to not be affected by delay, if empty delay is disabled -->
<setting name="*blockRepeatMessages" value="true"/> <!-- prevent a player from saying the same thing twice in a row to spam -->
<setting name="*playerDefaultColor" value="0,255,255"/> <!-- default color for player if nameColorMode = "team" and not in team -->
<setting name="*removeHex" value="false"
friendlyname="Remove HEX Codes"
friendlyname="Remove player name HEX color"
accept="true,false"
desc="Setting this to true will remove all HEX codes from players in chat."
/>
desc="Setting this to true will remove all HEX codes from player names in chat."
/>
<setting name="*nameColorMode" value="nametag"
friendlyname="Name Color Mode"
accept="nametag,team"
desc="Sets the color source for player names in chat."
/>
</settings>
</meta>
</meta>