link: stop services re-locking +r on every join — track the registered channel mode, keep +r channels alive when empty, use ijoin not fjoin for incremental joins, and consume s2s channel-mode params through the registry

This commit is contained in:
Jean Chevronnet 2026-08-15 13:20:04 +00:00
parent 62f901bdc8
commit 3fa9737ccb
5 changed files with 92 additions and 26 deletions

View file

@ -29,7 +29,9 @@ fn set(s: &mut Server, uid: Uid, key: &str, on: bool) {
let sign = if on { '+' } else { '-' };
let name = s.channels.get(key).map(|c| c.name.clone()).unwrap_or_default();
s.to_channel(key, &format!(":{} MODE {name} {sign}y {nick}", s.name), None);
s.propagate(&format!(":{} MODE {name} {sign}y {nick}", s.sid), None);
// links: a timestamped FMODE (not a plain channel MODE), member named by uuid
let sid = s.sid.clone();
s.propagate_chan_mode(&sid, &name, &format!("{sign}y"), std::slice::from_ref(&nick));
}
/// Grant the oper prefix in `key` (used by ojoin and on-join auto-grant).