use std::cmp;
use rand::RngExt;
use crate::data::CHAR_MAX;
#[derive(Debug)]
pub struct Sequencer {
start: i32,
counter: i32,
}
impl Sequencer {
pub fn new(start: i32) -> Self {
Self { start, counter: 0 }
}
pub fn next_sequence(&mut self) -> i32 {
self.counter = (self.counter + 1) % 10;
self.start + self.counter
}
pub fn set_start(&mut self, start: i32) {
self.start = start;
}
pub fn get_start(&self) -> i32 {
self.start
}
}
pub fn generate_sequence_start() -> i32 {
let mut rng = rand::rng();
rng.random_range(0..=CHAR_MAX - 10)
}
pub fn get_init_sequence_bytes(start: i32) -> [i32; 2] {
let mut rng = rand::rng();
let seq1_min = cmp::max(0, (start - (CHAR_MAX - 1) + 13 + 6) / 7);
let seq1_max = (start + 13) / 7;
let seq1 = rng.random_range(0..=seq1_max - seq1_min) + seq1_min;
let seq2 = start - seq1 * 7 + 13;
[seq1, seq2]
}
pub fn get_init_sequence_start(s1: i32, s2: i32) -> i32 {
s1 * 7 + s2 - 13
}
pub fn get_ping_sequence_bytes(start: i32) -> [i32; 2] {
let mut rng = rand::rng();
let seq1_max = start + 252;
let seq1_min = start;
let seq1 = rng.random_range(seq1_min..=seq1_max);
let seq2 = seq1 - start;
[seq1, seq2]
}
pub fn get_ping_sequence_start(s1: i32, s2: i32) -> i32 {
s1 - s2
}