diff --git a/cogs/help/__init__.py b/cogs/help/__init__.py new file mode 100644 index 0000000..31aeac1 --- /dev/null +++ b/cogs/help/__init__.py @@ -0,0 +1,19 @@ +from nextcord.ext import commands + +from .help_command import NewHelpCommand + + +class HelpCog(commands.Cog): + def __init__(self, bot: commands.Bot): + self.bot = bot + self._original_help_command = bot.help_command + bot.help_command = NewHelpCommand() + bot.help_command.cog = self + + def cog_unload(self): + self.bot.help_command = self._original_help_command + + +# setup functions for bot +def setup(bot: commands.Bot): + bot.add_cog(HelpCog(bot)) diff --git a/cogs/help/help_command.py b/cogs/help/help_command.py new file mode 100644 index 0000000..8634b78 --- /dev/null +++ b/cogs/help/help_command.py @@ -0,0 +1,80 @@ +import config +import nextcord +from nextcord.embeds import EmptyEmbed +from nextcord.ext import commands + + +class NewHelpCommand(commands.MinimalHelpCommand): + """Custom help command override using embeds""" + + COLOUR = nextcord.Colour.blurple() + + def get_ending_note(self): + """Returns note to display at the bottom""" + invoked_with = self.invoked_with + return f"Use {config.BOT_PREFIX}{invoked_with} [command] for more info on a command." + + def get_command_signature(self, command: commands.core.Command): + """Retrieves the signature portion of the help page.""" + return f"{command.qualified_name} {command.signature}" + + async def send_bot_help(self, mapping: dict): + """implements bot command help page""" + embed = nextcord.Embed(title="Bot Commands", colour=self.COLOUR) + avatar = self.context.bot.user.avatar + avatar_url = avatar.url if avatar else EmptyEmbed + embed.set_author(name=self.context.bot.user.name, icon_url=avatar_url) + description = self.context.bot.description + if description: + embed.description = description + + for cog, commands in mapping.items(): + name = "No Category" if cog is None else cog.qualified_name + filtered = await self.filter_commands(commands, sort=True) + if filtered: + # \u2002 = middle dot + value = "\u2002".join(f"{config.BOT_PREFIX}{c.name}" for c in filtered) + if cog and cog.description: + value = f"{cog.description}\n{value}" + embed.add_field(name=name, value=value) + + embed.set_footer(text=self.get_ending_note()) + await self.get_destination().send(embed=embed) + + async def send_cog_help(self, cog: commands.Cog): + """implements cog help page""" + embed = nextcord.Embed(title=f"{cog.qualified_name} Commands", colour=self.COLOUR) + if cog.description: + embed.description = cog.description + + filtered = await self.filter_commands(cog.get_commands(), sort=True) + for command in filtered: + embed.add_field( + name=self.get_command_signature(command), + value=command.short_doc or "...", + inline=False, + ) + + embed.set_footer(text=self.get_ending_note()) + await self.get_destination().send(embed=embed) + + async def send_group_help(self, group: commands.Group): + """implements group help page and command help page""" + embed = nextcord.Embed(title=group.qualified_name, colour=self.COLOUR) + if group.help: + embed.description = group.help + + if isinstance(group, commands.Group): + filtered = await self.filter_commands(group.commands, sort=True) + for command in filtered: + embed.add_field( + name=self.get_command_signature(command), + value=command.short_doc or "...", + inline=False, + ) + + embed.set_footer(text=self.get_ending_note()) + await self.get_destination().send(embed=embed) + + # Use the same function as group help for command help + send_command_help = send_group_help # type: ignore