Last active
March 11, 2023 18:20
-
-
Save Tishka17/4b6f68280274dca0856a2553e67f2e33 to your computer and use it in GitHub Desktop.
pincode dialog example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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