From 20848977858f556920f7ca7b9731d58bbadd3fe5 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 1 Jan 2022 02:26:42 +1100 Subject: [PATCH] refactor(callbacks): randomise event callback and fix timer logic Prevent any possibility of listening for server callback or conflicting event handlers on the client. --- fxmanifest.lua | 2 +- imports/callbacks/client.lua | 40 +++++++++++++++++++++--------------- imports/callbacks/server.lua | 4 ++-- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index e85407c..dcf0150 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -23,7 +23,7 @@ game 'gta5' --[[ Resource Information ]]-- name 'pe-lualib' author 'Linden' -version '1.2.0' +version '1.2.1' repository 'https://github.com/project-error/pe-lualib' description 'A library of shared functions to utilise in other resources.' diff --git a/imports/callbacks/client.lua b/imports/callbacks/client.lua index 03528f1..93b99fa 100644 --- a/imports/callbacks/client.lua +++ b/imports/callbacks/client.lua @@ -2,7 +2,7 @@ local ServerCallbacks = {} ---@param event string ---@param delay number prevent the event from being called for the given time -local function CallbackTimer(event, delay) +local function callbackTimer(event, delay) if type(delay) == 'number' then local time = GetGameTimer() if (ServerCallbacks[event] or 0) > time then @@ -10,6 +10,14 @@ local function CallbackTimer(event, delay) end ServerCallbacks[event] = time + delay end + return true +end + +local function startCallback(resource, event, ...) + local id = math.random(0, 100000) + event = ('__cb_%s:%s'):format(resource, event) + TriggerServerEvent(event, id, ...) + return event..id end local ServerCallback = table.create(0, 2) @@ -19,15 +27,14 @@ local ServerCallback = table.create(0, 2) ---@param delay number prevent the event from being called for the given time --- Sends an event to the server and halts the current thread until a response is returned. ServerCallback.Await = function(resource, event, delay, ...) - CallbackTimer(event, delay) - event = ('__cb_%s:%s'):format(resource, event) - TriggerServerEvent(event, ...) - local promise = promise.new() - event = RegisterNetEvent(event, function(...) - promise:resolve({...}) - RemoveEventHandler(event) - end) - return table.unpack(Citizen.Await(promise)) + if callbackTimer(event, delay) then + local promise = promise.new() + event = RegisterNetEvent(startCallback(resource, event, ...), function(...) + promise:resolve({...}) + RemoveEventHandler(event) + end) + return table.unpack(Citizen.Await(promise)) + end end ---@param resource string @@ -36,13 +43,12 @@ end ---@param cb function --- Sends an event to the server and triggers a callback function once the response is returned. ServerCallback.Async = function(resource, event, delay, cb, ...) - CallbackTimer(event, delay) - event = ('__cb_%s:%s'):format(resource, event) - TriggerServerEvent(event, ...) - event = RegisterNetEvent(event, function(...) - cb(...) - RemoveEventHandler(event) - end) + if callbackTimer(event, delay) then + event = RegisterNetEvent(startCallback(resource, event, ...), function(...) + cb(...) + RemoveEventHandler(event) + end) + end end return ServerCallback diff --git a/imports/callbacks/server.lua b/imports/callbacks/server.lua index f0b92b1..03664d4 100644 --- a/imports/callbacks/server.lua +++ b/imports/callbacks/server.lua @@ -6,10 +6,10 @@ local ServerCallback = {} ServerCallback.Register = function(name, callback) name = ('__cb_%s:%s'):format(GetCurrentResourceName(), name) - RegisterServerEvent(name, function(...) + RegisterServerEvent(name, function(id, ...) local source = source callback(source, function(...) - TriggerClientEvent(name, source, ...) + TriggerClientEvent(name..id, source, ...) end, ...) end) end