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

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

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

Войти через центр авторизации
Похожие вопросы