aboutsummaryrefslogtreecommitdiff
path: root/gamemode/server/sv_database.lua
diff options
context:
space:
mode:
authorAlexander Pickering <alexandermpickering@gmail.com>2016-07-10 17:04:29 -0400
committerAlexander Pickering <alexandermpickering@gmail.com>2016-07-10 17:04:29 -0400
commit1de5f9ac6f038bfed2230cc1272b253794b2f41a (patch)
tree15bc9d515f1f48c036522afb7cc71f60243849a9 /gamemode/server/sv_database.lua
downloadartery-1de5f9ac6f038bfed2230cc1272b253794b2f41a.tar.gz
artery-1de5f9ac6f038bfed2230cc1272b253794b2f41a.tar.bz2
artery-1de5f9ac6f038bfed2230cc1272b253794b2f41a.zip
Initial commit
Diffstat (limited to 'gamemode/server/sv_database.lua')
-rw-r--r--gamemode/server/sv_database.lua155
1 files changed, 155 insertions, 0 deletions
diff --git a/gamemode/server/sv_database.lua b/gamemode/server/sv_database.lua
new file mode 100644
index 0000000..59b685f
--- /dev/null
+++ b/gamemode/server/sv_database.lua
@@ -0,0 +1,155 @@
+--One-type setup stuff
+print("Hello from database.lua!!")
+require("mysqloo")
+
+local createplayerquery
+local createplayerprepare = [[
+INSERT INTO playerdata (`SteamID`, `PlayerName`,`Inventory`,`WorldPosition`,`World`) VALUES(?, ?, ?, ?, ?)]]
+local createtablequery = [[
+create table if not exists playerdata(SteamID text, PlayerName text, Inventory json, WorldPosition text, World text)]]
+
+local function connectToDatabase()
+ if ART.database ~= nil then return end
+ ART.database = mysqloo.connect(
+ ART.config.dbhost,
+ ART.config.dbuser,
+ ART.config.dbpass,
+ ART.config.dbname,
+ ART.config.dbport
+ )
+ local db = ART.database
+
+ function db:onConnected()
+ print("Database connected successfully")
+ local q = self:query("SELECT 5+5")
+ function q:onSuccess(data)
+ print("Query successful")
+ PrintTable(data)
+ end
+ function q:onError(err, sql)
+ print("Query errored!")
+ print("Query",sql)
+ error(err)
+ end
+ q:start()
+ end
+
+ function db:onConnectionFailed( err )
+ print( "Connection to database failed!" )
+ print( "Error:",err )
+ end
+ print("Connecting to db")
+ db:connect()
+end
+
+connectToDatabase()
+
+local function checkDatabase()
+ local db = ART.database
+ print("Checking if playerdata table exists")
+ local q = db:query(createtablequery)
+ function q:onSuccess(data)
+ print("Got data:")
+ PrintTable(data)
+ end
+ function q:onError(err,sql)
+ print("Query error:")
+ print("Query",sql)
+ print("Error",err)
+ end
+ q:start()
+ print("Tried to query, something should be printed soon!")
+end
+
+checkDatabase()
+
+local function loadQueries()
+ local db = ART.database
+ print("Loading queries")
+ createplayerquery = db:prepare(createplayerprepare)
+ print("starting inventory:")
+ print(ART.defaults.starting_inventory)
+ createplayerquery:setString(3,ART.defaults.starting_inventory)
+ createplayerquery:setString(4,ART.defaults.starting_position)
+ createplayerquery:setString(5,ART.defaults.starting_world)
+ function createplayerquery:onSuccess(data)
+ print("Created player entry successfully!")
+ end
+ function createplayerquery:onError(err)
+ print("An error occured while createing a player entry: " .. err)
+ end
+ ART.DatabaseConnected = true
+end
+
+loadQueries()
+
+function ART.loadPlayerData(ply)
+ assert(ART.DatabaseConnected,"Player joined while setup was not complete!")
+ print("Attempting to load player data")
+ local steamid = ply:SteamID()
+ local db = ART.database
+ local q = db:query([[
+select Inventory, WorldPosition, World from playerdata where SteamID="]] .. steamid .. "\"")
+ function q:onSuccess(data)
+ if #data == 0 then --Player does not have an entry, make one!
+ print("Player does not have entry!")
+ if ART.config.server_world ~= ART.defaults.starting_world then
+ print("You didn't connect to the starting world, you are on:")
+ print(ART.config.server_world)
+ print("The starting world is")
+ print(ART.defaults.starting_world)
+ local ccmd = "connect " .. ART.defaults.starting_world
+ print("Running concommand:" .. ccmd)
+ --ply:ConCommand(ccmd)
+ else
+ print("New player without entry in database, and he's connected to the right place!")
+ createplayerquery:setString(1,steamid)
+ createplayerquery:setString(2,ply:Nick())
+ createplayerquery:start()
+ ply:ConCommand("retry") -- reconnect to the server to load player data normally
+ end
+ else
+ assert(#data == 1, "Two players with the same steamID? Something's gone horribly wrong!")
+ print("Loaded player data,")
+ --PrintTable(data)
+ local world = data[1].World
+ local inv = data[1].Inventory
+ local worldpos = data[1].WorldPosition
+ print("World:" .. world)
+ PrintTable(data)
+ if world ~= ART.config.server_world then
+ print("Joined the wrong world, redirecting!")
+ print("You are on :" .. ART.config.server_world .. " which is not " .. world)
+ local ccmd = "connect " .. world
+ --ply:ConCommand(ccmd)
+ return
+ end
+ --Otherwise, we're in the right world, load our data
+ ply:LoadInventory(inv)
+ local postbl = string.Explode(" ", worldpos)
+ local posvec = Vector(postbl[1],postbl[2],postbl[3])
+ print("Setting player pos to:")
+ print(posvec)
+ ply:SetPos(posvec)
+ end
+
+ end
+ function q:onError(err,sql)
+ print("Query error:")
+ print("Query",sql)
+ print("Error",err)
+ end
+ q:start()
+end
+
+--A randomly assigned model based on a player's UniqueID, so it should always stay the same.
+
+--[[
+hook.Add("PlayerInitialSpawn","ArteryPlayerInit",function(ply)
+ local modelnum = ply:UniqueID() % (#models)
+ print("Setting player model")
+ ply:SetModel(models[modelnum])
+ print("Loading data")
+ ART.loadPlayerData(ply)
+end)
+]]