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:
parent
b59fe70537
commit
65bedaf417
1 changed files with 9 additions and 2 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue