Code source de lgrez.features.actions_publiques

"""lg-rez / features / Actions publiques

Gestion des haros, candidatures à la mairie, résultats des votes

"""

import discord
from discord.ext import commands

from lgrez import config
from lgrez.blocs import tools
from lgrez.bdd import Joueur, CandidHaro, Statut, CandidHaroType, Vote


[docs]class ActionsPubliques(commands.Cog): """Commandes d'actions vous engageant publiquement""" @commands.command() @tools.vivants_only @tools.private async def haro(self, ctx, *, cible=None): """Lance publiquement un haro contre un autre joueur. Args: cible: nom du joueur à accuser Cette commande n'est utilisable que lorsqu'un vote pour le condamné est en cours. """ auteur = ctx.author joueur = Joueur.from_member(auteur) try: vaction = joueur.action_vote(Vote.cond) except RuntimeError: await ctx.send("Minute papillon, le jeu n'est pas encore lancé !") return if not vaction.is_open: await ctx.send("Pas de vote pour le condamné du jour en cours !") return cible = await tools.boucle_query_joueur( ctx, cible, "Contre qui souhaites-tu déverser ta haine ?" ) if cible.statut == Statut.mort: await ctx.send("Nan mais oh, tu crois qu'il a pas assez " "souffert en mourant lui ?") return elif cible.statut == Statut.immortel: await ctx.send("Comment oses-tu t'en prendre à ceux qui te sont " f"supérieurs ? {config.Role.mj.mention}, regardez " "un peu ce qu'il se passe là...") return await tools.send_blocs( ctx, "Et quelle est la raison de cette haine, d'ailleurs ?" ) motif = await tools.wait_for_message_here(ctx) emb = discord.Embed( title=(f"**{config.Emoji.ha}{config.Emoji.ro} " f"contre {cible.nom} !**"), description=f"**« {motif.content} »\n**", color=0xff0000 ) emb.set_author(name=f"{joueur.nom} en a gros 😡😡") emb.set_thumbnail(url=config.Emoji.bucher.url) emb.set_footer( text=f"Utilise !vote {cible.nom} pour voter contre cette personne." ) mess = await ctx.send("C'est tout bon ?", embed=emb) if await tools.yes_no(mess): if not CandidHaro.query.filter_by(joueur=cible, type=CandidHaroType.haro).all(): # Inscription haroté config.session.add(CandidHaro(joueur=cible, type=CandidHaroType.haro)) if not CandidHaro.query.filter_by(joueur=joueur, type=CandidHaroType.haro).all(): # Inscription haroteur config.session.add(CandidHaro(joueur=joueur, type=CandidHaroType.haro)) config.session.commit() await config.Channel.haros.send( f"(Psst, {cible.member.mention} :3)", embed=emb ) await config.Channel.debats.send( f"{config.Emoji.ha}{config.Emoji.ro} de {auteur.mention} " f"sur {cible.member.mention} ! Vous en pensez quoi vous ? " f"(détails sur {config.Channel.haros.mention})" ) await ctx.send( f"Allez, c'est parti ! ({config.Channel.haros.mention})" ) else: await ctx.send("Mission aborted.") @commands.command() @tools.vivants_only @tools.private async def candid(self, ctx): """Candidate à l'élection du nouveau maire. Cette commande n'est utilisable que lorsqu'un vote pour le nouveau maire est en cours. """ auteur = ctx.author joueur = Joueur.from_member(auteur) try: vaction = joueur.action_vote(Vote.maire) except RuntimeError: await ctx.send("Minute papillon, le jeu n'est pas encore lancé !") return if not vaction.is_open: await ctx.send("Pas de vote pour le nouveau maire en cours !") return if CandidHaro.query.filter_by(joueur=joueur, type=CandidHaroType.candidature).all(): await ctx.send( "Hola collègue, tout doux, tu t'es déjà présenté(e) !" ) return await tools.send_blocs(ctx, "Quel est ton programme politique ?") motif = await tools.wait_for_message_here(ctx) emb = discord.Embed( title=(f"**{config.Emoji.maire} {joueur.nom} " "candidate à la Mairie !**"), description=("Voici son programme politique :\n" + tools.bold(motif.content)), color=0xf1c40f ) emb.set_author(name=f"{joueur.nom} vous a compris !") emb.set_thumbnail(url=config.Emoji.maire.url) emb.set_footer( text=(f"Utilise !votemaire {auteur.display_name} " "pour voter pour cette personne.") ) mess = await ctx.send("C'est tout bon ?", embed=emb) if await tools.yes_no(mess): ch = CandidHaro(joueur=joueur, type=CandidHaroType.candidature) config.session.add(ch) config.session.commit() await config.Channel.haros.send( "Here comes a new challenger !", embed=emb ) await config.Channel.debats.send( f"{auteur.mention} se présente à la Mairie ! " "Vous en pensez quoi vous ?\n" f"(détails sur {config.Channel.haros.mention})" ) await ctx.send( f"Allez, c'est parti ! ({config.Channel.haros.mention})" ) else: await ctx.send("Mission aborted.") @commands.command() @tools.mjs_only async def wipe(self, ctx, quoi): """Efface les haros / candidatures du jour (COMMANDE MJ) Args: quoi (str): peut être - ``haros`` : Supprimer les haros - ``candids`` : Supprimer les candicatures (commande non testée unitairement) """ if quoi == "haros": cht = CandidHaroType.haro elif quoi == "candids": cht = CandidHaroType.candidature else: await ctx.send("Mauvais argument") items = CandidHaro.query.filter_by(type=cht).all() if not items: await ctx.send("Rien à faire") await tools.log(f"!wipe {quoi} : rien à faire") else: CandidHaro.delete(*items) await ctx.send("Fait.") await tools.log(f"!wipe {quoi} : fait")