From e655f536415960d8e8c93b2396d52ddd8535fcd2 Mon Sep 17 00:00:00 2001
From: Paul <paulmakles@gmail.com>
Date: Sat, 31 Jul 2021 12:09:03 +0100
Subject: [PATCH] Fix embeds not re-generating properly on edit. Include own
 memberships in Ready payload.

---
 set_version.sh                      |  2 +-
 src/database/entities/user.rs       | 24 ++++++++++++++++++++++++
 src/notifications/events.rs         |  1 +
 src/notifications/payload.rs        |  7 ++++++-
 src/routes/channels/message_edit.rs |  3 ++-
 src/version.rs                      |  2 +-
 6 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/set_version.sh b/set_version.sh
index 3b4132d..23f0096 100755
--- a/set_version.sh
+++ b/set_version.sh
@@ -1,3 +1,3 @@
 #!/bin/bash
-export version=0.5.1-alpha.19
+export version=0.5.1-alpha.20
 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs
diff --git a/src/database/entities/user.rs b/src/database/entities/user.rs
index 520307c..4db5646 100644
--- a/src/database/entities/user.rs
+++ b/src/database/entities/user.rs
@@ -228,6 +228,30 @@ impl User {
         Ok(users)
     }
 
+    /// Utility function to get all of a user's memberships.
+    pub async fn fetch_memberships(id: &str) -> Result<Vec<Member>> {
+        Ok(get_collection("server_members")
+            .find(
+                doc! {
+                    "_id.user": id
+                },
+                None,
+            )
+            .await
+            .map_err(|_| Error::DatabaseError {
+                operation: "find",
+                with: "server_members",
+            })?
+            .filter_map(async move |s| s.ok())
+            .collect::<Vec<Document>>()
+            .await
+            .into_iter()
+            .filter_map(|x| {
+                from_document(x).ok()
+            })
+            .collect::<Vec<Member>>())
+    }
+
     /// Utility function to get all the server IDs the user is in.
     pub async fn fetch_server_ids(id: &str) -> Result<Vec<String>> {
         Ok(get_collection("server_members")
diff --git a/src/notifications/events.rs b/src/notifications/events.rs
index 6d3a407..f93925c 100644
--- a/src/notifications/events.rs
+++ b/src/notifications/events.rs
@@ -66,6 +66,7 @@ pub enum ClientboundNotification {
         users: Vec<User>,
         servers: Vec<Server>,
         channels: Vec<Channel>,
+        members: Vec<Member>
     },
 
     Message(Message),
diff --git a/src/notifications/payload.rs b/src/notifications/payload.rs
index d79a16c..f79d3fd 100644
--- a/src/notifications/payload.rs
+++ b/src/notifications/payload.rs
@@ -19,7 +19,11 @@ pub async fn generate_ready(mut user: User) -> Result<ClientboundNotification> {
         );
     }
 
-    let server_ids = User::fetch_server_ids(&user.id).await?;
+    let members = User::fetch_memberships(&user.id).await?;
+    let server_ids: Vec<String> = members.iter()
+        .map(|x| x.id.server.clone())
+        .collect();
+    
     let mut cursor = get_collection("servers")
         .find(
             doc! {
@@ -114,5 +118,6 @@ pub async fn generate_ready(mut user: User) -> Result<ClientboundNotification> {
         users,
         servers,
         channels,
+        members
     })
 }
diff --git a/src/routes/channels/message_edit.rs b/src/routes/channels/message_edit.rs
index a356a68..cf8f7f0 100644
--- a/src/routes/channels/message_edit.rs
+++ b/src/routes/channels/message_edit.rs
@@ -29,7 +29,7 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result<
         Err(Error::MissingPermission)?
     }
 
-    let message = msg.fetch_message(&channel).await?;
+    let mut message = msg.fetch_message(&channel).await?;
     if message.author != user.id {
         Err(Error::CannotEditMessage)?
     }
@@ -40,6 +40,7 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result<
         "edited": Bson::DateTime(edited)
     };
 
+    message.content = Content::Text(edit.content.clone());
     let mut update = json!({ "content": edit.content, "edited": DateTime(edited) });
 
     if let Some(embeds) = &message.embeds {
diff --git a/src/version.rs b/src/version.rs
index 24a1ed1..a16194b 100644
--- a/src/version.rs
+++ b/src/version.rs
@@ -1 +1 @@
-pub const VERSION: &str = "0.5.1-alpha.19";
+pub const VERSION: &str = "0.5.1-alpha.20";
-- 
GitLab