Skip to main content

This package automates the process of bot creation

Project description

ChatBotMaker

This project aims to automate plateform messaging where the plateform support message forwarding.

Description

This module is based around a bot class in which you inject the necessary code / objects:

  • Messenger (An object that sends message or event back)
  • Dispatcher (An object that contains all the logic rule)
  • Database (An object that allows database interaction)

General Idea

User are in states and define what action should be executed.

A state is composed of 3 event and 1 input event (or main event):

  • func(user, user_input): main function called with the user's input
  • enter_func(user): called every time before the user sends text in its current state
  • pre_func(user): called when entering a state (ie. during change_state)
  • post_func(user): called when exiting a state (ie. during change_state)

InternalShema

Components

Messenger

You can create your own messenger class that should inherit the chatbotmaker.Messenger class.
It must implement a send(user_id: str, message:str) method and can implement other optional methods.

Dispatcher

The dispatcher recieves your config as a dictionnary in the following format:

{  
  'actions': {  
    'handle_name': {  
        'enter_func': lambda user: user.send_message('Hi there every time'),  
        'pref_func': lambda user: user.send_message('Hi there'),  
        'func': lambda user, user_input: user.change_state('home'),  
        'post_func': lambda user: user.send_message('You are redirected'),  
    },  
    'home': {  
        'pref_func': lambda user: user.send_message('Welcome back!'),  
        'func': 'lambda user, user_input: user.change_state(user_input)',  
    },  
    'input': {  
        'func': 'lambda user, user_input: (  
                    user.store_argument('input', user_input),  
                    user.change_state('home'),  
                )',  
    },  
    'help': Dispatcher.DEFAULT,
  }  
}
DEFAULT

You can associate function by their name to make the binding process easier. You must name your functions with {key}_{handle_name} (eg: func_help, pre_func_help, post_func_help). You then must pass the binding table dictionary to the Dispatcher constructor alongside the config __init__(self, config, env=None) . This generally are locals() or globals().

How does it work?

The user is the orm User class to whom we add some method (redirect failing attribute calls):

  • send_message(message: str)
  • change_state(state: str)
  • get_argument(name: str)
  • store_argument(name: str, value: str)
  • self.messenger, self.dispatcher, self.database (the one onjected in the bot)

Database

The given database database follows the following architecture:

  • users:
    • id = Column(Integer, primary_key=True)
    • fb_id = Column(String)
    • state = Column(String)
    • arguments = relationship('Argument', back_populates='user', lazy='dynamic')
  • arguments:
    • id = Column(Integer, primary_key=True)
    • name = Column(String)
    • value = Column(String)
    • user_id = Column(Integer, ForeignKey('users.id'))
    • user = relationship('User', uselist=False, back_populates='arguments')

The database expects a config (sqlachemy.config) object to initialize the database. Please check sqlalchemy configuration for more information.

Custom tables / ORM classes

You can add custom tables (thus ORM classes). To do so create your own base (declarative_base() from sqlalchemy) and with it your own models . Then inject it in the database object database([...], base=my_base).

In case you want to create relationships with default classes, it is possible. A function add_relationship(class_to_add, name, value) is available in the database module.

Usage

Default components

To avoid re-inventing the wheel, some "common" components have already been coded. They are in chatbotmaker.default.

Facebook

  • FacebookMessenger(authentication_token)
  • facebook_route(request, facebook_check_token, bot)
    • this flask routing should be called directly from the routing function

Dev

We have the dev file containing:

  • DevMessenger() # prints everythin in console

Installation

Using PIP since its a pip module repository:

42sh$ : pip install chatbotmaker

Contributing

Do no hesitate to make a pull request or launch a discussion. I am looking foreward to expand the default capabilites.

Authors and acknowledgment

Author:

Dominique MICHEL dominique.michel@epita.fr

Status

The project has reached its first final phase. Now there will be:

  • need to think about the design and facilitate user-database integration
    • Good work done here, maybe allow any orm engiine ine the future
  • need of tests (why not make a CI pipeline)
    • tests must tests more the content of the calls
    • github ci pipeline is so confusing coming from gitlab :o

Once the backend is functional and robust, i aim to make a frontend plateform to allow non-programming people to create bots too.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chatbotmaker-0.0.13.tar.gz (90.8 kB view hashes)

Uploaded Source

Built Distribution

chatbotmaker-0.0.13-py3-none-any.whl (11.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page