예제 #1
0
    def test_guess(self):
        for text, name in self.tests:
            self.assertEqual(guess_language(text), name)

        for text, name, hints in self.tests_with_hints:
            self.assertEqual(guess_language(text, hints), name)

        text = "Vérifions que le détecteur de langue fonctionne."
        self.assertEqual(guess_language_tag(text), "fr")
        self.assertEqual(guess_language_name(text), "French")
        self.assertEqual(guess_language_id(text), 26150)
        self.assertEqual(guess_language_info(text), ("fr", 26150, "French"))
예제 #2
0
파일: lampone.py 프로젝트: bdbais/lampone
    def reply(self,lang,msg):
        # reply message
        
        if self.multibrain:
            lang = guess_language_name(msg).lower()
        else:
            lang = 'italian'

        if not lang in self.brains:
            self.brains[lang] =  Brain(os.path.join(os.path.split(__file__)[0],"brains","lampone_%s.brain" % lang))
            if lang in self.languages:
                self.brains[lang].set_stemmer(lang)
            
        return self.brains[lang].reply(msg,loop_ms=self.reply_time)
예제 #3
0
    def reply(self, lang, msg):
        # reply message

        if self.multibrain:
            lang = guess_language_name(msg).lower()
        else:
            lang = 'italian'

        if not lang in self.brains:
            self.brains[lang] = Brain(
                os.path.join(
                    os.path.split(__file__)[0], "brains",
                    "lampone_%s.brain" % lang))
            if lang in self.languages:
                self.brains[lang].set_stemmer(lang)

        return self.brains[lang].reply(msg, loop_ms=self.reply_time)
예제 #4
0
파일: lampone.py 프로젝트: bdbais/lampone
    def learn(self,msg):
        # learn message
        if self.multibrain:
            lang = guess_language_name(msg).lower()
        else:
            lang = 'italian'

        try:
            if not lang in self.brains:
                self.brains[lang] =  Brain(os.path.join(os.path.split(__file__)[0],"brains","lampone_%s.brain" % lang))
                if self.brains[lang]  in self.languages:
                    brain.set_stemmer(lang)
            self.brains[lang].learn(msg)
        except Exception as e:
            logger.error("ERR - learn - %s" % e )
             
        return lang
예제 #5
0
    def learn(self, msg):
        # learn message
        if self.multibrain:
            lang = guess_language_name(msg).lower()
        else:
            lang = 'italian'

        try:
            if not lang in self.brains:
                self.brains[lang] = Brain(
                    os.path.join(
                        os.path.split(__file__)[0], "brains",
                        "lampone_%s.brain" % lang))
                if self.brains[lang] in self.languages:
                    brain.set_stemmer(lang)
            self.brains[lang].learn(msg)
        except Exception as e:
            logger.error("ERR - learn - %s" % e)

        return lang
예제 #6
0
파일: models.py 프로젝트: blumug/texapi
 def _get_language(self):
     if self.readable == '':
         return
     self.language = guess_language_name(self.readable)
예제 #7
0
 def test_guess_tag(self):
     text = "Vérifions que le détecteur de langue fonctionne."
     self.assertEqual(guess_language_tag(text), "fr")
     self.assertEqual(guess_language_name(text), "French")
     self.assertEqual(guess_language_id(text), 26150)
     self.assertEqual(guess_language_info(text), ("fr", 26150, "French"))
예제 #8
0
    def parsemessage(self, chat_id, message):
        logger.info("Messaggio ricevuto da %s" % message['from'])
        logger.info(message['text'])
        if self.stop:
            # stopping, ignore messages
            return

        if str(message['from']['id']) in self.blacklist:
            logger.info("%s blacklisted" % message['from']['id'])
            return

        #if self.lastbackup != datetime.now().hour:
        #    self.lastbackup = datetime.now().hour
        #    self.backupBrain()

        if message['text'].startswith(
                '/learn') and message['from']['id'] in self.admins:
            self.learn_lines(message)
            return

        if message['text'].startswith(
                '/update') and message['from']['id'] in self.admins:
            """
            Bot updates from git and then quits, 
            to reload automatically use a cron like this:
            */1 * * * * [ `ps aux | grep python3 | grep lampone | grep -v grep | wc -l` -eq 0 ] && /usr/bin/python3 /home/pi/lampone/lampone.py  > /dev/null 2>&1
            """
            self.sendMessageThreaded(chat_id, "Updating...")
            res = os.popen(
                "cd %s && git fetch --all && git reset --hard origin" %
                os.path.join(os.path.split(__file__)[0])).read()
            self.sendMessageThreaded(chat_id, res)
            self.sendMessageThreaded(chat_id, "Restarting...")
            self.stop = True
            return

        if message['text'].startswith(
                '/f') and message['from']['id'] in self.admins:
            ## fortune auto learning, needs fortune-mod installed
            ## check for params
            count = 1
            if len(message['text'].split()) > 1:
                param = message['text'].split()[1]
                if param.isdecimal():
                    count = int(param)
                    if count > 100:
                        count = 100
            self.sendMessageThreaded(chat_id, "Learning %s fortunes" % count)
            for x in range(count):
                txt = os.popen(
                    'fortune | grep -v "\-\-\s.*" | grep -v ".*:$" | grep -v ".*http://"'
                ).read()
                if txt:
                    self.learn(txt)
            self.sendMessageThreaded(chat_id, "Done")
            return

        if message['text'] == "/start":
            self.sendMessageThreaded(chat_id, "Welcome to Lampone Bot")
            return

        if message['text'].startswith(
                "/rt") and message['from']['id'] in self.admins:
            if message['text'].split()[-1].isdigit():
                val = int(message['text'].split()[-1])
                if val < 30:
                    self.reply_time = int(message['text'].split()[-1]) * 1000
                    self.sendMessageThreaded(
                        chat_id, "Reply Timer set to %s seconds" % val)
                else:
                    self.sendMessageThreaded(
                        chat_id,
                        "Bad n. of seconds: %s" % message['text'].split()[-1])
            else:
                self.sendMessageThreaded(
                    chat_id,
                    "Bad n. of seconds: %s" % message['text'].split()[-1])
            return

        if message['text'] == "/groupmode":
            if chat_id > 0:
                self.sendMessageThreaded(chat_id, "This is not a group.")
            else:
                self.sendMessageThreaded(
                    chat_id,
                    "Select Group Mode:",
                    reply_markup={
                        'keyboard': [
                            ['/g1 Respond all messages'],
                            ['/g2 Respond some messages'],
                            ['/g3 Respond only for Lampone'],
                        ]
                    })
            return

        if message['text'].startswith("/g1"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,
                                         "This is not a group.",
                                         reply_markup={'hide_keyboard': True})
            else:
                self.groupmode[chat_id] = 1
                self.sendMessageThreaded(chat_id,
                                         "Groupmode 1 enabled",
                                         reply_markup={'hide_keyboard': True})
            return

        if message['text'].startswith("/g2"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,
                                         "This is not a group.",
                                         reply_markup={'hide_keyboard': True})
            else:
                self.groupmode[chat_id] = 2
                self.sendMessageThreaded(chat_id,
                                         "Groupmode 2 enabled",
                                         reply_markup={'hide_keyboard': True})
            return

        if message['text'].startswith("/g3"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,
                                         "This is not a group.",
                                         reply_markup={'hide_keyboard': True})
            else:
                self.groupmode[chat_id] = 3
                self.sendMessageThreaded(chat_id,
                                         "Groupmode 3 enabled",
                                         reply_markup={'hide_keyboard': True})
            return

        if message['text'] == "/help":
            self.sendMessageThreaded(
                chat_id,
                "This is a simple AI bot, just talk to him or invite to your group and he will learn and respond\nTry /groupmode for limit group interaction"
            )
            self.sendMessageThreaded(
                chat_id,
                "Vote for lampone here if you like it: https://telegram.me/storebot?start=lamponebot"
            )
            return

        if message['text'] == "/stop":
            self.sendMessageThreaded(
                chat_id, "Command not needed, just close the chat :)")
            return

        if message['text'] == "/autolearn" and message['from'][
                'id'] in self.admins:
            try:
                self.autolearn()
            except Exception as e:
                logger.error("ERR - /autolearn - %s" % e)

            return

        if message['text'] == "/listen" and message['from'][
                'id'] in self.admins:
            self.sendMessageThreaded(
                chat_id, "Listening enabled, stop with /stoplisten")
            if not chat_id in self.listening:
                self.listening.append(chat_id)
            return

        if message['text'] == "/stoplisten" and message['from'][
                'id'] in self.admins:
            self.sendMessageThreaded(chat_id, "Listening stopped")
            if chat_id in self.listening:
                self.listening.pop(self.listening.index(chat_id))
            return

        if message['text'].startswith(
                "/ban") and message['from']['id'] in self.admins:
            # blacklist user
            if len(message['text'].split()) == 2:
                ban_id = message['text'].split()[1]
                self.blacklistuser(ban_id, chat_id)
            else:
                if 'reply_to_message' in message:
                    match = re.match('.*\[(\d+)\].*',
                                     message['reply_to_message']['text'])
                    if match:
                        ban_id = match.groups(0)[0]
                        self.blacklistuser(ban_id, chat_id)
            return

        if message['text'].startswith(
                "/unban") and message['from']['id'] in self.admins:
            # blacklist user
            if len(message['text'].split()) == 2:
                ban_id = message['text'].split()[1]
                if ban_id in self.blacklist:
                    self.blacklist.remove(ban_id)
                    self.sendMessageThreaded(chat_id,
                                             "User %s un-blacklisted" % ban_id)
                    with open(
                            os.path.join(
                                os.path.split(__file__)[0], 'blacklist.txt'),
                            'w') as fp:
                        fp.writelines(["%s\r\n" % x for x in self.blacklist])
            return

        if not message['text'].startswith('/'):
            for ll in self.listening:
                # self.forwardMessageThreaded(ll, message['from']['id'], message['message_id']) # too
                self.sendMessageThreaded(
                    ll,
                    "<-- [%s] %s" % (message['from']['id'], message['text']))

            delta = delta = datetime.now() - datetime.fromtimestamp(
                message['date'])
            learn = True
            rispondi = True

            text = message['text'].strip().strip("'").strip('"')

            # se passati più di 30 minuti non rispondo, probabilmente è crashato il bot
            if delta.total_seconds() / 60 > 30.0:
                rispondi = False

            # skip links

            if 'http' in text.lower(): learn = False  # don't learn urls
            if re.match('.*[\w\d]+\.\w{2,4}', text):
                learn = False  # try don't learn hostnames
            if len(text.split()) < 2:
                learn = False  # don't learn shorter phrases
            if re.match('.*@\w+', text): learn = False  # don't learn usernames
            if len(text.split()) > 100:
                learn = False  # don't learn too long messages

            if chat_id in self.groupmode:
                gm = self.groupmode[chat_id]

                if gm == 2:
                    # responds sometimes
                    if not 'lampone' in text.lower():
                        rispondi = True if randrange(0, 5) == 0 else False

                if gm == 3:
                    # responds only if asked
                    if not 'lampone' in text.lower():
                        rispondi = False
            else:
                if chat_id < 0:
                    # default set group mode to 2 in groups
                    self.groupmode[chat_id] = 2
                    rispondi = False

            guesslang = guess_language_name(text).lower()
            if guesslang in self.ignorelangs:
                # automatic ban
                self.blacklistuser(message['from']['id'])
                learn = False
                rispondi = False

            try:
                logger.info("Lang: %s, Learn: %s, Rispondi: %s" %
                            (guesslang, learn, rispondi))
                if learn:
                    self.log_learn(text)  # log messages for retrain
                    lang = self.learn(text)
                else:
                    if self.multibrain:
                        lang = guesslang
                    else:
                        lang = 'italian'

                if rispondi:
                    # se proprio devo rispondere
                    self.action_typing(chat_id)
                    try:
                        logger.info("get reply l:%s text:%s" % (lang, text))
                        reply = self.reply(lang, text)
                    except Exception as e:
                        # manda un messaggio a caso se non gli piace ?
                        logger.error("ERR - rispondi - %s" % e)
                        reply = self.reply(lang, "")

                    # rispondi se e diversa, copiare no buono
                    if not reply.lower().strip('.').strip('!').strip(
                            '?').strip() == text.lower().strip('.').strip(
                                '!').strip('?').strip():
                        self.sendMessageThreaded(chat_id, reply)
                    else:
                        # manda un messaggio a caso invece di ripetere
                        reply = self.reply(lang, "")
                        if reply.strip():
                            self.sendMessageThreaded(chat_id, reply)

                    for ll in self.listening:
                        self.sendMessageThreaded(
                            ll, "--> [%s] %s" % (message['from']['id'], reply))

            except Exception as e:
                logger.error("ERR - try learn/rispondi - %s" % e)
                self.sendMessageThreaded(
                    self.admins[0],
                    "Brain error: %s\nbad text:\n%s" % (e, text))
예제 #9
0
파일: lampone.py 프로젝트: bdbais/lampone
    def parsemessage(self,chat_id,message):
        logger.info("Messaggio ricevuto da %s" % message['from'] )
        logger.info(message['text'])
        if self.stop:
            # stopping, ignore messages
            return
        
        if str(message['from']['id']) in self.blacklist:
            logger.info("%s blacklisted" % message['from']['id'])
            return 
        
        #if self.lastbackup != datetime.now().hour:
        #    self.lastbackup = datetime.now().hour
        #    self.backupBrain()

        if message['text'].startswith('/learn') and message['from']['id'] in self.admins:
            self.learn_lines(message)
            return
        
        if message['text'].startswith('/update') and message['from']['id'] in self.admins:
            """
            Bot updates from git and then quits, 
            to reload automatically use a cron like this:
            */1 * * * * [ `ps aux | grep python3 | grep lampone | grep -v grep | wc -l` -eq 0 ] && /usr/bin/python3 /home/pi/lampone/lampone.py  > /dev/null 2>&1
            """
            self.sendMessageThreaded(chat_id,"Updating...")
            res = os.popen("cd %s && git fetch --all && git reset --hard origin" % os.path.join(os.path.split(__file__)[0])).read()
            self.sendMessageThreaded(chat_id,res)
            self.sendMessageThreaded(chat_id,"Restarting...")
            self.stop = True
            return        
        
        if message['text'].startswith('/f') and message['from']['id'] in self.admins:
            ## fortune auto learning, needs fortune-mod installed
            ## check for params
            count = 1
            if len(message['text'].split()) > 1:
                param = message['text'].split()[1]
                if param.isdecimal():
                    count = int(param)
                    if count > 100:
                        count = 100
            self.sendMessageThreaded(chat_id,"Learning %s fortunes"%count)
            for x in range(count):
                txt = os.popen('fortune | grep -v "\-\-\s.*" | grep -v ".*:$" | grep -v ".*http://"').read()
                if txt:
                    self.learn(txt)
            self.sendMessageThreaded(chat_id,"Done")
            return        
        
        if message['text'] == "/start":
            self.sendMessageThreaded(chat_id,"Welcome to Lampone Bot")
            return

        if message['text'].startswith("/rt")  and message['from']['id'] in self.admins:
            if message['text'].split()[-1].isdigit():
                val = int(message['text'].split()[-1])
                if val < 30:
                    self.reply_time = int(message['text'].split()[-1])*1000
                    self.sendMessageThreaded(chat_id,"Reply Timer set to %s seconds" % val)
                else:
                    self.sendMessageThreaded(chat_id,"Bad n. of seconds: %s" % message['text'].split()[-1] )
            else:
                self.sendMessageThreaded(chat_id,"Bad n. of seconds: %s" % message['text'].split()[-1] )
            return

        if message['text'] == "/groupmode":
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,"This is not a group.")
            else:
                self.sendMessageThreaded(chat_id,"Select Group Mode:",reply_markup={'keyboard':[['/g1 Respond all messages'],['/g2 Respond some messages'],['/g3 Respond only for Lampone'],]})
            return
        
        if message['text'].startswith("/g1"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,"This is not a group.",reply_markup={'hide_keyboard':True})
            else:
                self.groupmode[chat_id] = 1
                self.sendMessageThreaded(chat_id,"Groupmode 1 enabled",reply_markup={'hide_keyboard':True})
            return
        
        if message['text'].startswith("/g2"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,"This is not a group.",reply_markup={'hide_keyboard':True})
            else:
                self.groupmode[chat_id] = 2
                self.sendMessageThreaded(chat_id,"Groupmode 2 enabled",reply_markup={'hide_keyboard':True})
            return
        
        if message['text'].startswith("/g3"):
            if chat_id > 0:
                self.sendMessageThreaded(chat_id,"This is not a group.",reply_markup={'hide_keyboard':True})
            else:
                self.groupmode[chat_id] = 3
                self.sendMessageThreaded(chat_id,"Groupmode 3 enabled",reply_markup={'hide_keyboard':True})
            return        
        
        if message['text'] == "/help":
            self.sendMessageThreaded(chat_id,"This is a simple AI bot, just talk to him or invite to your group and he will learn and respond\nTry /groupmode for limit group interaction")
            self.sendMessageThreaded(chat_id,"Vote for lampone here if you like it: https://telegram.me/storebot?start=lamponebot")
            return        
        
        if message['text'] == "/stop":
            self.sendMessageThreaded(chat_id,"Command not needed, just close the chat :)")
            return        
        
        if message['text'] == "/autolearn" and message['from']['id'] in self.admins:
            try:
                self.autolearn()
            except Exception as e:
                logger.error("ERR - /autolearn - %s" % e )
                
            return              
        
        if message['text'] == "/listen" and message['from']['id'] in self.admins:
            self.sendMessageThreaded(chat_id,"Listening enabled, stop with /stoplisten")
            if not chat_id in self.listening:
                self.listening.append(chat_id)
            return        
        
        if message['text'] == "/stoplisten" and message['from']['id'] in self.admins:
            self.sendMessageThreaded(chat_id,"Listening stopped")
            if chat_id in self.listening:
                self.listening.pop(self.listening.index(chat_id))
            return                
        
        if message['text'].startswith("/ban") and message['from']['id'] in self.admins:
            # blacklist user
            if len(message['text'].split())==2:
                ban_id = message['text'].split()[1]
                self.blacklistuser(ban_id,chat_id)
            else:
                if 'reply_to_message' in message:
                    match = re.match('.*\[(\d+)\].*',message['reply_to_message']['text'])
                    if match:
                        ban_id = match.groups(0)[0]
                        self.blacklistuser(ban_id,chat_id)
            return

        if message['text'].startswith("/unban") and message['from']['id'] in self.admins:
            # blacklist user
            if len(message['text'].split())==2:
                ban_id = message['text'].split()[1]
                if ban_id in self.blacklist:
                    self.blacklist.remove(ban_id)
                    self.sendMessageThreaded(chat_id,"User %s un-blacklisted" % ban_id)
                    with open(os.path.join(os.path.split(__file__)[0],'blacklist.txt'),'w') as fp:
                        fp.writelines([ "%s\r\n" % x for x in self.blacklist ])
            return        
            
        if not message['text'].startswith('/'):
            for ll in self.listening:
                # self.forwardMessageThreaded(ll, message['from']['id'], message['message_id']) # too
                self.sendMessageThreaded(ll,"<-- [%s] %s" % (message['from']['id'], message['text']))

            delta = delta = datetime.now() - datetime.fromtimestamp(message['date'])
            learn = True
            rispondi = True

            text = message['text'].strip().strip("'").strip('"')            
            
            # se passati più di 30 minuti non rispondo, probabilmente è crashato il bot
            if delta.total_seconds()/60 > 30.0:
                rispondi = False

            # skip links 
            
            if 'http' in text.lower(): learn = False # don't learn urls
            if re.match('.*[\w\d]+\.\w{2,4}',text) : learn = False # try don't learn hostnames
            if len(text.split()) < 2: learn = False # don't learn shorter phrases
            if re.match('.*@\w+',text): learn = False # don't learn usernames
            if len(text.split()) > 100: learn = False # don't learn too long messages

            
            if chat_id in self.groupmode:
                gm = self.groupmode[chat_id]

                if gm == 2:
                    # responds sometimes
                    if not 'lampone' in text.lower():
                        rispondi = True if randrange(0,5) == 0 else False
                        
                if gm == 3:
                    # responds only if asked
                    if not 'lampone' in text.lower():
                        rispondi = False
            else:
                if chat_id < 0:
                    # default set group mode to 2 in groups
                    self.groupmode[chat_id] = 2
                    rispondi = False

            guesslang =  guess_language_name(text).lower()
            if guesslang in self.ignorelangs:
                # automatic ban 
                self.blacklistuser(message['from']['id'])
                learn = False
                rispondi = False

            try: 
                logger.info("Lang: %s, Learn: %s, Rispondi: %s" % (guesslang,learn,rispondi) )
                if learn:
                    self.log_learn(text) # log messages for retrain
                    lang = self.learn(text)
                else:
                    if self.multibrain:
                        lang = guesslang
                    else:
                        lang = 'italian'
             
                if rispondi:
                    # se proprio devo rispondere
                    self.action_typing(chat_id)
                    try:
                        logger.info("get reply l:%s text:%s" % (lang,text))
                        reply = self.reply(lang,text)
                    except Exception as e:
                        # manda un messaggio a caso se non gli piace ?
                        logger.error("ERR - rispondi - %s" % e )
                        reply = self.reply(lang,"")

                    # rispondi se e diversa, copiare no buono
                    if not reply.lower().strip('.').strip('!').strip('?').strip() == text.lower().strip('.').strip('!').strip('?').strip():
                        self.sendMessageThreaded(chat_id,reply)
                    else:
                        # manda un messaggio a caso invece di ripetere
                        reply = self.reply(lang,"")
                        if reply.strip():
                            self.sendMessageThreaded(chat_id,reply)
                        

                    for ll in self.listening:
                        self.sendMessageThreaded(ll,"--> [%s] %s" % (message['from']['id'],reply))

            except Exception as e:
                logger.error("ERR - try learn/rispondi - %s" % e )
                self.sendMessageThreaded(self.admins[0],"Brain error: %s\nbad text:\n%s" % (e,text))