Advertisement
81_DrizZle

Untitled

Jun 20th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.86 KB | None | 0 0
  1. --@author Kenshin
  2. --@version 21.06.2019
  3.  
  4. --#region rewards config
  5. local donatorGroup = "Donator"
  6. local dailyTPassAmount = 2
  7. local dailyDetePassAmount = 2
  8. local rewardCooldown = 24 -- in hours
  9. --#endregion
  10.  
  11. --#region mysql config
  12. local mysql_hostname = '127.0.0.1'
  13. local mysql_username = 'gmod'
  14. local mysql_password = 'AcMkz15orXkEHR73'
  15. local mysql_database = 'gmod'
  16. local mysql_port = 3306
  17. --#endregion
  18.  
  19. --#region Connect to DB
  20. require('mysqloo')
  21. local db = mysqloo.connect(mysql_hostname, mysql_username, mysql_password, mysql_database, mysql_port)
  22. function db:onConnected()
  23.     print("[DailyRewards] Successfully connected to database.")
  24. end
  25. function db:onConnectionFailed(err)
  26.     print("[DailyRewards] Connection to database failed: " .. err)
  27. end
  28. db:connect()
  29. --#endregion
  30.  
  31. --#region Handle MySQLError
  32. local 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()
  42. end
  43. --#endregion
  44.  
  45. --#region Create table if it does not exist yet
  46. local 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`))"
  47. local query = db:query(cmd)
  48. function query:onError(err, sql)
  49.     handleMySQLError(query,err,sql)
  50. end
  51. query:start()
  52. --#endregion
  53.  
  54. --#region Function to format unix timestamp
  55. local 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
  60. end
  61. --#endregion
  62.  
  63. --#region Handle Playercommand
  64. hook.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
  116. hook.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
  144. hook.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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement