From 65e1034372570bff1f62a28adeb0d8e121aa55cf Mon Sep 17 00:00:00 2001 From: stijndcl Date: Mon, 19 Sep 2022 14:29:14 +0200 Subject: [PATCH] Generate help embed from function signature --- didier/cogs/help.py | 36 +++++++++++++++++++++++++++++++++--- didier/cogs/school.py | 20 +++++++++++--------- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/didier/cogs/help.py b/didier/cogs/help.py index 8bb46d1..0693f50 100644 --- a/didier/cogs/help.py +++ b/didier/cogs/help.py @@ -1,3 +1,4 @@ +import re from typing import Mapping, Optional import discord @@ -63,6 +64,30 @@ class CustomHelpCommand(commands.MinimalHelpCommand): def command_not_found(self, string: str, /) -> str: return f"Found no command named `{string}`." + @overrides + def get_command_signature(self, command: commands.Command, /) -> str: + signature_list = [command.name] + + # Perform renaming for hybrid commands + if hasattr(command.callback, "__discord_app_commands_param_rename__"): + renames = command.callback.__discord_app_commands_param_rename__ + else: + renames = {} + + sig = command.params + + for name, param in sig.items(): + name = renames.get(name, name) + is_optional = param.default is not param.empty + + # Wrap optional arguments in square brackets + if is_optional: + name = f"[{name}]" + + signature_list.append(name) + + return " ".join(signature_list) + @overrides async def send_bot_help(self, mapping: Mapping[Optional[commands.Cog], list[commands.Command]], /): embed = self._help_embed_base("Categories") @@ -122,10 +147,15 @@ class CustomHelpCommand(commands.MinimalHelpCommand): This allows re-using this logic for Group commands that can be invoked by themselves. """ - embed.description = command.help + # Regex borrowed from https://stackoverflow.com/a/59843498/13568999 + # Remove single newlines but keep double newlines + # This allows short lines in the docstring, but joins them together for the help description + embed.description = re.sub( + r"([^\S\n]*\n(?:[^\S\n]*\n)+[^\S\n]*)|[^\S\n]*\n[^\S\n]*", lambda x: x.group(1) or " ", command.help + ) - if command.usage: - embed.add_field(name="Signature", value=f"{command.name} {command.usage}", inline=False) + signature = self.get_command_signature(command) + embed.add_field(name="Signature", value=signature, inline=False) if command.aliases: embed.add_field(name="Aliases", value=", ".join(command.aliases), inline=False) diff --git a/didier/cogs/school.py b/didier/cogs/school.py index 6b2d835..d90b905 100644 --- a/didier/cogs/school.py +++ b/didier/cogs/school.py @@ -27,21 +27,23 @@ class School(commands.Cog): def __init__(self, client: Didier): self.client = client - @commands.hybrid_command(name="deadlines", description="Show upcoming deadlines") + @commands.hybrid_command(name="deadlines") async def deadlines(self, ctx: commands.Context): - """Show upcoming deadlines""" + """Show upcoming deadlines.""" async with self.client.postgres_session as session: deadlines = await get_deadlines(session) embed = Deadlines(deadlines).to_embed() await ctx.reply(embed=embed, mention_author=False, ephemeral=False) - @commands.hybrid_command( - name="les", description="Show your personalized schedule for a given day.", aliases=["Sched", "Schedule"] - ) + @commands.hybrid_command(name="les", aliases=["sched", "schedule"]) @app_commands.rename(day_dt="date") async def les(self, ctx: commands.Context, day_dt: Optional[app_commands.Transform[date, DateTransformer]] = None): - """Show your personalized schedule for a given day.""" + """Show your personalized schedule for a given day. + + If no day is provided, this defaults to the schedule for the current day. When invoked during a weekend, + it will skip forward to the next weekday instead. + """ if day_dt is None: day_dt = date.today() @@ -62,14 +64,14 @@ class School(commands.Cog): @commands.hybrid_command( name="menu", - description="Show the menu in the Ghent University restaurants.", - aliases=["Eten", "Food"], + aliases=["eten", "food"], ) @app_commands.rename(day_dt="date") async def menu(self, ctx: commands.Context, day_dt: Optional[app_commands.Transform[date, DateTransformer]] = None): """Show the menu in the Ghent University restaurants. - Menus are Dutch, as a lot of dishes have very weird translations + If no day is provided, this defaults to the schedule for the current day. + Menus are shown in Dutch by default, as a lot of dishes have very weird translations. """ if day_dt is None: day_dt = date.today()