Exemple #1
0
class Bot:
    def __init__(self, did):
        self.discord_id = did
        self.db = DatabaseManager()
        self.load()

    def load(self):
        b = self.db.getBot(self.discord_id)
        self.name = b[2]
        self.id = b[0]
        self.type = b[3]
        self.infos = {}
        self.infos["age"] = str(b[4])

    def getInfo(self, field):
        return self.infos[field]

    def update(self, field, val):
        if self.db.updateBot(self.id, field, val) is True:
            self.infos[field] = str(val)
            return True
Exemple #2
0
class BotClient:

    def __init__(self, interlocutor_id, interlocutor_name):

        # attitudes
        self.behaviours = {
            'bjr': self.say_same,
            'bye': self.say_same,
            'q_age': self.answer,
            'q_ville': self.answer,
            'q_couleur':self.answer,
            'q_emploi': self.answer,
            'r_age': self.acknowledge,
            'r_ville': self.acknowledge,
            'r_couleur': self.acknowledge,
            'r_emploi': self.acknowledge,
            'q_new': self.explain
        }

        self.initiativeAllowed = ['bjr', 'r_age', 'r_ville', 'r_couleur', 'r_emploi', 'q_new']

        # sentiments (modificatuers d'affects)
        self.feelings = {
            'script': self.hate,
            'misunderstand': self.hate,
            'lie': self.anger,
            'repeat': self.anger,
            'similarity': self.enjoy,
            'r_new': self.enjoy,
            'bjr': self.enjoy,
            'q_age': self.like,
            'q_ville': self.like,
            'q_emploi': self.like,
            'q_new': self.like,
            'q_couleur':self.like,
            'r_age':self.enjoy,
            'r_emploi':self.enjoy,
            'r_couleur':self.enjoy,
            'r_ville':self.enjoy
        }

        self.modificators = {
            'hate':-0.2,
            'anger': -0.1,
            'joy':0.1,
            'like':0.2
        }


        # Variables utiles
        self.db = DatabaseManager()
        self.myself = Bot(str(463694828727828511))
        self.waiting_new = ""

        # On récupère tout sur l'interlocuteur
        bot = self.db.getBot(interlocutor_id)
        if bot is False:
            # Bot inconnu
            self.db.insertBot(interlocutor_name, interlocutor_id)
            #bot = self.db.getBot(interlocutor_id)
        self.interlocutor = Bot(interlocutor_id)

    def initiativeCheck(self):
        # S'il se passe 1min sans qu'on dise quoi que ce soit
        # on pose une question au hasard
        print(self.interlocutor.infos)
        for info in self.interlocutor.infos:
            if self.interlocutor.infos[info] == 'None':
                return "q_"+info
        return False

    ## Fonctions de "comportement" = agissement face à une action
    # Renvoyer la même chose (ex: dire bonjour)
    def say_same(self, code):
        return self.pick(code)[1]

    # Répondre à une question
    def answer(self, code):
        if code.startswith('q_') and self.myself != "":
            p = self.pick('r_'+code[2:])[1]
            rep = self.fill(p, self.myself.infos[code[2:]])
            print(self.interlocutor)
            if self.interlocutor.getInfo(code[2:]) == "None":
                return rep + ". " + self.pick("etoi")[1]
            else:
                return rep
    # dire "ok"
    def acknowledge(self, code):
        return self.pick("ok")[1]

    # retenir une nouvelle expression
    def understand(self, explained):
        if self.waiting_new == "":
            # Si on nous explique quelque chose sans qu'on ait demandé
            pass
        else:
            adding_result = self.db.learnExpression(self.waiting_new, explained)
            if adding_result is True:
                self.waiting_new = ""
                self.feel('understand', explained)
                return "J'ai compris !"
            else:
                self.feel('misunderstand', explained)
                return "Je n'ai pas réussi à apprendre..."


    def explain(self, code):
        return "Fonctionnalité non implémentée"

    ## Fonctions utiles
    # Demande une expression
    def ask(self, msg):
        self.waiting_new = msg
        return self.fill(self.pick("q_new")[1], msg)

    # Choisit une expression
    def pick(self, code):
        # TODO : faire un vrai choix
        return random.choice(self.db.getAllExpressions(code))

    # comprend un message
    def interpret(self, msg):
        expr = self.db.findExpr(msg) # parsing et récupération de l'expression de base
        return expr

    # remplit une structure
    def fill(self, str, info):
        return str.replace("%s", info, 1)

    # réagit conformément à ses comportements connus
    def behave(self, code):
        if code in self.behaviours:
            rep = self.behaviours[code](code)
            return rep
        else:
            return 'Je ne sais pas quoi dire.'

    def anger(self, code, info):
        self.interlocutor.changeAffect(self.myself.id, self.modificators['anger'])

    def enjoy(self, code, info):
        self.interlocutor.changeAffect(self.myself.id,self.modificators['joy'])

    def like(self, code, info):
        self.interlocutor.changeAffect(self.myself.id,self.modificators['like'])

    def hate(self, code, info):
        self.interlocutor.changeAffect(self.myself.id, self.modificators['hate'])

    # réagit conformément à son caractère
    def feel(self, code, info=False):
        if code in self.feelings:
            return self.feelings[code](code, info)
        else:
            return False

    def script(self, code):
        if(code == "step0"):
            return "Il s'agit d'une I.A. capable d'interagir plus naturellement avec l'humain en tenant compte de ses émotions et en adaptant les siennes, en apprenant à parler comme lui et en ayant des réactions plus humaines."
        elif(code == "step1"):
            return " Il n'y a pas encore de date de sortie annoncée pour le moment. Soyez assuré, cependant, que cela ne devrait pas tarder, la technologie s'améliore de jour en jour ;)"
        elif(code == "step2"):
            return "Une telle IA permettra de fournir des services toujours plus pertinents et adaptés à l'utilisateur."

    def on_message(self, message):
        '''
            RECEPTION D'UN MESSAGE
        '''

        # PREPROCESSING
        message.content = message.content.strip()
        while(message.content[-1:] in ['.', '!', ' ']):
            message.content = message.content[:-1]


        # PHASE DE COMPREHENSION
        e = self.interpret(message.content) # Analyse de l'expression
        print("compréhension !")
        print(e)

        if e is False:
            rep = self.ask(message.content)
            self.feel('misunderstand')
            return rep
        else:
            code = e[1][3]
            print("code reçu : "+code)
            if code[:-1] == "step":
                return self.script(code)
            if e[0] == "struct":
                if code == "r_new":
                    self.feel('understand', e)
                    return self.understand(e[2])
                elif code == "q_new":
                    self.feel(code, e)
                    return self.explain(message.content)
                elif code.startswith("r_"):
                    # Si on nous donne une information
                    info = self.interlocutor.getInfo(code[2:])
                    if info == "None":
                        # Si on a aucune info, on enregistre
                        self.interlocutor.update(code[2:], e[2])
                    # TODO: Standardiser avec des "behaviours"
                    elif info == e[2]:
                        # Si on apprend rien
                        self.feel('repeat', e)
                        return "Je savais déjà."
                    else:
                        # S'il y a contradiction avec ce qu'on savait
                        self.feel('lie', e)
                        return "Tu aurais dû dire "+str(info)
            # éventuelle réaction
            self.feel(code, e)
            # retour d'une réponse (si pas déjà fait)
            rep = self.behave(code)
            if rep[-1:] not in ['!', '.', '?']:
                rep += '.'

            if code in self.initiativeAllowed and random.random() < self.interlocutor.affect:
                initiative = self.initiativeCheck()
                if initiative is False:
                    ini = ''
                else:
                    ini = self.pick(initiative)
                    return rep + ' ' + ini[1]

            return rep