Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Current »

Пример простой кнопки без стейт машины
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;
Отправка сообщения
#Создаем текст сообщения, для кавычек обязательно тройное экранирование
my $message = "Пример сообщения\n";
$message .= "<b>Жирный текст</b>\n";
$message .= "<a href=\\\"google.com\\\">Пример ссылки</a>";

#Отправляем сообщение
$self->{bot}->send_message({
  text       => $message,
  parse_mode => 'HTML'
});


Отправка сообщения с встроеной кнопкой
my @keyboard = ();
my $button = {
  text          => "Кнопка в сообщении",
  callback_data => "Button_name&fn_name"
};

# 1 кнопка в ряду. Telegram использует двухмерные массивы, для обозначения расположения кнопок.
push (@keyboard, [$button]);

$self->{bot}->send_message({
  text => "Текст сообщения",
  reply_markup => {
    inline_keyboard => \@keyboard,
  }
});

# После нажатия этой кнопки бот запустит функцию fn_name из кнопки Button_name.


Отправка сообщения с ссылкой
my @keyboard = ();
my $button = {
  text => "Кнопка с ссылкой",
  url  => "http://abills.net.ua"
};

# 1 кнопка в ряду. Telegram использует двухмерные массивы, для обозначения расположения кнопок.
push (@keyboard, [$button]);

$self->{bot}->send_message({
  text => "Текст сообщения",
  reply_markup => {
    inline_keyboard => \@keyboard,
  }
});


Отправка сообщения с заменой клавиатуры (многоуровневая операция/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);
Пример вызова через API
# Пример вызова API за авторизацией USERBOT.
my ($res) = $self->{api}->fetch_api({
  # если это GET, то использование METHOD не обязательно.
  METHOD => 'GET',
  PATH   => '/user/pi/'
}); 

if ($res->{errno}) {
  $self->{bot}->send_message({
    text => "Случилась ошибка, вы не авторизованы." 
  });
  return 0;
}

$self->{bot}->send_message({
  text => "Здравствуйте, " . $res->{FIO} . "!"
});
  • No labels