1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
--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 json, MetaData json)]]
--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
|