diff options
| author | Alexander Pickering <alexandermpickering@gmail.com> | 2016-07-10 17:04:29 -0400 |
|---|---|---|
| committer | Alexander Pickering <alexandermpickering@gmail.com> | 2016-07-10 17:04:29 -0400 |
| commit | 1de5f9ac6f038bfed2230cc1272b253794b2f41a (patch) | |
| tree | 15bc9d515f1f48c036522afb7cc71f60243849a9 /gamemode/server/sv_database.lua | |
| download | artery-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.lua | 155 |
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) +]] |
