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")