diff options
Diffstat (limited to 'gamemode/core/database/sv_setup.lua')
| -rw-r--r-- | gamemode/core/database/sv_setup.lua | 160 |
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 |
