diff --git a/src/pkg/whatsapp/init.go b/src/pkg/whatsapp/init.go index c6e2ce2..9f70ebb 100644 --- a/src/pkg/whatsapp/init.go +++ b/src/pkg/whatsapp/init.go @@ -152,9 +152,11 @@ func handler(rawEvt interface{}) { if config.WhatsappWebhook != "" && !strings.Contains(evt.Info.SourceString(), "broadcast") && !isFromMySelf(evt.Info.SourceString()) { - if err := forwardToWebhook(evt); err != nil { - logrus.Error("Failed forward to webhook: ", err) - } + go func(evt *events.Message) { + if err := forwardToWebhook(evt); err != nil { + logrus.Error("Failed forward to webhook: ", err) + } + }(evt) } case *events.Receipt: if evt.Type == types.ReceiptTypeRead || evt.Type == types.ReceiptTypeReadSelf { diff --git a/src/pkg/whatsapp/webhook.go b/src/pkg/whatsapp/webhook.go index 7e7529e..98643fa 100644 --- a/src/pkg/whatsapp/webhook.go +++ b/src/pkg/whatsapp/webhook.go @@ -57,6 +57,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { "video": videoMedia, "view_once": evt.IsViewOnce, "forwarded": forwarded, + "timestamp": evt.Info.Timestamp.Format(time.RFC3339), } if imageMedia != nil { @@ -120,8 +121,17 @@ func submitWebhook(payload map[string]interface{}) error { req.Header.Set("Content-Type", "application/json") req.Header.Set("X-Hub-Signature-256", fmt.Sprintf("sha256=%s", signature)) - if _, err = client.Do(req); err != nil { - return pkgError.WebhookError(fmt.Sprintf("error when submit webhook %v", err)) + var attempt int + var maxAttempts = 5 + var sleepDuration = 1 * time.Second + + for attempt = 0; attempt < maxAttempts; attempt++ { + if _, err = client.Do(req); err == nil { + return nil + } + time.Sleep(sleepDuration) + sleepDuration *= 2 } - return nil + + return pkgError.WebhookError(fmt.Sprintf("error when submit webhook after %d attempts: %v", attempt, err)) }