def mention(self, telegramBot, update): message = update.message.text words = re.compile('\s+', re.UNICODE).split(message) words = filter(lambda word: word.strip() and not self.mentionMatcher.match(word), words) words = map(lambda word: word.lower(), words) aliases = dict(self.bot.config.items('friendly-aliases')) if self.bot.config.has_section('friendly-aliases') else self.bot.config.has_section('friendly-aliases') if aliases and len(words) >= 1 and words[0] in aliases.keys(): command = aliases[words[0]] params = words[1:] self.logDebug(u'Friendly mention (chat_id: %s, command: %s, params: %s)' % (update.message.chat_id, command, (' ').join(params or ['None']))) updateMock = DynObject() updateMock.message = DynObject() if (hasattr(update.message, 'user')): updateMock.message.user = update.message.user updateMock.message.chat_id = update.message.chat_id updateMock.message.text = '/%s %s' % (command, ' '.join(params)) self.bot.dispatchCommand(updateMock, command) elif len(words) == 1: self.bot.sendMessage(chat_id=update.message.chat_id, text=random.choice(self._defaultAnswers).decode('utf-8')) elif len(words) > 1: sentence = ' '.join(words) bc = self.behaviourControl results = [] sentenceEnglish = ExternalAPI.translate(sentence, fromLanguage=self.language) or '' target = lambda behaviour, sentence: bc.getStatus(behaviour) == 'loaded' and results.append({'source': behaviour, 'answer': bc.get(behaviour).query(sentence)}) t1 = Thread(target=target, args=('evi', sentenceEnglish)) t2 = Thread(target=target, args=('wolfram', sentenceEnglish)) map(lambda t: t.start(), [t1, t2]) map(lambda t: t.join(), [t1, t2]) results = filter(lambda result: result['answer'] and result['answer'].strip(), results) results = sorted(results, lambda x, y: len(x['answer']) - len(y['answer'])) if results: result = results[0] self.logDebug(u'Friendly answer (chat_id: %s, sentence: %s, sentenceEnglish: %s, answers: %s, choosen: %s)' % (update.message.chat_id, sentence, sentenceEnglish, results, result['source'])) answerEnglish = result['answer'] creator = self.bot.config.get('main', 'creator') if self.bot.config.has_option('main', 'creator') else 'somebody smart' answerEnglish = re.sub('My creators are the company Evi \(formerly known as True Knowledge\), a semantic technology company based in Cambridge, UK', creator, answerEnglish) answerEnglish = re.sub('Evi \(formerly known as True Knowledge\)', creator, answerEnglish) answerEnglish = re.sub('Stephen Wolfram', creator, answerEnglish) answerEnglish = re.sub('William Tunstall-Pedoe, founder of Evi Technologies.', creator, answerEnglish) answerEnglish = re.sub('(Wolfram\|Alpha|Evi)', self.bot.getInfo().username, answerEnglish) answerNative = ExternalAPI.translate(answerEnglish, fromLanguage='en', toLanguage=self.language) self.bot.sendMessage(chat_id=update.message.chat_id, text=(answerNative or answerEnglish)) else: self.logDebug(u'Friendly answer (chat_id: %s, sentence: %s, sentenceEnglish: %s, answers: None)' % (update.message.chat_id, sentence, sentenceEnglish)) self.bot.sendMessage(chat_id=update.message.chat_id, text=random.choice(self._defaultAnswers).decode('utf-8'))
def talk(self, telegramBot, update): p = re.compile('([^ ]*) (.*)') query = (p.match(update.message.text).groups()[1] or '').strip() if query: self.logDebug(u'Talk (chat_id: %s, query: %s, source_language: pt)' % (update.message.chat_id, query or 'None')) audioFile = ExternalAPI.textToSpeech(query, language=self.language, encode='mp3') self.bot.sendAudio(chat_id=update.message.chat_id, audio=audioFile, performer=self.bot.getInfo().username)
def jokeSearch(self, telegramBot, update): p = re.compile('([^ ]*) (.*)') query = (p.match(update.message.text).groups()[1] or '').strip() self.logDebug(u'Joke search (chat_id: %s, query: %s)' % (update.message.chat_id, query or 'None')) jokes = ExternalAPI.searchJoke(query) if jokes: self.bot.sendMessage(chat_id=update.message.chat_id, text=random.choice(jokes))
def nasaSearch(self, telegramBot, update): self.logDebug(u'Nasa search (chat_id: %s)' % update.message.chat_id) nasaData = ExternalAPI.getNasaIOD() if nasaData: self.bot.sendMessage(chat_id=update.message.chat_id, text=nasaData['imageSource']) self.bot.sendMessage(chat_id=update.message.chat_id, text=nasaData['explanation']) else: self.bot.sendMessage(chat_id=update.message.chat_id, text='Não encontrei imagem da nasa')
def jalkSearch(self, telegramBot, update): p = re.compile('([^ ]*) (.*)') query = (p.match(update.message.text).groups()[1] or '').strip() self.logDebug(u'Jalk search (chat_id: %s, query: %s)' % (update.message.chat_id, query or 'None')) jokes = ExternalAPI.searchJoke(query) if jokes: jokes = filter(lambda c: len(re.split('\W+', c, re.MULTILINE)) < 200, jokes) jokes = sorted(jokes, lambda x, y: len(x) - len(y)) if jokes: joke = jokes[0] audioFile = ExternalAPI.textToSpeech(joke, language=self.language, encode='mp3') if os.path.exists(audioFile) and os.path.getsize(audioFile) > 0: self.bot.sendAudio(chat_id=update.message.chat_id, audio=audioFile, performer=self.bot.getInfo().username) else: self.bot.sendMessage(chat_id=update.message.chat_id, text=u'Não consigo contar') else: self.bot.sendMessage(chat_id=update.message.chat_id, text=u'Não encontrei piada curta')
def imageSearch(self, telegramBot, update): p = re.compile('([^ ]*) (.*)') query = (p.match(update.message.text).groups()[1] or '').strip() self.logDebug(u'Bing image search (chat_id: %s, query: %s)' % (update.message.chat_id, query or 'None')) imageSources = ExternalAPI.searchBingImage(query) if imageSources: self.bot.sendMessage(chat_id=update.message.chat_id, text=imageSources[0]) else: self.bot.sendMessage(chat_id=update.message.chat_id, text=u'Não encontrei imagem relacionada')
def testSearchBingImage(self): result = ExternalAPI.searchBingImage('amigo') self.assertItemsEqual(result, filter(lambda img: re.match('http.*bing.net.*', img), result))
def testSearchGoogleImage(self): result = ExternalAPI.searchGoogleImage('amigo') self.assertItemsEqual(result, filter(lambda img: re.match('http.*gstatic.*', img), result))
def testSearchJoke(self): result = ExternalAPI.searchJoke('amigo') self.assertItemsEqual(result, filter(lambda j: re.match('.*amigo.*', j, re.IGNORECASE), result))
def textTextToSpeechAsOGG(self): sentence = 'ok' audioFile = ExternalAPI.textToSpeech(sentence, fromLanguage='en', encode='ogg') self.assertTrue(os.path.getsize(audioFile) > 0)
def testEviQueryForMathInNumbers(self): result = ExternalAPI.eviQuery('calculate 1 + 1') self.assertEqual(result, 'Sorry, that looks like a maths question. Try asking it in words rather than using symbols like + or *.')
def testWolframQueryForMathInWords(self): result = ExternalAPI.wolframQuery('calculate one plus one', os.environ.get('SMARTBOT_WOLFRAM_APPID')) self.assertEqual(result, '2')
def query(self, queryEnglish): return ExternalAPI.eviQuery(queryEnglish)
def query(self, queryEnglish): return ExternalAPI.wolframQuery(queryEnglish, appId=self.wolframAppId)
def testGetNasaIOD(self): result = ExternalAPI.getNasaIOD() self.assertTrue(result.get('imageSource')) self.assertTrue(result.get('explanation'))
def testWolframQuery(self): result = ExternalAPI.wolframQuery('who are you ?', os.environ.get('SMARTBOT_WOLFRAM_APPID')) self.assertEqual(result, 'My name is Wolfram|Alpha.')
def testTranslateShortInvalidWord(self): sentence = 'pi' result = ExternalAPI.translate(sentence) self.assertEqual(result, 'PI')
def testEviQuery(self): result = ExternalAPI.eviQuery('who are you ?') self.assertEqual(result, 'I\'m Evi, your thinking, talking, computerised assistant.')
def testTranslateSimpleSentence(self): sentence = u'O que é carro ?' result = ExternalAPI.translate(sentence, fromLanguage='pt') self.assertEqual(result, 'What is a car?')
def testEviQueryForMathInWords(self): result = ExternalAPI.eviQuery('calculate one plus one') self.assertEqual(result, 'The sum of 1 and 1 is 2.')
def testTranslateComplex(self): sentence = 'The fox jumps. But who the hell is the fox ? I don\'t know' result = ExternalAPI.translate(sentence) self.assertEqual(result, u'A raposa salta. Mas quem \xe9 a raposa? Eu n\xe3o sei')