SAM - gBan проблема

В самом скрипте присутствуют строки, которые по идее должны записывать информацию о забаненном игроке в БД, производить отсчет до разбана, даже когда игрока нет на сервере, но по какой-то непонятной причине этого не происходит. Сам скрипт работает, игрока банит, но, допустим, если до выхода с сервера у меня было до разбана 2000 секунд, то при перезаходе останется тоже 2000 секунд, даже если я зайду на следующий день

Скрипт gBan
GBan = GBan or {}
GBan.Config = GBan.Config or {}

GBan.Config.banned_pos = Vector(0, 0, 0) -- координаты изменять тут
GBan.Config.banned_model = 'models/player/charple.mdl'
GBan.Config.banned_maxspeed = 180
GBan.Config.max_seconds = 10000000000000000000

local META = FindMetaTable( 'Player' )
function META:IsGBan()

	return self:GetNWBool( 'GBan' )

end

if SERVER then

	util.AddNetworkString( 'gban_send_ply' )

	sql.Query( 'CREATE TABLE IF NOT EXISTS gban( SteamID TEXT PRIMARY KEY, Time NUMBER, Date NUMBER, Reason TEXT, Judge TEXT )' )

	function GBan.GiveBanPlayer( ePly, eAdmin, sReason, nSeconds )

		if not IsValid( ePly ) or not ePly:IsPlayer() then print( '[GBan] GiveBanPlayer ERROR #01' ) return end

		local is_gban = ePly:IsGBan()
		if is_gban then print( '[GBan] GiveBanPlayer ERROR #02' ) return end

		if not sReason or not isstring( sReason ) then print( '[GBan] GiveBanPlayer WARNING #01' ) sReason = 'Причина не указана' end
		if not nSeconds or not isnumber( nSeconds ) then print( '[GBan] GiveBanPlayer WARNING #02' ) nSeconds = 60 end
		if ( nSeconds > GBan.Config.max_seconds ) then print( '[GBan] GiveBanPlayer WARNING #03' ) nSeconds = GBan.Config.max_seconds end
		if ( nSeconds <= 0 ) then print( '[GBan] GiveBanPlayer WARNING #04' ) nSeconds = 1 end
		nSeconds = math.floor( nSeconds )
		-- Action

		ePly:changeTeam( TEAM_BANNED, true )
		ePly:SetNWBool( 'GBan', true )
		ePly:SetNWInt( 'GBanTime', nSeconds )
		if ePly:InVehicle() then ply:ExitVehicle() end
		ePly:Spawn()
		ePly:StripWeapons()
		ePly:StripAmmo()
		local nick_admin = eAdmin and eAdmin:Nick() or 'CONSOLE'
		ePly:ChatPrint( 'Администратор '..nick_admin..' выдал Вам бан по причине: '..sReason )

		timer.Create( 'GBanPlayer'..ePly:SteamID(), nSeconds, 1, function() GBan.RemoveBanPlayerOffline( ePly:SteamID() ) end )

		net.Start( 'gban_send_ply' )
			net.WriteBool( true )
			net.WriteUInt( nSeconds, 16 )
		net.Send( ePly )

		local values = Format( '(%s, %i, %i, %s, %s)', sql.SQLStr( ePly:SteamID() ), nSeconds, os.time(), sql.SQLStr( sReason ), sql.SQLStr( nick_admin ) )
		print( values )
		sql.Query( 'INSERT INTO gban( SteamID, Time, Date, Reason, Judge ) VALUES '..values )

		if eAdmin then eAdmin:ChatPrint( 'Вы выдали бан игроку '..ePly:Nick()..' по причине: '..sReason..' на '..nSeconds..' секунд' ) end
		
		print( '[GBan] Player '..ePly:SteamID()..' has banned on '..nSeconds..' sec!' )

	end

	function GBan.GiveBanPlayerOffline( sSteamID, eAdmin, nSeconds, sReason )

		if not sSteamID then print( '[GBan] GiveBanPlayerOffline ERROR #03' ) return end

		local ply = player.GetBySteamID( sSteamID )
		if ply and IsValid( ply ) then GBan.GiveBanPlayer( ply, eAdmin, sReason, nSeconds ) return end

		if ( nSeconds > GBan.Config.max_seconds ) then print( '[GBan] GiveBanPlayerOffline WARNING #03' ) nSeconds = GBan.Config.max_seconds end
		if ( nSecond <= 0 ) then print( '[GBan] GiveBanPlayerOffline WARNING #04' ) nSeconds = 1 end
		nSeconds = math.floor( nSeconds )
		
		local judge = eAdmin and eAdmin:Nick() or 'CONSOLE'
		local values = Format( '(%s, %i, %i, %s, %s)', sql.SQLStr( sSteamID ), nSeconds, os.time(), sql.SQLStr( sReason ), sql.SQLStr( judge ) )
		sql.Query( 'INSERT INTO gban( SteamID, Time, Date, Reason, Judge ) VALUES '..values )

		if eAdmin then eAdmin:ChatPrint( 'Вы выдали бан игроку '..sSteamID ) end

		print( '[GBan] Player '..sSteamID..' has banned on '..nSeconds..' sec!' )

	end

	function GBan.RemoveBanPlayer( ePly, eAdmin )

		local is_gban = ePly:IsGBan()
		if not is_gban then print( '[GBan] RemoveBanPlayer ERROR #04' ) return end

		ePly:SetNWBool( 'GBan', false )
		ePly:SetNWInt( 'GBanTime', 0 )
		ePly:changeTeam( TEAM_CITIZEN, true )
		ePly:Kill()

		net.Start( 'gban_send_ply' )
			net.WriteBool( false )
			net.WriteUInt( 0, 16 )
		net.Send( ePly )

		if timer.Exists( 'GBanPlayer'..ePly:SteamID() ) then timer.Remove( 'GBanPlayer'..ePly:SteamID() ) end

		sql.Query( 'DELETE FROM gban WHERE SteamID = '..sql.SQLStr( ePly:SteamID() ) )

		if eAdmin then 
		
			ePly:ChatPrint( 'Вам снял бан администратор '..eAdmin:Nick() ) 
			eAdmin:ChatPrint( 'Вы сняли бан игроку '..ePly:Nick() )

		end

		print( '[GBan] Player '..ePly:SteamID()..' has removed gban!' )

	end

	function GBan.RemoveBanPlayerOffline( sSteamID, eAdmin )

		if not sSteamID then print( '[GBan] ERROR #03' ) return end

		local ply = player.GetBySteamID( sSteamID )
		if ply and IsValid( ply ) then GBan.RemoveBanPlayer( ply, eAdmin ) return end

		sql.Query( 'DELETE FROM gban WHERE SteamID = '..sql.SQLStr( sSteamID ) )

		print( '[GBan] Player '..sSteamID..' has removed gban!' )

	end

	hook.Add( 'PlayerInitialSpawn', 'GBan.JailerTheFirstSpawn', function( ePly )

		timer.Simple( 2, function() 

			local steamid = sql.SQLStr( ePly:SteamID() )
			local time = sql.QueryValue( 'SELECT Time FROM gban WHERE SteamID='..steamid )
			if not time then return end
		
			time = tonumber( time ) -- only seconds!
			local date = sql.QueryValue( 'SELECT Date FROM gban WHERE SteamID='..steamid  )

			local finish_time = time + tonumber( date )
			local current_time = os.time()

			if ( finish_time <= current_time ) then sql.Query( 'DELETE FROM gban WHERE SteamID = '..steamid ) ePly:ChatPrint( 'Срок вашего бана закончился!' ) return end

			ePly:changeTeam( TEAM_BANNED, true )
			ePly:SetNWBool( 'GBan', true )
			ePly:SetNWInt( 'GBanTime', time )
			ePly:Spawn()

			net.Start( 'gban_send_ply' )
				net.WriteBool( true )
				net.WriteUInt( time, 16 )
			net.Send( ePly )

			timer.Create( 'GBanPlayer'..ePly:SteamID(), time, 1, function() GBan.RemoveBanPlayerOffline( ePly:SteamID() ) end )

		end )

	end )

	hook.Add( 'PlayerSpawn', 'GBan.JailerSpawn', function( ePly )

		if not ePly:IsGBan() then return end

		timer.Simple( 0.1, function() 

			ePly:SetPos( GBan.Config.banned_pos )
			ePly:SetModel( GBan.Config.banned_model )
			ePly:SetCrouchedWalkSpeed( GBan.Config.banned_maxspeed )
			ePly:SetRunSpeed( GBan.Config.banned_maxspeed )
			ePly:SetWalkSpeed( GBan.Config.banned_maxspeed )
			ePly:StripWeapons()

		end )

	end )

	hook.Add( 'PlayerDisconnected', 'GBan.UpdateTimeForJailer', function( ePly )

		if not ePly:IsGBan() then return end

		local steamid, time = sql.SQLStr( ePly:SteamID() ), math.floor( timer.TimeLeft( 'GBanPlayer'..ePly:SteamID() ) )
		sql.Query( 'UPDATE gban SET Time='.. time ..' WHERE SteamID='.. steamid )

		timer.Remove( 'GBanPlayer'..ePly:SteamID() )

	end)

	-- Restrict

	hook.Add( 'CanPlayerSuicide', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end )

	hook.Add( 'PlayerLoadout', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end )

	hook.Add( 'PlayerSpawnObject', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerSpawnSENT', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerSpawnNPC', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerSpawnSWEP', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerSpawnVehicle', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerGiveSWEP', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

	hook.Add( 'PlayerCanPickupWeapon', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)

    hook.Add( 'PlayerCanPickupItem', 'GBan.RestrictHook', function( ePly )
        
		if ePly:IsGBan() then return false end 

    end )

    hook.Add( 'playerCanChangeTeam', "GhostBan_CantChangeJob",function( ePly )
        
		if ePly:IsGBan() then return false end 

    end)

--	hook.Add( 'PlayerCanJoinTeam', 'GBan.RestrictHook', function( ePly )
--
--		if ePly:IsGBan() then return false end 
--
--	end )

	hook.Add( 'CanPlayerEnterVehicle', 'GBan.RestrictHook', function( ePly )

		if ePly:IsGBan() then return false end

	end )

	hook.Add( 'PlayerNoClip', 'GBan.RestrictHook', function( ePly ) 
		
		if ePly:IsGBan() then return false end 
		
	end)



elseif CLIENT then

	local w = ScrW()
	local h = ScrH()

	surface.CreateFont( 'TheShitFont', {

		font = "Trebuchet24",
		size = ( h + w ) * .011,
		weight = 300, 
		blursize = 0, 
		scanlines = 0, 
		antialias = false, 
		underline = false, 
		italic = false, 
		strikeout = false, 
		symbol = false, 
		rotary = false, 
		shadow = true, 
		additive = false, 
		outline = false,

	} )

	local COLOR_WHITE = Color( 255, 255, 255 )
	local COLOR_BLACK = Color( 0, 0, 0 )

	net.Receive( 'gban_send_ply',function()

		to_ban = net.ReadBool()
		time = net.ReadUInt( 16 )

		if not to_ban then hook.Remove( 'HUDPaint', 'GBan.DrawInfoPanel' ) return end

		timer.Create( 'GBanTime', time, 1, function() end )

		hook.Add( 'HUDPaint', 'GBan.DrawInfoPanel', function()

			if not LocalPlayer():IsGBan() then return end
			local time = timer.Exists( 'GBanTime' ) and math.floor( timer.TimeLeft( 'GBanTime' ) ) or 0
	        draw.SimpleTextOutlined( 'До снятия бана осталось '.. time ..' секунд', 'TheShitFont', w / 2, 0, COLOR_WHITE, TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP, 1, COLOR_BLACK )

		end)

	end)

end

if SAM_LOADED then return end
local sam, cmd, lang = sam, sam.command, sam.language
local cat = 'gBan'

cmd.set_category( cat )

cmd.new( 'gban' )

    :Help( 'Банит игрока' )

	:SetPermission( 'gban', 'admin' )

	:AddArg( 'player' )
	:AddArg( 'number', { hint = 'Секунды', min = 1, max = GBan.Config.max_seconds, round = true, optional = true, default = 250 } )
    :AddArg( 'text', { hint = 'Причина' } )

	:OnExecute( function( eAdmin, tTargets, nSeconds, sReason )

		if #tTargets > 1 then return end

		for i=1, #tTargets do

			local ply = tTargets[i]

			GBan.GiveBanPlayer( ply, eAdmin, sReason, nSeconds )

		end

	end )

:End()

cmd.new( 'ungban' )

    :Help( 'Убирает у игрока gban' )

	:SetPermission( 'ungban', 'admin' )

	:AddArg( 'player' )

	:OnExecute( function( eAdmin, target )

		if #target > 1 then return end

		for i=1, #target do

			local ply = target[i]

			GBan.RemoveBanPlayer( ply, eAdmin )

		end

	end )

:End()

gban.lua (10.6 КБ)

в Бд записывается на сколько его забанили
при заходе это время прибавляется к текущему и создаётся таймер
gban.lua (10.6 КБ)
Я немного изменил код.
В БД теперь в Time записывается Время+Время системы.
И естественно другую часть кода где этот Time используется.
Проверяй нет ли ошибок.

Я пытался сам поментяь и заметил, что скрипт вообще не коннектится к БД и не создает таблиц. В любом модуле есть переменная local SQL = sam.sql, которая, как я понимаю, подключает глобальную либу. Если вставить этот код в gBan, будет видно, что он пытается коннектиться, но синтаксис неправильный