aboutsummaryrefslogtreecommitdiff
path: root/gamemode/core/database/sv_setup.lua
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2017-02-18 21:55:55 -0500
committerAlexander Pickering <alexandermpickering@gmail.com>2017-02-18 21:55:55 -0500
commita22cbeddc5f8fb61e87a30aa14ba354de5cf4431 (patch)
tree297c1dbfb23185c5246e1dd7bdec52253a24ba60 /gamemode/core/database/sv_setup.lua
parentf4ee62bb0725a3ae94477b2818071f506e4dfd9f (diff)
downloadartery-a22cbeddc5f8fb61e87a30aa14ba354de5cf4431.tar.gz
artery-a22cbeddc5f8fb61e87a30aa14ba354de5cf4431.tar.bz2
artery-a22cbeddc5f8fb61e87a30aa14ba354de5cf4431.zip
Updates
Diffstat (limited to 'gamemode/core/database/sv_setup.lua')
-rw-r--r--gamemode/core/database/sv_setup.lua160
1 files changed, 160 insertions, 0 deletions
diff --git a/gamemode/core/database/sv_setup.lua b/gamemode/core/database/sv_setup.lua
new file mode 100644
index 0000000..0d0eb74
--- /dev/null
+++ b/gamemode/core/database/sv_setup.lua
@@ -0,0 +1,160 @@
+--Adds the MySQLite global
+nrequire("sv_mysqlite.lua")
+local config = nrequire("config/sv_sql.lua")
+local data = nrequire("config/sv_newplayer.lua")
+local fn = nrequire("fn.lua")
+local col = nrequire("colortheme.lua")
+local inv = nrequire("inventory/inventory.lua")
+local track = nrequire("sv_invtracker.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 json, MetaData json)]]
+
+--Create a new player
+local create_player_query = [[
+INSERT INTO playerdata (`SteamID`,`PlayerData`,`MetaData`) VALUES(%.0f,%q,%q)]]
+
+--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=%q PlayerData=%q WHERE SteamID=%.0f
+]]
+
+local s_fmt = function(fmt,...)
+ local args = {...}
+ fn.map(args,MySQLite.SQLStr)
+ return string.format(fmt,unpack(args))
+end
+
+local function q_fai(err,query)
+ MsgC(col.console.red,string.format("Error executing %q, error:%s",query,err))
+end
+
+local function serialize_player(ply)
+ local sdata = {}
+ local invs = {}
+ for k,v in pairs(ply.data.inventories) do
+ invs[k] = {v.Name,v:Serialize()}
+ end
+ sdata.inventories = invs
+ sdata.skills = ply.data.skills
+ sdata.quests = ply.data.quests
+ sdata.prayers = ply.data.prayers
+ return util.TableToJSON(sdata)
+end
+
+local function deserialize_player(ply,str)
+ print("Deseriailizeing player",ply," with ", str)
+ track.ClearInventories(ply)
+ local tbl = util.JSONToTable(str)
+ local invs = tbl.inventories
+ print("Inventories was", invs)
+ PrintTable(invs)
+ for k,v in pairs(invs) do
+ print("Giveing inventory",v[1],v[2])
+ track.GiveInventoryWithData(ply,v[1],v[2])
+ end
+ ply.data.skills = tbl.skills or {}
+ ply.data.quests = tbl.quests or {}
+ ply.data.prayers = tbl.prayers or {}
+ track.SendPlayerData(ply)
+end
+
+local function connect()
+ print("Connecting to the database...")
+ MySQLite.initialize(config)
+end
+hook.Add("DatabaseInitialized","setup_table",function()
+ 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)
+connect()
+
+--Retruns (PlayerData, MetaData) or nil
+function sql.GetPlayerData(ply)
+ local s64 = ply:SteamID64()
+ local q_str = 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")
+ local _,_,x,y,z = mtbl.lastlocation:find("([%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)))
+ 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 = 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 = serialize_player(ply)
+ local plymeta = util.TableToJSON({
+ lastserver = ls,
+ lastlocation = ll
+ })
+ local q_str = 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 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)
+
+return sql