Skip to content

cirebon-dev/chatrouter

Repository files navigation

status workflow test status workflow build Downloads

Chatrouter is an enhanced router for chatbots and easily integrates with any bot library.

key features

  1. turned complexity into simplicity.

from:

if user_session == "A":
    ...
elif user_session == "B":
    ...
elif user_session == "C":
    ...
else:
    ...

to:

chatbot = chatrouter.group(user_session)
r = chatrouter.run(chatbot, msg)
  1. Readable route.
@chatbot.add_command("call me {my_name}")
# or 
chatbot.add_command("call me {my_name} and {my_friend}")
# etc
  1. case sensitive and insensitive.

default case is insensitive but you can add strict=True to a route/command to make it case sensitive.

  1. public and private command.

command start with "/" and have description is public command, for example:

@chatbot.add_command("/test", description="test command", strict=True)
  1. invoke callback anywhere.
func = chatrouter.util.get_func("group_name", "command_name")
  1. auto generated /start and /help command.

  2. object storage chatrouter.data_user.

  3. support asynchronous.

  4. support midleware

@chatbot.midleware()
def limit_user():
  allowed_user_id = (123, 456)
  return chatrouter.data_user.id in allowed_user_id

installation

pip install chatrouter

quick example

# -*-coding:utf8;-*-
import chatrouter


chatbot = chatrouter.group("test", "this is test bot!")


@chatbot.add_command("call me {name}")
def say_handler(name):
    return f"hello {name}, nice to meet you!"


@chatbot.add_command("repeat me {one} and {two}")
def repeat_handler(one, two):
    return f"ok {one}.. {two}"


@chatbot.add_default_command()
def default_handler(command):
    return f"command {command} not found!"


if __name__ == '__main__':
    print(chatrouter.run(chatbot, "/start"))
    while True:
        try:
            i = input("you: ")
            r = chatrouter.run(chatbot, i)
            print(f"bot: {r}")
        except BaseException as e:
            print("bot: byebye!")
            exit(0)

asynchronous example

#-*-coding:utf8;-*-
import asyncio
import chatrouter


chatbot = chatrouter.group("test", asynchronous=True)

@chatbot.add_command("call me {name}")
async def test(name):
    return f"hello {name}!"

async def main():
    user_input = "call me human"
    response = await chatrouter.async_run(chatbot, user_input)
    print(response)

if __name__ == '__main__':
    asyncio.run(main())

for more complex example, please open demo/telegram_bot.