From dc1efa7b0c898ded87527dd3405ced876515e16e Mon Sep 17 00:00:00 2001 From: Abigail G Date: Sun, 11 Apr 2021 15:20:42 -0400 Subject: [PATCH] make help command sort by category fixes #390 --- common.py | 3 ++- exts/base.py | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/common.py b/common.py index e231bcc..5c8e0a5 100644 --- a/common.py +++ b/common.py @@ -42,8 +42,9 @@ colours = SimpleNamespace( class BoltCats(enum.Enum): - ADMIN = "Bot Control" + OTHER = "Other" INFO = "Bot Information" + ADMIN = "Bot Control" # meow diff --git a/exts/base.py b/exts/base.py index 817a2e0..a0fce90 100644 --- a/exts/base.py +++ b/exts/base.py @@ -10,11 +10,12 @@ the GNU General Public License, version 2. import random import re -from typing import Union +from typing import Union, Iterable import pathlib import discord import discord.ext.commands as commands +from discord.ext.commands import Command, CommandError import info import common as cmn @@ -31,12 +32,52 @@ class QrmHelpCommand(commands.HelpCommand): self.verify_checks = True self.context: commands.Context + async def filter_commands(self, commands: Iterable[Command]) -> list[Command]: + def sort_by_cat(cmds): + ret = [] + bolt_cmds = {} + for c in cmds: + cat = c.__original_kwargs__.get("category", cmn.BoltCats.OTHER) + if isinstance(cat, cmn.BoltCats): + if cat in bolt_cmds: + bolt_cmds[cat].append(c) + else: + bolt_cmds[cat] = [c] + cmds.remove(c) + else: + ret.append(c) + + ret.sort(key=lambda c: c.__original_kwargs__["category"].name) + + for cat in cmn.BoltCats: + ret += sorted(bolt_cmds[cat], key=lambda c: c.name) + + return ret + + iterator = commands if self.show_hidden else filter(lambda c: not c.hidden, commands) + + if not self.verify_checks: + return sort_by_cat(iterator) + + async def predicate(cmd): + try: + return await cmd.can_run(self.context) + except CommandError: + return False + + cmds = [] + for cmd in iterator: + if await predicate(cmd): + cmds.append(cmd) + + return sort_by_cat(cmds) + async def get_bot_mapping(self): bot = self.context.bot mapping = {} - for cmd in await self.filter_commands(bot.commands, sort=True): - cat = cmd.__original_kwargs__.get("category", None) + for cmd in await self.filter_commands(bot.commands): + cat = cmd.__original_kwargs__.get("category", cmn.BoltCats.OTHER) if cat in mapping: mapping[cat].append(cmd) else: