mirror of
https://github.com/citizenfx/cfx-server-data.git
synced 2025-12-12 14:24:02 +01:00
chat: wip rework as chat2
This commit is contained in:
@@ -7,18 +7,161 @@ RegisterServerEvent('_chat:messageEntered')
|
||||
RegisterServerEvent('chat:clear')
|
||||
RegisterServerEvent('__cfx_internal:commandFallback')
|
||||
|
||||
AddEventHandler('_chat:messageEntered', function(author, color, message)
|
||||
exports('addMessage', function(target, message)
|
||||
if not message then
|
||||
message = target
|
||||
target = -1
|
||||
end
|
||||
|
||||
if not target or not message then return end
|
||||
|
||||
TriggerClientEvent('chat:addMessage', target, message)
|
||||
end)
|
||||
|
||||
local hooks = {}
|
||||
local hookIdx = 1
|
||||
|
||||
exports('registerMessageHook', function(hook)
|
||||
local resource = GetInvokingResource()
|
||||
hooks[hookIdx + 1] = {
|
||||
fn = hook,
|
||||
resource = resource
|
||||
}
|
||||
|
||||
hookIdx = hookIdx + 1
|
||||
end)
|
||||
|
||||
local modes = {}
|
||||
|
||||
exports('registerMode', function(modeData)
|
||||
if not modeData.name or not modeData.displayName or not modeData.cb then
|
||||
return false
|
||||
end
|
||||
|
||||
local resource = GetInvokingResource()
|
||||
|
||||
modes[modeData.name] = modeData
|
||||
modes[modeData.name].resource = resource
|
||||
|
||||
TriggerClientEvent('chat:addMode', -1, {
|
||||
name = modeData.name,
|
||||
displayName = modeData.displayName,
|
||||
color = modeData.color or '#fff'
|
||||
})
|
||||
|
||||
return true
|
||||
end)
|
||||
|
||||
local function unregisterHooks(resource)
|
||||
local toRemove = {}
|
||||
|
||||
for k, v in pairs(hooks) do
|
||||
if v.resource == resource then
|
||||
table.insert(toRemove, k)
|
||||
end
|
||||
end
|
||||
|
||||
for _, v in ipairs(toRemove) do
|
||||
hooks[v] = nil
|
||||
end
|
||||
|
||||
toRemove = {}
|
||||
|
||||
for k, v in pairs(modes) do
|
||||
if v.resource == resource then
|
||||
table.insert(toRemove, k)
|
||||
end
|
||||
end
|
||||
|
||||
for _, v in ipairs(toRemove) do
|
||||
TriggerClientEvent('chat:removeMode', -1, {
|
||||
name = v
|
||||
})
|
||||
|
||||
modes[v] = nil
|
||||
end
|
||||
end
|
||||
|
||||
AddEventHandler('_chat:messageEntered', function(author, color, message, mode)
|
||||
if not message or not author then
|
||||
return
|
||||
end
|
||||
|
||||
TriggerEvent('chatMessage', source, author, message)
|
||||
local source = source
|
||||
|
||||
if not WasEventCanceled() then
|
||||
TriggerClientEvent('chatMessage', -1, author, { 255, 255, 255 }, message)
|
||||
local outMessage = {
|
||||
color = { 255, 255, 255 },
|
||||
multiline = true,
|
||||
args = { message }
|
||||
}
|
||||
|
||||
if author ~= "" then
|
||||
outMessage.args = { author, message }
|
||||
end
|
||||
|
||||
print(author .. '^7: ' .. message .. '^7')
|
||||
local messageCanceled = false
|
||||
local routingTarget = -1
|
||||
|
||||
local hookRef = {
|
||||
updateMessage = function(t)
|
||||
-- shallow merge
|
||||
for k, v in pairs(t) do
|
||||
if k == 'template' then
|
||||
outMessage['template'] = v:gsub('%{%}', outMessage['template'] or '@default')
|
||||
elseif k == 'params' then
|
||||
if not outMessage.params then
|
||||
outMessage.params = {}
|
||||
end
|
||||
|
||||
for pk, pv in pairs(v) do
|
||||
outMessage.params[pk] = pv
|
||||
end
|
||||
else
|
||||
outMessage[k] = v
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
cancel = function()
|
||||
messageCanceled = true
|
||||
end,
|
||||
|
||||
setRouting = function(target)
|
||||
routingTarget = target
|
||||
end
|
||||
}
|
||||
|
||||
if message:sub(1, 1) ~= '/' then
|
||||
for _, hook in pairs(hooks) do
|
||||
if hook.fn then
|
||||
hook.fn(source, outMessage, hookRef)
|
||||
end
|
||||
end
|
||||
|
||||
if modes[mode] then
|
||||
local m = modes[mode]
|
||||
|
||||
m.cb(source, outMessage, hookRef)
|
||||
end
|
||||
end
|
||||
|
||||
if messageCanceled then
|
||||
return
|
||||
end
|
||||
|
||||
TriggerEvent('chatMessage', source, #outMessage.args > 1 and outMessage.args[1] or '', outMessage.args[#outMessage.args])
|
||||
|
||||
if not WasEventCanceled() then
|
||||
if type(routingTarget) ~= 'table' then
|
||||
TriggerClientEvent('chat:addMessage', routingTarget, outMessage)
|
||||
else
|
||||
for _, id in ipairs(routingTarget) do
|
||||
TriggerClientEvent('chat:addMessage', id, outMessage)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
print(author .. '^7' .. (modes[mode] and (' (' .. modes[mode].displayName .. ')') or '') .. ': ' .. message .. '^7')
|
||||
end)
|
||||
|
||||
AddEventHandler('__cfx_internal:commandFallback', function(command)
|
||||
@@ -34,11 +177,19 @@ AddEventHandler('__cfx_internal:commandFallback', function(command)
|
||||
end)
|
||||
|
||||
-- player join messages
|
||||
AddEventHandler('chat:init', function()
|
||||
AddEventHandler('playerJoining', function()
|
||||
if GetConvarInt('chat_showJoins', 1) == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) .. ' joined.')
|
||||
end)
|
||||
|
||||
AddEventHandler('playerDropped', function(reason)
|
||||
if GetConvarInt('chat_showQuits', 1) == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
TriggerClientEvent('chatMessage', -1, '', { 255, 255, 255 }, '^2* ' .. GetPlayerName(source) ..' left (' .. reason .. ')')
|
||||
end)
|
||||
|
||||
@@ -77,3 +228,7 @@ AddEventHandler('onServerResourceStart', function(resName)
|
||||
refreshCommands(player)
|
||||
end
|
||||
end)
|
||||
|
||||
AddEventHandler('onResourceStop', function(resName)
|
||||
unregisterHooks(resName)
|
||||
end)
|
||||
Reference in New Issue
Block a user