Exemplo n.º 1
0
    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'))
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
 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))
Exemplo n.º 4
0
 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')
Exemplo n.º 5
0
 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')
Exemplo n.º 6
0
 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')
Exemplo n.º 7
0
 def testSearchBingImage(self):
     result = ExternalAPI.searchBingImage('amigo')
     self.assertItemsEqual(result, filter(lambda img: re.match('http.*bing.net.*', img), result))
Exemplo n.º 8
0
 def testSearchGoogleImage(self):
     result = ExternalAPI.searchGoogleImage('amigo')
     self.assertItemsEqual(result, filter(lambda img: re.match('http.*gstatic.*', img), result))
Exemplo n.º 9
0
 def testSearchJoke(self):
     result = ExternalAPI.searchJoke('amigo')
     self.assertItemsEqual(result, filter(lambda j: re.match('.*amigo.*', j, re.IGNORECASE), result))
Exemplo n.º 10
0
 def textTextToSpeechAsOGG(self):
     sentence = 'ok'
     audioFile = ExternalAPI.textToSpeech(sentence, fromLanguage='en', encode='ogg')
     self.assertTrue(os.path.getsize(audioFile) > 0)
Exemplo n.º 11
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 *.')
Exemplo n.º 12
0
 def testWolframQueryForMathInWords(self):
     result = ExternalAPI.wolframQuery('calculate one plus one', os.environ.get('SMARTBOT_WOLFRAM_APPID'))
     self.assertEqual(result, '2')
Exemplo n.º 13
0
 def query(self, queryEnglish):
     return ExternalAPI.eviQuery(queryEnglish)
Exemplo n.º 14
0
 def query(self, queryEnglish):
     return ExternalAPI.wolframQuery(queryEnglish, appId=self.wolframAppId)
Exemplo n.º 15
0
 def testGetNasaIOD(self):
     result = ExternalAPI.getNasaIOD()
     self.assertTrue(result.get('imageSource'))
     self.assertTrue(result.get('explanation'))
Exemplo n.º 16
0
 def testWolframQuery(self):
     result = ExternalAPI.wolframQuery('who are you ?', os.environ.get('SMARTBOT_WOLFRAM_APPID'))
     self.assertEqual(result, 'My name is Wolfram|Alpha.')
Exemplo n.º 17
0
 def testTranslateShortInvalidWord(self):
     sentence = 'pi'
     result = ExternalAPI.translate(sentence)
     self.assertEqual(result, 'PI')
Exemplo n.º 18
0
 def testEviQuery(self):
     result = ExternalAPI.eviQuery('who are you ?')
     self.assertEqual(result, 'I\'m Evi, your thinking, talking, computerised assistant.')
Exemplo n.º 19
0
 def testTranslateSimpleSentence(self):
     sentence = u'O que é carro ?'
     result = ExternalAPI.translate(sentence, fromLanguage='pt')
     self.assertEqual(result, 'What is a car?')
Exemplo n.º 20
0
 def testEviQueryForMathInWords(self):
     result = ExternalAPI.eviQuery('calculate one plus one')
     self.assertEqual(result, 'The sum of 1 and 1 is 2.')
Exemplo n.º 21
0
 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')