def __init__(self, text: Text = Const("Back"), id: str = "__back__", on_click: Optional[Callable] = None, when: WhenCondition = None): super().__init__(text, id, self._on_click, when) self.text = text self.callback_data = id self.user_on_click = on_click
def __init__(self, text: Text = Const("Next"), callback_data: str = "__next__", on_click: Optional[Callable] = None, when: WhenCondition = None): super().__init__(text, callback_data, self._on_click, when) self.text = text self.callback_data = callback_data self.user_on_click = on_click
def __init__(self, text: Text = Const("Cancel"), id: str = "__cancel__", on_click: Optional[Callable] = None, when: WhenCondition = None): super().__init__(text, id, self._on_click, when) self.text = text self.user_on_click = on_click
Format("🔘 {item[0]}"), Format("◯ {item[0]}"), "select:", itemgetter(0), items, ) multiselect = Select( Format("✓ {item[0]}"), Format("{item[0]}"), "mselect", itemgetter(0), items, multiple=True ) 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(), ),
def test_buttons_creator(btn_quantity): buttons = [] for i in btn_quantity: i = str(i) buttons.append(Button(Const(i), id=i)) return buttons
counter = manager.current_context().dialog_data.get("counter", 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)
from aiogram_dialog.widgets.kbd import Button, Group from aiogram_dialog.widgets.text import Const group = Group( Button(Const("Crawl"), id="crawl"), Button(Const("Go"), id="go"), Button(Const("Run"), id="run"), Button(Const("Fly"), id="fly"), Button(Const("Teleport"), id="tele"), keep_rows=False, width=2, )
async def get_data(**kwargs): return { "name": "Tishka17", "extended": False, } def is_tishka17(data: Dict, widget: Whenable, manager: DialogManager): return data.get("name") == "Tishka17" window = Window( Multi( Const("Hello"), Format("{name}", when="extended"), sep=" " ), Group( Row( Button(Const("Wait"), id="wait"), Button(Const("Ignore"), id="ignore"), when="extended", ), Button(Const("Admin mode"), id="nothing", when=is_tishka17), ), state=MySG.main, getter=get_data, )
# 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()))
radio = Radio( Format("🔘 {item[0]}"), Format("◯ {item[0]}"), "radio", itemgetter(0), items, ) multiselect = Multiselect( Format("✓ {item[0]}"), Format("{item[0]}"), "mselect", itemgetter(0), items, ) 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")),
from aiogram_dialog.widgets.text import Multi, Const, Format # let's assume this is our window data getter async def get_data(**kwargs): return {"name": "Tishka17"} # This will produce text `Hello! And goodbye!` text = Multi( Const("Hello!"), Const("And goodbye!"), sep=" ", ) # This one will produce text `Hello, Tishka17, and goodbye {name}!` text2 = Multi( Format("Hello, {name}"), Const("and goodbye {name}!"), sep=", ", ) # This one will produce `01.02.2003T04:05:06` text3 = Multi( Multi(Const("01"), Const("02"), Const("2003"), sep="."), Multi(Const("04"), Const("05"), Const("06"), sep=":"), sep="T" )
from aiogram.types import CallbackQuery from aiogram_dialog import DialogManager from aiogram_dialog.widgets.kbd import Button, Row from aiogram_dialog.widgets.text import Const async def go_clicked(c: CallbackQuery, button: Button, manager: DialogManager): await c.message.answer("Going on!") async def run_clicked(c: CallbackQuery, button: Button, manager: DialogManager): await c.message.answer("Running!") row = Row( Button(Const("Go"), id="go", on_click=go_clicked), Button(Const("Run"), id="run", on_click=run_clicked), Button(Const("Fly"), id="fly"), )
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 ) )
from aiogram_dialog.widgets.kbd import Url from aiogram_dialog.widgets.text import Const go_btn = Url( Const("Github"), Const('https://github.com/Tishka17/aiogram_dialog/'), )
class RenderSG(StatesGroup): first = State() 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, ),
async def on_finish(c: CallbackQuery, button: Button, manager: DialogManager): await c.message.answer("Thank you. To start again click /start") await manager.done() async def on_age_changed(c: ChatEvent, item_id: str, select: Select, manager: DialogManager): manager.context.set_data("age", item_id) await manager.dialog().next(manager) 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,
async def name_handler(m: Message, dialog: Dialog, manager: DialogManager): manager.context.set_data("name", m.text) await dialog.next(manager) 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 broadcast_image(m: Message, dialog: Dialog, manager: DialogManager): if m.content_type['PHOTO']: print("оп у нас тут фоточка образовалась") await manager.start(Broadcast.broadcast_image, m.photo[0].file_id, reset_stack=False) else: await m.answer(text="Прикрепите фотографию") 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/")),
from typing import Dict from aiogram_dialog import DialogManager from aiogram_dialog.widgets.text import Multi, Const, Format, Case # let's assume this is our window data getter async def get_data(**kwargs): return {"color": "red", "number": 42} # This will produce text `Square` text = Case( { "red": Const("Square"), "green": Const("Unicorn"), "blue": Const("Moon"), }, selector="color", ) # This one will produce text `42 is even!` def parity_selector(data: Dict, case: Case, manager: DialogManager): return data["number"] % 2 text2 = Case( { 0: Format("{number} is even!"), 1: Const("It is Odd"),
from aiogram_dialog import DialogManager, ChatEvent from aiogram_dialog.widgets.kbd import Checkbox from aiogram_dialog.widgets.text import Const async def check_changed(event: ChatEvent, checkbox: Checkbox, manager: DialogManager): print("Check status changed:", checkbox.is_checked(manager)) check = Checkbox( Const("✓ Checked"), Const("Unchecked"), id="check", default=True, # so it will be checked by default, on_state_changed=check_changed, )
from aiogram.dispatcher.filters.state import StatesGroup, State from aiogram_dialog import Dialog, Window 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 to_second(c: CallbackQuery, button: Button, manager: DialogManager): 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.dispatcher.filters.state import StatesGroup, State from aiogram_dialog import Window from aiogram_dialog.widgets.kbd import Button from aiogram_dialog.widgets.text import Const class MySG(StatesGroup): main = State() main_window = Window( Const("Hello, unknown person"), # just a constant text Button(Const("Useless button"), id="nothing"), # button with text and id MySG.main, # state is used to identify window between dialogs )
from aiogram_dialog.widgets.kbd import Button, Group, Row from aiogram_dialog.widgets.text import Const group = Group( Row( Button(Const("Go"), id="go"), Button(Const("Run"), id="run"), ), Button(Const("Fly"), id="fly"), )
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)
from aiogram.types import CallbackQuery from aiogram_dialog import DialogManager from aiogram_dialog.widgets.kbd import Button from aiogram_dialog.widgets.text import Const async def go_clicked(c: CallbackQuery, button: Button, manager: DialogManager): await c.message.answer("Going on!") go_btn = Button( Const("Go"), id="go", # id is used to detect which button is clicked on_click=go_clicked, )