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

22
main.go
View File

@@ -206,6 +206,14 @@ func main() {
// ---- 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)
// Auto-join on invite + moderation member tracking
@@ -260,11 +268,25 @@ func main() {
return
}
// Skip explicitly ignored bots (e.g. Pete, which posts m.text).
if ignoredBots[evt.Sender] {
return
}
content := evt.Content.AsMessage()
if content == nil || content.Body == "" {
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.
// Without this check, edits re-trigger URL previews and inflate stats.
if content.RelatesTo != nil && content.RelatesTo.Type == event.RelReplace {