diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 4de99ff9dba54ab866b8b6920998cff440ab56e1..34b3bbfeebee40492dc4479652484e02e9706e00 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -268,7 +268,7 @@ impl Message { ClientboundNotification::MessageUpdate { id: self.id.clone(), channel: self.channel.clone(), - data, + data } .publish(channel); self.process_embed(); @@ -282,6 +282,8 @@ impl Message { } if let Content::Text(text) = &self.content { + // ! FIXME: re-write this at some point, + // ! or just before we allow user generated embeds let id = self.id.clone(); let content = text.clone(); let channel = self.channel.clone(); @@ -305,7 +307,7 @@ impl Message { ClientboundNotification::MessageUpdate { id, channel: channel.clone(), - data: json!({ "embeds": embeds }), + data: json!({ "embeds": embeds }) } .publish(channel); } diff --git a/src/notifications/events.rs b/src/notifications/events.rs index 4a105dc84c07e34c543fb3d8dd1d85c75e8604ac..6ed1aaa897b8f59fc9eeda0258845aa9a1cbfbb4 100644 --- a/src/notifications/events.rs +++ b/src/notifications/events.rs @@ -70,7 +70,7 @@ pub enum ClientboundNotification { MessageUpdate { id: String, channel: String, - data: JsonValue, + data: JsonValue }, MessageDelete { id: String, diff --git a/src/routes/channels/message_edit.rs b/src/routes/channels/message_edit.rs index 15cdc48d8f91133e5d7736f8a0774b24cb356fd3..d33d60bda243557182611a897b5490a43025d821 100644 --- a/src/routes/channels/message_edit.rs +++ b/src/routes/channels/message_edit.rs @@ -2,7 +2,7 @@ use crate::database::*; use crate::util::result::{Error, Result}; use chrono::Utc; -use mongodb::bson::{doc, Bson, DateTime}; +use mongodb::bson::{Bson, DateTime, Document, doc}; use rocket_contrib::json::Json; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -33,16 +33,37 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result< } let edited = Utc::now(); + let mut set = doc! { + "content": &edit.content, + "edited": Bson::DateTime(edited) + }; + + let mut update = json!({ "content": edit.content, "edited": DateTime(edited) }); + + if let Some(embeds) = &message.embeds { + let new_embeds: Vec<Document> = vec![]; + + for embed in embeds { + match embed { + Embed::Website(_) | + Embed::Image(_) | + Embed::None => { } + // Otherwise push to new_embeds. + } + } + + let obj = update.as_object_mut().unwrap(); + obj.insert("embeds".to_string(), json!(new_embeds).0); + set.insert("embeds", new_embeds); + } + get_collection("messages") .update_one( doc! { "_id": &message.id }, doc! { - "$set": { - "content": &edit.content, - "edited": Bson::DateTime(edited) - } + "$set": set }, None, ) @@ -53,6 +74,6 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result< })?; message - .publish_update(json!({ "content": edit.content, "edited": DateTime(edited) })) + .publish_update(update) .await }