From 65bedaf417ed5d00555adb0b6f5dbd6662468a14 Mon Sep 17 00:00:00 2001 From: reverse Date: Wed, 19 Aug 2026 01:23:33 +0000 Subject: [PATCH] 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 --- src/modules/hidemode.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/modules/hidemode.rs b/src/modules/hidemode.rs index 83b1182..1fb7d6d 100644 --- a/src/modules/hidemode.rs +++ b/src/modules/hidemode.rs @@ -66,14 +66,21 @@ pub fn broadcast( .get(key) .map(|c| c.members.keys().copied().collect()) .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> = changes.iter().map(|(_, c, _)| hidden_rank(s, *c)).collect(); for m in members { 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)> = changes .iter() - .filter(|(_, c, _)| match hidden_rank(s, *c) { + .enumerate() + .filter(|(i, _)| match hidden[*i] { None => true, - Some(req) => privileged || s.rank(m, key) >= req, + Some(req) => mrank >= req, }) + .map(|(_, ch)| ch) .collect(); if visible.is_empty() { continue;