diff --git a/src/database/channel.rs b/src/database/channel.rs index a94a01ca..a7a8b3e4 100644 --- a/src/database/channel.rs +++ b/src/database/channel.rs @@ -139,36 +139,54 @@ impl<'r> FromParam<'r> for Channel { } } -/*pub fn test() { - use std::time::Instant; +use crate::notifications::events::Notification; - let now = Instant::now(); - let mut cache = CACHE.lock().unwrap(); - println!("I'm about to write 4 million entries to cache."); - for i in 0..4_000_000 { - let c = Channel { - id: "potato".to_string(), - channel_type: 0, +pub fn process_event(event: &Notification) { + match event { + Notification::group_user_join(ev) => { + let mut cache = CACHE.lock().unwrap(); + let entry = cache.pop(&ev.id); - active: None, - last_message: None, - description: None, - guild: None, - name: None, - owner: None, - recipients: None - }; + if entry.is_some() { + let mut channel = entry.unwrap(); + channel.recipients.as_mut().unwrap().push(ev.user.clone()); + cache.put(ev.id.clone(), channel); + } + } + Notification::group_user_leave(ev) => { + let mut cache = CACHE.lock().unwrap(); + let entry = cache.pop(&ev.id); - cache.put(format!("{}", i), c); + if entry.is_some() { + let mut channel = entry.unwrap(); + let recipients = channel.recipients.as_mut().unwrap(); + if let Some(pos) = recipients.iter().position(|x| *x == ev.user) { + recipients.remove(pos); + } + cache.put(ev.id.clone(), channel); + } + } + Notification::guild_channel_create(ev) => { + let mut cache = CACHE.lock().unwrap(); + cache.put( + ev.id.clone(), + Channel { + id: ev.channel.clone(), + channel_type: 2, + active: None, + last_message: None, + recipients: None, + owner: None, + guild: Some(ev.id.clone()), + name: Some(ev.name.clone()), + description: Some(ev.description.clone()) + } + ); + } + Notification::guild_channel_delete(ev) => { + let mut cache = CACHE.lock().unwrap(); + cache.pop(&ev.channel); + } + _ => {} } - - println!("It took {} seconds, roughly {}ms per entry.", now.elapsed().as_secs_f64(), now.elapsed().as_millis() as f64 / 1_000_000.0); - - let now = Instant::now(); - println!("Now I'm going to read every entry and immediately dispose of it."); - for i in 0..4_000_000 { - cache.get(&format!("{}", i)); - } - - println!("It took {} seconds, roughly {}ms per entry.", now.elapsed().as_secs_f64(), now.elapsed().as_millis() as f64 / 1_000_000.0); -}*/ +} diff --git a/src/notifications/events/mod.rs b/src/notifications/events/mod.rs index ec079fb1..4e9ba6b7 100644 --- a/src/notifications/events/mod.rs +++ b/src/notifications/events/mod.rs @@ -38,4 +38,8 @@ impl Notification { unreachable!() } } + + pub fn push_to_cache(&self) { + crate::database::channel::process_event(&self); + } } diff --git a/src/notifications/mod.rs b/src/notifications/mod.rs index 1e3baadc..897dec03 100644 --- a/src/notifications/mod.rs +++ b/src/notifications/mod.rs @@ -17,6 +17,8 @@ pub fn send_message>>, G: Into>>( let users = users.into(); let guild = guild.into(); + data.push_to_cache(); + if pubsub::send_message(users.clone(), guild.clone(), data.clone()) { state::send_message(users, guild, data.serialize());