help
parent
49c74ea2b6
commit
c11f87b500
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
|
@ -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]
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue