From 568e2705403e65d999998342cb7edd82a36bd47a Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Wed, 26 Apr 2023 21:54:46 +0300 Subject: [PATCH] Receive all events in same function --- go.mod | 2 +- go.sum | 11 +--- user.go | 196 +++++++++++++++++++++++++++----------------------------- 3 files changed, 99 insertions(+), 110 deletions(-) diff --git a/go.mod b/go.mod index 300cf98..71594f5 100644 --- a/go.mod +++ b/go.mod @@ -37,4 +37,4 @@ require ( maunium.net/go/mauflag v1.0.0 // indirect ) -replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20230426180404-ce66567c447b +replace github.com/bwmarrin/discordgo => github.com/beeper/discordgo v0.0.0-20230426184739-79aea97f6660 diff --git a/go.sum b/go.sum index b89d522..67b871f 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-20230426180404-ce66567c447b h1:Xk0iNigYnqfx4TpbW6X5qjeO9TTq7eTW9CJIi+YfC94= -github.com/beeper/discordgo v0.0.0-20230426180404-ce66567c447b/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= +github.com/beeper/discordgo v0.0.0-20230426184739-79aea97f6660 h1:5LFnUY/Aj/0k/UqeEmW2GS4ql1vxmivkrckPxUHf8oc= +github.com/beeper/discordgo v0.0.0-20230426184739-79aea97f6660/go.mod h1:59+AOzzjmL6onAh62nuLXmn7dJCaC/owDLWbGtjTcFA= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -13,7 +13,6 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/lib/pq v1.10.8 h1:3fdt97i/cwSU83+E0hZTC/Xpc9mTZxc6UWSCRcSbxiE= @@ -52,20 +51,14 @@ github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU= github.com/yuin/goldmark v1.5.4/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= diff --git a/user.go b/user.go index 28c6f24..992797f 100644 --- a/user.go +++ b/user.go @@ -16,6 +16,7 @@ import ( "github.com/bwmarrin/discordgo" "github.com/gorilla/websocket" "github.com/rs/zerolog" + "maunium.net/go/mautrix/util/dbutil" "maunium.net/go/mautrix" "maunium.net/go/mautrix/appservice" @@ -250,7 +251,7 @@ func (user *User) startupTryConnect(retryCount int) { user.log.Error().Err(err).Msg("Error connecting on startup") closeErr := &websocket.CloseError{} if errors.As(err, &closeErr) && closeErr.Code == 4004 { - user.invalidAuthHandler(nil, nil) + user.invalidAuthHandler(nil) } else if retryCount < 6 { user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "dc-unknown-websocket-error", Message: err.Error()}) retryInSeconds := 2 << retryCount @@ -574,47 +575,80 @@ func (user *User) Connect() error { if !session.IsUser { session.Identify.Intents = BotIntents } + session.EventHandler = user.eventHandlerSync user.Session = session - user.Session.AddHandler(user.readyHandler) - user.Session.AddHandler(user.resumeHandler) - 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) - user.Session.AddHandler(user.guildUpdateHandler) - user.Session.AddHandler(user.guildRoleCreateHandler) - user.Session.AddHandler(user.guildRoleUpdateHandler) - user.Session.AddHandler(user.guildRoleDeleteHandler) - - user.Session.AddHandler(user.channelCreateHandler) - user.Session.AddHandler(user.channelDeleteHandler) - user.Session.AddHandler(user.channelPinsUpdateHandler) - user.Session.AddHandler(user.channelUpdateHandler) - - user.Session.AddHandler(user.channelRecipientAdd) - user.Session.AddHandler(user.channelRecipientRemove) - - user.Session.AddHandler(user.relationshipAddHandler) - user.Session.AddHandler(user.relationshipRemoveHandler) - user.Session.AddHandler(user.relationshipUpdateHandler) - - user.Session.AddHandler(user.messageCreateHandler) - user.Session.AddHandler(user.messageDeleteHandler) - user.Session.AddHandler(user.messageUpdateHandler) - user.Session.AddHandler(user.reactionAddHandler) - user.Session.AddHandler(user.reactionRemoveHandler) - user.Session.AddHandler(user.messageAckHandler) - user.Session.AddHandler(user.typingStartHandler) - - user.Session.AddHandler(user.interactionSuccessHandler) - return user.Session.Open() } +func (user *User) eventHandlerSync(rawEvt any) { + go user.eventHandler(rawEvt) +} + +func (user *User) eventHandler(rawEvt any) { + switch evt := rawEvt.(type) { + case *discordgo.Ready: + user.readyHandler(evt) + case *discordgo.Resumed: + user.resumeHandler(evt) + case *discordgo.Connect: + user.connectedHandler(evt) + case *discordgo.Disconnect: + user.disconnectedHandler(evt) + case *discordgo.InvalidAuth: + user.invalidAuthHandler(evt) + case *discordgo.GuildCreate: + user.guildCreateHandler(evt) + case *discordgo.GuildDelete: + user.guildDeleteHandler(evt) + case *discordgo.GuildUpdate: + user.guildUpdateHandler(evt) + case *discordgo.GuildRoleCreate: + user.discordRoleToDB(evt.GuildID, evt.Role, nil, nil) + case *discordgo.GuildRoleUpdate: + user.discordRoleToDB(evt.GuildID, evt.Role, nil, nil) + case *discordgo.GuildRoleDelete: + user.bridge.DB.Role.DeleteByID(evt.GuildID, evt.RoleID) + case *discordgo.ChannelCreate: + user.channelCreateHandler(evt) + case *discordgo.ChannelDelete: + user.channelDeleteHandler(evt) + case *discordgo.ChannelUpdate: + user.channelUpdateHandler(evt) + case *discordgo.ChannelRecipientAdd: + user.channelRecipientAdd(evt) + case *discordgo.ChannelRecipientRemove: + user.channelRecipientRemove(evt) + case *discordgo.RelationshipAdd: + user.relationshipAddHandler(evt) + case *discordgo.RelationshipRemove: + user.relationshipRemoveHandler(evt) + case *discordgo.RelationshipUpdate: + user.relationshipUpdateHandler(evt) + case *discordgo.MessageCreate: + user.pushPortalMessage(evt, "message create", evt.ChannelID, evt.GuildID) + case *discordgo.MessageDelete: + user.pushPortalMessage(evt, "message delete", evt.ChannelID, evt.GuildID) + case *discordgo.MessageUpdate: + user.pushPortalMessage(evt, "message update", evt.ChannelID, evt.GuildID) + case *discordgo.MessageReactionAdd: + user.pushPortalMessage(evt, "reaction add", evt.ChannelID, evt.GuildID) + case *discordgo.MessageReactionRemove: + user.pushPortalMessage(evt, "reaction remove", evt.ChannelID, evt.GuildID) + case *discordgo.MessageAck: + user.messageAckHandler(evt) + case *discordgo.TypingStart: + user.typingStartHandler(evt) + case *discordgo.InteractionSuccess: + user.interactionSuccessHandler(evt) + case *discordgo.Event: + // Ignore + default: + user.log.Debug().Type("event_type", evt).Msg("Unhandled event") + } +} + func (user *User) Disconnect() error { user.Lock() defer user.Unlock() @@ -658,7 +692,7 @@ func (s ChannelSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) { +func (user *User) readyHandler(r *discordgo.Ready) { user.log.Debug().Msg("Discord connection ready") user.bridgeStateLock.Lock() user.wasLoggedOut = false @@ -704,7 +738,7 @@ func (user *User) readyHandler(_ *discordgo.Session, r *discordgo.Ready) { if r.ReadState != nil && r.ReadState.Version > user.ReadStateVersion { // TODO can we figure out which read states are actually new? for _, entry := range r.ReadState.Entries { - user.messageAckHandler(nil, &discordgo.MessageAck{ + user.messageAckHandler(&discordgo.MessageAck{ MessageID: string(entry.LastMessageID), ChannelID: entry.ID, }) @@ -741,7 +775,7 @@ func (user *User) subscribeGuilds(delay time.Duration) { } } -func (user *User) resumeHandler(_ *discordgo.Session, r *discordgo.Resumed) { +func (user *User) resumeHandler(r *discordgo.Resumed) { user.log.Debug().Msg("Discord connection resumed") user.subscribeGuilds(0 * time.Second) } @@ -763,19 +797,19 @@ func (user *User) addPrivateChannelToSpace(portal *Portal) bool { } } -func (user *User) relationshipAddHandler(_ *discordgo.Session, r *discordgo.RelationshipAdd) { +func (user *User) relationshipAddHandler(r *discordgo.RelationshipAdd) { user.log.Debug().Interface("relationship", r.Relationship).Msg("Relationship added") user.relationships[r.ID] = r.Relationship user.handleRelationshipChange(r.ID, r.Nickname) } -func (user *User) relationshipUpdateHandler(_ *discordgo.Session, r *discordgo.RelationshipUpdate) { +func (user *User) relationshipUpdateHandler(r *discordgo.RelationshipUpdate) { user.log.Debug().Interface("relationship", r.Relationship).Msg("Relationship update") user.relationships[r.ID] = r.Relationship user.handleRelationshipChange(r.ID, r.Nickname) } -func (user *User) relationshipRemoveHandler(_ *discordgo.Session, r *discordgo.RelationshipRemove) { +func (user *User) relationshipRemoveHandler(r *discordgo.RelationshipRemove) { user.log.Debug().Str("other_user_id", r.ID).Msg("Relationship removed") delete(user.relationships, r.ID) user.handleRelationshipChange(r.ID, "") @@ -854,7 +888,7 @@ func (user *User) addGuildToSpace(guild *Guild, isInSpace bool, timestamp time.T return isInSpace } -func (user *User) discordRoleToDB(guildID string, role *discordgo.Role, dbRole *database.Role) (*database.Role, bool) { +func (user *User) discordRoleToDB(guildID string, role *discordgo.Role, dbRole *database.Role, txn dbutil.Execable) bool { var changed bool if dbRole == nil { dbRole = user.bridge.DB.Role.New() @@ -872,7 +906,10 @@ func (user *User) discordRoleToDB(guildID string, role *discordgo.Role, dbRole * dbRole.Permissions != role.Permissions } dbRole.Role = *role - return dbRole, changed + if changed { + dbRole.Upsert(txn) + } + return changed } func (user *User) handleGuildRoles(guildID string, newRoles []*discordgo.Role) { @@ -887,11 +924,8 @@ func (user *User) handleGuildRoles(guildID string, newRoles []*discordgo.Role) { panic(err) } for _, role := range newRoles { - dbRole, changed := user.discordRoleToDB(guildID, role, existingRoleMap[role.ID]) + user.discordRoleToDB(guildID, role, existingRoleMap[role.ID], txn) delete(existingRoleMap, role.ID) - if changed { - dbRole.Upsert(txn) - } } for _, removeRole := range existingRoleMap { removeRole.Delete(txn) @@ -907,20 +941,6 @@ func (user *User) handleGuildRoles(guildID string, newRoles []*discordgo.Role) { } } -func (user *User) guildRoleCreateHandler(_ *discordgo.Session, r *discordgo.GuildRoleCreate) { - dbRole, _ := user.discordRoleToDB(r.GuildID, r.Role, nil) - dbRole.Upsert(nil) -} - -func (user *User) guildRoleUpdateHandler(_ *discordgo.Session, r *discordgo.GuildRoleUpdate) { - dbRole, _ := user.discordRoleToDB(r.GuildID, r.Role, nil) - dbRole.Upsert(nil) -} - -func (user *User) guildRoleDeleteHandler(_ *discordgo.Session, r *discordgo.GuildRoleDelete) { - user.bridge.DB.Role.DeleteByID(r.GuildID, r.RoleID) -} - func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSpace bool) { guild := user.bridge.GetGuildByID(meta.ID, true) guild.UpdateInfo(user, meta) @@ -949,7 +969,7 @@ func (user *User) handleGuild(meta *discordgo.Guild, timestamp time.Time, isInSp user.addGuildToSpace(guild, isInSpace, timestamp) } -func (user *User) connectedHandler(_ *discordgo.Session, _ *discordgo.Connect) { +func (user *User) connectedHandler(_ *discordgo.Connect) { user.bridgeStateLock.Lock() defer user.bridgeStateLock.Unlock() user.log.Debug().Msg("Connected to Discord") @@ -959,7 +979,7 @@ func (user *User) connectedHandler(_ *discordgo.Session, _ *discordgo.Connect) { } } -func (user *User) disconnectedHandler(_ *discordgo.Session, _ *discordgo.Disconnect) { +func (user *User) disconnectedHandler(_ *discordgo.Disconnect) { user.bridgeStateLock.Lock() defer user.bridgeStateLock.Unlock() if user.wasLoggedOut { @@ -971,7 +991,7 @@ func (user *User) disconnectedHandler(_ *discordgo.Session, _ *discordgo.Disconn user.BridgeState.Send(status.BridgeState{StateEvent: status.StateTransientDisconnect, Error: "dc-transient-disconnect", Message: "Temporarily disconnected from Discord, trying to reconnect"}) } -func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidAuth) { +func (user *User) invalidAuthHandler(_ *discordgo.InvalidAuth) { user.bridgeStateLock.Lock() defer user.bridgeStateLock.Unlock() user.log.Info().Msg("Got logged out from Discord due to invalid token") @@ -980,7 +1000,7 @@ func (user *User) invalidAuthHandler(_ *discordgo.Session, _ *discordgo.InvalidA go user.Logout(false) } -func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCreate) { +func (user *User) guildCreateHandler(g *discordgo.GuildCreate) { user.log.Info(). Str("guild_id", g.ID). Str("name", g.Name). @@ -989,7 +1009,7 @@ func (user *User) guildCreateHandler(_ *discordgo.Session, g *discordgo.GuildCre user.handleGuild(g.Guild, time.Now(), false) } -func (user *User) guildDeleteHandler(_ *discordgo.Session, g *discordgo.GuildDelete) { +func (user *User) guildDeleteHandler(g *discordgo.GuildDelete) { user.log.Info().Str("guild_id", g.ID).Msg("Got guild delete event") user.MarkNotInPortal(g.ID) guild := user.bridge.GetGuildByID(g.ID, false) @@ -1005,12 +1025,12 @@ func (user *User) guildDeleteHandler(_ *discordgo.Session, g *discordgo.GuildDel } } -func (user *User) guildUpdateHandler(_ *discordgo.Session, g *discordgo.GuildUpdate) { +func (user *User) guildUpdateHandler(g *discordgo.GuildUpdate) { user.log.Debug().Str("guild_id", g.ID).Msg("Got guild update event") user.handleGuild(g.Guild, time.Now(), user.IsInSpace(g.ID)) } -func (user *User) channelCreateHandler(_ *discordgo.Session, c *discordgo.ChannelCreate) { +func (user *User) channelCreateHandler(c *discordgo.ChannelCreate) { if user.getGuildBridgingMode(c.GuildID) < database.GuildBridgeEverything { user.log.Debug(). Str("guild_id", c.GuildID).Str("channel_id", c.ID). @@ -1040,7 +1060,7 @@ func (user *User) channelCreateHandler(_ *discordgo.Session, c *discordgo.Channe } } -func (user *User) channelDeleteHandler(_ *discordgo.Session, c *discordgo.ChannelDelete) { +func (user *User) channelDeleteHandler(c *discordgo.ChannelDelete) { portal := user.GetExistingPortalByID(c.ID) if portal == nil { user.log.Debug(). @@ -1061,11 +1081,7 @@ func (user *User) channelDeleteHandler(_ *discordgo.Session, c *discordgo.Channe Msg("Completed cleaning up channel") } -func (user *User) channelPinsUpdateHandler(_ *discordgo.Session, c *discordgo.ChannelPinsUpdate) { - user.log.Debug().Msg("channel pins update") -} - -func (user *User) channelUpdateHandler(_ *discordgo.Session, c *discordgo.ChannelUpdate) { +func (user *User) channelUpdateHandler(c *discordgo.ChannelUpdate) { portal := user.GetPortalByMeta(c.Channel) if c.GuildID == "" { user.handlePrivateChannel(portal, c.Channel, time.Now(), true, user.IsInSpace(portal.Key.String())) @@ -1074,14 +1090,14 @@ func (user *User) channelUpdateHandler(_ *discordgo.Session, c *discordgo.Channe } } -func (user *User) channelRecipientAdd(_ *discordgo.Session, c *discordgo.ChannelRecipientAdd) { +func (user *User) channelRecipientAdd(c *discordgo.ChannelRecipientAdd) { portal := user.GetExistingPortalByID(c.ChannelID) if portal != nil { portal.syncParticipant(user, c.User, false) } } -func (user *User) channelRecipientRemove(_ *discordgo.Session, c *discordgo.ChannelRecipientRemove) { +func (user *User) channelRecipientRemove(c *discordgo.ChannelRecipientRemove) { portal := user.GetExistingPortalByID(c.ChannelID) if portal != nil { portal.syncParticipant(user, c.User, true) @@ -1152,26 +1168,6 @@ func (user *User) pushPortalMessage(msg interface{}, typeName, channelID, guildI } } -func (user *User) messageCreateHandler(_ *discordgo.Session, m *discordgo.MessageCreate) { - user.pushPortalMessage(m, "message create", m.ChannelID, m.GuildID) -} - -func (user *User) messageDeleteHandler(_ *discordgo.Session, m *discordgo.MessageDelete) { - user.pushPortalMessage(m, "message delete", m.ChannelID, m.GuildID) -} - -func (user *User) messageUpdateHandler(_ *discordgo.Session, m *discordgo.MessageUpdate) { - user.pushPortalMessage(m, "message update", m.ChannelID, m.GuildID) -} - -func (user *User) reactionAddHandler(_ *discordgo.Session, m *discordgo.MessageReactionAdd) { - user.pushPortalMessage(m, "reaction add", m.ChannelID, m.GuildID) -} - -func (user *User) reactionRemoveHandler(_ *discordgo.Session, m *discordgo.MessageReactionRemove) { - user.pushPortalMessage(m, "reaction remove", m.ChannelID, m.GuildID) -} - type CustomReadReceipt struct { Timestamp int64 `json:"ts,omitempty"` DoublePuppetSource string `json:"fi.mau.double_puppet_source,omitempty"` @@ -1196,7 +1192,7 @@ func (user *User) makeReadMarkerContent(eventID id.EventID) *CustomReadMarkers { } } -func (user *User) messageAckHandler(_ *discordgo.Session, m *discordgo.MessageAck) { +func (user *User) messageAckHandler(m *discordgo.MessageAck) { portal := user.GetExistingPortalByID(m.ChannelID) if portal == nil || portal.MXID == "" { return @@ -1229,7 +1225,7 @@ func (user *User) messageAckHandler(_ *discordgo.Session, m *discordgo.MessageAc } } -func (user *User) typingStartHandler(_ *discordgo.Session, t *discordgo.TypingStart) { +func (user *User) typingStartHandler(t *discordgo.TypingStart) { portal := user.GetExistingPortalByID(t.ChannelID) if portal == nil || portal.MXID == "" { return @@ -1237,7 +1233,7 @@ func (user *User) typingStartHandler(_ *discordgo.Session, t *discordgo.TypingSt portal.handleDiscordTyping(t) } -func (user *User) interactionSuccessHandler(_ *discordgo.Session, s *discordgo.InteractionSuccess) { +func (user *User) interactionSuccessHandler(s *discordgo.InteractionSuccess) { user.pendingInteractionsLock.Lock() defer user.pendingInteractionsLock.Unlock() ce, ok := user.pendingInteractions[s.Nonce]