send_and_bin utility

This commit is contained in:
ddorn 2020-04-30 20:11:07 +02:00
parent 3b9f4aae95
commit b36a582a06
4 changed files with 59 additions and 32 deletions

View File

@ -168,6 +168,12 @@ class DevCog(Cog, name="Dev tools"):
await ctx.send(str(jury_channel)) await ctx.send(str(jury_channel))
@command(name="send", hidden=True)
@has_role(Role.DEV)
async def send_cmd(self, ctx, *msg):
await ctx.message.delete()
await ctx.send(" ".join(msg))
def setup(bot: Bot): def setup(bot: Bot):
bot.add_cog(DevCog(bot)) bot.add_cog(DevCog(bot))

View File

@ -44,7 +44,8 @@ class MiscCog(Cog, name="Divers"):
""" """
choice = random.choice(args) choice = random.choice(args)
await ctx.send(f"J'ai choisi... **{choice}**") msg = await ctx.send(f"J'ai choisi... **{choice}**")
await self.bot.wait_for_bin(ctx.author, msg),
@command(name="joke", aliases=["blague"], hidden=True) @command(name="joke", aliases=["blague"], hidden=True)
async def joke_cmd(self, ctx): async def joke_cmd(self, ctx):
@ -93,9 +94,11 @@ class MiscCog(Cog, name="Divers"):
"""Affiche des détails à propos d'une commande.""" """Affiche des détails à propos d'une commande."""
if not args: if not args:
await self.send_bot_help(ctx) msg = await self.send_bot_help(ctx)
else: else:
await self.send_command_help(ctx, args) msg = await self.send_command_help(ctx, args)
await self.bot.wait_for_bin(ctx.author, msg)
async def send_bot_help(self, ctx: Context): async def send_bot_help(self, ctx: Context):
embed = discord.Embed( embed = discord.Embed(
@ -134,7 +137,7 @@ class MiscCog(Cog, name="Divers"):
embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego") embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego")
await ctx.send(embed=embed) return await ctx.send(embed=embed)
async def send_command_help(self, ctx, args): async def send_command_help(self, ctx, args):
name = " ".join(args) name = " ".join(args)
@ -162,7 +165,7 @@ class MiscCog(Cog, name="Divers"):
) )
embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego") embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego")
await ctx.send(embed=embed) return await ctx.send(embed=embed)
async def send_group_help(self, ctx, group: Group): async def send_group_help(self, ctx, group: Group):
embed = discord.Embed( embed = discord.Embed(
@ -205,7 +208,7 @@ class MiscCog(Cog, name="Divers"):
) )
embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego") embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego")
await ctx.send(embed=embed) return await ctx.send(embed=embed)
def _name(self, command: Command): def _name(self, command: Command):
return f"`!{command.qualified_name}`" return f"`!{command.qualified_name}`"
@ -265,5 +268,5 @@ class MiscCog(Cog, name="Divers"):
return ret return ret
def setup(bot: Bot): def setup(bot: CustomBot):
bot.add_cog(MiscCog(bot)) bot.add_cog(MiscCog(bot))

View File

@ -8,7 +8,7 @@ from discord.utils import get, find
from src.constants import * from src.constants import *
from src.core import CustomBot from src.core import CustomBot
from src.utils import has_role from src.utils import has_role, send_and_bin
Team = namedtuple("Team", ["name", "trigram", "tournoi", "secret", "status"]) Team = namedtuple("Team", ["name", "trigram", "tournoi", "secret", "status"])
@ -46,7 +46,7 @@ class TeamsCog(Cog, name="Teams"):
@team.command(name="create") @team.command(name="create")
async def create_team(self, ctx: Context, trigram, team_secret): async def create_team(self, ctx: Context, trigram, team_secret):
""" """
Permet aux capitaines de créer leur equipes. Permet aux capitaines de créer leur equipe.
Pour utiliser cette commande, il faut ton trigram et ton code Pour utiliser cette commande, il faut ton trigram et ton code
d'équipe. Tu peux ensuite écrire `!team create TRIGRAM SECRET` d'équipe. Tu peux ensuite écrire `!team create TRIGRAM SECRET`
@ -66,21 +66,21 @@ class TeamsCog(Cog, name="Teams"):
captain_role = get(ctx.guild.roles, name=Role.CAPTAIN) captain_role = get(ctx.guild.roles, name=Role.CAPTAIN)
if team is None: if team is None:
await ctx.send( msg = (
f"{ctx.author.mention}: le trigram `{trigram}` " f"{ctx.author.mention}: le trigram `{trigram}` "
f"n'est pas valide. Es-tu sûr d'avoir le bon ?" f"n'est pas valide. Es-tu sûr d'avoir le bon ?"
) )
elif role is not None: elif role is not None:
# Team exists # Team exists
captain = find(lambda m: captain_role in m.roles, role.members) captain = find(lambda m: captain_role in m.roles, role.members)
await ctx.send( msg = (
f"{ctx.author.mention}: l'équipe {trigram} " f"{ctx.author.mention}: l'équipe {trigram} "
f"existe déjà. Tu peux demander a ton capitaine " f"existe déjà. Tu peux demander a ton capitaine "
f"{captain.mention} de t'ajouter à l'équipe avec " f"{captain.mention} de t'ajouter à l'équipe avec "
f"`!team add {ctx.author.name}`" f"`!team add {ctx.author.name}`"
) )
elif team_secret != team.secret: elif team_secret != team.secret:
await ctx.send( msg = (
f"{ctx.author.mention}: ton secret n'est pas valide, " f"{ctx.author.mention}: ton secret n'est pas valide, "
f"Tu peux le trouver sur https://inscription.tfjm.org/mon-equipe." f"Tu peux le trouver sur https://inscription.tfjm.org/mon-equipe."
) )
@ -103,7 +103,7 @@ class TeamsCog(Cog, name="Teams"):
reason="Creation of team " + trigram, reason="Creation of team " + trigram,
) )
await ctx.send( msg = (
f"L'équipe {team_role.mention} a été créée et son capitaine " f"L'équipe {team_role.mention} a été créée et son capitaine "
f"est {ctx.author.mention}" f"est {ctx.author.mention}"
) )
@ -122,8 +122,12 @@ class TeamsCog(Cog, name="Teams"):
f"une meilleure expérience ici, envoie un petit message à {diego.mention} ;)" f"une meilleure expérience ici, envoie un petit message à {diego.mention} ;)"
) )
msg = await ctx.send(msg)
await self.bot.wait_for_bin(ctx.author, msg)
@team.command(name="add") @team.command(name="add")
@commands.has_role(Role.CAPTAIN) @commands.has_role(Role.CAPTAIN)
@send_and_bin
async def team_add(self, ctx, member: discord.Member): async def team_add(self, ctx, member: discord.Member):
""" """
(cap) Ajoute un membre a ton équipe. (cap) Ajoute un membre a ton équipe.
@ -141,12 +145,12 @@ class TeamsCog(Cog, name="Teams"):
member_teams = self.teams_for(member) member_teams = self.teams_for(member)
if member_teams: if member_teams:
await ctx.send( return (
f"{member.mention} est déjà dans une équipe " f"{member.mention} est déjà dans une équipe "
f"et ne peut pas être dans deux à la fois." f"et ne peut pas être dans deux à la fois."
) )
elif len(author_teams) > 1: elif len(author_teams) > 1:
await ctx.send( return (
f"Tu est dans plusieurs équipes, je ne sais " f"Tu est dans plusieurs équipes, je ne sais "
f"pas où l'ajouter. Il faut demander à un organisateur " f"pas où l'ajouter. Il faut demander à un organisateur "
f"de le faire." f"de le faire."
@ -162,12 +166,11 @@ class TeamsCog(Cog, name="Teams"):
participant, participant,
reason=f"{ctx.author.name} l'a ajouté à son équipe", reason=f"{ctx.author.name} l'a ajouté à son équipe",
) )
await ctx.send( return f"{member.mention} a été ajouté dans l'équipe {the_team[1].mention}"
f"{member.mention} a été ajouté dans l'équipe {the_team[1].mention}"
)
@team.command(name="channel") @team.command(name="channel")
@commands.has_role(Role.CAPTAIN) @commands.has_role(Role.CAPTAIN)
@send_and_bin
async def team_channel(self, ctx, *channel_name): async def team_channel(self, ctx, *channel_name):
""" """
(cap) Crée une channel privée pour l'équipe (cap) Crée une channel privée pour l'équipe
@ -180,18 +183,17 @@ class TeamsCog(Cog, name="Teams"):
""" """
if not channel_name: if not channel_name:
await ctx.send( return (
"Tu dois mettre un nom d'équipe, par exemple " "Tu dois mettre un nom d'équipe, par exemple "
"`!team channel un-super-nom`" "`!team channel un-super-nom`"
) )
return
channel_name = " ".join(channel_name) channel_name = " ".join(channel_name)
guild: discord.Guild = ctx.guild guild: discord.Guild = ctx.guild
team_role = self.teams_for(ctx.author)[0][1] team_role = self.teams_for(ctx.author)[0][1]
team_channel_category = get(guild.categories, name=TEAMS_CHANNEL_CATEGORY) team_channel_category = get(guild.categories, name=TEAMS_CHANNEL_CATEGORY)
await guild.create_text_channel( channel = await guild.create_text_channel(
channel_name, channel_name,
overwrites={ overwrites={
guild.default_role: discord.PermissionOverwrite(read_messages=False), guild.default_role: discord.PermissionOverwrite(read_messages=False),
@ -201,8 +203,11 @@ class TeamsCog(Cog, name="Teams"):
reason=f"{ctx.author.name} à demandé une channel pour son équipe.", reason=f"{ctx.author.name} à demandé une channel pour son équipe.",
) )
return f"{ctx.author.mention}: Le salon d'équipe {channel.mention} à été créé."
@team.command(name="voice", usage="Nom du salon") @team.command(name="voice", usage="Nom du salon")
@commands.has_role(Role.CAPTAIN) @commands.has_role(Role.CAPTAIN)
@send_and_bin
async def team_voice(self, ctx, *channel_name): async def team_voice(self, ctx, *channel_name):
""" """
(cap) Crée une channel vocale privée pour l'équipe (cap) Crée une channel vocale privée pour l'équipe
@ -215,18 +220,17 @@ class TeamsCog(Cog, name="Teams"):
""" """
if not channel_name: if not channel_name:
await ctx.send( return (
"Tu dois mettre un nom d'équipe, par exemple " "Tu dois mettre un nom d'équipe, par exemple "
"`!team voice un-super-nom`" "`!team voice un-super-nom`"
) )
return
channel_name = " ".join(channel_name) channel_name = " ".join(channel_name)
guild: discord.Guild = ctx.guild guild: discord.Guild = ctx.guild
team_role = self.teams_for(ctx.author)[0][1] team_role = self.teams_for(ctx.author)[0][1]
team_channel_category = get(guild.categories, name=TEAMS_CHANNEL_CATEGORY) team_channel_category = get(guild.categories, name=TEAMS_CHANNEL_CATEGORY)
await guild.create_voice_channel( channel = await guild.create_voice_channel(
channel_name, channel_name,
overwrites={ overwrites={
guild.default_role: discord.PermissionOverwrite(read_messages=False), guild.default_role: discord.PermissionOverwrite(read_messages=False),
@ -236,6 +240,8 @@ class TeamsCog(Cog, name="Teams"):
reason=f"{ctx.author.name} à demandé un salon vocale pour son équipe.", reason=f"{ctx.author.name} à demandé un salon vocale pour son équipe.",
) )
return f"{ctx.author.mention}: La salon vocal '{channel.mention}' à été créé."
@team.command(name="list") @team.command(name="list")
@commands.has_role(Role.CNO) @commands.has_role(Role.CNO)
async def list_cmd(self, ctx): async def list_cmd(self, ctx):
@ -258,5 +264,5 @@ class TeamsCog(Cog, name="Teams"):
await ctx.send(embed=embed) await ctx.send(embed=embed)
def setup(bot: Bot): def setup(bot: CustomBot):
bot.add_cog(TeamsCog(bot)) bot.add_cog(TeamsCog(bot))

View File

@ -1,12 +1,7 @@
import asyncio from functools import wraps
from typing import Sequence
import psutil import psutil
from discord import Message, Member, User, Reaction from discord.ext.commands import Bot
from discord.ext.commands import Context, Bot
from discord.utils import get
from src.constants import Emoji
def has_role(member, role: str): def has_role(member, role: str):
@ -15,6 +10,23 @@ def has_role(member, role: str):
return any(r.name == role for r in member.roles) return any(r.name == role for r in member.roles)
def send_and_bin(f):
"""
Decorator that allows a command in a cog to just return
the messages that needs to be sent, and allow the author that
trigger the message de delete it.
"""
@wraps(f)
async def wrapped(cog, ctx, *args, **kwargs):
msg = await f(cog, ctx, *args, **kwargs)
if msg:
msg = await ctx.send(msg)
await cog.bot.wait_for_bin(ctx.author, msg)
return wrapped
def start_time(self): def start_time(self):
return psutil.Process().create_time() return psutil.Process().create_time()