Перед созданием меню требуется познакомиться со следующими элементами:
InlineCallback – Метод которые создает Inline кнопку с callback.
TCommand – Вспомогательный класс для отправки данных в callback.
InlineCallback принимает следующие параметры:
buttonName – название кнопки.
commandType – команда или тип команды. Принимает перечисление типа THeader, о котором написано ранее.
data – (не обязательный параметр) данные которые нужно передать в callback.
TCommand является базовым классом в котором хранятся данные которые нужно передать через callback. TCommand можно отнаследовать и создать свои переменные которые должны содержать свои данные.
ВНИМАНИЕ: Максимальный допустимый размер данных для обработки в callback_data 64байт!
Чтобы использовать дефолтный конвертер inline меню, но при этом сэкономить несколько байт можно использовать другой сериализатор ToonSerializedWrapper, который реализует интерфейс IPRSerializer.
Если вы хотите полностью исключить у себя проблему с ограничением в 64 байта, тогда нужно использовать другой конвертер. Для этого доступен FileInlineConverter реализующий IInlineMenuConverter, который сохраняет данные локально в json файлы в формате файлов "{Ид бота}-{Ид пользователя}-{Ид команды}".
public class Commands
{
/// <summary>
/// Напишите в чате "Тест"
/// </summary>
[ReplyMenuHandler("Тест")]
public static async Task ExampleReply(IBotContext context)
{
/* Создание новой кнопки с callback данными
* Название кнопки
* Models.Enums.CustomTHeader.ExampleOne - Заголовок команды
*/
var exampleItemOne = new InlineCallback("Пример 1", CustomTHeader.ExampleOne);
/* Создание новой кнопки с callback данными
* Название кнопки
* Models.Enums.CustomTHeader.ExampleOne - Заголовок команды
* new EntityTCommand(2) - Данные которые требуется передать
*/
var exampleItemTwo = new InlineCallback<EntityTCommand<long>>("Пример 2", CustomTHeader.ExampleTwo, new EntityTCommand<long>(2));
/* Создание новой кнопки с callback данными
* Models.Enums.CustomTHeader.ExampleOne - Заголовок команды
* new EntityTCommand(2) - Данные которые требуется передать
*/
var exampleItemThree = new InlineCallback<EntityTCommand<long>>("Пример 3", CustomTHeader.ExampleThree, new EntityTCommand<long>(3));
// Создает inline кнопку с ссылкой
var url = new InlineURL("Google", "https://google.com");
// Создаем кнопку для работы с webApp
var webdata = new InlineWebApp("WA", "https://prethink.github.io/telegram/webapp.html");
//IInlineContent - реализуют все inline кнопки
List<IInlineContent> menu = new();
menu.Add(exampleItemOne);
menu.Add(exampleItemTwo);
menu.Add(exampleItemThree);
menu.Add(url);
menu.Add(webdata);
//Генерация меню на основе данных в 1 столбец
var testMenu = MenuGenerator.InlineKeyboard(1, menu);
//Создание настроек для передачи в сообщение
var option = new OptionMessage();
//Передача меню в настройки
option.MenuInlineKeyboardMarkup = testMenu;
string msg = "Пример работы меню";
await PRTelegramBot.Helpers.Message.Send(context, msg, option);
}
}
[ReplyMenuHandler("InlineMenu")]
public static async Task InlineMenu(IBotContext context)
{
/*
* В program.cs создается экземпляр бота:
*
* var telegram = new PRBotBuilder(string.Empty)
.AddConfigPath(ExampleConstants.BUTTONS_FILE_KEY, ".\\Configs\\buttons.json")
* .Build();
*
* AddConfigPath - добавляет путь для конфигурационного файла.
* ExampleConstants.BUTTONS_FILE_KEY - ключ
* ".\\Configs\\buttons.json" - путь до конфигурационного файла.
*
*/
/*
* context.GetConfigValue<BotConfigJsonProvider, string>(ExampleConstants.BUTTONS_FILE_KEY, "IN_EXAMPLE_ONE")
* BotConfigJsonProvider - провайдер который работает с json файлами.
* string - возращаемый тип.
* ExampleConstants.BUTTONS_FILE_KEY - ключ конфига.
* IN_EXAMPLE_ONE - ключ текста кнопки из json файла buttons.json
*
*/
/* Создание новой кнопки с callback данными
* context`.GetConfigValue<BotConfigJsonProvider, string>(ExampleConstants.BUTTONS_FILE_KEY, "IN_EXAMPLE_ONE") - Название кнопки из json
* CustomTHeaderTwo.ExampleOne - Заголовок команды
*/
var exampleItemOne = new InlineCallback(context.GetConfigValue<BotConfigJsonProvider, string>(ExampleConstants.BUTTONS_FILE_KEY, "IN_EXAMPLE_ONE"), CustomTHeaderTwo.ExampleOne);
/* Создание новой кнопки с callback данными
* InlineKeys.IN_EXAMPLE_TWO - Название кнопки из константы
* CustomTHeaderTwo.ExampleTwo - Заголовок команды
* new EntityTCommand(2) - Данные которые требуется передать
*/
var exampleItemTwo = new InlineCallback<EntityTCommand<long>>("Пример с большим числом", CustomTHeaderTwo.ExampleTwo, new EntityTCommand<long>(2_000_000_000_000_000_000));
/* Создание новой кнопки с callback данными
* CustomTHeaderTwo.ExampleThree - Заголовок команды
* new EntityTCommand(3) - Данные которые требуется передать
*/
var exampleItemThree = new InlineCallback<EntityTCommand<string>>("Пример с большим текстом", CustomTHeaderTwo.ExampleThree, new EntityTCommand<string>("И нет сомнений, что диаграммы связей будут объявлены нарушающими общечеловеческие нормы этики и морали. Имеется спорная точка зрения, гласящая примерно следующее: ключевые особенности структуры проекта, инициированные исключительно синтетически, своевременно верифицированы. Значимость этих проблем настолько очевидна, что высокотехнологичная концепция общественного уклада обеспечивает широкому кругу (специалистов) участие в формировании переосмысления внешнеэкономических политик. Таким образом, высокотехнологичная концепция общественного уклада играет важную роль в формировании экспериментов, поражающих по своей масштабности и грандиозности. Картельные сговоры не допускают ситуации, при которой тщательные исследования конкурентов, превозмогая сложившуюся непростую экономическую ситуацию, заблокированы в рамках своих собственных рациональных ограничений. Каждый из нас понимает очевидную вещь: реализация намеченных плановых заданий выявляет срочную потребность как самодостаточных, так и внешне зависимых концептуальных решений. Равным образом, убеждённость некоторых оппонентов однозначно определяет каждого участника как способного принимать собственные решения касаемо первоочередных требований. Повседневная практика показывает, что реализация намеченных плановых заданий обеспечивает актуальность распределения внутренних резервов и ресурсов. В своём стремлении повысить качество жизни, они забывают, что базовый вектор развития обеспечивает актуальность поставленных обществом задач."));
var inlineStep = new InlineCallback("Inline Step", CustomTHeader.InlineWithStep);
//Команды который добавлены после запуска бота
var exampleAddCommand = new InlineCallback("Команда добавленная динамически 1", AddCustomTHeader.TestAddCommand);
var exampleAddCommandTwo = new InlineCallback("Команда добавленная динамически 2", AddCustomTHeader.TestAddCommandTwo);
// Создает inline кнопку с ссылкой
var url = new InlineURL("Google", "https://google.com");
// Создаем кнопку для работы с webApp
var webdata = new InlineWebApp("WebApp", "https://prethink.github.io/telegram/webapp.html");
var keyboard = new InlineKeyboardBuilder()
.AddButton(exampleItemOne)
.AddButton(exampleItemTwo, newRow:true)
.AddButton(exampleItemThree, newRow: true)
.AddButton(exampleAddCommand, newRow: true)
.AddRow()
.AddButton(exampleAddCommandTwo)
.AddButton(inlineStep)
.AddRow()
.AddButton(url)
.AddButton(webdata)
.Build();
//Создание настроек для передачи в сообщение
var option = new OptionMessage();
//Передача меню в настройки
option.MenuInlineKeyboardMarkup = keyboard;
string msg = "Пример работы меню";
//Отправка сообщение с меню
await MessageSender.Send(context, msg, option);
}