Ignore other bots: skip m.notice + IGNORED_BOTS denylist (Pete)

No repost (urls.go) or XP (xp.go) for ignored senders. Filters at the
dispatcher so all plugins are covered. m.notice catches convention-
following bots; IGNORED_BOTS handles m.text bots like Pete.
This commit is contained in:
prosolis
2026-06-05 10:28:55 -07:00
parent 6e4928ca17
commit 979b0c6495
2 changed files with 25 additions and 0 deletions

View File

@@ -7,6 +7,9 @@ BOT_DISPLAY_NAME=GogoBee
# Which rooms the bot posts scheduled content to (comma-separated room IDs) # Which rooms the bot posts scheduled content to (comma-separated room IDs)
BROADCAST_ROOMS=!roomid:example.com BROADCAST_ROOMS=!roomid:example.com
# Bots to ignore wholesale: no repost, no XP (comma-separated user IDs)
IGNORED_BOTS=@pete:matrix.example.org
# Admins who can run admin-only commands (comma-separated Matrix user IDs) # Admins who can run admin-only commands (comma-separated Matrix user IDs)
ADMIN_USERS=@yourmxid:example.com ADMIN_USERS=@yourmxid:example.com

22
main.go
View File

@@ -206,6 +206,14 @@ func main() {
// ---- Set up event handlers ---- // ---- Set up event handlers ----
// Bots we ignore wholesale (no repost, no XP). Set IGNORED_BOTS to a
// comma-separated list of Matrix user IDs. Pete (@pete:...) posts plain
// m.text, so the m.notice convention below won't catch it on its own.
ignoredBots := make(map[id.UserID]bool)
for _, u := range splitAndTrim(os.Getenv("IGNORED_BOTS"), ",") {
ignoredBots[id.UserID(u)] = true
}
syncer := client.Syncer.(*mautrix.DefaultSyncer) syncer := client.Syncer.(*mautrix.DefaultSyncer)
// Auto-join on invite + moderation member tracking // Auto-join on invite + moderation member tracking
@@ -260,11 +268,25 @@ func main() {
return return
} }
// Skip explicitly ignored bots (e.g. Pete, which posts m.text).
if ignoredBots[evt.Sender] {
return
}
content := evt.Content.AsMessage() content := evt.Content.AsMessage()
if content == nil || content.Body == "" { if content == nil || content.Body == "" {
return return
} }
// Ignore messages from other bots. By Matrix convention automated
// clients send m.notice (instead of m.text) precisely so other bots
// don't react to them, which avoids feedback loops. Dropping notices
// here means no plugin reposts them (urls.go) or awards XP for them
// (xp.go). Our own messages are already skipped by the sender check.
if content.MsgType == event.MsgNotice {
return
}
// Ignore edits — they arrive as m.room.message with m.replace relation. // Ignore edits — they arrive as m.room.message with m.replace relation.
// Without this check, edits re-trigger URL previews and inflate stats. // Without this check, edits re-trigger URL previews and inflate stats.
if content.RelatesTo != nil && content.RelatesTo.Type == event.RelReplace { if content.RelatesTo != nil && content.RelatesTo.Type == event.RelReplace {