From 5604d140e3bbf5c8f6c414b1427145a0c4e36bb4 Mon Sep 17 00:00:00 2001 From: Sam W Date: Fri, 24 Jun 2022 22:50:48 +0100 Subject: [PATCH] Ignore events from other guilds, add nosendjoinpart support (discord) (#1846) * discord: add nosendjoinpart support This allows the discord bridge to be configured with `nosendjoinpart`, preventing discord-originating join/part messages from being send to other bridged platforms. * discord: Ignore incoming events for other guilds Ignore all incoming discord events originating from Guild IDs other than the one we have configured. This is necessary because discord bots receive events for *all* discord guilds that they are present in. Fixes #1612 --- bridge/discord/discord.go | 2 +- bridge/discord/handlers.go | 38 ++++++++++++++++++++++++++++++++++++++ matterbridge.toml.sample | 6 +++--- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index ad08cd30..5ae6c572 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -83,12 +83,12 @@ func (b *Bdiscord) Connect() error { b.Log.Info("Connection succeeded") b.c.AddHandler(b.messageCreate) b.c.AddHandler(b.messageTyping) - b.c.AddHandler(b.memberUpdate) b.c.AddHandler(b.messageUpdate) b.c.AddHandler(b.messageDelete) b.c.AddHandler(b.messageDeleteBulk) b.c.AddHandler(b.memberAdd) b.c.AddHandler(b.memberRemove) + b.c.AddHandler(b.memberUpdate) if b.GetInt("debuglevel") == 1 { b.c.AddHandler(b.messageEvent) } diff --git a/bridge/discord/handlers.go b/bridge/discord/handlers.go index d2613e1a..34cef554 100644 --- a/bridge/discord/handlers.go +++ b/bridge/discord/handlers.go @@ -7,6 +7,10 @@ import ( ) func (b *Bdiscord) messageDelete(s *discordgo.Session, m *discordgo.MessageDelete) { //nolint:unparam + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring messageDelete because it originates from a different guild") + return + } rmsg := config.Message{Account: b.Account, ID: m.ID, Event: config.EventMsgDelete, Text: config.EventMsgDelete} rmsg.Channel = b.getChannelName(m.ChannelID) @@ -17,6 +21,10 @@ func (b *Bdiscord) messageDelete(s *discordgo.Session, m *discordgo.MessageDelet // TODO(qaisjp): if other bridges support bulk deletions, it could be fanned out centrally func (b *Bdiscord) messageDeleteBulk(s *discordgo.Session, m *discordgo.MessageDeleteBulk) { //nolint:unparam + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring messageDeleteBulk because it originates from a different guild") + return + } for _, msgID := range m.Messages { rmsg := config.Message{ Account: b.Account, @@ -37,6 +45,10 @@ func (b *Bdiscord) messageEvent(s *discordgo.Session, m *discordgo.Event) { } func (b *Bdiscord) messageTyping(s *discordgo.Session, m *discordgo.TypingStart) { + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring messageTyping because it originates from a different guild") + return + } if !b.GetBool("ShowUserTyping") { return } @@ -52,6 +64,10 @@ func (b *Bdiscord) messageTyping(s *discordgo.Session, m *discordgo.TypingStart) } func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdate) { //nolint:unparam + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring messageUpdate because it originates from a different guild") + return + } if b.GetBool("EditDisable") { return } @@ -67,6 +83,10 @@ func (b *Bdiscord) messageUpdate(s *discordgo.Session, m *discordgo.MessageUpdat } func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { //nolint:unparam + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring messageCreate because it originates from a different guild") + return + } var err error // not relay our own messages @@ -144,6 +164,10 @@ func (b *Bdiscord) messageCreate(s *discordgo.Session, m *discordgo.MessageCreat } func (b *Bdiscord) memberUpdate(s *discordgo.Session, m *discordgo.GuildMemberUpdate) { + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring memberUpdate because it originates from a different guild") + return + } if m.Member == nil { b.Log.Warnf("Received member update with no member information: %#v", m) } @@ -171,6 +195,13 @@ func (b *Bdiscord) memberUpdate(s *discordgo.Session, m *discordgo.GuildMemberUp } func (b *Bdiscord) memberAdd(s *discordgo.Session, m *discordgo.GuildMemberAdd) { + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring memberAdd because it originates from a different guild") + return + } + if b.GetBool("nosendjoinpart") { + return + } if m.Member == nil { b.Log.Warnf("Received member update with no member information: %#v", m) return @@ -192,6 +223,13 @@ func (b *Bdiscord) memberAdd(s *discordgo.Session, m *discordgo.GuildMemberAdd) } func (b *Bdiscord) memberRemove(s *discordgo.Session, m *discordgo.GuildMemberRemove) { + if m.GuildID != b.guildID { + b.Log.Debugf("Ignoring memberRemove because it originates from a different guild") + return + } + if b.GetBool("nosendjoinpart") { + return + } if m.Member == nil { b.Log.Warnf("Received member update with no member information: %#v", m) return diff --git a/matterbridge.toml.sample b/matterbridge.toml.sample index f004f4b6..41ab44bf 100644 --- a/matterbridge.toml.sample +++ b/matterbridge.toml.sample @@ -197,7 +197,7 @@ ShowJoinPart=false VerboseJoinPart=false #Do not send joins/parts to other bridges -#Currently works for messages from the following bridges: irc, mattermost, slack +#Currently works for messages from the following bridges: irc, mattermost, slack, discord #OPTIONAL (default false) NoSendJoinPart=false @@ -496,7 +496,7 @@ RemoteNickFormat="[{PROTOCOL}] <{NICK}> " ShowJoinPart=false #Do not send joins/parts to other bridges -#Currently works for messages from the following bridges: irc, mattermost, slack +#Currently works for messages from the following bridges: irc, mattermost, slack, discord #OPTIONAL (default false) NoSendJoinPart=false @@ -830,7 +830,7 @@ RemoteNickFormat="[{PROTOCOL}] <{NICK}> " ShowJoinPart=false #Do not send joins/parts to other bridges -#Currently works for messages from the following bridges: irc, mattermost, slack +#Currently works for messages from the following bridges: irc, mattermost, slack, discord #OPTIONAL (default false) NoSendJoinPart=false