コード例 #1
0
ファイル: bot.py プロジェクト: xopow/bot_dice
    async def roll_once(self, message: types.Message):
        chat_id = message.chat.id

        if not self.board.can_add_result(chat_id=chat_id):
            text = [
                f'*Нельзя бросать слишком часто!*',
                '',
            ]
            # Посчитать точное время
            dt = self.board.time_left
            if dt < 0:
                # Что-то не так с обновлением!
                msg = 'Вы скоро сможете повторить!'
                log.error('something wrong with update thread!')
            else:
                msg = f'Вы сможете повторить в новом раунде через {pretty_time_delta(dt)}!'
            text.append(msg)

            return await message.answer(
                text=prepare_str(text=text),
                parse_mode=types.ParseMode.MARKDOWN,
            )

        # Roll
        rolls = [await message.answer_dice(emoji='🎳') for _ in range(3)]

        score = 1
        for v in rolls:
            score *= v["dice"]["value"]

        # Wait for animation
        await asyncio.sleep(3)

        pos = self.board.add_result(
            chat_id=chat_id,
            full_name=message.chat.full_name,
            score=score,
        )

        text = [
            f'Ваш результат: *{score}*',
            f'Прямо сейчас вы на позиции *{pos}*',
            '',
            f'Посмотреть итоги раунда: /{COMMAND_ROUND_LEADERS}',
            f'Посмотреть лучшие результаты: /{COMMAND_GAME_LEADERS}',
        ]
        await message.answer(
            text=prepare_str(text=text),
            parse_mode=types.ParseMode.MARKDOWN,
        )
コード例 #2
0
ファイル: bot.py プロジェクト: xopow/bot_dice
 async def show_help(self, message: types.Message):
     text = [
         '*Боулинг*',
         '',
         f'/{COMMAND_ROLL} -- бросить шары.',
         f'/{COMMAND_ROUND_LEADERS} -- итоги раунда.',
         f'/{COMMAND_GAME_LEADERS} -- лучшие результаты.',
         '',
         '*Помощь*',
         '',
         f'/{COMMAND_START} -- запустить бота.',
         f'/{COMMAND_HELP} -- просмотреть это сообщение ещё раз.',
     ]
     if message.chat.id in ADMIN_IDS:
         text.extend([
             '',
             '*Вспомогательные команды*',
             '',
             f'/{COMMAND_USER} -- посмотреть на себя.',
             f'/{COMMAND_STATS} -- посмотреть статистику бота.',
         ])
     await message.answer(
         text=prepare_str(text=text),
         parse_mode=types.ParseMode.MARKDOWN,
     )
コード例 #3
0
ファイル: bot.py プロジェクト: xopow/bot_dice
    async def abc_roll_stats_round(self, stats_func: Callable, header: str, message: types.Message):
        chat_id = message.chat.id
        stats = stats_func(chat_id=chat_id)
        if not stats:
            return await message.answer(
                text='Пока что ничего нет.',
                parse_mode=types.ParseMode.MARKDOWN,
            )

        text = [
            header,
            '',
        ]

        for pos, item in stats:
            msg_pos = f'*{pos}*' if pos <= 3 else f'{pos}'
            msg = f'{msg_pos}. {item}'
            text.append(msg)

        dt = self.board.time_left
        if dt > 0:
            text.extend([
                '',
                f'Следующий раунд через: {pretty_time_delta(dt)}',
            ])

        await message.answer(
            text=prepare_str(text=text),
            parse_mode=types.ParseMode.MARKDOWN,
        )
コード例 #4
0
ファイル: bot.py プロジェクト: xopow/bot_dice
 async def show_user_info(self, message: types.Message):
     text = [
         '*Информация об аккаунте*',
         '',
         f'Имя: `{message.chat.full_name}`',
         f'Идентификатор чата: `{message.chat.id}`',
     ]
     await message.answer(
         text=prepare_str(text=text),
         parse_mode=types.ParseMode.MARKDOWN,
     )
コード例 #5
0
ファイル: bot.py プロジェクト: xopow/bot_dice
 async def show_welcome(self, message: types.Message):
     text = [
         'Привет! Это бот для бросания шаров. Каждый пользователь может бросить шары только 1 раз за 2 минуты.',
         'Чем больше *произведение* выпавших кегль - тем лучше.',
         '',
         f'Нажми /{COMMAND_HELP} чтобы увидеть список доступных комманд.',
         '',
         f'Или нажми /{COMMAND_ROLL} чтобы сразу бросить шары.',
     ]
     await message.answer(
         text=prepare_str(text=text),
         parse_mode=types.ParseMode.MARKDOWN,
     )
コード例 #6
0
ファイル: bot.py プロジェクト: xopow/bot_dice
    async def show_stats(self, message: types.Message):
        if not self.func_counter:
            return await message.answer(
                text='Сейчас тут ничего нет.',
            )

        now = time.time()
        lifetime = pretty_time_delta(now - self.started_at)

        text = [
            '*Статистика бота*',
            '',
            f'- Всего запросов с момента старта: *{self.counter}*',
            f'- Всего пользователей с момента старта: *{len(self.unique_chats)}*',
            f'- Время жизни бота: {lifetime}',
            '',
            '*Статистика по функциям*',
            '',
        ]
        total_resp_time = []
        sorted_requests = sorted(self.func_counter.items(), key=lambda i: (i[1], i[0]), reverse=True)
        for (fn, requests) in sorted_requests:
            # AVG resp time
            resp_time = self.func_resp_time[fn]
            total_resp_time.extend(resp_time)
            avg_resp = sum(resp_time) / len(resp_time)

            text.append(f'`{fn}`')
            text.append(f'{requests} requests, {avg_resp:.0f} avg resp time (ms)')
            text.append('')

        # Вставить после ``Всего запросов..``
        total_avg = sum(total_resp_time) / len(total_resp_time)
        text.insert(3, f'- Среднее время ответа: *{total_avg:.0f}* (ms)')

        await message.answer(
            text=prepare_str(text=text),
            parse_mode=types.ParseMode.MARKDOWN,
        )
コード例 #7
0
ファイル: test_utils.py プロジェクト: xopow/bot_dice
 def test_prepare_str(self):
     res = prepare_str([1, 2])
     self.assertEqual(res, '1\n2')