Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- """
- subscribers - tier 1 1000, tier 2 2500 tier 3 5000 / semaine
- DONE !gamble X : d100 50 -> x/2 gagnés
- !versus
- !contest
- DONE !makeitrain
- DONE !doubletrouble
- DONE !kekettes pour voir les kekettes
- cheer = 1000 points par 100 bits
- pseudo 1: !vs "pseudo2" "montant"
- bot: pseudo2 vous êtes challengé par "pseudo1"
- pseudo2: !vs pseudo1 "montant"
- plus on parie plus on a de chances de gagner base montant1=montant2 : 50/50
- montant1/(montant1+2)*100 %
- """
- import socket
- from twitch import TwitchClient
- from twitch.api.streams import Streams
- import csv
- from datetime import datetime
- import time
- from threading import Thread, RLock
- import random as rd
- import math
- lock = RLock()
- BOT_HAS_STARTED = "KekettesBot is now running !"
- NOT_ENOUGH_POINTS = "User {} has not enough kekettes to perform this action."
- DISPLAY_POINTS = "User {} has {} kekettes"
- USER_CHALLENGED_YOU = "{0}, user {1} has challenged you ! Type !vs {1} *amount* to accept."
- DISPLAY_CHALLENGE_ODDS = "{0} has put {1} on the table. {2} has put {3} on the table. {0} has {4}% chances of winning !"
- VS_WIN = "You won your duel versus {0}, you win {} kekettes."
- VS_LOST = "You lost your duel versus {0}, you lose {} kekettes."
- GAMBLE_WON = "{} rolled {} and thus has won {} kekettes !"
- GAMBLE_LOST = "{} rolled {} and thus has lost {} kekettes !"
- VALUE_ERROR_EXCEPTION = "You entered an incorrect value."
- BOT_LEAVING_CHAT = "KekettesBot has left the chat room, goodbye!"
- MADE_IT_RAIN = "Woohoo, {} made it rain !"
- DOUBLE_TROUBLE_STARTED = "{} has requested double points ! Everyone gets double for 10 minutes !"
- DOUBLE_TROUBLE_ENDED = "Double trouble has ended !"
- HELP_MESSAGE = "Available Commands: {}"
- next_call = time.time()
- def add_kekettes_every(users, base_drop_rate, points_multiplier):
- global next_call
- next_call = next_call+120
- for i in range(1, len(users['username'])): #TODO: les viewers qui n'ont pas encore de kekettes (les nouveaux)
- current = users["current"][i]
- current = int(current)
- current += self.base_drop_rate * self.points_multiplier
- self.users["current"][i] = str(current)
- threading.Timer( next_call - time.time(), add_kekettes_every ).start()
- def help(users, text):
- return HELP_MESSAGE, users, 0
- def kekettes(users, text):
- user_id = text.split("user-id=")[1].split(";")[0]
- username = text.split(":")[1].split("!")[0]
- i = users["user_id"].index(user_id)
- balance = users['current'][i]
- return DISPLAY_POINTS.format(username.capitalize(), balance), users, 0
- pass
- def gamble(users, text):
- user_id = text.split("user-id=")[1].split(";")[0]
- username = text.split(":")[1].split("!")[0]
- i = users["user_id"].index(user_id)
- balance = users['current'][i]
- try:
- message = text.split(":")[-1]
- gmbl = message.split()[-1]
- gmbl = int(gmbl)
- except ValueError:
- return VALUE_ERROR_EXCEPTION, users, 0
- o = add_points_to_user(users, user_id, -gmbl)
- if o:
- users = o
- else:
- return NOT_ENOUGH_POINTS.format(username.capitalize()), users, 0
- rng = rd.randint(1, 100)
- if rng <50:
- return GAMBLE_LOST.format(username.capitalize(), rng, gmbl), users, gmbl
- else:
- winnings = gmbl*(math.ceil((rng-50)/50*4)+1)
- users = add_points_to_user(users, user_id, winnings)
- return GAMBLE_WON.format(username.capitalize(), rng, winnings-gmbl), users, 0
- pass
- def doubletrouble(users, text):
- username = username = text.split(":")[1].split("!")[0]
- now = datetime.now().time()
- then = addSecs(now, 600)
- return (then, DOUBLE_TROUBLE_STARTED.format(username.capitalize())), users, 2000
- pass
- def versus(users, text):
- pass
- def makeitrain(users, text):
- username = text.split(":")[1].split("!")[0]
- for i in range(len(users['username'])):
- current = int(users['current'][i])
- current+= 30
- users['current'][i] = str(current)
- return MADE_IT_RAIN.format(username.capitalize()), users, 3000
- pass
- def add_points_to_user(users_dict, user_id, amount):
- user_id = str(user_id)
- if user_id in users_dict["user_id"]:
- i = users_dict["user_id"].index(user_id)
- if int(users_dict['current'][i]) + amount >= 0:
- current = int(users_dict['current'][i])
- current+= amount
- users_dict['current'][i] = str(current)
- else:
- return False
- elif user_id not in users_dict["user_id"] and amount<0:
- return False
- else:
- i = users_dict["user_id"].index(user_id)
- current = int(users_dict['current'][i])
- current+= amount
- users_dict['current'][i] = str(current)
- return users_dict
- def addSecs(tm, secs):
- fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
- fulldate = fulldate + datetime.timedelta(seconds=secs)
- return fulldate.time()
- class KeketteBot(Thread):
- def __init__(self, commands):
- Thread.__init__(self)
- self.stop = False
- #CONFIG
- self.channel_name = 'misterteamot'
- self.channel_oauth = '<redacted>'
- self.max_messages = 100 #/30 sec
- self.max_joins = 50 #/15 sec
- self.base_drop_rate = 2 #per minute
- self.points_multiplier = 1
- self.csv_filename = "points.csv"
- #IRC CONFIG
- self.server = 'irc.chat.twitch.tv'
- self.port = 6667
- self.nickname = 'kekettesbot'
- self.password = '<redacted>'
- self.commands = commands
- self.given_to_subs = False
- self.end_doubletrouble = datetime.now().time()
- self.doubletroublechanged = False
- self.time_start_daemon = time.time()
- self.points_not_given = True
- #Loader for csv data
- fields = ['username', 'user_id', 'current', 'all_time']
- self.users = {'username':[], 'user_id':[], 'current':[], 'all_time':[]}
- with open(self.csv_filename, "r") as csvfile:
- reader = csv.DictReader(csvfile, fieldnames=fields)
- i = 0
- for row in reader:
- i+=1
- if i>1:
- for f in fields:
- self.users[f].append(row[f])
- print(self.users)
- #IRC STUFF
- self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
- # Connect
- #self.irc.bind((self.server, self.port))
- self.irc.connect((self.server, self.port))
- self.irc.setblocking(False)
- self.irc.send("PASS {}\n".format(self.password).encode())
- self.irc.send("NICK {}\n".format(self.nickname).encode())
- self.irc.send("JOIN #{}\n".format(self.channel_name).encode())
- self.irc.send("PRIVMSG #{} :{}\n".format(self.channel_name, BOT_HAS_STARTED).encode())
- self.irc.send("CAP REQ :twitch.tv/membership\n".encode())
- self.irc.send("CAP REQ :twitch.tv/tags\n".encode())
- #TWITCH API STUFF
- self.client_id = 'iaqh3hzv031qgn4182ardxfaeqiyzt'
- self.client = TwitchClient(self.client_id, self.channel_oauth)
- #self.channel = self.client.channels.get()
- current_offset = 0
- self.subscribers = []
- #while self.client.channels.get_subscribers(self.channel._id, limit=100, offset=current_offset):
- # self.subscribers.extend(self.client.channels.get_subscribers(self.channel_oauth, limit=100, offset=current_offset))
- # current_offset += 100
- def run(self):
- while not self.stop:
- with lock:
- if datetime.now().time() > self.end_doubletrouble and self.doubletroublechanged:
- self.points_multiplier = 1
- self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, DOUBLE_TROUBLE_ENDED).encode())
- self.doubletroublechanged = False
- 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
- self.points_not_given = False
- for i in range(1, len(self.users['username'])): #TODO: les viewers qui n'ont pas encore de kekettes (les nouveaux)
- current = self.users["current"][i]
- current = int(current)
- current += self.base_drop_rate * self.points_multiplier
- self.users["current"][i] = str(current)
- if not self.points_not_given and int(time.time()-self.time_start_daemon)%121==0:
- self.points_not_given = True
- if datetime.now().weekday() == 0 and not self.given_to_subs: #Monday #Donne 1000 kekettes aux subs par semaine
- self.given_to_subs = True
- for sub in self.subscribers:
- i = self.users["user_id"].index(str(sub.id_))
- self.users["current"][i] += 1000
- try:
- text=self.irc.recv(4096).decode()
- print(text)
- # Prevent Timeout
- if text.find('PING') != -1:
- self.irc.send('PONG {}\r\n'.format(text.split()[1]).encode())
- print('PONG {}\r\n'.format(text.split()[1]))
- #If message received
- elif text.find('PRIVMSG') != -1:
- if "!quit" in text and "mod" in text.split("user-type=")[1].split(":")[0]:
- self.quit()
- for command, handle in self.commands.items():
- if text.find(command) != -1:
- print("Command found !")
- username = text.split(":")[1].split("!")[0]
- user_id = text.split("user-id=")[1].split(";")[0]
- print((username, user_id))
- output, self.users, cost = handle(self.users, text)
- print(output)
- o = add_points_to_user(self.users, user_id, -cost)
- if o:
- self.users = o
- else:
- self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, NOT_ENOUGH_POINTS.format(username.capitalize())).encode())
- if type(output) == type(str()):
- self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, output).encode())
- elif type(output) == type(tuple()):
- self.points_multiplier += 1
- self.end_doubletrouble = output[0]
- self.doubletroublechanged = True
- self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, output[1]).encode())
- except Exception as e:
- if "10035" not in repr(e):
- print("{} : {}".format(type(e), e))
- continue
- def quit(self):
- self.irc.send('PRIVMSG #{} :{}\n'.format(self.channel_name, BOT_LEAVING_CHAT).encode())
- self.irc.send('PART'.encode())
- self.irc.close()
- self.stop = True
- with open(self.csv_filename, 'w') as csvfile:
- fieldnames = ['username', 'user_id', 'current', 'all_time']
- writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
- writer.writeheader()
- for i in range(len(self.users['username'])):
- writer.writerow({
- 'username': self.users["username"][i],
- 'user_id': self.users["user_id"][i],
- 'current': self.users["current"][i],
- 'all_time': self.users["all_time"][i]
- })
- def main():
- commands = {'!kekettes':kekettes, #displays the amount of points the user has
- '!gamble':gamble, #gamble a set amount of points
- '!makeitrain':makeitrain, #gives each user 30 points
- '!doubletrouble':doubletrouble, #double the drop-rate of points for 30 minutes
- 'versus':versus, # challenge un autre viewer a un versus
- '!helpkekettes':help #Affiche l'aide
- }
- HELP_MESSAGE.format(commands.keys())
- #Most normal chat commands like /timeout, /ban, /clear are sent with periods
- #in place of the forward slash. For example, to ban the user "xangold", you
- #would send ".ban xangold" to the server (minus the quotes).
- bot = KeketteBot(commands)
- print('KekettesBot is now running !')
- bot.start()
- if __name__ == '__main__':
- main()
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement