negezor / vk-io

Modern VK API SDK for Node.js
https://npm.im/vk-io
MIT License
549 stars 85 forks source link

Не определяются аудио сообщения #236

Closed den67rus closed 4 years ago

den67rus commented 4 years ago

Есть задача фильтровать сообщению по аудио сообщению, но данный код вводит в заблуждение и не работает так как должен.

vk.updates.on('message', async (context, next) => {
    if (context.hasAttachments(AttachmentType.AUDIO_MESSAGE)) {
        console.log('есть аудио сообщение')
    } else {
        console.log('нет аудио сообщения')
    }
    console.log(context);
});

Вот так выглядит контекст, то есть, ауди сообщение определилось как документ. Код отработал не как ожидалось.

MessageContext {
  id: 111111,
  conversationMessageId: null,
  peerId: 1111,
  peerType: 'user',
  senderId: 1111,
  senderType: 'user',
  createdAt: 11111,
  text: null,
  forwards: MessageForwardsCollection [],
  attachments: [
    DocumentAttachment <doc1111_111111> {
      id: 111111,
      ownerId: 11111,
      accessKey: null,
      title: null,
      typeId: null,
      typeName: null,
      createdAt: null,
      extension: null,
      url: null
    }
  ],
  isOutbox: false,
  type: 'message',
  subTypes: [
    'new_message'
  ],
  state: {}
}

Сырой атач выглядит вот так

[
  {
    type: 'doc',
    doc: { id: 111111, owner_id: 111111, kind: 'audiomsg' }
  }
]

Можно идентифицировать, что это аудио сообщение по kind: 'audiomsg', например где нибудь вот здесь вот так:

        let {type} = item;
        if (type == 'doc' && item.doc && item.doc.kind && item.doc.kind == 'audiomsg') {
            type = 'audio_message'
            item.audio_message = {
                id: item.doc.id,
                owner_id: item.doc.owner_id
            }
        }

Код выше не будет работать так как AudioMessageAttachment не готов к таким входным данным.

P.S. Можно конечно принудительно перегружать сообщения, но не хотелось бы таким заниматься...

await context.loadMessagePayload({
  force: true
});

P.S.S. Спасибо за крутой инструмент

negezor commented 4 years ago

Какая версия API в Callback API/Bots Long Poll? До определённой версии возвращался только документ.

den67rus commented 4 years ago

@negezor версия api используется последняя, транспорт User Long Poll API, как в библиотеке настроить версию polling я не нашел, полагаю используется последняя.

Скриншот ![Picture](https://user-images.githubusercontent.com/592654/74457993-14da4380-4e9a-11ea-9935-dcf9720d80a0.png)
negezor commented 4 years ago

Так или иначе, в User Long Poll придётся перезагружать сообщение что бы получить полный объект.

den67rus commented 4 years ago

@negezor если нужен полный объект его можно получить, но было бы хорошо, чтобы если объект действительно аудио сообщение, он правильно детектился с помощью context.hasAttachments(AttachmentType.AUDIO_MESSAGE), а уже на основе этих данных перегружать сообщение, так как при работе с большим объемом данных это достаточно критично перегружать все сообщения, для правильного детекта. Так же можно если детектится, что объект не полный loadMessagePayload() и уже загружать объект по запросу, только когда это необходимо.

negezor commented 4 years ago

В релизной 4.0.0 версии будет исправлено https://github.com/negezor/vk-io/commit/a94db5dff58ddff361ea753111e921b2e899ee2e