Skip to main content

manabrew_server/
chat.rs

1use std::collections::VecDeque;
2use std::time::{SystemTime, UNIX_EPOCH};
3
4use crate::protocol::{ChatMessage, CHAT_HISTORY_MAX_AGE_MS, CHAT_HISTORY_MAX_MESSAGES};
5
6#[derive(Debug, Default)]
7pub struct ChatHistory {
8    messages: VecDeque<ChatMessage>,
9}
10
11impl ChatHistory {
12    pub fn push(&mut self, message: ChatMessage) {
13        self.prune(message.sent_at_ms);
14        self.messages.push_back(message);
15        while self.messages.len() > CHAT_HISTORY_MAX_MESSAGES {
16            self.messages.pop_front();
17        }
18    }
19
20    pub fn snapshot(&mut self) -> Vec<ChatMessage> {
21        self.prune(unix_time_ms());
22        self.messages.iter().cloned().collect()
23    }
24
25    fn prune(&mut self, now_ms: u64) {
26        let cutoff = now_ms.saturating_sub(CHAT_HISTORY_MAX_AGE_MS);
27        while self.messages.front().is_some_and(|m| m.sent_at_ms < cutoff) {
28            self.messages.pop_front();
29        }
30    }
31}
32
33pub fn unix_time_ms() -> u64 {
34    SystemTime::now()
35        .duration_since(UNIX_EPOCH)
36        .map(|d| d.as_millis() as u64)
37        .unwrap_or_default()
38}