Задать вопрос
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
  • Вопрос задан
  • 881 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
Yobanaris
@Yobanaris Автор вопроса
Учусь отвечая.
Решено с помощью добавления минуса

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

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

Похожие вопросы