Advertisement
Guest User

kekettes

a guest
Jun 19th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.86 KB | None | 0 0
  1. """
  2. subscribers - tier 1 1000, tier 2 2500 tier 3 5000 / semaine
  3. DONE !gamble X : d100 50 -> x/2 gagnés
  4. !versus
  5. !contest
  6. DONE !makeitrain
  7. DONE !doubletrouble
  8. DONE !kekettes pour voir les kekettes
  9. cheer = 1000 points par 100 bits
  10.  
  11.  
  12.  
  13. pseudo 1: !vs "pseudo2" "montant"
  14. bot: pseudo2 vous êtes challengé par "pseudo1"
  15. pseudo2: !vs pseudo1 "montant"
  16. plus on parie plus on a de chances de gagner base montant1=montant2 : 50/50
  17. montant1/(montant1+2)*100 %
  18. """
  19.  
  20. import socket
  21. from twitch import TwitchClient
  22. from twitch.api.streams import Streams
  23. import csv
  24. from datetime import datetime
  25. import time
  26. from threading import Thread, RLock
  27. import random as rd
  28. import math
  29.  
  30. lock = RLock()
  31.  
  32. BOT_HAS_STARTED = "KekettesBot is now running !"
  33. NOT_ENOUGH_POINTS = "User {} has not enough kekettes to perform this action."
  34. DISPLAY_POINTS = "User {} has {} kekettes"
  35. USER_CHALLENGED_YOU = "{0}, user {1} has challenged you ! Type !vs {1} *amount* to accept."
  36. DISPLAY_CHALLENGE_ODDS = "{0} has put {1} on the table. {2} has put {3} on the table. {0} has {4}% chances of winning !"
  37. VS_WIN = "You won your duel versus {0}, you win {} kekettes."
  38. VS_LOST = "You lost your duel versus {0}, you lose {} kekettes."
  39. GAMBLE_WON = "{} rolled {} and thus has won {} kekettes !"
  40. GAMBLE_LOST = "{} rolled {} and thus has lost {} kekettes !"
  41. VALUE_ERROR_EXCEPTION = "You entered an incorrect value."
  42. BOT_LEAVING_CHAT = "KekettesBot has left the chat room, goodbye!"
  43. MADE_IT_RAIN = "Woohoo, {} made it rain !"
  44. DOUBLE_TROUBLE_STARTED = "{} has requested double points ! Everyone gets double for 10 minutes !"
  45. DOUBLE_TROUBLE_ENDED = "Double trouble has ended !"
  46. HELP_MESSAGE = "Available Commands: {}"
  47.  
  48. next_call = time.time()
  49.  
  50. def add_kekettes_every(users, base_drop_rate, points_multiplier):
  51.     global next_call
  52.     next_call = next_call+120
  53.     for i in range(1, len(users['username'])): #TODO: les viewers qui n'ont pas encore de kekettes (les nouveaux)
  54.         current = users["current"][i]
  55.         current = int(current)
  56.         current += self.base_drop_rate * self.points_multiplier
  57.         self.users["current"][i] = str(current)
  58.     threading.Timer( next_call - time.time(), add_kekettes_every ).start()
  59.  
  60. def help(users, text):
  61.     return HELP_MESSAGE, users, 0
  62.  
  63. def kekettes(users, text):
  64.     user_id = text.split("user-id=")[1].split(";")[0]
  65.     username = text.split(":")[1].split("!")[0]
  66.     i = users["user_id"].index(user_id)
  67.     balance = users['current'][i]
  68.     return DISPLAY_POINTS.format(username.capitalize(), balance), users, 0
  69.     pass
  70.  
  71. def gamble(users, text):
  72.     user_id = text.split("user-id=")[1].split(";")[0]
  73.     username = text.split(":")[1].split("!")[0]
  74.     i = users["user_id"].index(user_id)
  75.     balance = users['current'][i]
  76.     try:
  77.         message = text.split(":")[-1]
  78.         gmbl = message.split()[-1]
  79.         gmbl = int(gmbl)
  80.     except ValueError:
  81.         return VALUE_ERROR_EXCEPTION, users, 0
  82.     o = add_points_to_user(users, user_id, -gmbl)
  83.     if o:
  84.         users = o
  85.     else:
  86.         return NOT_ENOUGH_POINTS.format(username.capitalize()), users, 0
  87.     rng = rd.randint(1, 100)
  88.     if rng <50:
  89.         return GAMBLE_LOST.format(username.capitalize(), rng, gmbl), users, gmbl
  90.     else:
  91.         winnings = gmbl*(math.ceil((rng-50)/50*4)+1)
  92.         users = add_points_to_user(users, user_id, winnings)
  93.         return GAMBLE_WON.format(username.capitalize(), rng, winnings-gmbl), users, 0
  94.     pass
  95.  
  96. def doubletrouble(users, text):
  97.     username = username = text.split(":")[1].split("!")[0]
  98.     now = datetime.now().time()
  99.     then = addSecs(now, 600)
  100.     return (then, DOUBLE_TROUBLE_STARTED.format(username.capitalize())), users, 2000
  101.     pass
  102.  
  103. def versus(users, text):
  104.     pass
  105.  
  106. def makeitrain(users, text):
  107.     username = text.split(":")[1].split("!")[0]
  108.     for i in range(len(users['username'])):
  109.         current = int(users['current'][i])
  110.         current+= 30
  111.         users['current'][i] = str(current)
  112.     return MADE_IT_RAIN.format(username.capitalize()), users, 3000
  113.     pass
  114.  
  115. def add_points_to_user(users_dict, user_id, amount):
  116.     user_id = str(user_id)
  117.     if user_id in users_dict["user_id"]:
  118.         i = users_dict["user_id"].index(user_id)
  119.         if int(users_dict['current'][i]) + amount >= 0:
  120.             current = int(users_dict['current'][i])
  121.             current+= amount
  122.             users_dict['current'][i] = str(current)
  123.         else:
  124.             return False
  125.     elif user_id not in users_dict["user_id"] and amount<0:
  126.         return False
  127.     else:
  128.         i = users_dict["user_id"].index(user_id)
  129.         current = int(users_dict['current'][i])
  130.         current+= amount
  131.         users_dict['current'][i] = str(current)
  132.     return users_dict
  133.  
  134. def addSecs(tm, secs):
  135.     fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
  136.     fulldate = fulldate + datetime.timedelta(seconds=secs)
  137.     return fulldate.time()
  138.  
  139. class KeketteBot(Thread):
  140.     def __init__(self, commands):
  141.         Thread.__init__(self)
  142.         self.stop = False
  143.         #CONFIG
  144.         self.channel_name = 'misterteamot'
  145.         self.channel_oauth = '<redacted>'
  146.         self.max_messages = 100 #/30 sec
  147.         self.max_joins = 50 #/15 sec
  148.         self.base_drop_rate = 2 #per minute
  149.         self.points_multiplier = 1
  150.         self.csv_filename = "points.csv"
  151.         #IRC CONFIG
  152.         self.server = 'irc.chat.twitch.tv'
  153.         self.port = 6667
  154.         self.nickname = 'kekettesbot'
  155.         self.password = '<redacted>'
  156.         self.commands = commands
  157.         self.given_to_subs = False
  158.         self.end_doubletrouble = datetime.now().time()
  159.         self.doubletroublechanged = False
  160.         self.time_start_daemon = time.time()
  161.         self.points_not_given = True
  162.        
  163.         #Loader for csv data
  164.         fields = ['username', 'user_id', 'current', 'all_time']
  165.         self.users = {'username':[], 'user_id':[], 'current':[], 'all_time':[]}
  166.         with open(self.csv_filename, "r") as csvfile:
  167.             reader = csv.DictReader(csvfile, fieldnames=fields)
  168.             i = 0
  169.             for row in reader:
  170.                 i+=1
  171.                 if i>1:
  172.                     for f in fields:
  173.                         self.users[f].append(row[f])
  174.         print(self.users)
  175.         #IRC STUFF
  176.         self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
  177.         # Connect
  178.         #self.irc.bind((self.server, self.port))
  179.         self.irc.connect((self.server, self.port))
  180.         self.irc.setblocking(False)
  181.         self.irc.send("PASS {}\n".format(self.password).encode())
  182.         self.irc.send("NICK {}\n".format(self.nickname).encode())
  183.         self.irc.send("JOIN #{}\n".format(self.channel_name).encode())
  184.         self.irc.send("PRIVMSG #{} :{}\n".format(self.channel_name, BOT_HAS_STARTED).encode())
  185.         self.irc.send("CAP REQ :twitch.tv/membership\n".encode())
  186.         self.irc.send("CAP REQ :twitch.tv/tags\n".encode())
  187.         #TWITCH API STUFF
  188.         self.client_id = 'iaqh3hzv031qgn4182ardxfaeqiyzt'
  189.         self.client = TwitchClient(self.client_id, self.channel_oauth)
  190.         #self.channel = self.client.channels.get()
  191.         current_offset = 0
  192.         self.subscribers = []
  193.         #while self.client.channels.get_subscribers(self.channel._id, limit=100, offset=current_offset):
  194.         #   self.subscribers.extend(self.client.channels.get_subscribers(self.channel_oauth, limit=100, offset=current_offset))
  195.         #   current_offset += 100
  196.    
  197.     def run(self):
  198.         while not self.stop:
  199.             with lock:
  200.                 if datetime.now().time() > self.end_doubletrouble and self.doubletroublechanged:
  201.                     self.points_multiplier = 1
  202.                     self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, DOUBLE_TROUBLE_ENDED).encode())
  203.                     self.doubletroublechanged = False
  204.                 if int(time.time()-self.time_start_daemon)%120==0 and self.points_not_given:#datetime.now().minute%2 == 0 and datetime.now().second == 1: #donne des kekettes toutes les 2 minutes
  205.                     self.points_not_given = False
  206.                     for i in range(1, len(self.users['username'])): #TODO: les viewers qui n'ont pas encore de kekettes (les nouveaux)
  207.                         current = self.users["current"][i]
  208.                         current = int(current)
  209.                         current += self.base_drop_rate * self.points_multiplier
  210.                         self.users["current"][i] = str(current)
  211.                 if not self.points_not_given and int(time.time()-self.time_start_daemon)%121==0:
  212.                     self.points_not_given = True
  213.                 if datetime.now().weekday() == 0 and not self.given_to_subs: #Monday #Donne 1000 kekettes aux subs par semaine
  214.                     self.given_to_subs = True
  215.                     for sub in self.subscribers:
  216.                         i = self.users["user_id"].index(str(sub.id_))
  217.                         self.users["current"][i] += 1000
  218.                 try:
  219.                     text=self.irc.recv(4096).decode()
  220.                     print(text)
  221.                     # Prevent Timeout
  222.                     if text.find('PING') != -1:
  223.                         self.irc.send('PONG {}\r\n'.format(text.split()[1]).encode())
  224.                         print('PONG {}\r\n'.format(text.split()[1]))
  225.                     #If message received
  226.                     elif text.find('PRIVMSG') != -1:
  227.                         if "!quit" in text and "mod" in text.split("user-type=")[1].split(":")[0]:
  228.                             self.quit()
  229.                         for command, handle in self.commands.items():
  230.                             if text.find(command) != -1:
  231.                                 print("Command found !")
  232.                                 username = text.split(":")[1].split("!")[0]
  233.                                 user_id = text.split("user-id=")[1].split(";")[0]
  234.                                 print((username, user_id))
  235.                                 output, self.users, cost = handle(self.users, text)
  236.                                 print(output)
  237.                                 o = add_points_to_user(self.users, user_id, -cost)
  238.                                 if o:
  239.                                     self.users = o
  240.                                 else:
  241.                                     self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, NOT_ENOUGH_POINTS.format(username.capitalize())).encode())
  242.                                 if type(output) == type(str()):
  243.                                     self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, output).encode())
  244.                                 elif type(output) == type(tuple()):
  245.                                     self.points_multiplier += 1
  246.                                     self.end_doubletrouble = output[0]
  247.                                     self.doubletroublechanged = True
  248.                                     self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, output[1]).encode())
  249.                 except Exception as e:
  250.                     if "10035" not in repr(e):
  251.                         print("{} : {}".format(type(e), e))
  252.                     continue
  253.    
  254.     def quit(self):
  255.         self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, BOT_LEAVING_CHAT).encode())
  256.         self.irc.send('PART'.encode())
  257.         self.irc.close()
  258.         self.stop = True
  259.         with open(self.csv_filename, 'w') as csvfile:
  260.             fieldnames = ['username', 'user_id', 'current', 'all_time']
  261.             writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
  262.             writer.writeheader()
  263.             for i in range(len(self.users['username'])):
  264.                 writer.writerow({
  265.                 'username': self.users["username"][i],
  266.                 'user_id': self.users["user_id"][i],
  267.                 'current': self.users["current"][i],
  268.                 'all_time': self.users["all_time"][i]
  269.                 })
  270.    
  271.        
  272. def main():
  273.     commands = {'!kekettes':kekettes, #displays the amount of points the user has
  274.                 '!gamble':gamble, #gamble a set amount of points
  275.                 '!makeitrain':makeitrain, #gives each user 30 points
  276.                 '!doubletrouble':doubletrouble, #double the drop-rate of points for 30 minutes
  277.                 'versus':versus, # challenge un autre viewer a un versus
  278.                 '!helpkekettes':help #Affiche l'aide
  279.                 }
  280.     HELP_MESSAGE.format(commands.keys())
  281.     #Most normal chat commands like /timeout, /ban, /clear are sent with periods
  282.     #in place of the forward slash. For example, to ban the user "xangold", you
  283.     #would send ".ban xangold" to the server (minus the quotes).
  284.     bot = KeketteBot(commands)
  285.     print('KekettesBot is now running !')
  286.     bot.start()
  287.    
  288.  
  289. if __name__ == '__main__':
  290.     main()
  291.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement