--Adds the MySQLite global nrequire("sv_mysqlite.lua") local config = nrequire("config/sv_sql.lua") local data = nrequire("config/sv_newplayer.lua") local col = nrequire("config/colortheme.lua") local q = nrequire("core/database/sv_queries.lua") local sql = {} --Setup the database if it's not already local setup_db = [[ CREATE TABLE IF NOT EXISTS playerdata(SteamID bigint primary key, PlayerData TEXT, MetaData TEXT)]] --Create a new player local create_player_query = [[ INSERT INTO playerdata (`SteamID`,`PlayerData`,`MetaData`) VALUES(%.0f,'%s','%s')]] --Get a player's data from the database local fetch_player_query = [[ SELECT PlayerData, MetaData FROM playerdata WHERE SteamID=%.0f ]] local save_player_query = [[ UPDATE playerdata SET MetaData='%s' PlayerData='%s' WHERE SteamID=%.0f ]] local function q_fai(err,query) MsgC(col.console.red,string.format("Error executing %s, error:%s",query,err)) end local function connect() --print("Connecting to the database...") MySQLite.initialize(config) end hook.Add("DatabaseInitialized","setup_table",function() assert(MySQLite.isMySQL(),"Database wasn't mysqloo, something is probably wrong!") local setup_success = function(res,li) --print("Set up connection to db") end --print("Setup query:",setup_db) MySQLite.query(setup_db,setup_success,q_fai) end) hook.Add("Initialize","initalizedbconnection",function() connect() end) --Retruns (PlayerData, MetaData) or nil function sql.GetPlayerData(ply) local s64 = ply:SteamID64() local q_str = q.s_fmt(fetch_player_query,s64) local q_suc = function(res,li) --print("Got player's data:",res,type(res)) if res == nil then --print("Was nil, createing player data") sql.CreatePlayerTable(ply) else --PrintTable(res) assert(#res == 1,"Not unique!") --print("Was unique!") local meta = res[1].MetaData local plyd = res[1].PlayerData local mtbl = util.JSONToTable(meta) --print("About to check if we are on the right server") if mtbl.lastserver ~= game.GetIPAddress() then --print("Connecting player to ", mtbl.lastserver, " was on ", game.GetIPAddress()) ply:ConCommand("connect " .. mtbl.lastserver) return end --print("We were on the right server") --print("Before finding data in the metatable, mtbl was ") --PrintTable(mtbl) --print(type(mtbl.lastlocation)) local _,_,x,y,z = string.find(mtbl.lastlocation,"([-%d%.]+) ([-%d%.]+) ([-%d%.]+)") local vec = {x,y,z} for k,v in pairs(vec) do vec[k] = tonumber(v) end --print("setting player pos to") --PrintTable(vec) ply:SetPos(Vector(unpack(vec))) q.deserialize_player(ply,plyd) end end --print("doing query",q_str) MySQLite.query(q_str,q_suc,q_fai) end function sql.CreatePlayerTable(ply) --print("Createing player table....") local s64 = ply:SteamID64() --print("steamid was", s64) local plytbl = data.newdata() local plymet = data.newmeta() local plydata = util.TableToJSON(plytbl) local metdata = util.TableToJSON(plymet) local q_str = q.s_fmt(create_player_query,s64,plydata,metdata) local q_suc = function(res,li) --print("Inserted new player",ply) sql.GetPlayerData(ply) end --print("doing query", q_str) MySQLite.query(q_str,q_suc,q_fai) end function sql.SendPlayerToInstance(ply,ls,ll) local s64 = ply:SteamID64() local plydata = q.serialize_player(ply) local plymeta = util.TableToJSON({ lastserver = ls, lastlocation = ll }) local q_str = q.s_fmt(save_player_query,plymeta,plydata,s64) local q_suc = function(res,li) --print("Successfully saved player data") end MySQLite.query(q_str,q_suc,q_fai) end concommand.Add("DoQuery",function(ply,cmd,args) if not ply:IsAdmin() then return end if args[1] == "create" then sql.CreatePlayerTable(ply) elseif args[1] == "get" then sql.GetPlayerData(ply) elseif args[1] == "send" then sql.SendPlayerToInstance(ply,args[2],args[3]) else error("Command not understood:" .. args[1] .. "!") end end) --print("In sv_setup.lua, sql before returning is", sql) return sql