fix: suppress connection noise, MOTD, CTCP, and DCC from clients
Filter out messages that are useless to bouncer clients: - Server notices (prefix without !, NOTICE to */AUTH) - MOTD numerics (375, 372, 376, 422) - Welcome/stats numerics (001-005, 042, 250-255, 265-266) - User mode changes (MODE to non-channel targets) - CTCP queries and DCC requests (PRIVMSG with \x01, except ACTION) - CTCP replies in NOTICE Filter applies to both live dispatch and backlog replay. Purged existing noise from the backlog database. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -25,6 +25,59 @@ _TARGET0_COMMANDS = {
|
||||
"PRIVMSG", "NOTICE", "JOIN", "PART", "MODE", "TOPIC", "NAMES", "WHO", "WHOIS",
|
||||
}
|
||||
|
||||
# Numerics suppressed from client delivery (connection noise, MOTD, server stats)
|
||||
_SUPPRESS_NUMERICS = {
|
||||
# Welcome block (we synthesize our own)
|
||||
"001", "002", "003", "004", "005",
|
||||
# Unique ID
|
||||
"042",
|
||||
# LUSERS / server stats
|
||||
"250", "251", "252", "253", "254", "255",
|
||||
# Local/global user counts
|
||||
"265", "266",
|
||||
# MOTD
|
||||
"375", "372", "376", "422",
|
||||
# Visible host (handled internally by network)
|
||||
"396",
|
||||
# Nick in use (handled internally by network)
|
||||
"433",
|
||||
}
|
||||
|
||||
_CTCP_MARKER = "\x01"
|
||||
|
||||
|
||||
def _suppress(msg: IRCMessage) -> bool:
|
||||
"""Return True if this message should not reach the client."""
|
||||
# Noisy numerics
|
||||
if msg.command in _SUPPRESS_NUMERICS:
|
||||
return True
|
||||
|
||||
# Server notices: prefix without '!' is a server, not a user
|
||||
if msg.command == "NOTICE" and msg.prefix and "!" not in msg.prefix:
|
||||
return True
|
||||
|
||||
# Connection notices (NOTICE to * or AUTH, regardless of prefix)
|
||||
if msg.command == "NOTICE" and msg.params and msg.params[0] in ("*", "AUTH"):
|
||||
return True
|
||||
|
||||
# CTCP replies in NOTICE
|
||||
if msg.command == "NOTICE" and len(msg.params) >= 2:
|
||||
if msg.params[1].startswith(_CTCP_MARKER):
|
||||
return True
|
||||
|
||||
# CTCP/DCC inside PRIVMSG (keep ACTION)
|
||||
if msg.command == "PRIVMSG" and len(msg.params) >= 2:
|
||||
text = msg.params[1]
|
||||
if text.startswith(_CTCP_MARKER) and not text.startswith("\x01ACTION"):
|
||||
return True
|
||||
|
||||
# User mode changes (MODE for non-channel targets)
|
||||
if msg.command == "MODE" and msg.params:
|
||||
if not msg.params[0].startswith(("#", "&", "+", "!")):
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
|
||||
class Router:
|
||||
"""Central message hub linking clients to networks."""
|
||||
@@ -165,6 +218,9 @@ class Router:
|
||||
|
||||
async def _dispatch(self, network_name: str, msg: IRCMessage) -> None:
|
||||
"""Dispatch a network message to attached clients and backlog."""
|
||||
if _suppress(msg):
|
||||
return
|
||||
|
||||
# Store in backlog (raw, un-namespaced)
|
||||
if msg.command in BACKLOG_COMMANDS and msg.params:
|
||||
target = msg.params[0]
|
||||
@@ -204,6 +260,8 @@ class Router:
|
||||
params=[entry.target, entry.content],
|
||||
prefix=entry.sender,
|
||||
)
|
||||
if _suppress(msg):
|
||||
continue
|
||||
namespaced = encode_message(
|
||||
msg, network_name, own_nicks, client_nick=client.nick,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user