def test_track(self):
     """Test sending event to botan"""
     print('Test sending event to botan')
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertTrue(result)
 def test_track(self):
     """Test sending event to botan"""
     print('Test sending event to botan')
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertTrue(result)
 def test_wrong_endpoint(self):
     """Test wrong endpoint"""
     print('Test wrong endpoint')
     botan = Botan(self.token)
     botan.url_template = 'https://api.botaaaaan.io/traccc?token={token}&uid={uid}&name={name}'
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertFalse(result)
 def test_wrong_message(self):
     """Test sending wrong message"""
     print('Test sending wrong message')
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     message = delattr(message, 'chat_id')
     result = botan.track(message, 'named event')
     self.assertFalse(result)
 def test_track_fail(self):
     """Test fail when sending event to botan"""
     print('Test fail when sending event to botan')
     botan = Botan(self.token)
     botan.url_template = 'https://api.botan.io/traccc?token={token}&uid={uid}&name={name}'
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertFalse(result)
 def test_wrong_endpoint(self):
     """Test wrong endpoint"""
     print('Test wrong endpoint')
     botan = Botan(self.token)
     botan.url_template = 'https://api.botaaaaan.io/traccc?token={token}&uid={uid}&name={name}'
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertFalse(result)
 def test_wrong_message(self):
     """Test sending wrong message"""
     print('Test sending wrong message')
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     message = delattr(message, 'chat_id')
     result = botan.track(message, 'named event')
     self.assertFalse(result)
 def test_track_fail(self):
     """Test fail when sending event to botan"""
     print('Test fail when sending event to botan')
     botan = Botan(self.token)
     botan.url_template = 'https://api.botan.io/traccc?token={token}&uid={uid}&name={name}'
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertFalse(result)
示例#9
0
 def test_wrong_message(self):
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     message = delattr(message, 'chat_id')
     result = botan.track(message, 'named event')
     self.assertFalse(result)
示例#10
0
 def test_track(self):
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertTrue(result)
示例#11
0
 def test_wrong_message(self):
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     message = delattr(message, 'chat_id')
     result = botan.track(message, 'named event')
     self.assertFalse(result)
示例#12
0
 def test_track(self):
     botan = Botan(self.token)
     message = MessageMock(self._chat_id)
     result = botan.track(message, 'named event')
     self.assertTrue(result)
示例#13
0
class CakesBot:
    __help = '''Напишите боту слово, что бы получить случайный пирожок с ним.
Доступные команды:
    /last - присылает пять последних пирожков
    /random - присылает вам случайный пирожок
    /help  - выводит эту справку
    /about - выводит информацию о боте
Для поиска напишите в чате имя бота и ключевые слова. Пример:
    @pirozkibot олег
    '''
    __about = '''
Загружено %s пирожка
Написано just for fun.
Контент берётся отсюда: https://vk.com/perawki
Вы можете проголосовать за бота по ссылке:
https://telegram.me/storebot?start=pirozkibot
Автор бота: @HissingSound
    '''

    def __init__(self,  updater, database, botan_token=''):
        self.updater = updater
        if botan_token:
            self.botan = Botan(botan_token)
        self.__db = database

    def start(self, bot, update):
        self.__message_info(update.message, 'start')
        bot.sendMessage(update.message.chat_id, text=self.__help)

    def help(self, bot, update):
        self.__message_info(update.message, 'help')
        bot.sendMessage(update.message.chat_id, text=self.__help)

    def random(self, bot, update, args):
        self.__message_info(update.message, 'random')
        poem = ''

        if args:
            word = ' '.join(args)
            poem = self.__db.randomByWord(word)
        else:
            poem = self.__db.random()

        bot.sendMessage(update.message.chat_id, text=poem)

    def last(self, bot, update):
        self.__message_info(update.message, 'last')
        poems = self.__db.last(5)
        bot.sendMessage(update.message.chat_id, text=''.join(poems))

    def about(self, bot, update, args):
        self.__message_info(update.message, 'about')
        bot.sendMessage(update.message.chat_id,
                        text=self.__about % self.__db.count())

    def inline_search(self, bot, update):
        if update.inline_query:
            user = update.inline_query.from_user
            query = update.inline_query.query
            results = list()
            if query:
                logger.info('Inline: %s from %s @%s %s' % (query,
                                                           user.first_name,
                                                           user.username,
                                                           user.last_name))
                poems = self.__db.listByWord(query)
                if poems:
                    for poem in poems:
                        text, author = poem['text'], poem['author']
                        msg = '\n'.join([text, author])
                        uniqueId = hex(getrandbits(64))[2:]
                        article = InlineQueryResultArticle(id=uniqueId,
                                                           title=author,
                                                           message_text=msg,
                                                           description=text)
                        results.append(article)

            bot.answerInlineQuery(update.inline_query.id, results)

    def error(self, bot, update, error):
        self.__message_info(update.message, 'error')
        logger.warn('Update "%s" caused error "%s"' % (update, error))

    def unknow_command(self, bot, update, *args):
        self.__message_info(update.message)

    def message(self, bot, update):
        self.__message_info(update.message, 'message')
        poem = self.__db.randomByWord(update.message.text)
        bot.sendMessage(update.message.chat_id, text=poem)

    def __message_info(self, message, command='unknow'):
        if self.botan:
            self.botan.track(
                message=message,
                event_name=command
            )
        user = message.from_user
        logger.info(u'%s from %s @%s %s' % (message.text,
                                            user.first_name,
                                            user.username,
                                            user.last_name))

    def cli_unknow_command(self, bot, update):
        logger.info('Unknow command')

    def signal_handler(self, signum, frame):
        self.is_idle = False
        self.updater.stop()

    def idle(self, stop_signals=(SIGINT, SIGTERM, SIGABRT)):
        self.is_idle = True

        for sig in stop_signals:
            signal(sig, self.signal_handler)

        self.update_queue = self.updater.start_polling(poll_interval=0.1,
                                                       timeout=10)

        while self.is_idle:
            try:
                text = raw_input()
            except NameError:
                text = input()

            if text == 'stop':
                self.updater.stop()
                break

            elif len(text) > 0:
                self.update_queue.put(text)
示例#14
0
class GitTrendsBot:
    __about_text = (
        'Shows GitHub trending repositories from: http://github.com/trending\n'
        'Written \'Just for Fun\' by [ShelomentsevD](https://github.com/shelomentsevd)\n'
        '[Source code here](https://github.com/shelomentsevd/GitTrendsBot)'
    )

    __help_text = (
        'Supports commands:\n'
        '/today [language] - shows today trending repositories written in [language]\n'
        '/week [language] - same as /today\n'
        '/month [language] - same as previous two\n'
        '/help - this text\n'
        '/about - bot information\n'
    )

    def __init__(self, telegram, botan=None):
        if botan:
            from telegram.utils.botan import Botan
            self.__botan = Botan(botan)

        self.__updater = Updater(telegram)
        dp = self.__updater.dispatcher
        dp.addTelegramCommandHandler('start', self.__start)
        dp.addTelegramCommandHandler('help', self.__help)
        dp.addTelegramCommandHandler('about', self.__about)
        dp.addTelegramCommandHandler('today', self.__today)
        dp.addTelegramCommandHandler('week', self.__week)
        dp.addTelegramCommandHandler('month', self.__month)
        
        dp.addUnknownTelegramCommandHandler(self.__unknow)

        dp.addErrorHandler(self.__error)

    def __logger_wrap(self, message, command):
        if self.__botan:
            self.__botan.track(
                message=message,
                event_name=command
            )
        user = message.from_user
        logger.info(u'%s from %s @%s %s' % (message.text,
                                            user.first_name,
                                            user.username,
                                            user.last_name))

    def __trends_wrap(self, period, language=''):
        trends = list()
        description = (
            '*Name*: [%s](http://github.com/%s)\n'
            '*Description*: %s\n'
            '*Language*: %s\n'
            '%s')
        
        try:
            trends = git.get_trends(period, language)
        except Exception as e:
            logger.exception(e)

        repos = [description % (repo['name'],
                                repo['name'],
                                repo['description'],
                                repo['language'],
                                re.sub(u'stars',
                                Emoji.WHITE_MEDIUM_STAR.decode('utf-8'),
                                repo['stars'])) for repo in trends]

        return '\n\n'.join(repos)

    def __start(self, bot, update, args):
        self.__logger_wrap(update.message, 'start')
        bot.sendMessage(update.message.chat_id, text=self.__help_text)

    def __help(self, bot, update):
        self.__logger_wrap(update.message, 'help')
        bot.sendMessage(update.message.chat_id, text=self.__help_text)

    def __about(self, bot, update):
        self.__logger_wrap(update.message, 'about')
        bot.sendMessage(update.message.chat_id, text=self.__about_text, parse_mode=ParseMode.MARKDOWN)

    def __today(self, bot, update, args):
        self.__logger_wrap(update.message, 'today')
        result = ''
        if args:
            result = self.__trends_wrap('daily', args[0])
        else:
            result = self.__trends_wrap('daily')
        bot.sendMessage(update.message.chat_id, text=result, parse_mode=ParseMode.MARKDOWN)

    def __week(self, bot, update, args):
        self.__logger_wrap(update.message, 'week')
        result = ''
        if args:
            result = self.__trends_wrap('weekly', args[0])
        else:
            result = self.__trends_wrap('weekly')
        bot.sendMessage(update.message.chat_id, text=result, parse_mode=ParseMode.MARKDOWN)

    def __month(self, bot, update, args):
        self.__logger_wrap(update.message, 'month')
        result = ''
        if args:
            result = self.__trends_wrap('monthly', args[0])
        else:
            result = self.__trends_wrap('monthly')
        bot.sendMessage(update.message.chat_id, text=result, parse_mode=ParseMode.MARKDOWN)

    def __unknow(self, bot, update):
        self.__logger_wrap(update.message, 'unknow')

    def __error(self, bot, update, error):
        self.__logger_wrap(update.message, 'error')
        logger.warn('Update "%s" caused error "%s"' % (update, error))

    def idle(self):
        self.__updater.start_polling()
        self.__updater.idle()