From 71a845f3a7c5fb53faf68604bbfb747869eb9693 Mon Sep 17 00:00:00 2001 From: Nick Mills-Barrett Date: Thu, 19 Feb 2026 16:48:20 +0000 Subject: [PATCH] handlewhatsapp: retry generic 400 errors from WhatsApp a few times Sometimes these might loop forever if the account is in a bad state so we can't just retry indefinitely. --- pkg/connector/client.go | 1 + pkg/connector/handlewhatsapp.go | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/pkg/connector/client.go b/pkg/connector/client.go index 60af485c..b0034654 100644 --- a/pkg/connector/client.go +++ b/pkg/connector/client.go @@ -58,6 +58,7 @@ type MetaClient struct { E2EEClient *whatsmeow.Client WADevice *store.Device e2eeConnectLock sync.Mutex + waGenericErrors int metaState status.BridgeState waState status.BridgeState diff --git a/pkg/connector/handlewhatsapp.go b/pkg/connector/handlewhatsapp.go index 678aa24a..5d51a06d 100644 --- a/pkg/connector/handlewhatsapp.go +++ b/pkg/connector/handlewhatsapp.go @@ -18,6 +18,8 @@ import ( "go.mau.fi/mautrix-meta/pkg/metaid" ) +var MaxGenericWhatsappErrorRetries = 5 + func (m *MetaClient) e2eeEventHandler(rawEvt any) bool { if m == nil || m.E2EEClient == nil { return false @@ -80,6 +82,7 @@ func (m *MetaClient) e2eeEventHandler(rawEvt any) bool { m.e2eeConnectWaiter.Set() m.waState = status.BridgeState{StateEvent: status.StateConnected} m.UserLogin.BridgeState.Send(m.waState) + m.waGenericErrors = 0 case *events.Disconnected: log.Debug().Msg("Disconnected from WhatsApp socket") m.e2eeConnectWaiter.Clear() @@ -128,6 +131,10 @@ func (m *MetaClient) e2eeEventHandler(rawEvt any) bool { m.resetWADevice() log.Debug().Msg("Doing full reconnect after WhatsApp 418 error") go m.FullReconnect() + } else if e.Reason == events.ConnectFailureGeneric && m.canReconnect() && m.waGenericErrors < MaxGenericWhatsappErrorRetries { + log.Debug().Msg("Doing full reconnect after WhatsApp 400 error") + m.waGenericErrors++ + go m.FullReconnect() } }