Package: chatbotmaker
ChatBotMakerThis project aims to automate plateform messaging where the plateform support
message forwarding.DescriptionThis 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 IdeaUser are instatesand define what action should be executed.A state is composed of 3 event and 1 input event (or main event):func(user, user_input):mainfunction called with the user's inputenter_func(user): calledeverytime before the user sends text in its
current statepre_func(user): called when entering a state (ie. during change_state)post_func(user): called when exiting a state (ie. during change_state)ComponentsMessengerYou can create your own messenger class that should inherit thechatbotmaker.Messengerclass.It must implement a send(user_id: str, message:str)
method and can implement other optional methods.DispatcherThe 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,
  }  
}DEFAULTYou 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)DatabaseThe 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 classesYou 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 functionadd_relationship(class_to_add, name, value)is available in
the database module.UsageDefault componentsTo avoid re-inventing the wheel, some "common" components have already been
coded. They are in chatbotmaker.default.FacebookFacebookMessenger(authentication_token)facebook_route(request, facebook_check_token, bot)this flask routing should be called directly from the routing functionDevWe have the dev file containing:DevMessenger()  # prints everythin in consoleInstallationUsing PIP since its a pip module repository:42sh$:pipinstallchatbotmakerContributingDo no hesitate to make a pull request or launch a discussion. I am looking
foreward to expand the default capabilites.Authors and acknowledgmentAuthor:Dominique MICHELdominique.michel@epita.frStatusThe project has reached its first final phase. Now there will be:need to think about the design and facilitate user-database integrationGood work done here, maybe allow any orm engiine ine the futureneed of tests (why not make a CI pipeline)tests must tests more the content of the callsgithub ci pipeline is so confusing coming from gitlab :oOnce the backend is functional and robust, i aim to make a frontend plateform
to allow non-programming people to create bots too.