From aba0db268a4a3bcc98a7a6c2c18dc9e0ad73e6b8 Mon Sep 17 00:00:00 2001 From: Paul Makles <paulmakles@gmail.com> Date: Mon, 10 Aug 2020 15:29:48 +0200 Subject: [PATCH] Update cached channel state from notifications. --- src/database/channel.rs | 78 ++++++++++++++++++++------------- src/notifications/events/mod.rs | 4 ++ src/notifications/mod.rs | 2 + 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/src/database/channel.rs b/src/database/channel.rs index a94a01c..a7a8b3e 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; - - 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, - - active: None, - last_message: None, - description: None, - guild: None, - name: None, - owner: None, - recipients: None - }; - - cache.put(format!("{}", i), c); - } +use crate::notifications::events::Notification; - println!("It took {} seconds, roughly {}ms per entry.", now.elapsed().as_secs_f64(), now.elapsed().as_millis() as f64 / 1_000_000.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); - 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)); - } + 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); - println!("It took {} seconds, roughly {}ms per entry.", now.elapsed().as_secs_f64(), now.elapsed().as_millis() as f64 / 1_000_000.0); -}*/ + 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); + } + _ => {} + } +} diff --git a/src/notifications/events/mod.rs b/src/notifications/events/mod.rs index ec079fb..4e9ba6b 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 1e3baad..897dec0 100644 --- a/src/notifications/mod.rs +++ b/src/notifications/mod.rs @@ -17,6 +17,8 @@ pub fn send_message<U: Into<Option<Vec<String>>>, G: Into<Option<String>>>( 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()); -- GitLab