Awesome IRC bot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.1 KiB

#!/usr/bin/env python3
.. module::ModInfo
:synopsis: Provides manpage-like info for commands
from pyircbot.modulebase import ModuleBase, command
class info(object):
Decorator for tagging module methods with help text
.. code-block:: python
from pyircbot.modules.ModInfo import info
@info("help [command] show the manual for all or [commands]", cmds=["help", "rtfm"])
def cmd_help(self, msg, cmd):
:param docstring: command help formatted as above
:type docstring: str
:param cmds: enable command names or aliases this function implements, as a list of strings. E.g. if the "help"
command has the alias "rtfm"
:type cmds: list
def __init__(self, docstring, cmds=None):
self.docstring = docstring
self.commands = cmds or []
def __call__(self, func):
if hasattr(func, "irchelp"):
setattr(func, "irchelp", [self.docstring])
if hasattr(func, "irchelpc"):
setattr(func, "irchelpc", [self.commands])
return func
class ModInfo(ModuleBase):
@info("help [command] show the manual for all or [commands]", cmds=["help"])
def cmd_help(self, msg, cmd):
Get help on a command
if cmd.args:
for modname, module, helptext, helpcommands in self.iter_modules():
if cmd.args[0] in ["{}{}".format(command.prefix, i) for i in helpcommands]:[0], "RTFM: {}: {}".format(cmd.args[0], helptext))
for modname, module, helptext, helpcommands in self.iter_modules():[0], "{}: {}{}".format(modname, command.prefix, helptext))
@info("helpindex show a short list of all commands", cmds=["helpindex"])
def cmd_helpindex(self, msg, cmd):
Short index of commands
commands = []
for modname, module, helptext, helpcommands in self.iter_modules():
commands += ["{}{}".format(command.prefix, i) for i in helpcommands][0], "{}: commands: {}".format(msg.prefix.nick, ", ".join(commands)))
def iter_modules(self):
Iterator that cycles through module methods that are tagged with help information. The iterator yields tuples
(module_name, module_object, helptext, command_list)
for modname, module in
for attr_name in dir(module):
attr = getattr(module, attr_name)
if callable(attr) and hasattr(attr, "irchelp"):
for cmdhelp, cmdaliases in zip(getattr(attr, "irchelp"), getattr(attr, "irchelpc")):
yield (modname, module, cmdhelp, cmdaliases, )
raise StopIteration()