From c11f87b500bf17043b209ed3042b5ff64e3b286d Mon Sep 17 00:00:00 2001 From: pi3c Date: Fri, 23 Feb 2024 18:04:30 +0300 Subject: [PATCH] help --- tg_bot/app.py | 2 ++ tg_bot/handlers/games.py | 1 + tg_bot/handlers/help.py | 47 ++++++++++++++++++++++++++++++++++++++++ tg_bot/handlers/quest.py | 16 +++++++++++--- tg_bot/handlers/quiz.py | 21 ++++++++++++++---- 5 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 tg_bot/handlers/help.py diff --git a/tg_bot/app.py b/tg_bot/app.py index 678e4d1..66947c5 100644 --- a/tg_bot/app.py +++ b/tg_bot/app.py @@ -11,6 +11,7 @@ from aiogram.utils.markdown import hbold from tg_bot.handlers import ( games, + help, lesson_five, lesson_four, lesson_one, @@ -25,6 +26,7 @@ TOKEN: str = getenv('BOT_TOKEN') or 'Your TG_BOT token' dp = Dispatcher() dp.include_routers( + help.router, quest.router, tic_tac_toy.router, quiz.router, diff --git a/tg_bot/handlers/games.py b/tg_bot/handlers/games.py index ec73164..b3e3d96 100644 --- a/tg_bot/handlers/games.py +++ b/tg_bot/handlers/games.py @@ -15,4 +15,5 @@ markup_kb = ReplyKeyboardMarkup(keyboard=kb, resize_keyboard=True) @router.message(Command('games')) async def games(message: Message): + """Хэндлер выбора игры""" await message.answer('Select Game:', reply_markup=markup_kb) diff --git a/tg_bot/handlers/help.py b/tg_bot/handlers/help.py new file mode 100644 index 0000000..2bbe60f --- /dev/null +++ b/tg_bot/handlers/help.py @@ -0,0 +1,47 @@ +from aiogram import Router +from aiogram.filters import Command +from aiogram.types import Message +from aiogram.utils.formatting import ( + Bold, + HashTag, + as_key_value, + as_list, + as_marked_section, +) + +router = Router() + + +@router.message(Command('help')) +async def games(message: Message): + """Хэндлер выбора игры""" + content = as_list( + as_marked_section( + Bold('Реализованный функционал'), + 'Эхо_бот', + 'Генератор случайных чисел', + 'Разворот строки', + 'Обработчик приветствия', + 'Эхо видеозаметкой', + 'API Запросы к deeppavlov.ai', + 'Получения адреса и погоды по геометке', + '3 игры', + marker='✅ ', + ), + as_marked_section( + Bold('Команды:'), + as_key_value('...', 'Бот вернет написанный текст'), + as_key_value('/rand', 'Вернет число от 0 до 100'), + as_key_value('/reverse', 'Запросит строку и развернет ее'), + as_key_value('...', 'Приветствует user, если написать волшебное слово'), + as_key_value('...', 'Вернет video_note, если отправить видео'), + as_key_value('/ask', 'Отправит запрос к апи и вернет ответ'), + as_key_value('...', 'Вернет адрес и погоду, если отправить свои гео'), + as_key_value('/games', 'Выведет кнопки для запуска игр'), + as_key_value('/help', 'Вывод этой справки'), + marker=' ', + ), + HashTag('#shitbot'), + sep='\n\n', + ) + await message.answer(**content.as_kwargs()) diff --git a/tg_bot/handlers/quest.py b/tg_bot/handlers/quest.py index f972328..d5cebc2 100644 --- a/tg_bot/handlers/quest.py +++ b/tg_bot/handlers/quest.py @@ -11,10 +11,12 @@ from aiogram.types import ( ReplyKeyboardMarkup, ReplyKeyboardRemove, ) -from aiogram.utils.formatting import Bold, as_list, as_marked_section +from aiogram.utils.formatting import Bold, Text, as_list, as_marked_section +# Создаем граф G = nx.Graph() +# Создаем точки графа, точка соответствует игровой локации G.add_node('start') G.add_node('A') G.add_node('B') @@ -22,6 +24,7 @@ G.add_node('C') G.add_node('D') G.add_node('end') +# Связываем точки ребрами создавая связи между локациями G.add_edge('start', 'A') G.add_edge('start', 'B') G.add_edge('A', 'C') @@ -37,11 +40,13 @@ class GameState(StatesGroup): @router.message(F.text.lower() == 'exit game') async def exit_games(message: Message, state: FSMContext): + """Обработчик завершения игры""" await state.clear() await message.reply('Game is finished', reply_markup=ReplyKeyboardRemove()) -async def get_content(place, backward, forward): +async def get_content(place: str, backward: str, forward: list[str]) -> Text: + """Возвращает форматированный текс ответа бота""" if forward != ['None']: f_text = 'Можете продолжить путь' else: @@ -69,10 +74,12 @@ async def get_content(place, backward, forward): ), sep='\n\n', ) + print(type(content)) return content -async def get_keyboard(backward, forward): +async def get_keyboard(backward: list[str], forward: str) -> InlineKeyboardMarkup: + """Возвращает инлайн клавиатуру в зависимости от локации""" buttons = [] if backward is not None: @@ -100,6 +107,7 @@ async def get_keyboard(backward, forward): @router.message(F.text.lower() == 'quest') async def start_quest(message: Message, state: FSMContext): + """Обработчик старта игры""" quest_kb = [ [KeyboardButton(text='Exit Game')], ] @@ -120,6 +128,7 @@ async def start_quest(message: Message, state: FSMContext): @router.message(GameState.quest, F.text) async def make_move(message: Message, state: FSMContext): + """Обработчик смены локации в игре""" data = await state.get_data() keyboard = await get_keyboard(data['backward'], data['forward']) @@ -130,6 +139,7 @@ async def make_move(message: Message, state: FSMContext): @router.callback_query(GameState.quest) async def check_answer(callback: CallbackQuery, state: FSMContext, bot: Bot): + """Обработчик колбэков на локациях""" data = await state.get_data() data['backward'] = data['place'] data['place'] = (callback.data.split('_'))[1] diff --git a/tg_bot/handlers/quiz.py b/tg_bot/handlers/quiz.py index 12d6930..2266fae 100644 --- a/tg_bot/handlers/quiz.py +++ b/tg_bot/handlers/quiz.py @@ -1,4 +1,5 @@ from os import getenv +from typing import Any from aiogram import Bot, F, Router, html from aiogram.fsm.context import FSMContext @@ -12,11 +13,18 @@ from aiogram.types import ( ReplyKeyboardMarkup, ReplyKeyboardRemove, ) -from aiogram.utils.formatting import Bold, as_key_value, as_list, as_marked_section +from aiogram.utils.formatting import ( + Bold, + Text, + as_key_value, + as_list, + as_marked_section, +) from pyquizAPI import QuizClient -async def get_question(): +async def get_question() -> list[dict[str, Any]]: + """Получение вопроса с QuizAPI""" api = getenv('QUIZ_API') client = QuizClient(api) client.make_config(limit=1, difficulty='Easy') @@ -34,13 +42,15 @@ class GameState(StatesGroup): @router.message(F.text.lower() == 'exit game') async def exit_games(message: Message, state: FSMContext): + """Обработка закрытия игры""" await state.clear() await message.reply('Game is finished', reply_markup=ReplyKeyboardRemove()) async def get_formated_question( qnt: int, correct: int, question: str, answers: list[str] -): +) -> Text: + """Возвращает форматированный текст для отправки ботом""" content = as_list( as_marked_section( Bold('Game summary:'), @@ -66,6 +76,7 @@ async def get_formated_question( @router.message(F.text.lower() == 'quiz') async def start_quiz(message: Message, state: FSMContext): + """Обработка запуска игры""" quiz_kb = [ [KeyboardButton(text='Next question')], [KeyboardButton(text='Exit Game')], @@ -82,9 +93,10 @@ async def start_quiz(message: Message, state: FSMContext): @router.message(GameState.quiz, F.text) async def question(message: Message, state: FSMContext): + """Отправка пользователю шага игры с клавиатурой для выбора""" data = await state.get_data() question_data = await get_question() - question = question_data[0].get('question') + question = str(question_data[0].get('question')) answers = { question_data[0]['answers'][k]: question_data[0]['correct_answers'][ k + '_correct' @@ -116,6 +128,7 @@ async def question(message: Message, state: FSMContext): @router.callback_query(GameState.quiz) async def check_answer(callback: CallbackQuery, state: FSMContext, bot: Bot): + """Обработчик нажатий на кнопки в процессе игры""" data = await state.get_data() answer = data['answer'] score = data.get('score', 0)