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}