Также вы можете форматировать текст, для Telegram доступно HTML.
https://core.telegram.org/bots/api#html-style
Code Block | ||||
---|---|---|---|---|
| ||||
package Telegram::buttons::Button_name; use strict; use warnings FATAL => 'all'; #********************************************************** =head2 new() =cut #********************************************************** sub new { my $class = shift; my ($db, $admin, $conf, $bot, $bot_db, $APILayer, $user_config) = @_; my $self = { db => $db, admin => $admin, conf => $conf, bot => $bot, bot_db => $bot_db, api => $APILayer user_config => $user_config }; bless($self, $class); return $self; } #********************************************************** =head2 enable() =cut #********************************************************** sub enable { my $self = shift; # Здесь вы определяете, ли кнопка может быть включена. # Вы в своём распоряжении имеете доступ к ответу /user/config # Например, кнопка оплат: # return $self->{user_config}{paysys_payment}; return 1; } #********************************************************** =head2 btn_name() =cut #********************************************************** sub btn_name { my $self = shift; # Также, вы имеете доступ до словаря бота. # $self->{bot}{lang}{BUTTON_NAME} return "Название кнопки"; } #********************************************************** =head2 click() =cut #********************************************************** sub click { my $self = shift; my ($attr) = @_; # Что-то делаем по нажатию кнопки. Например отправляем "Привет". $self->{bot}->send_message({ text => "Привет, напишите как к вам обращаться", }); # Возвращаем 0, так как операция завершена, и нужно показать пользователю меню. return 0; } 1; |
...
Code Block | ||||
---|---|---|---|---|
| ||||
# Внимание! Для использование многоуровневых операций (FSM) необходимо понимать что это такое. # Иначе вы рискуете сделать бота полностью неработоспособным. use Encode qw/encode_utf8/; sub click { my $self = shift; my ($attr) = @_; $self->{bot}->send_message({ text => 'Отправьте текст или нажмите <b>Отменить</b>', reply_markup => { keyboard => [[{ text => "Отменить", }]], resize_keyboard => "true", }, }); # Запоминаем состояние. $self->{bot_db}->add({ USER_ID => $self->{bot}->{chat_id}, BUTTON => "Button_name", FN => "second_step", # Можете хранить и не JSON, но базово рекомендуем так. ARGS => '{"message":{"text":""}}', }); # Сообщаем, что операция не закончилась, и юзеру не нужно показывать меню. return 1; } sub second_step { my $self = shift; my ($attr) = @_; my $text = $attr->{message}->{text}; # Проверяем, ли пользователь не нажал кнопку "Отменить" if ($text && encode_utf8($text) eq "Отменить") { # Удаляем информацию со стейт машины. $self->{bot_db}->del($self->{bot}->{chat_id}); $self->{bot}->send_message({ text => $self->{bot}{lang}{CANCELED} }); # Операция завершена return 0; } return 0; } $self->{bot}->send_message({ text => 'Вы на втором шаге какой-то операции.\nОтправьте текст или нажмите <b>Отменить</b>', reply_markup => { keyboard => [[{ text => "Отменить", }]], resize_keyboard => "true", }, parse_mode => 'HTML' }); # Запись в базу о том, что пользователь находится на втором шаге операции. # При любом его действии будет вызываться &Button_name::fn_name # Не забудьте удалить после завершения операции. $self->{bot_db}->add({ UID USER_ID => $self->{bot}->{uidchat_id}, BUTTON => "Button_name", FN => "fn_name", ARGS => "дополнительные аргументы", }); # вы сможете иметь доступ к данной информации сразу же по вызову. my $info = $attr->{step_info}; $info->{FN} = "execute_with_argument"; $self->{bot_db}->change($info); |
...