...
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 => $self->{bot}->{uid}, BUTTON => "Button_name", FN => "fn_name", ARGS => "дополнительные аргументы", }); # вы сможете иметь доступ к данной информации сразу же по вызову. my $info = $attr->{step_info}; $info->{FN} = "execute_with_argument"; $self->{bot_db}->change($info); |
...