From e4b36d2d4cc2d5ed12650a603a9f4161c996f353 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 1 Mar 2023 11:43:06 -0800 Subject: [PATCH] feat: Database connection validation Suggested by tabarra. Instead of throwing them into awaiting scripts with 0 information. stop them from joining and tell them the user --- [core]/es_extended/server/common.lua | 3 ++- [core]/es_extended/server/main.lua | 14 ++++++++++---- [core]/esx_multicharacter/server/main.lua | 21 ++++++++++++++++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/[core]/es_extended/server/common.lua b/[core]/es_extended/server/common.lua index 0867042b..57f1479e 100644 --- a/[core]/es_extended/server/common.lua +++ b/[core]/es_extended/server/common.lua @@ -8,7 +8,7 @@ Core.RegisteredCommands = {} Core.Pickups = {} Core.PickupId = 0 Core.PlayerFunctionOverrides = {} - +Core.DatabaseConnected = false Core.playersByIdentifier = {} Core.vehicleTypesByModel = {} @@ -39,6 +39,7 @@ local function StartDBSync() end MySQL.ready(function() + Core.DatabaseConnected = true if not Config.OxInventory then local items = MySQL.query.await('SELECT * FROM items') for k, v in ipairs(items) do diff --git a/[core]/es_extended/server/main.lua b/[core]/es_extended/server/main.lua index 6988aff2..d1d0a361 100644 --- a/[core]/es_extended/server/main.lua +++ b/[core]/es_extended/server/main.lua @@ -56,6 +56,7 @@ function onPlayerJoined(playerId) if result then loadESXPlayer(identifier, playerId, false) else + createESXPlayer(identifier, playerId) end end @@ -97,18 +98,23 @@ if not Config.Multichar then local identifier = ESX.GetIdentifier(playerId) if OnesyncState == "off" or OnesyncState == "legacy" then - deferrals.done(('[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s'):format(OnesyncState)) + return deferrals.done(('[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s'):format(OnesyncState)) end + + if not Core.DatabaseConnected then + return deferrals.done(('[ESX] ESX Cannot Connect to your database. Please make sure it is correctly configured in your server.cfg'):format(OnesyncState)) + end + if identifier then if ESX.GetPlayerFromIdentifier(identifier) then - deferrals.done( + return deferrals.done( ('[ESX] There was an error loading your character!\nError code: identifier-active\n\nThis error is caused by a player on this server who has the same identifier as you have. Make sure you are not playing on the same account.\n\nYour identifier: %s'):format( identifier)) else - deferrals.done() + return deferrals.done() end else - deferrals.done( + return deferrals.done( '[ESX] There was an error loading your character!\nError code: identifier-missing\n\nThe cause of this error is not known, your identifier could not be found. Please come back later or report this problem to the server administration team.') end end) diff --git a/[core]/esx_multicharacter/server/main.lua b/[core]/esx_multicharacter/server/main.lua index cce710f0..1e6b19e9 100644 --- a/[core]/esx_multicharacter/server/main.lua +++ b/[core]/esx_multicharacter/server/main.lua @@ -1,6 +1,10 @@ if not ESX then error('\n^1Unable to start Multicharacter - you must be using ESX Legacy^0') elseif ESX.GetConfig().Multichar then + local DatabaseConnected = false + local DatabaseFound = false + local OnesyncState = GetConvar('onesync', 'off') + local DATABASE do local connectionString = GetConvar('mysql_connection_string', ''); if connectionString == '' then @@ -8,6 +12,7 @@ elseif ESX.GetConfig().Multichar then elseif connectionString:find('mysql://') then connectionString = connectionString:sub(9, -1) DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') + DatabaseFound = true else connectionString = {string.strsplit(';', connectionString)} for i = 1, #connectionString do @@ -16,6 +21,7 @@ elseif ESX.GetConfig().Multichar then DATABASE = v:sub(10, #v) end end + DatabaseFound = true end end @@ -92,11 +98,23 @@ elseif ESX.GetConfig().Multichar then AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals) deferrals.defer() local identifier = GetIdentifier(source) + if OnesyncState == "off" or OnesyncState == "legacy" then + return deferrals.done(('[ESX] ESX Requires Onesync Infinity to work. This server currently has Onesync set to: %s'):format(OnesyncState)) + end + if not DatabaseFound then + deferrals.done(('[ESX Multicharacter] Cannot Find the servers mysql_connection_string. Please make sure it is correctly configured in your server.cfg'):format(OnesyncState)) + end + + if not DatabaseConnected then + deferrals.done(('[ESX Multicharacter] ESX Cannot Connect to your database. Please make sure it is correctly configured in your server.cfg'):format(OnesyncState)) + end + if identifier then + if not ESX.GetConfig().EnableDebug then if ESX.Players[identifier] then - deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) + deferrals.done(('[ESX Multicharacter] A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) else deferrals.done() end @@ -179,6 +197,7 @@ elseif ESX.GetConfig().Multichar then until next(ESX.Jobs) FETCH = 'SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?' + DatabaseConnected = true end end)