nickserv: SNOTICE names the service once per reply then uses plain *** continuations, so a long HELP is not the service name on every line
All checks were successful
CI / check (push) Successful in 3m47s

This commit is contained in:
Jean Chevronnet 2026-07-18 03:46:10 +00:00
parent 6429b82fc4
commit ce9c802d0a
No known key found for this signature in database

View file

@ -71,19 +71,26 @@ impl Engine {
out out
} }
// Rewrite each service→user NOTICE to a server-notice ("*** NickServ: …", // Rewrite each service→user NOTICE to a server-notice (sourced from our
// sourced from our server) for users who opted into SET SNOTICE. Everyone // server) for users who opted into SET SNOTICE; everyone else keeps a normal
// else's reply is left as a normal notice from the pseudoclient. Per target, // notice from the pseudoclient. A multi-line reply names the service once, on
// so notices to channels or to users who didn't opt in are untouched. // its first line ("*** NickServ: …"), and the rest are plain "*** …"
// continuations — so a long HELP isn't the service name on every row. Per
// target, so notices to channels or to users who didn't opt in are untouched.
fn apply_msg_style(&self, out: &mut [NetAction]) { fn apply_msg_style(&self, out: &mut [NetAction]) {
let mut named: std::collections::HashSet<(String, String)> = std::collections::HashSet::new();
for a in out.iter_mut() { for a in out.iter_mut() {
let NetAction::Notice { from, to, text } = a else { continue }; let NetAction::Notice { from, to, text } = a else { continue };
let Some(account) = self.network.account_of(to) else { continue }; let Some(account) = self.network.account_of(to) else { continue };
if !self.db.account_wants_snotice(account) { if !self.db.account_wants_snotice(account) {
continue; continue;
} }
let Some(nick) = self.services.iter().find(|s| s.uid() == *from).map(|s| s.nick()) else { continue }; let Some(nick) = self.services.iter().find(|s| s.uid() == *from).map(|s| s.nick().to_string()) else { continue };
*text = format!("*** {nick}: {text}"); *text = if named.insert((from.clone(), to.clone())) {
format!("*** {nick}: {text}")
} else {
format!("*** {text}")
};
*from = self.sid.clone(); *from = self.sid.clone();
} }
} }