forked from Tishka17/aiogram_dialog
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsubdialog.py
More file actions
112 lines (83 loc) · 3.23 KB
/
subdialog.py
File metadata and controls
112 lines (83 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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 Message, CallbackQuery
from aiogram_dialog import Dialog, DialogManager, Window, DialogRegistry, Data
from aiogram_dialog.tools import render_transitions
from aiogram_dialog.widgets.input import MessageInput
from aiogram_dialog.widgets.kbd import Button, Group, Back, Cancel, Row, Start, Next
from aiogram_dialog.widgets.text import Const, Format, Multi
API_TOKEN = "PLACE YOUR TOKEN HERE"
# name input dialog
class NameSG(StatesGroup):
input = State()
confirm = State()
async def name_handler(m: Message, dialog: Dialog, manager: DialogManager):
manager.current_context().dialog_data["name"] = m.text
await dialog.next(manager)
async def get_name_data(dialog_manager: DialogManager, **kwargs):
return {
"name": dialog_manager.current_context().dialog_data.get("name")
}
async def on_finish(c: CallbackQuery, button: Button, manager: DialogManager):
await manager.done({"name": manager.current_context().dialog_data["name"]})
name_dialog = Dialog(
Window(
Const("What is your name?"),
Cancel(),
MessageInput(name_handler),
state=NameSG.input,
preview_add_transitions=[Next()], # hint for graph rendering
),
Window(
Format("Your name is `{name}`, it is correct?"),
Row(Back(Const("No")), Button(Const("Yes"), id="yes", on_click=on_finish)),
state=NameSG.confirm,
getter=get_name_data,
preview_add_transitions=[Cancel()], # hint for graph rendering
)
)
# main dialog
class MainSG(StatesGroup):
main = State()
async def process_result(start_data: Data, result: Any, manager: DialogManager):
if result:
manager.current_context().dialog_data["name"] = result["name"]
async def get_main_data(dialog_manager: DialogManager, **kwargs):
return {
"name": dialog_manager.current_context().dialog_data.get("name"),
}
async def on_reset_name(c: CallbackQuery, button: Button, manager: DialogManager):
del manager.current_context().dialog_data["name"]
main_menu = Dialog(
Window(
Multi(
Format("Hello, {name}", when="name"),
Const("Hello, unknown person", when=lambda data, whenable, manager: not data["name"]),
),
Group(
Start(Const("Enter name"), id="set", state=NameSG.input),
Button(Const("Reset name"), id="reset", on_click=on_reset_name, when="name")
),
state=MainSG.main,
getter=get_main_data,
),
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) # resets stack and start dialogs on /start command
registry.register(name_dialog)
registry.register(main_menu)
render_transitions(registry) # render graph with current transtions
await dp.start_polling()
if __name__ == '__main__':
asyncio.run(main())