Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languageperl
titleОтправка сообщения с заменой клавиатуры (многоуровневая операция/FSM)
# Внимание! Для использование многоуровневых операций (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);

...