Skip to main content
Version: Latest

Buttons

Модуль показывает как работать с кнопками в RimTUB 2.2

Buttons/__init__.py
from utils import *


async def main(app: Client, mod: Module):

cmd = mod.cmd
group = mod.get_group()

# делаем функцию для кнопок
# функцию - потому что эта клавиатура будет использоваться несколько раз
main_buttons = lambda chat, text: Buttons([
[ # первый ряд
Button('Hello!!!!!', callback_data='hello'), # первая кнопка
Button('copy me', copy_text='copied!') # вторая кнопка
],
[ # второй ряд кнопок
Button('RimMirK', url='t.me/RimMirK')
],
[ # для каждой кнопки где есть callback_data можно указать extra_data (dict).
# Эти данные будут передаваться обработчику.
# Эти данные доступны только для юб. В callback_data они не видны.
# Передавать можно все что угодно. Все данные хранятся в формате pickle.
# Данные живут 3 дня, после чего удаляются.
# Изменить время жизни можно в конфиге, DEFAULT_STORAGE_FILES_TTL.
# vvvvvvvvvvvvvvvvvvvvvvv
Button('Private button', callback_data='private', extra_data={'secret': 8}),
Button('Public button', callback_data='public'),
],
[
Button('Edit text', callback_data='edit_text'),
Button('Edit buttons', callback_data='edit_buttons')
],
[
Button("Page", callback_data='page')
]
# Общая extra_data. Будет передана каждой кнопке в клавиатуре
], general_extra_data={'chat': chat, 'text': text})
# передаем чат и текст сообщения
# зачем узнаешь позже




@cmd('butest')
async def _butest(_, msg):

text = 'Держи кнопки!'
buttons = main_buttons(msg.chat, text)

# Отправляем кнопочки методом send_buttons
await mod.send_buttons(msg.chat.id, text, buttons)

# кнопки отправляются как новое сообщение,
# поэтому сообщение с командой надо удалить
await msg.delete()


# создаем обработчик на callback_data=='hello'
# желательно указывать group, для корректной работы,
# но это не обязательно
@mod.callback('hello', group=group, is_private=False) # и делаем кнопку публичной
async def _hello(c: C):
# отвечаем на нажатие окошком
await c.answer("Hi!", True)
# True значит что ответ будет в виде окна
# Если False то будет просто всплывающая надпись. (по умолчанию)


# создаем обработчик на callback_data=='private'
@mod.callback('private', group=group)
async def _private(c: C):

# а вот и наша extra_data. Как видишь, все передалось, причем в колбек дате этого секрета нет.
await c.answer(f"Hi, owner! Your secret is {c.extra_data.get('secret')}")


@mod.callback('public', group=group, is_private=False) # публичная кнопка
async def _public(c: C):
text = c.from_user.full_name + (f" (@{c.from_user.username})" if c.from_user.username else '')
text += ' кликнул на кнопку!'
# Bot API не дает информацию о чате при использовании inline режима.
# Поэтому, если тебе нужен чат, то его надо передать через extra_data
await app.send_message(c.extra_data['chat'].id, text)

# Кстати, тут нет ответа на кнопку. Вообще тг требует на них отвечать.
# Но в данном случае отвечать не обязательно, RimTUB ответит сам за тебя :)


@mod.callback('edit_text', group=group)
async def _edit_text(c: C):
# попробуем изменить текст сообщения

# ТГ, также не дает информацию о отправленном сообщении.
# т.е. у нас нет доступа к его тексту.
# поэтому мы его передали на 33 строке вместе

# сразу сформируем измененный текст
text = c.extra_data['text'] + "\nEdited!"

# И еще: когда изменяешь текст, тг,
# не пойми зачем удаляет кнопки,
# так что их надо опять сгенерировать
# и присоединить к сообщению.
# Возможно в следующих обновлениях
# я исправлю это неудобство, а пока так

# получаем наши кнопки и передаем измененный текст
# vvvv
buttons = main_buttons(c.extra_data['chat'], text)

# если не пользуемся send_buttons, а передаем кнопки сразу напрямую,
# надо обязательно использовать mod.prepare_buttons
buttons = await mod.prepare_buttons(buttons)

# изменяем сообщение методом edit_message_text.
# Не забываем присоединить кнопки
await c.edit_message_text(text, reply_markup=buttons)




@mod.callback('edit_buttons', group=group)
async def _edit_buttons(c: C):

# теперь попробуем заменить клавиатуру

# В этот раз попробуем передать данные через колбек дату.
# в некоторых случаях правильней будет так, чем через extra_data

# генерируем сетку чисел (в кнопках, понятное дело)
# кстати тут кнопки делаем прям в обработчике,
# потому что эти кнопки используются только тут и больше нигде.
buttons = Buttons([
*[
[
Button(
str(i * 4 + j),
callback_data=f'number:{i*4+j}',
# число вставляем сразу в колбек дату.
# Разделитель советую ':', но можно выбрать любой другой
) for j in range(4)
]
for i in range(4)
],
[Button('Back', callback_data='back')]
], general_extra_data=c.extra_data)
# кстати можно передать всю екстра дату целиком, без перечисления каждого параметр

# изменяем кнопки методом edit_message_reply_markup.
# Не забываем про prepare_buttons.
# Без этого кнопки не будут работать вовсе
await c.edit_message_reply_markup(await mod.prepare_buttons(buttons))


# обработчик уже нужен на startswith
@mod.callback(startswith='number', group=group, is_private=False)
async def _number(c: C):

# выбераем из колбек даты наше число
number = c.data.split(':')[-1]

# и выводим пользователю
await c.answer(number)


# другой пример изменения кнопок (без генерации)
@mod.callback('page')
async def _page(c: C):
text = "Thanks for using RimTUB ❤️"
buttons = Buttons([
[
Button(f"My id: {app.me.id}", copy_text=f'{app.me.id}')
],
[
Button('RimTUB Deve Loper', url='https://t.me/RimMirK')
],
[
Button('RimTUB Channel', url='https://t.me/RimTUB'),
Button('Chat', url='https://t.me/RimTUB_chat')
],
[
Button('return back', callback_data='back')
]
], general_extra_data={'chat': c.extra_data['chat'], 'text': text})
await c.edit_message_text(text, reply_markup=await mod.prepare_buttons(buttons))


# тут покажу как хендлерить все остальные кнопки
@mod.callback(group=group, is_private=True)
async def _all(c: C):
# проверяем колбек дату вручную
if c.data == 'back':

# меняем клаву назад, на главные кнопки
await c.edit_message_reply_markup(
await mod.prepare_buttons(
main_buttons(c.extra_data['chat'], c.extra_data['text'])
)
)

Buttons/mainfest.yaml
# название модуля 
module_name: Buttons

# версия модуля
version: 2.2-1.0.0-1
native_RimTUB_version: 2.2 # оригинальная версия RimTUB на которую писался модуль
available_RimTUB_versions: # версии RimTUB на которых работает модуль
- 2.2
- dev-2.2
online_check_RimTUB_versions: Off # чекать ли онлайн доступные версии ЮБ (в разработке)

description: | # описание модуля
Тестовый модуль для разработчиков
Тут примеры кнопок

# разраб
author: built-in (@RimMirK)


# Хелплист
sections:
_: # основная секция
description: # Описание секции (отсутствует)
commands: # команды
- names: [butest] # список алиасов
description: Открыть меню кнопок # описание команды