From d0c5f722db6c5f8e5ff255aa661a35e907509b00 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 27 Dec 2021 11:10:05 +1100 Subject: [PATCH] refactor(init): export cache and update intervals BREAKING CHANGE: lib will store cached export functions and no longer uses the : syntax to call functions. Allow SetInterval to return arguments to the callback function. --- fxmanifest.lua | 5 ++- init.lua | 96 ++++++++++++++++++++++++++++------------------- resource/main.lua | 4 +- version.lua | 5 +-- 4 files changed, 65 insertions(+), 45 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index c4a9118..ec44131 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -23,12 +23,13 @@ game 'gta5' --[[ Resource Information ]]-- name 'pe-lualib' author 'Linden' -version '1.0.4' +version '1.1.0' repository 'https://github.com/project-error/pe-lualib' description 'A library of shared functions to utilise in other resources.' [[ Manifest ]]-- dependencies { + '/server:5104', '/onesync', } @@ -48,3 +49,5 @@ server_scripts { 'version.lua', 'resource/**/server.lua' } + +provide 'lualib' diff --git a/init.lua b/init.lua index 8a2d75d..881817e 100644 --- a/init.lua +++ b/init.lua @@ -8,18 +8,18 @@ end ----------------------------------------------------------------------------------------------- -- env -local LIBRARY = 'pe-lualib' -local SERVICE = IsDuplicityVersion() and 'server' or 'client' +local lualib = 'pe-lualib' +local file = IsDuplicityVersion() and 'server' or 'client' -- micro-optimise local rawget = rawget local rawset = rawset local LoadResourceFile = LoadResourceFile -local function loadFile(self, file) - local dir = ('imports/%s'):format(file) - local chunk = LoadResourceFile(LIBRARY, ('%s/%s.lua'):format(dir, SERVICE)) - local shared = LoadResourceFile(LIBRARY, ('%s/shared.lua'):format(dir)) +local function loadFile(self, module) + local dir = ('imports/%s'):format(module) + local chunk = LoadResourceFile(lualib, ('%s/%s.lua'):format(dir, file)) + local shared = LoadResourceFile(lualib, ('%s/shared.lua'):format(dir)) if shared then chunk = (chunk and ('%s\n%s'):format(shared, chunk)) or shared @@ -27,12 +27,12 @@ local function loadFile(self, file) if chunk then local err - chunk, err = load(chunk, ('@@%s.lua'):format(SERVICE), 't') + chunk, err = load(chunk, ('@@pe-lualib/%s/%s.lua'):format(module, file), 't') if err then error(('\n^1Error importing module (%s): %s^0'):format(dir, err), 3) else - rawset(self, file, chunk()) - return self[file] + rawset(self, module, chunk()) + return self[module] end else error(('\n^3Unable to import module (%s)^0'):format(dir), 3) end end @@ -48,7 +48,7 @@ end ----------------------------------------------------------------------------------------------- --- Interface +-- API ----------------------------------------------------------------------------------------------- import = setmetatable({}, { @@ -57,48 +57,66 @@ import = setmetatable({}, { __call = getImport, __newindex = function() - error('Cannot add indexes to imports') + error('Cannot set index on import') end }) -local lib = {} -local setmetatable = setmetatable +lib = setmetatable({}, { + __index = function(self, method) + local export = exports[lualib][method] + rawset(self, method, function(...) + return export(nil, ...) + end) -setmetatable(lib, { - __index = exports[LIBRARY], + return self[method] + end, + + __newindex = function() + error('Cannot set index on lib') + end, __tostring = function() - return LIBRARY + return lualib end, }) -_ENV.lib = lib - +local intervals = {} --- Dream of a world where this PR gets accepted. ---- ``` ---- SetInterval(callback: function, timer: number) ---- ``` -SetInterval = setmetatable({currentId = 0}, { - __call = function(self, callback, timer) - local id = self.currentId + 1 - self.currentId = id - self[id] = timer or 0 - CreateThread(function() - repeat - local interval = self[id] - Wait(interval) - callback(interval) - until interval == -1 - self[id] = nil - end) - return id +---@param callback function +---@param interval? number +---@param ... any +function SetInterval(callback, interval, ...) + interval = interval or 0 + assert(type(interval) == 'number', ('Interval must be a number. Received %s'):format(tostring(interval))) + local cbType = type(callback) + + if cbType == 'number' and intervals[callback] then + intervals[callback] = interval or 0 + return end -}) + + assert(cbType == 'function', ('Callback must be a function. Received %s'):format(tostring(cbType))) + local id + local args = {...} + + Citizen.CreateThreadNow(function(ref) + id = ref + intervals[id] = interval or 0 + repeat + interval = intervals[id] + Wait(interval) + callback(table.unpack(args)) + until interval < 0 + intervals[id] = nil + end) + + return id +end function ClearInterval(id) - if SetInterval[id] then - SetInterval[id] = -1 - end + assert(type(id) == 'number', ('Interval id must be a number. Received %s'):format(tostring(id))) + assert(intervals[id], ('No interval exists with id %s'):format(id)) + intervals[id] = -1 end -- pe-lualib diff --git a/resource/main.lua b/resource/main.lua index 631f4d7..ea0651d 100644 --- a/resource/main.lua +++ b/resource/main.lua @@ -1,9 +1,9 @@ -- Creates exports from values assigned to lib -- Hacky workaround for Lua Language Server support - --- Alias for `exports['pe-lualib']` + lib = setmetatable({}, { - __newindex = function(self, name, fn) + __newindex = function(_, name, fn) exports(name, fn) end }) \ No newline at end of file diff --git a/version.lua b/version.lua index dabbfd5..4ea227a 100644 --- a/version.lua +++ b/version.lua @@ -5,10 +5,9 @@ CreateThread(function() local version = GetResourceMetadata(resource, 'version', 0) PerformHttpRequest(('%s/master/fxmanifest.lua'):format(url:gsub('github.com', 'raw.githubusercontent.com')), function(error, response) - if error ~= 200 then + if error == 200 then local latest = response:match('%d%.%d+%.%d+') - print(version, latest) - if version == latest then + if version < latest then local curMajor, curMinor = string.strsplit('.', version) local newMajor, newMinor = string.strsplit('.', response:match('%d%.%d+%.%d+')) local link = ('%s/archive/refs/tags/%s.zip'):format(url, latest, latest)