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, )
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, )
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, )
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, )
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, )
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, )
def test_prepare_str(self): res = prepare_str([1, 2]) self.assertEqual(res, '1\n2')