diff --git a/bot/modules/avalon.py b/bot/modules/avalon.py new file mode 100644 index 0000000..ec8a2b4 --- /dev/null +++ b/bot/modules/avalon.py @@ -0,0 +1,134 @@ +import random + +from bot import traductions as tr +import json + + +def to_str(entier): + return str(entier).replace("1", "a").replace("2", "b").replace("3", "c").replace("4", "d").replace("5", "e") \ + .replace("6", "f").replace("7", "g").replace("8", "h").replace("9", "i").replace("0", "j") + + +class MainClass: + name = "avalon" + + def __init__(self, guild): + self.guild = guild + # Init database + self.curent_games = [] + self.current_waiting_players = [] + self.current_roles = [] + self.current_players = [] + with self.guild.bot.database.cursor() as cursor: + sql_init = "CREATE TABLE IF NOT EXISTS {guild_id}avalon (" \ + " id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY," \ + " nb_joueurs int(5) NOT NULL," \ + " gentil_a varchar(50) NOT NULL," \ + " gentil_b varchar(50) NOT NULL," \ + " gentil_c varchar(50)," \ + " gentil_d varchar(50)," \ + " gentil_e varchar(50)," \ + " gentil_f varchar(50)," \ + " mechant_a varchar(50) NOT NULL," \ + " mechant_b varchar(50)," \ + " mechant_c varchar(50)," \ + " mechant_d varchar(50)," \ + " merlin varchar(50) NOT NULL," \ + " assassin varchar(50) NOT NULL," \ + " mordred varchar(50)," \ + " perceval varchar(50)," \ + " morgane varchar(50)," \ + " oberon varchar(50)," \ + " vainqueur varchar(50)" \ + ")".format(guild_id=self.guild.id) + cursor.execute(sql_init) + + async def start(self, msg, command, args): + if len(self.current_waiting_players) >= 5: + await msg.channel.send( + tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstart"]["notenoughtplayers"]) + return + elif len(self.current_waiting_players) != len(self.current_roles): + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstart"]["rolesnotmatch"]) + return + else: + self.current_games.append({ + "channel": msg.channel.id, + "players": self.current_waiting_players, + "gentils": [], + "mechants": [], + "merlin": None, + "assassin": None, + "mordred": None, + "perceval": None, + "morgane": None, + "oberon": None + }) + for player in self.current_waiting_players: + role = random.choose(self.current_roles) + self.current_roles.remove() + self.current_waiting_players = [] + + async def quit(self, msg, command, args): + if msg.author.id in self.current_waiting_players: + self.current_waiting_players.remove(msg.author.id) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonquit"]["quit"] + .format(player_id=msg.author.id, + nb_players=len(self.current_waiting_players))) + elif msg.author.id in self.current_players: + self.quitting_players.append(msg.author.id) + to_del = [] + # Verify if everyone want to quit game + for game in self.curent_games: + stop_game = True + for game_player in game.players: + if game_player not in self.quitting_player: + stop_game = False + if stop_game: + to_del.append(game) + for game in to_del: + self.curent_games.remove(game) + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonquit"]["alreadyplaying"] + .format(player_id=msg.authpr.id)) + + async def join(self, msg, command, args): + # Personne pas déjà en train d'attendre, ni en train de jouer + if msg.author.id not in self.current_waiting_players + self.current_players: + self.current_waiting_players.append(msg.author.id) + await msg.channel.send( + tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["join"] + .format(player_id=msg.author.id, + nb_players=len(self.current_waiting_players))) + if len(self.current_waiting_players) >= 5: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["canplay"] + .format(prefix=self.guild.config["prefix"])) + elif msg.author.id in self.current_players: + await msg.channel.send( + tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["alreadyplaying"] + .format(player_id=msg.author.id)) + elif msg.author.id in self.current_waiting_players: + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonjoin"]["alreadywaiting"] + .format(player_id=msg.author.id)) + + async def stats(self, msg, command, args): + with self.guild.bot.database.cursor() as cursor: + cursor.execute("SELECT id,nb_joueurs,vainqueur FROM {guild_id}avalon;".format(guild_id=self.guild.id)) + results = cursor.fetchall() + nb_games = len(results) + nb_victoire_gentil = len(list([result for result in results if results["vainqueur"] == "gentil"])) + nb_victoire_mechant = nb_games - nb_victoire_gentil + await msg.channel.send(tr.tr[self.guild.config["lang"]]["modules"]["avalon"]["avalonstats"] + .format(nb_games=nb_games, + nb_victoire_gentil=nb_victoire_gentil, + nb_victoire_mechant=nb_victoire_mechant)) + + async def on_message(self, msg): + if msg.content.startswith(self.guild.config["prefix"]): + command, *args = msg.content.lstrip(self.guild.config["prefix"]).split(" ") + if command == "avalonstats": + await self.stats(msg, command, args) + elif command == "avalonjoin": + await self.join(msg, command, args) + elif command == "avalonquit": + await self.quit(msg, command, args) + return diff --git a/bot/traductions.py b/bot/traductions.py index ce446ee..1eef7bc 100644 --- a/bot/traductions.py +++ b/bot/traductions.py @@ -115,7 +115,7 @@ tr = { ("`(prefix}pi`", "Affiche les 2000 premières décimales de pi."), ("`{prefix}pi 2000`", "Affiche 2000 décimales de pi à partir de la 2000ème"), ], - },"fpi": { + }, "fpi": { "description": "Recherche l'expression régulière dans pi", "examples": [ ("`{prefix}fpi 12345`", "Affiche les 10 premières occurences de 12345 dans pi"), @@ -126,18 +126,75 @@ tr = { "pi": "Voici les 2000 décimales de pi que vous avez demandé (à partir de la {debut}ème):", "fpi": "Une occurence de votre recherche a été trouvée à la {debut}ème place: `{before}`{find}`{after}`", }, + "avalon": { + "description": "Commandes relatives au jeu avalon", + "help": { + "avalonstats": { + "description": "Donne les stats du jeu avalon sur le serveur", + "examples": [ + ("`{prefix}`avalonstats", "Affiche les stats des parties avalon du serveur"), + ], + }, + "avalonjoin": { + "description": "Rejoindre la liste d'attente des joueurs pour avalon", + "examples": [ + ("`{prefix}avalonjoin`", "Rejoindre la liste d'attente d'une partie avalon"), + ], + }, + "avalonstart": { + "description": "Lancer la partie d'avalon", + "examples": [ + ("`{prefix}`avalonstart", "Lance la partie d'avalon si il ya a assez de joueurs.") + ] + } + }, + "avalonstats": "Depuis la création du jeu sur ce serveur {nb_games} parties de avalon ont étés jouées, " + "les gentils ont gagnés {nb_victoire_gentil} et les méchants ont gagnés " + "{nb_victoire_mechant}", + "avalonjoin": { + "join": "<@{player_id}>, vous avec rejoint la partie avalon, il y a actuellement {nb_players} " + "joueurs dans cette partie", + "canplay": "Il y a maintenant assez de joueurs, tapez `{prefix}avalonstart` pour démarer la partie.", + "alreadyplay": "Vous ne pouvez pas jouer à deux parties en même temps.", + "alreadywaiting": "Vous attendez déja de pouvoir jouer", + }, + "avalonquit": { + "quit": "<@{player_id>, vous avez bien quitté la partie, il reste {nb_players} joueurs", + "alreadyplaying": "<@{player_id}> vous êtes dans une partie déjà commencé, tous les joueurs de la " + "partie doivent quitter pour que la partie se termine." + }, + "avalonstart": { + "start": "La partie est lancée, avec {nb_joueurs}. Les roles {liste_roles} sont présents. Bonne " + "partie!", + "roles": { + "gentil": "gentil", + "mechant": "mechant", + "merlin": "merlin", + "assassin": "assassin", + "mordred": "mordred", + "perceval": "perceval", + "morgane": "morgane", + "oberon": "obéron" + }, + "bienvenue": "Je vous souhaite à tous la bienvenue autour de cette table ronde, maleuresement au moins " + "deux méchants sont présents. Leur but est de faire échouer trois quêtes du roi arthur, ou " + "de refuser cinq écuipes de quêtes d'affilé. Le roi arthur va proposer cinq quêtes, vous " + "devrez pour chacunes composer un équipe, la faire valider par les autres et réussir la " + "quête." + }, + }, "github": { "description": "Commands relatives à discord", "help": { "sourcecode": { "description": "Donne un lien vers mon code source (il est là comme ca tu a pas retapper la \ commande :smile: https://github.com/Fomys/foBot", - "examples":[ - ("`prefix`sourcecode", "Affiche mon code source") + "examples": [ + ("`{prefix}`sourcecode", "Affiche mon code source") ] }, }, - "sourcecode":"Mon code source est disponible sur github: https://github.com/Fomys/foBot", + "sourcecode": "Mon code source est disponible sur github: https://github.com/Fomys/foBot", }, "tools": { "description": "Commandes utiles",