From 08815f2ecd83852cb82a4f1e5019beb61a8cfc09 Mon Sep 17 00:00:00 2001 From: Andyyy7666 <86536434+Andyyy7666@users.noreply.github.com> Date: Sat, 24 Dec 2022 17:01:07 +0100 Subject: [PATCH] feat: callbacks --- client/functions.lua | 48 ++++++++++++++++++++++++++++++++++++++++++ server/functions.lua | 50 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/client/functions.lua b/client/functions.lua index ae8d2f3..df20632 100644 --- a/client/functions.lua +++ b/client/functions.lua @@ -8,4 +8,52 @@ end function NDCore.Functions.GetCharacters() return NDCore.Characters +end + +-- Callbacks are licensed under LGPL v3.0 +-- +NDCore.callback = {} +local events = {} + +RegisterNetEvent("ND:callbacks", function(key, ...) + local cb = events[key] + return cb and cb(...) +end) + +local function triggerCallback(_, name, cb, ...) + local key = ("%s:%s"):format(name, math.random(0, 100000)) + TriggerServerEvent(("ND:%s_cb"):format(name), key, ...) + + local promise = not cb and promise.new() + + events[key] = function(response, ...) + response = { response, ... } + events[key] = nil + + if promise then + return promise:resolve(response) + end + + if cb then + cb(table.unpack(response)) + end + end + + if promise then + return table.unpack(Citizen.Await(promise)) + end +end + +setmetatable(NDCore.callback, { + __call = triggerCallback +}) + +function NDCore.callback.await(name, ...) + return triggerCallback(nil, name, false, ...) +end + +function NDCore.callback.register(name, callback) + RegisterNetEvent(("ND:%s_cb"):format(name), function(key, ...) + TriggerServerEvent("ND:callbacks", key, callback(...)) + end) end \ No newline at end of file diff --git a/server/functions.lua b/server/functions.lua index 600ccf3..b5580a6 100644 --- a/server/functions.lua +++ b/server/functions.lua @@ -718,3 +718,53 @@ function NDCore.Functions.VersionChecker(expectedResourceName, resourceName, dow end) end NDCore.Functions.VersionChecker("ND_Core", GetCurrentResourceName(), "https://github.com/ND-Framework/ND_Core", "https://raw.githubusercontent.com/ND-Framework/ND_Core/main/fxmanifest.lua") + + +-- Callbacks are licensed under LGPL v3.0 +-- +NDCore.callback = {} +local events = {} + +RegisterNetEvent("ND:callbacks", function(key, ...) + local cb = events[key] + return cb and cb(...) +end) + +function triggerCallback(_, name, playerId, cb, ...) + local key = ("%s:%s:%s"):format(name, math.random(0, 100000), playerId) + TriggerClientEvent(("ND:%s_cb"):format(name), playerId, key, ...) + + local promise = not cb and promise.new() + + events[key] = function(response, ...) + response = { response, ... } + events[key] = nil + + if promise then + return promise:resolve(response) + end + + if cb then + cb(table.unpack(response)) + end + end + + if promise then + return table.unpack(Citizen.Await(promise)) + end +end + +setmetatable(NDCore.callback, { + __call = triggerCallback +}) + +function NDCore.callback.await(name, playerId, ...) + return triggerCallback(nil, name, playerId, false, ...) +end + +function NDCore.callback.register(name, callback) + RegisterNetEvent(("ND:%s_cb"):format(name), function(key, ...) + local src = source + TriggerClientEvent("ND:callbacks", src, key, callback(src, ...)) + end) +end \ No newline at end of file