Skip to content

Recognise other bots: honour the IRCv3 bot tag on inbound messages #2

Closed

Description

@toppk

eggbot already negotiates message-tags and account-tag —
DefaultPreferredCaps (internal/ircx/caps.go:12) lists both — so on a network
that implements IRCv3 bot mode, the bot tag is already arriving on messages
from other bots. Nothing reads it.

onPrivmsg (internal/bot/bot.go:443) has no bot check. Its only sender guard
is the self-nick comparison at :455, gated on honorackmsg, which exists for
echo-message self-echoes rather than other bots. onNotice, onAction and
onCTCP are in the same position, and as far as I can see there is no
ignore-list fallback anywhere in the tree.

So eggbot treats every other bot as a human and answers it.

What it would take

internal/origin/origin.go:38 already reads tags through GetTag for account
and certfp, so the natural shape is a bot read in the same place and an
IsBot field on Origin. Command dispatch then skips senders carrying it.

Worth keeping the skip narrow: still log the line, still record it for seen
and channel history, just do not treat it as an invocation. That keeps the
channel record complete while removing the trigger.

Why it matters

Two bots that each answer the other is the classic loop, and the usual amplifier
is a command that echoes stored text verbatim — a seen or history reply can
replay a line that re-triggers the other bot long after it was said. An ignore
list is the manual workaround, and it goes stale silently: a renamed or newly
deployed bot is not on it, and nobody notices until a channel is flooding.

The tag is the in-band answer. chonkline implements the server side as of
iconidentify/chonkline#36, which sends bot to
clients that negotiated message-tags — which eggbot already does, so this is
purely a matter of reading what is already on the wire.

Declaring eggbot's own bot mode is a separate change; filed separately since
each is useful without the other.

Activity

  1. toppk commented on Sep 26, 2026

    @toppk
    Author

    The outbound half is #1.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions