Skip to content

Instantly share code, notes, and snippets.

@Tishka17
Last active July 6, 2022 22:00
Show Gist options
  • Save Tishka17/5cd3226acad9df0b54fba80146a3c27b to your computer and use it in GitHub Desktop.
Save Tishka17/5cd3226acad9df0b54fba80146a3c27b to your computer and use it in GitHub Desktop.
Confirmation dialog factory
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