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