Add message history module

This commit is contained in:
lemonsh 2022-07-17 19:15:38 +02:00
parent aaa3d1bc8a
commit 3eaaeb1244
1 changed files with 50 additions and 0 deletions

50
src/history.rs Normal file
View File

@ -0,0 +1,50 @@
use std::collections::{HashMap, VecDeque};
use anyhow::anyhow;
use tokio::sync::RwLock;
pub struct MessageHistory {
map: RwLock<HashMap<String, VecDeque<String>>>,
maxlen: usize
}
impl MessageHistory {
pub fn new(maxlen: usize) -> MessageHistory {
MessageHistory {
map: RwLock::new(HashMap::new()),
maxlen
}
}
pub fn max_len(&self) -> usize {
self.maxlen
}
pub async fn last_msg(&self, user: &str) -> Option<String> {
let map = self.map.read().await;
map.get(user).and_then(|d| d.get(0)).map(|s| s.to_string())
}
pub async fn last_msgs(&self, user: &str, count: usize) -> Option<Vec<String>> {
let map = self.map.read().await;
if let Some(deque) = map.get(user) {
let count = if deque.len() < count { deque.len() } else {count};
Some(deque.range(..count).rev().map(ToString::to_string).collect())
} else {
None
}
}
pub async fn add_message(&self, user: &str, message: &str) {
let mut map = self.map.write().await;
if let Some(deque) = map.get_mut(user) {
if deque.len() == self.maxlen {
deque.remove(deque.len()-1);
}
deque.push_front(message.to_string());
} else {
let mut deque = VecDeque::with_capacity(self.maxlen);
deque.push_front(message.to_string());
map.insert(user.to_string(), deque);
}
}
}