mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-06 07:50:32 +00:00
* Migrate to hatchling instead of poetry, ruff instead of flake8 * Migrate to hatchling instead of poetry, ruff instead of flake8 * Update tests suite * venv? * -m venv? * Change dependencies * Remove venv * Change mypy config * Added changelog * Mark uvloop incompatible with pypy * Update release script * Use internal caching for dependencies * Re-disable cov branches * Added contributing guide
133 lines
3.9 KiB
Python
133 lines
3.9 KiB
Python
import asyncio
|
|
import logging
|
|
import sys
|
|
from os import getenv
|
|
from typing import Any, Dict
|
|
|
|
from aiogram import Bot, Dispatcher, F, Router, html
|
|
from aiogram.filters import Command
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.fsm.state import State, StatesGroup
|
|
from aiogram.types import (
|
|
KeyboardButton,
|
|
Message,
|
|
ReplyKeyboardMarkup,
|
|
ReplyKeyboardRemove,
|
|
)
|
|
|
|
form_router = Router()
|
|
|
|
|
|
class Form(StatesGroup):
|
|
name = State()
|
|
like_bots = State()
|
|
language = State()
|
|
|
|
|
|
@form_router.message(Command(commands=["start"]))
|
|
async def command_start(message: Message, state: FSMContext) -> None:
|
|
await state.set_state(Form.name)
|
|
await message.answer(
|
|
"Hi there! What's your name?",
|
|
reply_markup=ReplyKeyboardRemove(),
|
|
)
|
|
|
|
|
|
@form_router.message(Command(commands=["cancel"]))
|
|
@form_router.message(F.text.casefold() == "cancel")
|
|
async def cancel_handler(message: Message, state: FSMContext) -> None:
|
|
"""
|
|
Allow user to cancel any action
|
|
"""
|
|
current_state = await state.get_state()
|
|
if current_state is None:
|
|
return
|
|
|
|
logging.info("Cancelling state %r", current_state)
|
|
await state.clear()
|
|
await message.answer(
|
|
"Cancelled.",
|
|
reply_markup=ReplyKeyboardRemove(),
|
|
)
|
|
|
|
|
|
@form_router.message(Form.name)
|
|
async def process_name(message: Message, state: FSMContext) -> None:
|
|
await state.update_data(name=message.text)
|
|
await state.set_state(Form.like_bots)
|
|
await message.answer(
|
|
f"Nice to meet you, {html.quote(message.text)}!\nDid you like to write bots?",
|
|
reply_markup=ReplyKeyboardMarkup(
|
|
keyboard=[
|
|
[
|
|
KeyboardButton(text="Yes"),
|
|
KeyboardButton(text="No"),
|
|
]
|
|
],
|
|
resize_keyboard=True,
|
|
),
|
|
)
|
|
|
|
|
|
@form_router.message(Form.like_bots, F.text.casefold() == "no")
|
|
async def process_dont_like_write_bots(message: Message, state: FSMContext) -> None:
|
|
data = await state.get_data()
|
|
await state.clear()
|
|
await message.answer(
|
|
"Not bad not terrible.\nSee you soon.",
|
|
reply_markup=ReplyKeyboardRemove(),
|
|
)
|
|
await show_summary(message=message, data=data, positive=False)
|
|
|
|
|
|
@form_router.message(Form.like_bots, F.text.casefold() == "yes")
|
|
async def process_like_write_bots(message: Message, state: FSMContext) -> None:
|
|
await state.set_state(Form.language)
|
|
|
|
await message.reply(
|
|
"Cool! I'm too!\nWhat programming language did you use for it?",
|
|
reply_markup=ReplyKeyboardRemove(),
|
|
)
|
|
|
|
|
|
@form_router.message(Form.like_bots)
|
|
async def process_unknown_write_bots(message: Message, state: FSMContext) -> None:
|
|
await message.reply("I don't understand you :(")
|
|
|
|
|
|
@form_router.message(Form.language)
|
|
async def process_language(message: Message, state: FSMContext) -> None:
|
|
data = await state.update_data(language=message.text)
|
|
await state.clear()
|
|
text = (
|
|
"Thank for all! Python is in my hearth!\nSee you soon."
|
|
if message.text.casefold() == "python"
|
|
else "Thank for information!\nSee you soon."
|
|
)
|
|
await message.answer(text)
|
|
await show_summary(message=message, data=data)
|
|
|
|
|
|
async def show_summary(message: Message, data: Dict[str, Any], positive: bool = True) -> None:
|
|
name = data["name"]
|
|
language = data.get("language", "<something unexpected>")
|
|
text = f"I'll keep in mind that, {html.quote(name)}, "
|
|
text += (
|
|
f"you like to write bots with {html.quote(language)}."
|
|
if positive
|
|
else "you don't like to write bots, so sad..."
|
|
)
|
|
await message.answer(text=text, reply_markup=ReplyKeyboardRemove())
|
|
|
|
|
|
async def main():
|
|
bot = Bot(token=getenv("TELEGRAM_TOKEN"), parse_mode="HTML")
|
|
dp = Dispatcher()
|
|
dp.include_router(form_router)
|
|
|
|
await dp.start_polling(bot)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
|
|
asyncio.run(main())
|