portal_solutions_debuff/
lib.rs1#![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}