EvolutionAPI / evolution-api

Evolution API is an open-source WhatsApp integration API
https://evolution-api.com
GNU General Public License v3.0
938 stars 484 forks source link

[PT][BUG] Impossível marcar como recebida (não lida) - duas opções fazem a mesma coisa : `read_status` e `read_messages` chamam apenas `readMessages` #499

Closed TiagoGouvea closed 1 month ago

TiagoGouvea commented 3 months ago

Describe the bug

Na interface do manager tem duas opções "Marcar mensagens como lidas" e "Marcar status como visto" que na API fazem a mesma coisa:

         if (this.localSettings.read_messages && received.key.id !== 'status@broadcast') {
            await this.client.readMessages([received.key]);
          }

          if (this.localSettings.read_status && received.key.id === 'status@broadcast') {
            await this.client.readMessages([received.key]);
          }

Link para o código

Acredito que um input seria "Marcar mensagens como recebidas", que apenas deixa dois "checks", e o outro "Marcar mensagens como lidas" que deixa os dois checks azuis.

Additional context

Até tentei encontrar onde no baileys ele faz isso, mas não tive 100% de certeza.. mas parece que deveria ser atualizar o status da mensagem para DELIVERY_ACK.

jaison-x commented 3 months ago

@TiagoGouvea, estas duas opções fazem coisas distintas. A opção read_messages faz a leitura de uma mensagem assim que ela é recebida pela evo (mensagem diretas entre usuários ou grupos, etç...).

Já a outra opção read_status faz a leitura de mensagens do tipo status (aquelas que ficam numa área diferente dentro do app do WhatsApp. Na versão mais recente fica dentro da área "Atualizações").

A key status@broadcast simboliza uma mensagem do tipo status, por isso que tem este filtro nestas duas condições.

TiagoGouvea commented 3 months ago

Obrigado pela resposta @jaison-x .

Existe uma forma de marcar a mensagem como recebida (dois checks cinzas) automaticamente (ou via código)?

Sei que posso marcar como lida, mas no meu caso, preciso ter dois status: recebida (dois checks) e lida (dois checks azuis), porém, não encontrei como fazer isso com o Evolution.

Pode me ajudar?

kodiyak commented 3 months ago

Obrigado pela resposta @jaison-x .

Existe uma forma de marcar a mensagem como recebida (dois checks cinzas) automaticamente (ou via código)?

Sei que posso marcar como lida, mas no meu caso, preciso ter dois status: recebida (dois checks) e lida (dois checks azuis), porém, não encontrei como fazer isso com o Evolution.

Pode me ajudar?

Você tem o evento "message.update" onde recebe os parametros pra gerenciar o recebido e lido da mensagem

TiagoGouvea commented 3 months ago

Obrigado pela resposta @kodiyak . Mas não entendi exatamente como fazer isso. Tem algum exemplo na documentação de como lidar com os dois estados separadamente?

O objeto que recebo no message.update é este:

{
  event: 'messages.upsert',
  instance: 'tiago-dev',
  data: {
    key: {
      remoteJid: '55328....@s.whatsapp.net',
      fromMe: false,
      id: '3A6C552BB7E9E'
    },
    pushName: 'Tiago Gouvêa',
    message: {
      conversation: 'oi',
      messageContextInfo: {
        deviceListMetadata: {
          senderKeyHash: 'PcQUE26..',
          senderTimestamp: '1710935366',
          recipientKeyHash: '1YpgO9b...',
          recipientTimestamp: '1712053417'
        },
        deviceListMetadataVersion: 2
      }
    },
    messageType: 'conversation',
    messageTimestamp: 1712053869,
    owner: 'tiago-dev',
    source: 'ios'
  },
  server_url: 'http://localhost:8080',
  date_time: '2024-04-02T07:31:09.608Z',
  sender: '5532....@s.whatsapp.net',
  apikey: 'wqv....'
}

Eu já vi que tem {{baseUrl}}/chat/markMessageAsRead/{{instance}}, mas, eu queria controlar que 1 - recebi (dois ticks), 2 - li (dois ticks azuis).

Como emitir estes dois status pelo código?

kodiyak commented 3 months ago

@TiagoGouvea quando você recebe o evento message.update via webhook, o formato dos dados é mais ou menos este:

{
  local: 'WAStartupService.sendDataWebhook-global',
  url: '...',
  event: 'messages.update',
  instance: 'd57ce9fb-f0d8-466e-8c04-83b7f5af6225',
  data: {
    remoteJid: 'XXXXXXXXXXXX:XX@s.whatsapp.net', // Usuário que emitiu o evento
    id: 'BAE578D31203C27F', // ID da mensagem
    fromMe: true, // Uma mensagem que foi enviada por você
    participant: undefined,
    status: 'DELIVERY_ACK', // Status: DELIVERY_ACK | READ
    datetime: 1712083045414,
    owner: 'd57ce9fb-f0d8-466e-8c04-83b7f5af6225',
    pollUpdates: undefined
  },
  destination: undefined,
  date_time: '2024-04-02T15:37:25.417Z',
  sender: '5511991174114@s.whatsapp.net',
  server_url: 'localhost'
}

O lance está no status deste evento: Quando for DELIVERY_ACK significa que foi entregue ao usuário Quando for READ significa que o usuário leu sua mensagem

Você pode trabalhar com o gerenciamento desses status

DavidsonGomes commented 1 month ago

Foi criado o endpoint para marcar chats como não lidos, esta em develop atualmente