Skip to content

Commit e24c255

Browse files
committed
Fix auto read receipt to send when messages are viewed
- Add MarkMessageRead function to WhatsApp client - Send read receipts when user opens conversation (not on receive) - Only sends for unread messages when AutoReadReceipt is enabled
1 parent 7693794 commit e24c255

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

internal/handlers/contacts.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,11 @@ func (a *App) GetMessages(r *fastglue.Request) error {
360360
response[i] = msgResp
361361
}
362362

363+
// Get unread incoming messages for auto read receipt
364+
var unreadMessages []models.Message
365+
a.DB.Where("contact_id = ? AND direction = ? AND status != ?", contactID, "incoming", "read").
366+
Find(&unreadMessages)
367+
363368
// Mark incoming messages as read
364369
a.DB.Model(&models.Message{}).
365370
Where("contact_id = ? AND direction = ?", contactID, "incoming").
@@ -368,6 +373,29 @@ func (a *App) GetMessages(r *fastglue.Request) error {
368373
// Update contact read status
369374
a.DB.Model(&contact).Update("is_read", true)
370375

376+
// Send read receipts to WhatsApp if auto read receipt is enabled
377+
if len(unreadMessages) > 0 && contact.WhatsAppAccount != "" {
378+
var account models.WhatsAppAccount
379+
if err := a.DB.Where("organization_id = ? AND name = ?", orgID, contact.WhatsAppAccount).First(&account).Error; err == nil {
380+
if account.AutoReadReceipt {
381+
go func() {
382+
waAccount := &whatsapp.Account{
383+
PhoneID: account.PhoneID,
384+
AccessToken: account.AccessToken,
385+
APIVersion: a.Config.WhatsApp.APIVersion,
386+
}
387+
for _, msg := range unreadMessages {
388+
if msg.WhatsAppMessageID != "" {
389+
if err := a.WhatsApp.MarkMessageRead(context.Background(), waAccount, msg.WhatsAppMessageID); err != nil {
390+
a.Log.Error("Failed to send read receipt", "error", err, "message_id", msg.WhatsAppMessageID)
391+
}
392+
}
393+
}
394+
}()
395+
}
396+
}
397+
}
398+
371399
return r.SendEnvelope(map[string]any{
372400
"messages": response,
373401
"total": total,

pkg/whatsapp/client.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,3 +355,23 @@ func (c *Client) SendAudioMessage(ctx context.Context, account *Account, phoneNu
355355
c.Log.Info("Audio message sent", "message_id", messageID, "phone", phoneNumber)
356356
return messageID, nil
357357
}
358+
359+
// MarkMessageRead sends a read receipt for a message
360+
func (c *Client) MarkMessageRead(ctx context.Context, account *Account, messageID string) error {
361+
payload := map[string]interface{}{
362+
"messaging_product": "whatsapp",
363+
"status": "read",
364+
"message_id": messageID,
365+
}
366+
367+
url := c.buildMessagesURL(account)
368+
c.Log.Debug("Sending read receipt", "message_id", messageID)
369+
370+
_, err := c.doRequest(ctx, "POST", url, payload, account.AccessToken)
371+
if err != nil {
372+
return fmt.Errorf("failed to send read receipt: %w", err)
373+
}
374+
375+
c.Log.Debug("Read receipt sent", "message_id", messageID)
376+
return nil
377+
}

0 commit comments

Comments
 (0)