mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
There are only 3 genders, intersex people are born with sex characteristics (including genitals, gonads and chromosome patterns) that do not fit typical binary notions of male or female bodies.
129 lines
3.8 KiB
Python
129 lines
3.8 KiB
Python
import logging
|
|
|
|
import aiogram.utils.markdown as md
|
|
from aiogram import Bot, Dispatcher, types
|
|
from aiogram.contrib.fsm_storage.memory import MemoryStorage
|
|
from aiogram.dispatcher import FSMContext
|
|
from aiogram.dispatcher.filters import Text
|
|
from aiogram.dispatcher.filters.state import State, StatesGroup
|
|
from aiogram.types import ParseMode
|
|
from aiogram.utils import executor
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
API_TOKEN = 'BOT TOKEN HERE'
|
|
|
|
|
|
bot = Bot(token=API_TOKEN)
|
|
|
|
# For example use simple MemoryStorage for Dispatcher.
|
|
storage = MemoryStorage()
|
|
dp = Dispatcher(bot, storage=storage)
|
|
|
|
|
|
# States
|
|
class Form(StatesGroup):
|
|
name = State() # Will be represented in storage as 'Form:name'
|
|
age = State() # Will be represented in storage as 'Form:age'
|
|
gender = State() # Will be represented in storage as 'Form:gender'
|
|
|
|
|
|
@dp.message_handler(commands='start')
|
|
async def cmd_start(message: types.Message):
|
|
"""
|
|
Conversation's entry point
|
|
"""
|
|
# Set state
|
|
await Form.name.set()
|
|
|
|
await message.reply("Hi there! What's your name?")
|
|
|
|
|
|
# You can use state '*' if you need to handle all states
|
|
@dp.message_handler(state='*', commands='cancel')
|
|
@dp.message_handler(Text(equals='cancel', ignore_case=True), state='*')
|
|
async def cancel_handler(message: types.Message, state: FSMContext):
|
|
"""
|
|
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)
|
|
# Cancel state and inform user about it
|
|
await state.finish()
|
|
# And remove keyboard (just in case)
|
|
await message.reply('Cancelled.', reply_markup=types.ReplyKeyboardRemove())
|
|
|
|
|
|
@dp.message_handler(state=Form.name)
|
|
async def process_name(message: types.Message, state: FSMContext):
|
|
"""
|
|
Process user name
|
|
"""
|
|
async with state.proxy() as data:
|
|
data['name'] = message.text
|
|
|
|
await Form.next()
|
|
await message.reply("How old are you?")
|
|
|
|
|
|
# Check age. Age gotta be digit
|
|
@dp.message_handler(lambda message: not message.text.isdigit(), state=Form.age)
|
|
async def process_age_invalid(message: types.Message):
|
|
"""
|
|
If age is invalid
|
|
"""
|
|
return await message.reply("Age gotta be a number.\nHow old are you? (digits only)")
|
|
|
|
|
|
@dp.message_handler(lambda message: message.text.isdigit(), state=Form.age)
|
|
async def process_age(message: types.Message, state: FSMContext):
|
|
# Update state and data
|
|
await Form.next()
|
|
await state.update_data(age=int(message.text))
|
|
|
|
# Configure ReplyKeyboardMarkup
|
|
markup = types.ReplyKeyboardMarkup(resize_keyboard=True, selective=True)
|
|
markup.add("Male", "Female")
|
|
markup.add("Intersex")
|
|
|
|
await message.reply("What is your gender?", reply_markup=markup)
|
|
|
|
|
|
@dp.message_handler(lambda message: message.text not in ["Male", "Female", "Other"], state=Form.gender)
|
|
async def process_gender_invalid(message: types.Message):
|
|
"""
|
|
In this example gender has to be one of: Male, Female, Other.
|
|
"""
|
|
return await message.reply("Bad gender name. Choose your gender from the keyboard.")
|
|
|
|
|
|
@dp.message_handler(state=Form.gender)
|
|
async def process_gender(message: types.Message, state: FSMContext):
|
|
async with state.proxy() as data:
|
|
data['gender'] = message.text
|
|
|
|
# Remove keyboard
|
|
markup = types.ReplyKeyboardRemove()
|
|
|
|
# And send message
|
|
await bot.send_message(
|
|
message.chat.id,
|
|
md.text(
|
|
md.text('Hi! Nice to meet you,', md.bold(data['name'])),
|
|
md.text('Age:', md.code(data['age'])),
|
|
md.text('Gender:', data['gender']),
|
|
sep='\n',
|
|
),
|
|
reply_markup=markup,
|
|
parse_mode=ParseMode.MARKDOWN,
|
|
)
|
|
|
|
# Finish conversation
|
|
await state.finish()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
executor.start_polling(dp, skip_updates=True)
|