# name input dialog class Bg(StatesGroup): progress = State() async def get_bg_data(dialog_manager: DialogManager, **kwargs): return {"progress": dialog_manager.context.data("progress", 0)} bg_dialog = Dialog( Window( Multi( Const("Your click is processing, please wait..."), Progress("progress", 10), ), state=Bg.progress, getter=get_bg_data, ), ) # main dialog class MainSG(StatesGroup): main = State() async def start_bg(c: CallbackQuery, button: Button, manager: DialogManager): await manager.start(Bg.progress) asyncio.create_task(background(c, manager.bg()))
from aiogram_dialog.widgets.kbd import Row, SwitchTo, Next, Back from aiogram_dialog.widgets.text import Const class DialogSG(StatesGroup): first = State() second = State() third = State() dialog = Dialog( Window( Const("First"), SwitchTo(Const("To second"), id="sec", state=DialogSG.second), state=DialogSG.first, ), Window( Const("Second"), Row( Back(), Next(), ), state=DialogSG.second, ), Window( Const("Third"), Back(), state=DialogSG.third, ) )
async def get_name_data(dialog_manager: DialogManager, **kwargs): return {"name": dialog_manager.context.data("name", None)} async def on_finish(c: CallbackQuery, button: Button, manager: DialogManager): await manager.done({"name": manager.context.data("name")}) name_dialog = Dialog( Window( Const("What is your name?"), Cancel(), MessageInput(name_handler), state=NameSG.input, ), 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)) # main dialog class MainSG(StatesGroup): main = State() async def process_result(result: Any, manager: DialogManager): if result: manager.context.set_data("name", result["name"])
dialog1 = Dialog( Window( Const("Hello, {name}!"), Format("Hello, {name}!\n", when=lambda data, w, m: data["age"] > 18), Format("Now: {now}"), Progress("progress", 10), Progress("progress2", 10, filled="🟩"), Group( Button(Format("{name}"), "b1"), Button(Const("Is it Fun?"), "b2", on_click=fun), Checkbox(Const("Yes"), Const("No"), "check"), width=100, ), select, radio, multiselect, Button(Format("{now}"), "b3"), Row(Button(Progress("progress", 5), "b3"), Button(Progress("progress2", 5, filled="🟩"), "b4")), Next(), MessageInput(input_fun), getter=get_data, state=Register.hello, ), Window( Const("Выберите время начала"), Group(*[ Button(Const(f"{h % 24:2}:{m:02}"), f"{h}_{m}") for h in range(20, 26) for m in range(0, 60, 15) ], width=4), Group(Button(Const("Позже"), "ltr"), Button(Const("Раньше"), "erl"), width=100), Back(Const("Назад")), state=Register.name ) )
dialog1 = Dialog(Window( Multi( Const("Hello, {name}!"), Format("Hello, {name}!", when=lambda data, w, m: data["age"] > 18), sep="\n\n", ), Group( Group( Button(Format("{name}"), "b1"), Button(Const("Is it Fun?"), "b2", on_click=fun), Checkbox(Const("Yes"), Const("No"), "check"), keep_rows=False ), select, multiselect, Button(Const("3. {name}"), "b3"), Next(), ), getter=get_data, state=Register.hello, on_message=input_fun, ), Window(Const("Выберите время начала"), Group( Group(*[ Button(Const(f"{h % 24:2}:{m:02}"), f"{h}:{m}") for h in range(20, 26) for m in range(0, 60, 15) ], keep_rows=False, width=4), Group(Button(Const("Позже"), "ltr"), Button(Const("Раньше"), "erl"), keep_rows=False), Back(Const("Назад")), ), state=Register.name) )
dialog = Dialog( Window( text=Const("Greetings! Please, introduce yourself:"), kbd=None, state=DialogSG.greeting, on_message=name_handler, ), Window( text=Format("{name}! How old are you?"), kbd=Select( Format("{item}"), items=["0-12", "12-18", "18-25", "25-40", "40+"], item_id_getter=lambda x: x, id="w_age", on_click=on_age_changed, ), state=DialogSG.age, getter=get_data, ), Window( text=Multi( Format("{name}! Thank you for your answers."), Const("Hope you are not smoking", when="can_smoke"), sep="\n\n", ), kbd=Row( Back(), SwitchState(Const("Restart"), id="restart", state=DialogSG.greeting), Button(Const("Finish"), on_click=on_finish, id="finish"), ), getter=get_data, state=DialogSG.finish, ))
broadcast = Dialog( Window( Format("<b>Следующие роли получат рассылку:</b>" "\n• {selected}"), types_kbd, Group(Button(Const("Отмена"), id="Cancel", on_click=on_finish), Next(Const("Далее")), width=2, keep_rows=False), getter=get_data, state=Broadcast.broadcast_type, ), Window( Format("<b>Следующие роли получат рассылку:</b>" "\n• {selected}" "\n\n<b>Текст рассылаемого сообщения:</b>" "\n{text}" "\n\n<i>Поддерживается встроенное в Telegram форматирование!" "\nМаксимальное кол-во символов: 4096</i>"), Url(Const("Про форматирование"), Const("https://lifehacker.ru/formatirovanie-teksta-v-telegram/")), Button(Const("Отмена"), id="Cancel", on_click=on_finish), Group(Back(Const("Назад")), Next(Const("Далее")), width=2, keep_rows=False), MessageInput(broadcast_text), getter=get_text, state=Broadcast.broadcast_text, ), Window(Format( "<b>Если хотите прикрепить фотографию к вашей рассылке, пришлите ее на этом этапе:</b>\n" "{image_id}"), MessageInput(broadcast_image), Button(Const("Отмена"), id="Cancel", on_click=on_finish), Group(Back(Const("Назад")), Next(Const("Далее")), width=2, keep_rows=False), getter=get_image, state=Broadcast.broadcast_image)) # @TODO починить выбор картинки
await m.answer( f"Спасибо за вашу анкету, {dialog_data['name']}. " f"Наверно, тяжело иметь рост {dialog_data['height']}, когда ещё нет даже 18 лет" ) dialog = Dialog(texts=dialog_texts, steps={ State("1"): DataStep(prompt="Введите ваше имя", field="name"), State("2"): DataStep( prompt="Вам уже есть 18 лет?", variants=[("Да", "yes"), ("Нет", "no")], reorder_variants_by=2, field="18+", ), State("3"): DataStep( prompt="Введите ваш рост", error_msg="Ошибка, введите целое число!\n\n", type_factory=int, field="height", ), }) logging.basicConfig(level=logging.INFO) storage = MemoryStorage() bot = Bot(token=API_TOKEN) dp = Dispatcher(bot, storage=storage)
from aiogram.dispatcher.filters.state import StatesGroup, State from aiogram_dialog import Window, Dialog from aiogram_dialog.widgets.kbd import Button from aiogram_dialog.widgets.text import Const, Format class MySG(StatesGroup): main = State() async def get_data(**kwargs): return { "name": "Tishka17", } dialog = Dialog( Window( Format("Hello, {name}!"), Button(Const("Useless button"), id="nothing"), MySG.main, getter=get_data, # here we set our data getter ) )
import logging from aiogram import Bot, Dispatcher, executor from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher.filters.state import State from aiogram_dialog import Dialog, DataStep, StateStep API_TOKEN = 'BOT TOKEN HERE' subdialog = Dialog( steps={ State("subdialog"): DataStep( prompt="Вы курите?", variants=[("Да", "yes"), ("Нет", "no")], reorder_variants_by=2, field="smoke", ), }) last_state = State("empty") dialog = Dialog(can_done=True, can_cancel=False, can_back=False, steps={ State("dialog"): StateStep( prompt="Вам уже есть 18 лет?", variants=[("Да", "yes", subdialog), ("Нет", "no", last_state)],
dialog = Dialog( can_cancel=False, steps={ DialogSG.name: DataStep( prompt="Введите ваше имя", field="name" ), DialogSG.eighteen: StateStep( prompt="Вам уже есть 18 лет?", variants=[ ("Да", "yes", DialogSG.smoke), ("Нет", "no", DialogSG.height) ], reorder_variants_by=2, field="18+", ), DialogSG.smoke: DataStep( prompt="Вы курите?", variants=[ ("Да", "yes"), ("Нет", "no") ], reorder_variants_by=2, field="smoke", ), DialogSG.height: DataStep( prompt="Введите ваш рост", error_msg="Ошибка, введите целое число!\n\n", type_factory=int, field="height", back=DialogSG.eighteen ), } )
second = State() last = State() async def on_input(m: Message, dialog: Dialog, manager: DialogManager): manager.current_context().dialog_data["name"] = m.text await dialog.next(manager) # rendering tool cannot detect this call dialog = Dialog( Window( Const("1. First"), Next(), state=RenderSG.first, ), Window( Const("2. Second"), Back(), MessageInput(on_input), state=RenderSG.second, preview_add_transitions=[Next()], # this is a hint for rendering tool ), Window( Const("3. Last"), Back(), state=RenderSG.last, ), ) render_transitions([dialog])
manager.current_context().dialog_data["counter"] = counter + 1 multi = Multiselect( Format("✓ {item[0]}"), # E.g `✓ Apple` Format("{item[0]}"), id="check", item_id_getter=operator.itemgetter(1), items="fruits", ) dialog = Dialog( Window( Format("Clicked: {counter}\n\n{stack}\n\n{context}\n\n{now}"), Button(Const("Click me!"), id="btn1", on_click=on_click), multi, Cancel(), MessageInput(name_handler), # Inputs work only in default stack! state=DialogSG.greeting, getter=get_data, ), ) 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) # register handler which resets stack and start dialogs on /start command registry.register_start_handler(DialogSG.greeting)
kbd.Next( when=lambda d, w, m: m.dialog().find("color_select").get_checked(m) is not None, ), ), ), state=PosterCreation.color_scheme, ) summary_window = Window( text=text.Format( "City: <b>{city_name}</b>\n" "Specified area: <b>{is_area_specified}</b>\n" "Color scheme: <b>{color}</b>" ), kbd=kbd.Group( kbd.Button(text.Const("Create"), id="poster_confirm", on_click=make_poster), kbd.Row( kbd.Back(), kbd.Cancel() ), ), getter=collected_data_getter, state=PosterCreation.confirmation, ) dialog = Dialog( city_window, area_choice_window, color_choice_window, summary_window, )
await manager.dialog().switch_to(DialogSG.second, manager) async def go_back(c: CallbackQuery, button: Button, manager: DialogManager): await manager.dialog().back(manager) async def go_next(c: CallbackQuery, button: Button, manager: DialogManager): await manager.dialog().next(manager) dialog = Dialog( Window( Const("First"), Button(Const("To second"), id="sec", on_click=to_second), state=DialogSG.first, ), Window( Const("Second"), Row( Button(Const("Back"), id="back2", on_click=go_back), Button(Const("Next"), id="next2", on_click=go_next), ), state=DialogSG.second, ), Window( Const("Third"), Button(Const("Back"), id="back3", on_click=go_back), state=DialogSG.third, ))
from aiogram_dialog import Window, Dialog, DialogRegistry, DialogManager, StartMode from aiogram_dialog.widgets.kbd import Button from aiogram_dialog.widgets.text import Const storage = MemoryStorage() bot = Bot(token='BOT TOKEN HERE') dp = Dispatcher(bot, storage=storage) registry = DialogRegistry(dp) class MySG(StatesGroup): main = State() main_window = Window( Const("Hello, unknown person"), Button(Const("Useless button"), id="nothing"), state=MySG.main, ) dialog = Dialog(main_window) registry.register(dialog) @dp.message_handler(commands=["start"]) async def start(m: Message, dialog_manager: DialogManager): await dialog_manager.start(MySG.main, mode=StartMode.RESET_STACK) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
second = State() last = State() async def on_input(m: Message, dialog: Dialog, manager: DialogManager): manager.current_context().dialog_data["name"] = m.text await dialog.next(manager) dialog = Dialog( Window( Const("1. First"), Next(), state=RenderSG.first, ), Window( Const("2. Second"), Back(), MessageInput(on_input), state=RenderSG.second, ), Window( Const("3. Last"), Back(), state=RenderSG.last, ), ) # this is diagram rendering render_transitions([dialog])