Пример #1
0
# 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()))
Пример #2
0
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,
    )
)
Пример #3
0

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"])
Пример #4
0
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
    )
)
Пример #5
0
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)
)
Пример #6
0
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,
    ))
Пример #7
0
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 починить выбор картинки
Пример #8
0
        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)
Пример #9
0
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
    )
)
Пример #10
0
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)],
Пример #11
0
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
        ),
    }
)
Пример #12
0
    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])
Пример #13
0
    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)
Пример #14
0
            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,
)
Пример #15
0
    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,
    ))
Пример #16
0
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)
Пример #17
0
    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])