From 67ef3741b719d1b479e47854acf977896cf0c5e6 Mon Sep 17 00:00:00 2001 From: David Malchin Date: Sun, 18 Sep 2022 04:05:38 +0300 Subject: [PATCH 1/3] Add clearer messages and handle database errors on player connecting --- locale/en.lua | 2 ++ server/events.lua | 66 +++++++++++++++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/locale/en.lua b/locale/en.lua index a41748e..a8b4a5a 100644 --- a/locale/en.lua +++ b/locale/en.lua @@ -17,6 +17,8 @@ local Translations = { no_permission = 'You don\'t have permissions for this..', no_waypoint = 'No Waypoint Set.', tp_error = 'Error While Teleporting.', + connecting_database_error = 'A database error occurred while connecting to the server. (Is the SQL server on?)', + connecting_database_timeout = 'Connection to database timed out. (Is the SQL server on?)', }, success = { server_opened = 'The server has been opened', diff --git a/server/events.lua b/server/events.lua index 06876ce..406fe98 100644 --- a/server/events.lua +++ b/server/events.lua @@ -34,8 +34,6 @@ local function onPlayerConnecting(name, _, deferrals) end end - deferrals.update(string.format(Lang:t('info.checking_ban'), name)) - for _, v in pairs(identifiers) do if string.find(v, 'license') then license = v @@ -43,30 +41,54 @@ local function onPlayerConnecting(name, _, deferrals) end end - -- Mandatory wait - Wait(2500) - - deferrals.update(string.format(Lang:t('info.checking_whitelisted'), name)) - - local isBanned, Reason = QBCore.Functions.IsPlayerBanned(src) - local isLicenseAlreadyInUse = QBCore.Functions.IsLicenseInUse(license) - local isWhitelist, whitelisted = QBCore.Config.Server.Whitelist, QBCore.Functions.IsWhitelisted(src) - - Wait(2500) - - deferrals.update(string.format(Lang:t('info.join_server'), name)) - if not license then - deferrals.done(Lang:t('error.no_valid_license')) - elseif isBanned then - deferrals.done(Reason) - elseif isLicenseAlreadyInUse and QBCore.Config.Server.CheckDuplicateLicense then + deferrals.done(Lang:t('error.no_valid_license')) + elseif QBCore.Config.Server.CheckDuplicateLicense and QBCore.Functions.IsLicenseInUse(license) then deferrals.done(Lang:t('error.duplicate_license')) - elseif isWhitelist and not whitelisted then - deferrals.done(Lang:t('error.not_whitelisted')) end - deferrals.done() + local databaseTime = os.clock() + local databasePromise = promise.new() + + CreateThread(function() + deferrals.update(string.format(Lang:t('info.checking_ban'), name)) + local databaseSuccess, databaseError = pcall(function() + local isBanned, Reason = QBCore.Functions.IsPlayerBanned(src) + if isBanned then + deferrals.done(Reason) + end + end) + + if QBCore.Config.Server.Whitelist then + deferrals.update(string.format(Lang:t('info.checking_whitelisted'), name)) + databaseSuccess, databaseError = pcall(function() + if not QBCore.Functions.IsWhitelisted(src) then + deferrals.done(Lang:t('error.not_whitelisted')) + end + end) + end + + if not databaseSuccess then + databasePromise:reject(databaseError) + end + databasePromise:resolve() + end) + + databasePromise:next(function() + deferrals.update(string.format(Lang:t('info.join_server'), name)) + deferrals.done() + end, function (databaseError) + deferrals.done(Lang:t('error.connecting_database_error')) + print('^1' .. databaseError) + end) + + while databasePromise.state == 0 do -- while database promise is pending + if os.clock() - databaseTime > 30 then -- if 30 seconds were spent waiting for the database + deferrals.done(Lang:t('error.connecting_database_timeout')) + break + end + Wait(1000) + end -- Add any additional defferals you may need! end From fd86efbe1b5f9482c9fe6ad4791859daadec0631 Mon Sep 17 00:00:00 2001 From: David Malchin Date: Sat, 8 Oct 2022 03:52:59 +0300 Subject: [PATCH 2/3] Raise server-side error on database timeout --- server/events.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/server/events.lua b/server/events.lua index 406fe98..a4bc55d 100644 --- a/server/events.lua +++ b/server/events.lua @@ -85,6 +85,7 @@ local function onPlayerConnecting(name, _, deferrals) while databasePromise.state == 0 do -- while database promise is pending if os.clock() - databaseTime > 30 then -- if 30 seconds were spent waiting for the database deferrals.done(Lang:t('error.connecting_database_timeout')) + error(Lang:t('error.connecting_database_timeout')) break end Wait(1000) From bd30889c1c0f8bef68b61f127dc707ab7ab1a8ad Mon Sep 17 00:00:00 2001 From: David Malchin Date: Sat, 8 Oct 2022 03:53:25 +0300 Subject: [PATCH 3/3] Improve comments --- server/events.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/events.lua b/server/events.lua index a4bc55d..80bdbcd 100644 --- a/server/events.lua +++ b/server/events.lua @@ -50,6 +50,7 @@ local function onPlayerConnecting(name, _, deferrals) local databaseTime = os.clock() local databasePromise = promise.new() + -- conduct database-dependant checks CreateThread(function() deferrals.update(string.format(Lang:t('info.checking_ban'), name)) local databaseSuccess, databaseError = pcall(function() @@ -74,6 +75,7 @@ local function onPlayerConnecting(name, _, deferrals) databasePromise:resolve() end) + -- wait for database to finish databasePromise:next(function() deferrals.update(string.format(Lang:t('info.join_server'), name)) deferrals.done() @@ -81,9 +83,10 @@ local function onPlayerConnecting(name, _, deferrals) deferrals.done(Lang:t('error.connecting_database_error')) print('^1' .. databaseError) end) - - while databasePromise.state == 0 do -- while database promise is pending - if os.clock() - databaseTime > 30 then -- if 30 seconds were spent waiting for the database + + -- if conducting checks for too long then raise error + while databasePromise.state == 0 do + if os.clock() - databaseTime > 30 then deferrals.done(Lang:t('error.connecting_database_timeout')) error(Lang:t('error.connecting_database_timeout')) break