Задать вопрос
Yobanaris
@Yobanaris
Учусь отвечая.

Как удалить последние 2 сообщения в телеграм боте?

Доброго времени суток.
В боте есть кнопка "Баланс"
При нажатии отправляется сообщение "Баланс"
Отправленное сообщение Баланс удаляется,
И выводиться Баланс:
Потом я нажимаю "Назад"
Так же сообщение "Назад" удаляется и возвращает слово Главное меню,
Но перед ним остался баланс, и я бы хотел его тоже удалить.

Основной язык Perl
Это шаблон бота.
Код написан не мной, (естественно, тогда бы я не спрашивал )
Поэтому сложно разобраться.
Шаблон

<% CASE ['/start', 'Назад', 'Главное', 'меню']%>
{
    "deleteMessage": { "message_id": {{ message.message_id }} }
},
{
    "sendMessage": {
        "text":"Главное меню",
        "reply_markup": {
            "keyboard": [
                [
                    {"text": " Баланс"}
                ],
                [
                    {"text": " Помощь"}
                ]
                
                    
                
            ],
            "one_time_keyboard": false,
            "resize_keyboard": true
        }
    }
},
{
    "deleteMessage": { "message_id": {{ message.message_id }} }
}
<% CASE ['/balance', '', 'Баланс'] %>
{
    "deleteMessage": { 
"message_id": {{ message.message_id }}
 }
},
{
    "sendMessage": {
        "text": "Баланс: {{ user.balance }}",
        "reply_markup": {
            "keyboard": [
                [
                    {
                        "text": "☰ История платежей"
                    }
                ],
                [
                    {"text": "Назад"}
                ]
            ],
            "one_time_keyboard": false,
            "resize_keyboard": true
        }
    }
}



Вот часть кода который обрабатывает удаление сообщения
deleteMessage

sub deleteMessage {
    my $self = shift;
    my %args = (
        message_id => undef,
        @_,
    );

    $self->http( 'deleteMessage',
        data => \%args,
    );
}



и ещё немного

sub process_message {
    my $self = shift;
    my %args = (
        message => undef,
        @_,
    );

    return undef unless $self->token;

    logger->debug('REQUEST:', \%args );

    my $message = $args{callback_query} ? $args{callback_query}->{message} : $args{message};
    $self->message( $message );

    $self->chat_id( $message->{chat}->{id} );

    my $query;
    if ( $args{message} ) {
        $query = $args{message}->{text};
    } elsif ( $args{callback_query} ) {
        $query = $args{callback_query}->{data};
    }

    my ( $cmd, @callback_args ) = split( /\s+/, $query );
    if ( $cmd=~s/^\|// ) {
        $cmd = join(' ', $cmd, @callback_args );
    }

    if ( $cmd ne '/register' ) {
        my $user = $self->auth( $message );
        if ( !$user ) {
            logger->warning( 'USER_NOT_FOUND. Chat_id', $message->{chat}->{id}, 'username:', $message->{chat}->{username} );
            $cmd = 'USER_NOT_FOUND';
        } elsif ( $user->{block} ) {
            return $self->sendMessage(
                text => sprintf("You are blocked! (user_id: %s)", $user->{user_id} ),
            );
        }
    }

    my $obj = get_script( $cmd,
        vars => {
            cmd => $cmd,
            message => $message,
            args => \@callback_args,
        },
    );

    if ( my @errors = get_service('report')->errors ) {
        return $self->sendMessage(
            text => join('<br>', @errors),
        );
    }

    for my $script ( @{ $obj } ) {
        logger->debug( 'Script:', $script );
        my $method = get_script_method( $script );

        my %allow_telegram_methods = (
            sendPhoto => 1,
            sendAudio => 1,
            sendDocument => 1,
            sendVideo => 1,
            sendAnimation => 1,
            sendVoice => 1,
            sendVideoNote => 1,
            sendMediaGroup => 1,
            sendLocation => 1,
            sendVenue => 1,
            sendContact => 1,
            sendPoll => 1,
            sendDice => 1,
            sendChatAction => 1,
            deleteMessage => 1,
        );

        if ( $self->can( $method ) ) {
            $self->$method( %{ $script->{ $method } || {} } );
        } elsif ( $allow_telegram_methods{ $method } ) {
            $self->http( $method,
                data => $script->{ $method } || {},
            );
        } else {
            logger->error("Method $method not exists");
            next;
        }
    }

    return 1;
}


И ещё я не могу в keyboard вызвать обработчик
Если в keyboard есть текст
"text": "Меню"
"callback_query": "/menu"
То ничего не происходит.

А если использовать inline_keyboard то всё работает.
Но хотелось бы keyboard
  • Вопрос задан
  • 1522 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    SMM-продвижение в Телеграме
    1 месяц
    Далее
  • Skillbox
    Профессия Интернет-маркетолог + ИИ
    12 месяцев
    Далее
  • GB (GeekBrains)
    Интернет-маркетолог
    12 месяцев
    Далее
Решения вопроса 1
Yobanaris
@Yobanaris Автор вопроса
Учусь отвечая.
Решено с помощью добавления минуса

{
    "deleteMessage": { "message_id": {{ message.message_id }} }
},
{
    "deleteMessage": { "message_id": {{ message.message_id -1 }} }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Никак, бот может удалять только свои сообщения, но не сообщения от пользователя.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Казань
от 75 000 до 125 000 ₽
Инком Нижний Новгород
от 160 000 до 230 000 ₽