Problems with MySQL quey and Checkpassword hook

I’m making my own ban system for my server and I’m having some problems while attempting to disconnect the player on the ‘CheckPassword’ hook.

I’m storing bans inside a MySQL Database, when the hook is first run it queries the database to check if they have a valid ban. But it seems to take approx 0.3 seconds to do so. In turn this delay makes it impossible for me to return false and the reason they were banned, inside of the reason it just returns nil because the query hasn’t finished. I’ve tried to use a timer but I’m unsure of how to return false and the ban reason for the hook inside the timer function.

CheckPassword hook:




hook.Add( "CheckPassword", "cBansCheckBan", function( steamid64, ip, sv_password, cl_password, name ) 

	local msg = ""

	cBans.Is_cBanned( steamid64, function( banInfo )

		if !banInfo[ "access" ] then
			
			msg = "BANNED"

		end

		msg = "N/A"


	end )

        return false, msg // this returns nil

end )



Is Banned function:




function cBans.Is_cBanned( steamid64, func )

	local banData = {}

	cBans.Query( "SELECT * FROM `bans` WHERE `steamid64` = '" .. steamid64 .. "' AND `length` = '0' OR `expires` >= '" .. os.time() .. "' LIMIT 1" , function( status, data )

		banData['access'], banData['steamid64'], banData['reason'], banData['expires'], banData['admin'] = true, nil, nil, nil, nil

		if status then

			if data[1] != nil then

				banData['access'] = false
				banData['steamid64'] = data[1]["steamid64"]
				banData['reason'] = data[1]["reason"]
				banData['expires'] = data[1]["expires"]
				banData['admin'] = data[1]["admin"]

			end

		end

		local succ, err = pcall( func, banData )
		if err then error( err ) end

	end )

end



SQL Query




function cBans.Query( sql_query, func )

	local db = cBans.database
	local query = db:query( sql_query )
	local status, result

	function query:onSuccess( data )

		status = true
		result = data

		if func != false then

			local succ, err = pcall( func, status, result )
			if err then error( err ) end

		end

	end

	function query:onError( err )

	   	cBans.Print( err )

	   	status = false
	   	result = nil

		if func != false then

			local succ, err = pcall( func, status, result )
			if err then error( err ) end

		end

	    if db:status() == mysqloo.DATABASE_NOT_CONNECTED then

	     	db:connect()
	        query:start()

	    end

	end	

	query:start()
		
end



Thanks.

You can’t return. Use this.

game.KickID

Thanks! That will have to do.