From 3f0ba14166bc240e1a6d78c440482dd0992b8953 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Tue, 11 Mar 2025 20:37:56 +0100 Subject: [PATCH] =?UTF-8?q?Gestion=20de=20la=20fin=20des=20d=C3=A9fis=20et?= =?UTF-8?q?=20des=20=C3=A9changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 147 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 127 insertions(+), 20 deletions(-) diff --git a/bot.py b/bot.py index 10ac2ba..f2488dc 100755 --- a/bot.py +++ b/bot.py @@ -45,6 +45,8 @@ CANTONS = { "ZH": "Zurich", } +EQUIPES = ["rouge", "vert"] + CodeCanton = Literal["AG", "AI", "AR", "BE", "BL", "BS", "FR", "GE", "GL", "GR", "JU", "LU", "NE", "NW", "OW", "SG", "SH", "SO", "SZ", "TH", "TI", "UR", "VD", "VS", "ZG", "ZH"] Couleur = Literal["rouge", "vert"] @@ -53,7 +55,8 @@ Couleur = Literal["rouge", "vert"] intents = discord.Intents.default() intents.message_content = True -bot = commands.Bot(command_prefix='$', intents=intents) +PREFIX = '$' +bot = commands.Bot(command_prefix=PREFIX, intents=intents) DATA_FILE = Path(__file__).parent / "data.json" if DATA_FILE.exists(): @@ -61,10 +64,10 @@ if DATA_FILE.exists(): data = json.load(data_file) else: data = { - 'equipes': {'rouge': [], 'vert': []}, + 'equipes': {equipe: [] for equipe in EQUIPES}, 'cantons': {code_canton: {'capture': None, 'verrouille': False} for code_canton in CANTONS.keys()}, 'defis': { - 'mains': {'rouge': [], 'vert': []}, + 'mains': {equipe: [] for equipe in EQUIPES}, 'tires_capture': [], 'tires_competition': [], } @@ -122,7 +125,7 @@ async def capturer(ctx: commands.Context, canton: CodeCanton, *, couleur: Couleu if author_id in membres_equipe: break else: - raise commands.BadArgument("Vous n'appartez à aucune équipe. Merci de faire `$equipe [rouge|vert]`.") + raise commands.BadArgument(f"Vous n'appartez à aucune équipe. Merci de faire `{PREFIX}equipe [{"|".join(EQUIPES)}]`.") data['cantons'][canton]['capture'] = couleur with DATA_FILE.open('w') as data_file: json.dump(data, data_file, indent=2) @@ -146,7 +149,7 @@ async def verrouiller(ctx: commands.Context, canton: CodeCanton, *, couleur: Cou if author_id in membres_equipe: break else: - raise commands.BadArgument("Vous n'appartez à aucune équipe. Merci de faire `$equipe [rouge|vert]`.") + raise commands.BadArgument(f"Vous n'appartez à aucune équipe. Merci de faire `{PREFIX}equipe [{"|".join(EQUIPES)}]`.") data['cantons'][canton]['capture'] = couleur data['cantons'][canton]['verrouille'] = True with DATA_FILE.open('w') as data_file: @@ -184,26 +187,35 @@ async def defis(ctx: commands.Context, *, type_defi: Literal['capture', 'competi @bot.command() -async def description(ctx: commands.Context, type_defi: Literal['capture', 'competition'] = "capture"): +async def description(ctx: commands.Context, type_defi: Literal['capture', 'competition'] = "capture", id_defi: int | None = None): defis = DEFIS[type_defi] embeds = [] - for page in range((len(defis) - 1) // 25 + 1): - defis_page = defis[page * 25:(page + 1) * 25] - embed = discord.Embed(title=f"Description des défis", colour=discord.Colour.gold()) - embed.set_footer(f"Page {page}/{(len(defis) - 1) // 25 + 1}") - for defi in defis_page: - embed.add_field(name=f"{defi['nom']} (n°{defi['id']})", value=defi['description'], inline=False) + if id_defi is not None: + embed = discord.Embed(title=f"Description du défi {id_defi}", colour=discord.Colour.gold()) + try: + defi = next(defi for defi in defis if defi['id'] == id_defi) + except StopIteration: + raise commands.BadArgument(f"Le défi de {type_defi} n°{id_defi} n'existe pas.") + embed.add_field(name=f"{defi['nom']}", value=defi['description'], inline=False) embeds.append(embed) + else: + for page in range((len(defis) - 1) // 25 + 1): + defis_page = defis[page * 25:(page + 1) * 25] + embed = discord.Embed(title=f"Description des défis", colour=discord.Colour.gold()) + embed.set_footer(text=f"Page {page + 1}/{(len(defis) - 1) // 25 + 1}") + for defi in defis_page: + embed.add_field(name=f"{defi['nom']} (n°{defi['id']})", value=defi['description'], inline=False) + embeds.append(embed) await ctx.send(embeds=embeds) @bot.command() async def tirage(ctx: commands.Context, nb_defis: int = 7): - if data['defis']['mains']['rouge'] or data['defis']['mains']['vert']: + if any(data['defis']['mains'][equipe] for equipe in EQUIPES): raise commands.BadArgument("Les mains sont déjà initialisées") defis_libres = copy.deepcopy(DEFIS['capture']) - for equipe in ('rouge', 'vert'): + for equipe in EQUIPES: for _i in range(nb_defis): defi = random.choice(defis_libres) defis_libres.remove(defi) @@ -211,20 +223,20 @@ async def tirage(ctx: commands.Context, nb_defis: int = 7): data['defis']['tires_capture'].append(defi['id']) for member_id in data['equipes'][equipe]: - await main(ctx, author_id=member_id) + await afficher_main(ctx, author_id=member_id) with DATA_FILE.open('w') as data_file: json.dump(data, data_file, indent=2) await ctx.send("Les mains de départ ont bien été tirées ! Le contenu vous a été envoyé en MP.") -@bot.command() -async def main(ctx: commands.Context, *, author_id: int | None = None): +@bot.command(name="main") +async def afficher_main(ctx: commands.Context, author_id: int | None = None): author_id = author_id or ctx.author.id for couleur, membres_equipe in data['equipes'].items(): if author_id in membres_equipe: break else: - raise commands.BadArgument("Vous n'appartez à aucune équipe. Merci de faire `$equipe [rouge|vert]`.") + raise commands.BadArgument(f"Vous n'appartez à aucune équipe. Merci de faire `{PREFIX}equipe [{"|".join(EQUIPES)}]`.") main = data['defis']['mains'][couleur] embeds = [] @@ -238,10 +250,98 @@ async def main(ctx: commands.Context, *, author_id: int | None = None): await channel_dm.send("Vos défis en main :", embeds=embeds) +@bot.command() +async def terminer(ctx: commands.Context, id_defi: int): + if all(id_defi != defi['id'] for defi in DEFIS['capture']): + raise commands.BadArgument(f"Erreur : Le défi {id_defi_1} n'existe pas") + author_id = ctx.author.id + for equipe, membres_equipe in data['equipes'].items(): + if author_id in membres_equipe: + break + else: + raise commands.BadArgument(f"Vous n'appartez à aucune équipe. Merci de faire `{PREFIX}equipe [{"|".join(EQUIPES)}]`.") + + main = data['defis']['mains'][equipe] + if id_defi not in main: + raise commands.BadArgument(f"Le défi {id_defi} n'est pas dans votre main. Faites `{PREFIX}main` pour afficher votre main.") + + nouveau_defi = random.choice([defi for defi in DEFIS['capture'] if defi['id'] not in data['defis']['tires_capture']]) + main.remove(id_defi) + main.append(nouveau_defi['id']) + data['defis']['tires_capture'].append(nouveau_defi['id']) + with DATA_FILE.open('w') as data_file: + json.dump(data, data_file, indent=2) + + colour = discord.Color.red() if equipe == "rouge" else discord.Color.green() + embed = discord.Embed(title=nouveau_defi['nom'], description=nouveau_defi['description'], colour=colour) + embed.set_footer(text=f"Défi n°{nouveau_defi['id']}") + await ctx.send("**Votre nouveau défi en main :**", embed=embed) + for member_id in data['equipes'][equipe]: + await afficher_main(ctx, author_id=member_id) + + +@bot.command() +async def echange(ctx: commands.Context, id_defi_1: int, id_defi_2: int): + if all(id_defi_1 != defi['id'] for defi in DEFIS['capture']): + raise commands.BadArgument(f"Erreur : Le défi {id_defi_1} n'existe pas") + if all(id_defi_2 != defi['id'] for defi in DEFIS['capture']): + raise commands.BadArgument(f"Erreur : Le défi {id_defi_2} n'existe pas") + defi_1 = next(defi for defi in DEFIS['capture'] if defi['id'] == id_defi_1) + defi_2 = next(defi for defi in DEFIS['capture'] if defi['id'] == id_defi_2) + + equipe_1, equipe_2 = None, None + for equipe in EQUIPES: + main = data['defis']['mains'][equipe] + if id_defi_1 in main: + equipe_1 = equipe + if id_defi_2 in main: + equipe_2 = equipe + if equipe_1 is None and equipe_2 is None: + raise commands.BadArgument("Erreur : Aucun des deux défis n'est fait par une équipe") + elif equipe_1 == equipe_2: + raise commands.BadArgument(f"Erreur : Les défis {id_defi_1} et {id_defi_2} sont tous les deux fait par la même équipe {equipe_1}") + + if equipe_1 is not None: + data['defis']['mains'][equipe_1].remove(id_defi_1) + data['defis']['mains'][equipe_1].append(id_defi_2) + else: + tires_capture = data['defis']['tires_capture'] + if id_defi_1 not in tires_capture: + tires_capture.append(id_defi_1) + if id_defi_2 in tires_capture: + tires_capture.remove(id_defi_2) + + if equipe_2 is not None: + data['defis']['mains'][equipe_2].remove(id_defi_2) + data['defis']['mains'][equipe_2].append(id_defi_1) + else: + tires_capture = data['defis']['tires_capture'] + if id_defi_1 in tires_capture: + tires_capture.remove(id_defi_1) + if id_defi_2 not in tires_capture: + tires_capture.append(id_defi_2) + with DATA_FILE.open('w') as data_file: + json.dump(data, data_file, indent=2) + + if equipe_1 is not None and equipe_2 is not None: + await ctx.send(f"Le défi **{defi_1['nom']}** de l'équipe **{equipe_1}** et le défi **{defi_2['nom']}** de l'équipe **{equipe_2}** ont été échangés !") + else: + await ctx.send(f"Les défis **{defi_1['nom']}** et **{defi_2['nom']}** ont été échangés !") + + @bot.command() async def debug(ctx: commands.Context, key: Literal['equipes', 'cantons', 'defis']): data_json = json.dumps(data[key], indent=4) - await ctx.send(f"```json\n{data_json}\n```") + await ctx.reply(f"```json\n{data_json}\n```", ephemeral=True) + + +@bot.command() +async def reload(ctx: commands.Context): + with DATA_FILE.open() as data_file: + data = json.load(data_file) + with DEFIS_FILE.open() as defis_file: + DEFIS = json.load(defis_file) + await ctx.reply("Configuration rechargée.", ephemeral=True) @carte.error @@ -250,10 +350,17 @@ async def debug(ctx: commands.Context, key: Literal['equipes', 'cantons', 'defis @defis.error @description.error @tirage.error -@main.error +@afficher_main.error +@terminer.error +@echange.error @debug.error +@reload.error async def on_error(ctx, error): + with DATA_FILE.open() as data_file: + data = json.load(data_file) await ctx.send(str(error)) + if not isinstance(error, commands.BadArgument): + raise error bot.run(DISCORD_TOKEN)