portal_solutions_debuff/
lib.rs

1#![no_std]
2
3use core::{ops::DerefMut, slice};
4
5use sha3::Digest;
6#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default)]
7pub struct DebuffManager<T: DerefMut<Target = [[u8; 32]]>> {
8    pub cage: T,
9}
10impl<T: DerefMut<Target = [[u8; 32]]>> DebuffManager<T> {
11    pub fn debuffed(&mut self, a: &str) -> bool {
12        let Some(q) = a
13            .split("&")
14            .flat_map(|s| s.split("?"))
15            .find_map(|a| a.strip_prefix("debuff="))
16        else {
17            return true;
18        };
19        let q: [u8; 32] = sha3::Sha3_256::digest(q).into();
20        let b = match self.cage.binary_search(&q) {
21            Ok(a) => {
22                self.cage[a] = [0u8; 32];
23                true
24            }
25            Err(_) => {
26                for c in self.cage.iter_mut() {
27                    if *c == [0u8; 32] {
28                        *c = q;
29                        break;
30                    }
31                }
32                false
33            }
34        };
35        match self.cage.deref_mut() {
36            mut s => {
37                let s = &mut *s;
38                s.sort_unstable();
39            }
40        };
41        b
42    }
43}