· 6 years ago · Jun 20, 2019, 10:04 PM
1--#region rewards config
2local donatorGroup = "Donator"
3local dailyTPassAmount = 2
4local dailyDetePassAmount = 2
5local rewardCooldown = 24 -- in hours
6--#endregion
7
8--#region mysql config
9local mysql_hostname = '127.0.0.1'
10local mysql_username = 'gmod'
11local mysql_password = 'AcMkz15orXkEHR73'
12local mysql_database = 'gmod'
13local mysql_port = 3306
14--#endregion
15
16--#region Connect to DB
17require('mysqloo')
18local db = mysqloo.connect(mysql_hostname, mysql_username, mysql_password, mysql_database, mysql_port)
19function db:onConnected()
20 print("[DailyRewards] Successfully connected to database.")
21end
22function db:onConnectionFailed(err)
23 print("[DailyRewards] Connection to database failed: " .. err)
24end
25db:connect()
26--#endregion
27
28--#region Handle MySQLError
29local function handleMySQLError(query,err,sql)
30 if db:status() ~= mysqloo.DATABASE_CONNECTED then
31 db:connect()
32 db:wait()
33 if db:status() ~= mysqloo.DATABASE_CONNECTED then
34 ErrorNoHalt("Re-connection to database server failed.")
35 return
36 end
37 end
38 query:start()
39end
40--#endregion
41
42--#region Create table if it does not exist yet
43local cmd = "CREATE TABLE IF NOT EXISTS `dailyrewards` (`steamid` VARCHAR(20) NOT NULL, `lastlogin` INT(32) NOT NULL, `tPass` INT(32) NOT NULL DEFAULT " .. dailyTPassAmount .. ", `detePass` INT(32) NOT NULL DEFAULT " .. dailyDetePassAmount .. ", PRIMARY KEY (`steamid`))"
44local query = db:query(cmd)
45function query:onError(err, sql)
46 handleMySQLError(query,err,sql)
47end
48query:start()
49--#endregion
50
51--#region Function to format unix timestamp
52local function formatTime(currTime)
53 hours = string.format("%02.f", math.floor(currTime/3600));
54 mins = string.format("%02.f", math.floor(currTime/60 - (hours*60)));
55 secs = string.format("%02.f", math.floor(currTime - hours*3600 - mins *60));
56 return hours..":"..mins..":"..secs
57end
58--#endregion
59
60--#region Handle Playercommand
61hook.Add("PlayerSay", "SP_DailyRewards_HandlePlayerCommand",
62 function(ply,text)
63 if ply:IsUserGroup(donatorGroup) or ply:IsUserGroup("Developer") then -- TODO: REMOVE DEV
64 if string.lower(text) == "!traitor" or string.lower(text) == "!t" or string.lower(text) == "!detective" or string.lower(text) == "!dete" then
65 local cmd5 = "SELECT * FROM dailyrewards WHERE steamid = '%s'"
66 local query5 = db:query(string.format(cmd5,ply:SteamID()))
67
68 function query5:onSuccess(data)
69 if #data > 0 then
70 local row = data[1]
71 local tmp
72 if string.sub(string.lower(text),1,2) == "!t" then tmp = "tPass;Traitor;ROLE_TRAITOR" else tmp = "detePass;Detective;ROLE_DETECTIVE" end
73 if row[string.Split(tmp,";")[1]] > 0 then -- does the player still have a pass left?
74 local cmd6 = "UPDATE dailyrewards SET %s='%d' WHERE steamid = '%s'"
75 local query6 = db:query(string.format(cmd6,string.Split(tmp,";")[1], row[string.Split(tmp,";")[1]]-1, ply:SteamID()))
76
77 function query6:onError(err,sql)
78 handleMySQLError(query6,err,sql)
79 end
80 query6:start()
81 ply:PrintMessage(HUD_PRINTTALK, "[GEHEIM] Du wirst in der nächsten Runde " .. string.Split(tmp,";")[2] .. ". Dir bleiben " .. row[string.Split(tmp,";")[1]]-1 .. " " .. string.Split(tmp,";")[2] .. " Pässe." )
82 ply:SetRole(string.Split(tmp,";")[3]) --ROLE_TRAITOR/ROLE_DETECTIVE
83 else
84 if row.lastlogin + rewardCooldown *3600-os.time() <= 0 then
85 local cmd7 = "UPDATE dailyrewards SET lastlogin='%d', tPass='%d', detePass='%d'"
86 local query7 = db:query(string.format(cmd7, os.time(), dailyTPassAmount, dailyDetePassAmount))
87
88 function query7:onError(err,sql)
89 handleMySQLError(query7,err,sql)
90 end
91 query7:start()
92 else
93 ply:PrintMessage(HUD_PRINTTALK, "Du kannst in " .. formatTime((row.lastlogin + rewardCooldown *3600)-os.time()))
94 end
95 end
96 else
97 ply:PrintMessage(HUD_PRINTTALK, "Das hat nicht geklappt. Wende dich bitte an einen Admin oder einen Developer.")
98 end
99 end
100 function query5:onError(err,sql)
101 handleMySQLError(query5,err,sql)
102 end
103 query5:start()
104 end
105 end
106 end
107)
108--#endregion
109
110--#region Handle new player
111hook.Add("PlayerInitialSpawn", "SP_DailyRewards_HandleNewPlayer",
112 function(ply)
113 if ply:IsUserGroup(donatorGroup) or ply:IsUserGroup("Developer") then -- TODO: REMOVE DEV
114 local cmd2 = "SELECT * FROM dailyrewards WHERE steamid = '%s'" -- Try to select player's info from mysql database
115 local query2 = db:query(string.format(cmd2,ply:SteamID()))
116
117 function query2:onSuccess(data)
118 if #data <= 0 or data == nil then
119 local cmd3 = "INSERT INTO dailyrewards VALUES('%s','%d','%d','%d')" -- create player profile in database
120 local query3 = db:query(string.format(cmd3, ply:SteamID(), os.time(),dailyTPassAmount,dailyDetePassAmount))
121
122 function query3:onError(err,sql)
123 handleMySQLError(query3,err,sql)
124 end
125 query3:start()
126 end
127 end
128
129 function query2:onError(err,sql)
130 handleMySQLError(query2,err,sql)
131 end
132 query2:start()
133 end
134 end
135)
136--#endregion
137
138--#region Handle leaving player
139hook.Add("PlayerDisconnected", "SP_DailyRewards_HandleLeavingPlayer",
140 function(ply)
141 if ply:IsUserGroup(donatorGroup) or ply:IsUserGroup("Developer") then -- TODO: REMOVE DEV
142 local cmd4 = "UPDATE dailyrewards SET lastlogin='%d' WHERE steamid = '%s'"
143 local query4 = db:query(string.format(cmd4,os.time(),ply:SteamID()))
144
145 function query4:onError(err,sql)
146 handleMySQLError(query4,err,sql)
147 end
148 query4:start()
149 end
150 end
151)
152--#endregion