Last active
July 6, 2022 22:00
-
-
Save Tishka17/5cd3226acad9df0b54fba80146a3c27b to your computer and use it in GitHub Desktop.
Confirmation dialog factory
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 | |
import operator | |
from typing import Any, Tuple, List | |
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 magic_filter import F | |
from aiogram_dialog import Dialog, DialogManager, Window, DialogRegistry, Data | |
from aiogram_dialog.widgets.kbd import Button, Select | |
from aiogram_dialog.widgets.text import Format, Const | |
API_TOKEN = "PLACE YOUR TOKEN HERE" | |
async def _on_select(event, select, manager: DialogManager, data): | |
await manager.done({ | |
"result": data, | |
}) | |
def confirmation_dialog( | |
text: str, items: List[Tuple[str, str]], state: State | |
) -> Dialog: | |
return Dialog( | |
Window( | |
Const(text), | |
Format("{start_data[text]}", when=F["start_data"]["text"]), | |
Select( | |
text=Format("{item[0]}"), | |
id="s", | |
items=items, | |
item_id_getter=operator.itemgetter(1), | |
on_click=_on_select, | |
), | |
state=state, | |
), | |
) | |
class ConfirmSG(StatesGroup): | |
input = State() | |
confirm = confirmation_dialog( | |
"Are you sure?", | |
[("Yes", "yes"), ("No", "no")], | |
ConfirmSG.input | |
) | |
# main dialog | |
class MainSG(StatesGroup): | |
main = State() | |
async def process_result(start_data: Data, result: Any, | |
manager: DialogManager): | |
if start_data["id"] == "delete": | |
if result["result"] == "yes": | |
print("Delete it!!!") | |
await manager.done() | |
async def on_delete_requested(c: CallbackQuery, button: Button, | |
manager: DialogManager): | |
await manager.start( | |
ConfirmSG.input, data={"id": "delete"}, | |
) | |
main_menu = Dialog( | |
Window( | |
Format("Hello"), | |
Button(Const("Delete"), id="delete", on_click=on_delete_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(confirm) | |
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