Subcommands

For more complicated bots, it's often useful to have multiple distinct command handlers for different tasks. While it's technically possible to use separate commands, it might be nicer to have everything under a single command. To do this, maubot allows you to define subcommands.

Subcommands are defined by using the .subcommand() decorator of a top-level command that was defined earlier:

from maubot import Plugin, MessageEvent
from maubot.handlers import command


class SimpleBot(Plugin):
  @command.new(name="hello", require_subcommand=True)
  async def base_command(self, evt: MessageEvent) -> None:
    # When you require a subcommand, the base command handler
    # doesn't have to do anything.
    pass

  @base_command.subcommand(help="Do subcommand things")
  async def subcommand(self, evt: MessageEvent) -> None:
    await evt.react("subcommand!")

In this case, the subcommand handler would be triggered by !hello subcommand. If you send just !hello, it will respond with a help page. The help argument from the subcommand decorator is how the help page is populated.

The subcommand decorator has the same parameters as top-level commands, except it can't define the event_type and msgtypes that the handler catches. You can also nest subcommands as deep as you like (i.e. in the above example, @subcommand.subcommand() is a valid decorator for a third method).