hidemode: resolve each changed mode's hidden-rank once and each member's rank once, instead of re-scanning the hidemode config for every (member x change) pair on the MODE broadcast hot path

This commit is contained in:
Jean Chevronnet 2026-08-19 01:23:33 +00:00
parent b59fe70537
commit 65bedaf417

View file

@ -66,14 +66,21 @@ pub fn broadcast(
.get(key) .get(key)
.map(|c| c.members.keys().copied().collect()) .map(|c| c.members.keys().copied().collect())
.unwrap_or_default(); .unwrap_or_default();
// resolve each changed mode's hidden-rank once (a config scan) rather than
// re-scanning `hidemode` for every (member × change) pair.
let hidden: Vec<Option<u8>> = changes.iter().map(|(_, c, _)| hidden_rank(s, *c)).collect();
for m in members { for m in members {
let privileged = m == setter || s.is_oper(m); let privileged = m == setter || s.is_oper(m);
// compute this member's rank once, not once per changed mode
let mrank = if privileged { u8::MAX } else { s.rank(m, key) };
let visible: Vec<&(char, char, Option<String>)> = changes let visible: Vec<&(char, char, Option<String>)> = changes
.iter() .iter()
.filter(|(_, c, _)| match hidden_rank(s, *c) { .enumerate()
.filter(|(i, _)| match hidden[*i] {
None => true, None => true,
Some(req) => privileged || s.rank(m, key) >= req, Some(req) => mrank >= req,
}) })
.map(|(_, ch)| ch)
.collect(); .collect();
if visible.is_empty() { if visible.is_empty() {
continue; continue;