From 024577d8222b95010a2c6238b940742eb59de378 Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 13 Nov 2024 15:15:36 +0200 Subject: [PATCH] user: catch 40002 responses --- backfill.go | 3 +++ portal.go | 1 + user.go | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/backfill.go b/backfill.go index 6e0f0a1..122181b 100644 --- a/backfill.go +++ b/backfill.go @@ -151,6 +151,9 @@ func (portal *Portal) collectBackfillMessages(log zerolog.Logger, source *User, func (portal *Portal) backfillLimited(log zerolog.Logger, source *User, limit int, after string, thread *Thread) { messages, foundAll, err := portal.collectBackfillMessages(log, source, limit, after, thread) if err != nil { + if source.handlePossible40002(err) { + panic(err) + } log.Err(err).Msg("Error collecting messages to forward backfill") return } diff --git a/portal.go b/portal.go index c948b6c..09c1853 100644 --- a/portal.go +++ b/portal.go @@ -1680,6 +1680,7 @@ func (portal *Portal) handleMatrixMessage(sender *User, evt *event.Event) { AllowedMentions: sendReq.AllowedMentions, }) } + sender.handlePossible40002(err) go portal.sendMessageMetrics(evt, err, "Error sending") if msg != nil { dbMsg := portal.bridge.DB.Message.New() diff --git a/user.go b/user.go index 1f08fba..d3c85e5 100644 --- a/user.go +++ b/user.go @@ -7,6 +7,7 @@ import ( "math/rand" "net/http" "os" + "runtime/debug" "sort" "strconv" "strings" @@ -579,6 +580,15 @@ func (user *User) eventHandlerSync(rawEvt any) { } func (user *User) eventHandler(rawEvt any) { + defer func() { + err := recover() + if err != nil { + user.log.Error(). + Bytes(zerolog.ErrorStackFieldName, debug.Stack()). + Any(zerolog.ErrorFieldName, err). + Msg("Panic in Discord event handler") + } + }() switch evt := rawEvt.(type) { case *discordgo.Ready: user.readyHandler(evt) @@ -999,6 +1009,15 @@ func (user *User) invalidAuthHandler(_ *discordgo.InvalidAuth) { go user.Logout(false) } +func (user *User) handlePossible40002(err error) bool { + var restErr *discordgo.RESTError + if !errors.As(err, &restErr) || restErr.Message == nil || restErr.Message.Code != discordgo.ErrCodeActionRequiredVerifiedAccount { + return false + } + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-http-40002", Message: restErr.Message.Message}) + return true +} + func (user *User) guildCreateHandler(g *discordgo.GuildCreate) { user.log.Info(). Str("guild_id", g.ID).