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