Advertisement
81_DrizZle

Untitled

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