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