@responder(pattern="^(\?|help) ?(?P<regex>\S+)?", form="? [regex]", auth_required=False,
 help="Display help, optionally filtered")
def help(conversation, regex):
    help_text = ""
    groups = {}
    for func in responders.values():
        if func.module not in groups:
            groups[func.module] = []
        groups[func.module].append(func)
    for group,funcs in sorted(groups.items()):
        help_text += "\n<<< %s commands >>>\n" % group
        for func in funcs:
            help_text += "%24s  %s\n" % (func.form, func.help)

    if regex:
        regex = re.compile(regex)
        output = ""
        for line in help_text.split('\n'):
            if regex.search(line):
                output += line + '\n'
    else:
        output = help_text

    conversation.say('\n' + output, useHTML=False)

    if not regex:
        doc_url = "http://%s:%d/doc/index.html" % (config.HOSTNAME, config.DRONED_PORT)
        conversation.say("For more information read my online documentation at %s" % doc_url)
dataset/ETHPy150Open OrbitzWorldwide/droned/droned/lib/droned/responders/core.py/help/original