From 330faa45faa9ddce95aaf5498087d30f2909c45e Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 13 Jan 2023 18:41:22 +0200 Subject: [PATCH] Handle getting logged out while bridge is running --- go.mod | 2 +- go.sum | 4 ++-- user.go | 24 +++++++++++++++--------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 9111733..f71ad91 100644 --- a/go.mod +++ b/go.mod @@ -32,4 +32,4 @@ require ( maunium.net/go/mauflag v1.0.0 // indirect ) -replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5 +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20230113163915-8c5c59822cb9 diff --git a/go.sum b/go.sum index 5b98116..814d660 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5 h1:w/mHH7KoSLUPhqW11mu2rE7cLXhW878bBVRnZ/kiIhs= -github.com/beeper/discordgo v0.0.0-20220913114117-bbf4447874d5/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/beeper/discordgo v0.0.0-20230113163915-8c5c59822cb9 h1:V+SsDhYGus/Lnay6lwD6Hd30EGb6GvOwG3+VY3XiDRU= +github.com/beeper/discordgo v0.0.0-20230113163915-8c5c59822cb9/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= diff --git a/user.go b/user.go index 837e911..040a41d 100644 --- a/user.go +++ b/user.go @@ -223,11 +223,10 @@ func (br *DiscordBridge) startUsers() { if err != nil { user.log.Errorfln("Error connecting: %v", err) if closeErr := (&websocket.CloseError{}); errors.As(err, &closeErr) && closeErr.Code == 4004 { - user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Message: err.Error()}) - user.DiscordToken = "" - user.Update() + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-websocket-disconnect-4004"}) + go user.Logout() } else { - user.BridgeState.Send(status.BridgeState{StateEvent: status.StateUnknownError, Message: err.Error()}) + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateUnknownError, Error: "dc-unknown-websocket-error", Message: err.Error()}) } } }(u) @@ -477,6 +476,7 @@ func (user *User) Connect() error { user.Session.AddHandler(user.readyHandler) user.Session.AddHandler(user.connectedHandler) user.Session.AddHandler(user.disconnectedHandler) + user.Session.AddHandler(user.invalidAuthHandler) user.Session.AddHandler(user.guildCreateHandler) user.Session.AddHandler(user.guildDeleteHandler) @@ -705,17 +705,23 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp user.addGuildToSpace(guild, isInSpace, timestamp) } -func (user *User) connectedHandler(_ *discordgo.Session, c *discordgo.Connect) { - user.log.Debugln("Connected to discord") +func (user *User) connectedHandler(_ *discordgo.Session, _ *discordgo.Connect) { + user.log.Debugln("Connected to Discord") if user.wasDisconnected.Swap(false) { user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnected}) } } -func (user *User) disconnectedHandler(_ *discordgo.Session, d *discordgo.Disconnect) { - user.log.Debugln("Disconnected from discord") +func (user *User) disconnectedHandler(_ *discordgo.Session, _ *discordgo.Disconnect) { + user.log.Debugln("Disconnected from Discord") user.wasDisconnected.Store(true) - user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect}) + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "dc-transient-disconnect"}) +} + +func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidAuth) { + user.log.Debugln("Got logged out from Discord") + user.BridgeState.Send(status.BridgeState{StateEvent: status.StateBadCredentials, Error: "dc-websocket-disconnect-4004"}) + go user.Logout() } func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCreate) {