monitor/resource/sv_initialData.lua
2025-04-16 22:30:27 +07:00

82 lines
2.4 KiB
Lua

--[[ Helper Functions ]] --
local function logError(x)
txPrint("^1" .. x)
end
--[[ Initial Data Cache ]] --
local CLEANUP_INTERVAL = 60 * 1000
local MAX_AGE = 5 * 60 * 1000
local initialDataCache = {}
local function cacheData(data)
data.ts = GetGameTimer()
initialDataCache[data.netId] = data
end
local function popData(netId)
if not initialDataCache[netId] then return nil end
local data = initialDataCache[netId]
initialDataCache[netId] = nil
return data
end
CreateThread(function()
while true do
local now = GetGameTimer()
for netId, data in pairs(initialDataCache) do
if now - data.ts > MAX_AGE then
initialDataCache[netId] = nil
end
end
Wait(CLEANUP_INTERVAL)
end
end)
--[[ Handle Commands/Events ]] --
local function useInitData(data)
if not data then return end
if data.pendingWarn ~= nil then
TX_EVENT_HANDLERS.playerWarned({
author = data.pendingWarn.author,
reason = data.pendingWarn.reason,
actionId = data.pendingWarn.actionId,
targetNetId = data.pendingWarn.targetNetId,
targetIds = data.pendingWarn.targetIds, --not used
targetName = data.pendingWarn.targetName,
}, false)
end
end
RegisterCommand('txaInitialData', function(source, args)
-- sanity check
if type(args[1]) ~= 'string' then
return txPrintError('[txaInitialData] invalid argument types', type(args[1]))
end
-- prevent execution from admins or resources
if source ~= 0 then
return txPrintError('[txaInitialData] unexpected source', source)
end
if GetInvokingResource() ~= nil then
return txPrintError('[txaInitialData] unexpected invoking resource', GetInvokingResource())
end
-- processing event
local initialData = json.decode(replaceSemicolon(args[1]))
if not initialData or type(initialData.netId) ~= 'number' then
return txPrintError('[txaInitialData] invalid eventData', args[1])
end
cacheData(initialData)
CancelEvent()
end, true)
--- FIXME: This is triggered when player starts walking, but in the future change so the pendingWarn
--- is sent when react loads and stored locally, to show when player starts walking, without the need
--- for this event at all.
RegisterNetEvent('txsv:startedWalking', function()
useInitData(popData(tonumber(source)))
end)