bivashy / java-vk-bots-long-poll-api

A Java library to create VK bots using Bots Long Poll API
MIT License
3 stars 0 forks source link

Send.ResponseBody#getResult() возвращает 0, даже если сообщение было успешно отправлено (только в беседах). #128

Closed alllexey123 closed 2 years ago

alllexey123 commented 2 years ago

Насколько я знаю, Send.ResponseBody#getResult() должен возвращать ID отправленного сообщения, но в моём случае при отправке сообщения в беседу он всегда возвращает 0, сообщения отправляются успешно. Вот мой код:

public int sendText(String message) {
    try {
        Send.ResponseBody responseBody = VKBot.getVK().messages.send()
                .setPeerId(peerId)
                .setMessage(message)
                .execute();
        System.out.println(responseBody.getResponse()); // debug, returns 0 all the time
        return (Integer) responseBody.getResponse();
    } catch (VkApiException e) {
        e.printStackTrace();
        return -1;
    }
}

Дополнительная информация:

yvasyliev commented 2 years ago

ID сообщения в беседе всегда будет 0. Так устроен VK API.

alllexey123 commented 2 years ago

А есть тогда какие-нибудь способы получить последнее сообщение в беседе, или хотя-бы его ID?

yvasyliev commented 2 years ago

Вы имеете ввиду получить новое сообщение?

@Override
public void onMessageNew(MessageNew messageNew) {
    Integer messageId = messageNew.getMessage().getId();
}
alllexey123 commented 2 years ago

Нет, я имею ввиду получить последнее сообщение в беседе без NewMessage, то есть допустим когда бот включается. В теории это должно решить все проблемы. Либо как-то получить ID только что отправленного ботом в беседу сообщения.

yvasyliev commented 2 years ago

Нашел недоработку в методе messages.send. Теперь вы можете получить conversation_message_id отправленого ботом сообщения. Для этого нужно использовать параметр peer_ids вместо peer_id. Вот пример:

@Override
public void onMessageNew(MessageNew messageNew) {
    try {
        Send.ResponseBody responseBody = vk.messages.send()
                .setMessage("Hello world")
                .setPeerIds(messageNew.getMessage().getPeerId())
                .execute();

        List<?> responses = (List<?>) responseBody.getResponse();
        Send.ResponseBody.Response response = (Send.ResponseBody.Response) responses.get(0);

        Integer peerId = response.getPeerId();
        Integer conversationMessageId = response.getConversationMessageId();

        System.out.println(responseBody);

    } catch (VkApiException e) {
        throw new RuntimeException(e);
    }
}

Исправлено в версии 3.4.6