forked from Tishka17/aiogram_dialog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlist_group.py
108 lines (90 loc) · 2.77 KB
/
list_group.py
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
import asyncio
import logging
import os
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.filters.state import State, StatesGroup
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.types import Message
from aiogram_dialog import (
Dialog,
DialogManager,
LaunchMode,
StartMode,
SubManager,
Window,
setup_dialogs,
)
from aiogram_dialog.widgets.kbd import (
Checkbox,
ListGroup,
ManagedCheckbox,
Radio,
Row,
)
from aiogram_dialog.widgets.text import Const, Format
API_TOKEN = os.getenv("BOT_TOKEN")
class DialogSG(StatesGroup):
greeting = State()
def when_checked(data: dict, widget, manager: SubManager) -> bool:
# manager for our case is already adapted for current ListGroup row
# so `.find` returns widget adapted for current row
# if you need to find widgets outside the row, use `.find_in_parent`
check: ManagedCheckbox = manager.find("check")
return check.is_checked()
async def data_getter(*args, **kwargs):
return {
"fruits": ["mango", "papaya", "kiwi"],
"colors": ["blue", "pink"],
}
dialog = Dialog(
Window(
Const(
"Hello, please check you options for each item:",
),
ListGroup(
Checkbox(
Format("✓ {item}"),
Format(" {item}"),
id="check",
),
Row(
Radio(
Format("🔘 {item} ({data[item]})"),
Format("⚪️ {item} ({data[item]})"),
id="radio",
item_id_getter=str,
items=["black", "white"],
# Alternatives:
# items=F["data"]["colors"],
# items=lambda d: d["data"]["colors"],
when=when_checked,
),
),
id="lg",
item_id_getter=str,
items=["apple", "orange", "pear"],
# Alternatives:
# items=F["fruits"],
# items=lambda d: d["fruits"],
),
state=DialogSG.greeting,
getter=data_getter,
),
launch_mode=LaunchMode.SINGLE_TOP,
)
async def start(message: Message, dialog_manager: DialogManager):
# it is important to reset stack because user wants to restart everything
await dialog_manager.start(DialogSG.greeting, mode=StartMode.RESET_STACK)
async def main():
# real main
logging.basicConfig(level=logging.INFO)
storage = MemoryStorage()
bot = Bot(token=API_TOKEN)
dp = Dispatcher(storage=storage)
dp.include_router(dialog)
dp.message.register(start, CommandStart())
setup_dialogs(dp)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())