mirror of
https://gitlab.com/ddorn/tfjm-discord-bot.git
synced 2024-12-25 07:02:21 +00:00
✨ start better help
This commit is contained in:
parent
3d75af40ea
commit
463be1691d
@ -57,7 +57,7 @@ class DevCog(Cog, name="Dev tools"):
|
||||
possibles: `teams`, `tirages`, `dev`.
|
||||
"""
|
||||
|
||||
MAP = {"d": "dev", "ts": "teams", "t": "tirages"}
|
||||
MAP = {"d": "dev", "ts": "teams", "t": "tirages", "m": "misc"}
|
||||
name = MAP.get(name, name)
|
||||
|
||||
if not "." in name:
|
||||
|
116
src/cogs/misc.py
116
src/cogs/misc.py
@ -1,7 +1,17 @@
|
||||
import itertools
|
||||
import random
|
||||
from operator import attrgetter
|
||||
|
||||
import discord
|
||||
from discord.ext.commands import Cog, command, Context, Bot
|
||||
from discord.ext.commands import (
|
||||
Cog,
|
||||
command,
|
||||
Context,
|
||||
Bot,
|
||||
Command,
|
||||
CommandError,
|
||||
Group,
|
||||
)
|
||||
|
||||
from src.constants import *
|
||||
|
||||
@ -9,6 +19,8 @@ from src.constants import *
|
||||
class MiscCog(Cog, name="Divers"):
|
||||
def __init__(self, bot: Bot):
|
||||
self.bot = bot
|
||||
self.show_hidden = False
|
||||
self.verify_checks = True
|
||||
|
||||
@command(
|
||||
name="choose",
|
||||
@ -35,12 +47,13 @@ class MiscCog(Cog, name="Divers"):
|
||||
msg = random.choice(jokes)
|
||||
await ctx.send(msg)
|
||||
|
||||
@command(
|
||||
name="help-test", hidden=True,
|
||||
)
|
||||
@command(name="help-test", aliases=["h"])
|
||||
async def help_test(self, ctx: Context, *args):
|
||||
"""Affiche ce message"""
|
||||
|
||||
if not args:
|
||||
await self.send_bot_help(ctx)
|
||||
return
|
||||
else:
|
||||
pass
|
||||
|
||||
@ -56,7 +69,100 @@ class MiscCog(Cog, name="Divers"):
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
async def send_bot_help(self, ctx: Context):
|
||||
embed = discord.Embed(title="Aide pour le bot du TFJM²",)
|
||||
embed = discord.Embed(
|
||||
title="Aide pour le bot du TFJM²",
|
||||
description="Ici est une liste des commandes utiles (ou pas) "
|
||||
"durant le tournoi. Pour avoir plus de détails il "
|
||||
"suffit d'écrire `!help COMMANDE` en remplacant `COMMANDE` "
|
||||
"par le nom de la commande, par exemple `!help team channel`.",
|
||||
color=0xFFA500,
|
||||
)
|
||||
|
||||
commands = itertools.groupby(self.bot.walk_commands(), attrgetter("cog_name"))
|
||||
|
||||
for cat_name, cat in commands:
|
||||
cat = {c.qualified_name: c for c in cat if not isinstance(c, Group)}
|
||||
cat = await self.filter_commands(
|
||||
ctx, list(cat.values()), sort=True, key=attrgetter("qualified_name")
|
||||
)
|
||||
|
||||
if not cat:
|
||||
continue
|
||||
|
||||
names = ["!" + c.qualified_name for c in cat]
|
||||
width = max(map(len, names))
|
||||
names = [name.rjust(width) for name in names]
|
||||
short_help = [c.short_doc for c in cat]
|
||||
|
||||
lines = [f"`{n}` - {h}" for n, h in zip(names, short_help)]
|
||||
|
||||
if cat_name is None:
|
||||
cat_name = "Autres"
|
||||
|
||||
c: Command
|
||||
text = "\n".join(lines)
|
||||
embed.add_field(name=cat_name, value=text, inline=False)
|
||||
|
||||
embed.set_footer(text="Suggestion ? Problème ? Envoie un message à @Diego")
|
||||
|
||||
await ctx.send(embed=embed)
|
||||
|
||||
def _name(self, command: Command):
|
||||
return f"`!{command.qualified_name}`"
|
||||
|
||||
async def filter_commands(self, ctx, commands, *, sort=False, key=None):
|
||||
"""|coro|
|
||||
|
||||
Returns a filtered list of commands and optionally sorts them.
|
||||
|
||||
This takes into account the :attr:`verify_checks` and :attr:`show_hidden`
|
||||
attributes.
|
||||
|
||||
Parameters
|
||||
------------
|
||||
commands: Iterable[:class:`Command`]
|
||||
An iterable of commands that are getting filtered.
|
||||
sort: :class:`bool`
|
||||
Whether to sort the result.
|
||||
key: Optional[Callable[:class:`Command`, Any]]
|
||||
An optional key function to pass to :func:`py:sorted` that
|
||||
takes a :class:`Command` as its sole parameter. If ``sort`` is
|
||||
passed as ``True`` then this will default as the command name.
|
||||
|
||||
Returns
|
||||
---------
|
||||
List[:class:`Command`]
|
||||
A list of commands that passed the filter.
|
||||
"""
|
||||
|
||||
if sort and key is None:
|
||||
key = lambda c: c.name
|
||||
|
||||
iterator = (
|
||||
commands if self.show_hidden else filter(lambda c: not c.hidden, commands)
|
||||
)
|
||||
|
||||
if not self.verify_checks:
|
||||
# if we do not need to verify the checks then we can just
|
||||
# run it straight through normally without using await.
|
||||
return sorted(iterator, key=key) if sort else list(iterator)
|
||||
|
||||
# if we're here then we need to check every command if it can run
|
||||
async def predicate(cmd):
|
||||
try:
|
||||
return await cmd.can_run(ctx)
|
||||
except CommandError:
|
||||
return False
|
||||
|
||||
ret = []
|
||||
for cmd in iterator:
|
||||
valid = await predicate(cmd)
|
||||
if valid:
|
||||
ret.append(cmd)
|
||||
|
||||
if sort:
|
||||
ret.sort(key=key)
|
||||
return ret
|
||||
|
||||
|
||||
def setup(bot: Bot):
|
||||
|
Loading…
Reference in New Issue
Block a user