aboutsummaryrefslogtreecommitdiff
path: root/gamemode/server/sv_database.lua
blob: 357d8689e3b8c0e6353e574cfc67b7cfb64f21e4 (plain)
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
--One-type setup stuff
print("Hello from database.lua!!")
require("mysqloo")

local createplayerquery
local createplayerprepare = [[
INSERT INTO playerdata (`SteamID`, `PlayerName`,`Inventory`, `Skills`,`Quests`,`WorldPosition`,`World`) VALUES(?, ?, ?, ?, ?, ?, ?)]]
local createtablequery = [[
create table if not exists playerdata(SteamID bigint primary key, PlayerName text, Inventory json, Skills json, Quests 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_skills)
    createplayerquery:setString(5,ART.defaults.starting_quests)
    createplayerquery:setString(6,ART.defaults.starting_position)
    createplayerquery:setString(7,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:SteamID64()
    local db = ART.database
    local q = db:query([[
select Inventory, Skills, Quests, 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)
            ply.Skills = util.JSONToTable(data[1].Skills)
            ply.Quests = util.JSONToTable(data[1].Quests)
            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)
]]