ircv3: close server-support-table gaps — BOT=B ISUPPORT, account-extban (a: matcher + ACCOUNTEXTBAN=a), draft/read-marker cap (gates MARKREAD sync), and no-implicit-names (suppress the post-JOIN NAMES burst)

This commit is contained in:
Jean Chevronnet 2026-08-18 15:56:59 +00:00
parent c9bd8e7492
commit bcd958d2d3
6 changed files with 75 additions and 5 deletions

View file

@ -964,7 +964,11 @@ impl Server {
let text = t.text.clone();
self.numeric(uid, RPL_TOPIC, &format!("{name} :{text}"));
}
self.send_names(uid, &key);
// no-implicit-names: a client that negotiated the cap doesn't want the
// automatic NAMES burst after JOIN (it asks with NAMES when it needs it).
if !self.users.get(&uid).map(|u| u.caps.no_implicit_names).unwrap_or(false) {
self.send_names(uid, &key);
}
self.replay_chanhistory(uid, &key); // +H: replay recent messages to the joiner
self.propagate_join(uid, name, is_new); // tell linked servers this user joined
self.events.push_back(Hook::Join(uid, key));
@ -1229,6 +1233,7 @@ impl Server {
list.iter().any(|b| {
if b.mask.as_bytes().get(1) == Some(&b':') {
match b.mask.as_bytes().first() {
Some(b'a') => crate::modules::accountban::matches(self, uid, &b.mask[2..]),
Some(b'g') => crate::modules::securitygroups::in_group(self, uid, &b.mask[2..]),
Some(b'y') => {
crate::modules::reputation::score_ban_match(self, uid, &b.mask[2..])