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"))
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)
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)
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
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
def _get_language(self): if self.readable == '': return self.language = guess_language_name(self.readable)
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"))
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))
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))