manabrew-server 0.37.0

Matchmaking and lobby relay server for manabrew multiplayer
Documentation
use std::collections::VecDeque;
use std::time::{SystemTime, UNIX_EPOCH};

use crate::protocol::{ChatMessage, CHAT_HISTORY_MAX_AGE_MS, CHAT_HISTORY_MAX_MESSAGES};

#[derive(Debug, Default)]
pub struct ChatHistory {
    messages: VecDeque<ChatMessage>,
}

impl ChatHistory {
    pub fn push(&mut self, message: ChatMessage) {
        self.prune(message.sent_at_ms);
        self.messages.push_back(message);
        while self.messages.len() > CHAT_HISTORY_MAX_MESSAGES {
            self.messages.pop_front();
        }
    }

    pub fn snapshot(&mut self) -> Vec<ChatMessage> {
        self.prune(unix_time_ms());
        self.messages.iter().cloned().collect()
    }

    fn prune(&mut self, now_ms: u64) {
        let cutoff = now_ms.saturating_sub(CHAT_HISTORY_MAX_AGE_MS);
        while self.messages.front().is_some_and(|m| m.sent_at_ms < cutoff) {
            self.messages.pop_front();
        }
    }
}

pub fn unix_time_ms() -> u64 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map(|d| d.as_millis() as u64)
        .unwrap_or_default()
}