Skip to content

Instantly share code, notes, and snippets.

@Tishka17
Last active March 11, 2023 18:20
Show Gist options
  • Save Tishka17/4b6f68280274dca0856a2553e67f2e33 to your computer and use it in GitHub Desktop.
Save Tishka17/4b6f68280274dca0856a2553e67f2e33 to your computer and use it in GitHub Desktop.
pincode dialog example
import asyncio
import logging
from typing import Any
from aiogram import Bot, Dispatcher
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.types import CallbackQuery
from aiogram_dialog import Dialog, DialogManager, Window, DialogRegistry, Data
from aiogram_dialog.widgets.kbd import Button, Cancel, Select, Group, Row
from aiogram_dialog.widgets.text import Format, Const
API_TOKEN = "PLACE YOUR TOKEN HERE"
# name input dialog
class PincodeSG(StatesGroup):
input = State()
async def get_pincode_data(dialog_manager: DialogManager, **kwargs):
pincode = dialog_manager.current_context().dialog_data.get("pin", "")
return {
"text": "*" * len(pincode)
}
async def on_confirm(event, btn, manager: DialogManager):
expected = manager.current_context().start_data["pin"]
actual = manager.current_context().dialog_data["pin"]
await manager.done({
"result": ("yes" if actual == expected else "no"),
})
async def on_clear(event, btn, manager: DialogManager):
manager.current_context().dialog_data["pin"] = ""
async def on_backspace(event, btn, manager: DialogManager):
dialog_data = manager.current_context().dialog_data
dialog_data["pin"] = dialog_data.get("pin", "")[:-1]
async def on_select(event, select, manager: DialogManager, data):
dialog_data = manager.current_context().dialog_data
dialog_data["pin"] = dialog_data.get("pin", "") + data
pincode_dialog = Dialog(
Window(
Format("Pincode: {text}"),
Row(
Button(Const("Backspace"), id="bsp", on_click=on_backspace),
Button(Const("Clear"), id="clear", on_click=on_clear),
),
Group(
Select(
Format("{item}"), id="num", on_click=on_select,
items=[1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
item_id_getter=str
),
width=3
),
Row(
Button(Const("Confirm"), id="confirm", on_click=on_confirm),
Cancel(),
),
state=PincodeSG.input,
getter=get_pincode_data,
preview_data={"text": "*****"},
),
)
# main dialog
class MainSG(StatesGroup):
main = State()
async def process_result(start_data: Data, result: Any,
manager: DialogManager):
if start_data["id"] == "pin":
pin_result = result.get("result")
if pin_result == "yes":
await manager.event.answer("pincode is ok")
await manager.done()
elif pin_result == "no":
await manager.event.answer("invalid pincode")
else:
await manager.event.answer("cancelled")
async def on_pin_requested(c: CallbackQuery, button: Button,
manager: DialogManager):
await manager.start(
PincodeSG.input, data={"pin": "123456", "id": "pin"},
)
main_menu = Dialog(
Window(
Format("Expected pin: 123456"),
Button(Const("Enter pin code"), id="pin", on_click=on_pin_requested),
state=MainSG.main,
),
on_process_result=process_result,
)
async def main():
# real main
logging.basicConfig(level=logging.INFO)
storage = MemoryStorage()
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=storage)
registry = DialogRegistry(dp)
registry.register_start_handler(MainSG.main)
registry.register(pincode_dialog)
registry.register(main_menu)
await dp.start_polling()
if __name__ == '__main__':
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment