diff --git a/src/database/entities/channel.rs b/src/database/entities/channel.rs index b0a6cedd..6cef965d 100644 --- a/src/database/entities/channel.rs +++ b/src/database/entities/channel.rs @@ -63,6 +63,8 @@ pub enum Channel { description: Option, #[serde(skip_serializing_if = "Option::is_none")] icon: Option, + #[serde(skip_serializing_if = "Option::is_none")] + last_message: Option, }, } diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index a5b6eb9f..3609110a 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -90,7 +90,7 @@ impl Message { "last_message": { "_id": self.id.clone(), "author": self.author.clone(), - "short": text.chars().take(24).collect::() + "short": text.chars().take(128).collect::() } } } else { @@ -133,6 +133,25 @@ impl Message { })?; } } + Channel::TextChannel { id, .. } => { + if let Content::Text(_) = &self.content { + channels + .update_one( + doc! { "_id": id }, + doc! { + "$set": { + "last_message": &self.id + } + }, + None, + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "update_one", + with: "channel", + })?; + } + } _ => {} } diff --git a/src/database/entities/server.rs b/src/database/entities/server.rs index 13337efd..5f4eaf0c 100644 --- a/src/database/entities/server.rs +++ b/src/database/entities/server.rs @@ -3,6 +3,7 @@ use crate::notifications::events::ClientboundNotification; use crate::util::result::{Error, Result}; use futures::StreamExt; use mongodb::bson::doc; +use mongodb::bson::from_document; use mongodb::bson::to_document; use mongodb::bson::Document; use mongodb::options::FindOptions; @@ -148,7 +149,7 @@ impl Server { })?; // Delete all channels, members, bans and invites. - for with in ["channels", "invites"] { + for with in &["channels", "invites"] { get_collection(with) .delete_many( doc! { @@ -163,7 +164,7 @@ impl Server { })?; } - for with in ["server_members", "server_bans"] { + for with in &["server_members", "server_bans"] { get_collection(with) .delete_many( doc! { @@ -207,6 +208,27 @@ impl Server { Ok(()) } + pub async fn fetch_members(id: &str) -> Result> { + Ok(get_collection("server_members") + .find( + doc! { + "_id.server": id + }, + None, + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "find", + with: "server_members", + })? + .filter_map(async move |s| s.ok()) + .collect::>() + .await + .into_iter() + .filter_map(|x| from_document(x).ok()) + .collect::>()) + } + pub async fn fetch_member_ids(id: &str) -> Result> { Ok(get_collection("server_members") .find( diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs index b4bd4073..e1d67b80 100644 --- a/src/routes/channels/message_query.rs +++ b/src/routes/channels/message_query.rs @@ -98,11 +98,20 @@ pub async fn req(user: User, target: Ref, options: Form) -> Result JsonValue { json!({ "revolt": crate::version::VERSION, "features": { - "registration": !*DISABLE_REGISTRATION, "captcha": { "enabled": *USE_HCAPTCHA, "key": HCAPTCHA_SITEKEY.to_string() diff --git a/src/routes/servers/channel_create.rs b/src/routes/servers/channel_create.rs index 28fb8e9b..5990d154 100644 --- a/src/routes/servers/channel_create.rs +++ b/src/routes/servers/channel_create.rs @@ -60,6 +60,7 @@ pub async fn req(user: User, target: Ref, info: Json) -> Result name: info.name, description: info.description, icon: None, + last_message: None }; channel.clone().publish().await?; diff --git a/src/routes/servers/server_create.rs b/src/routes/servers/server_create.rs index 28d27c47..12cd741a 100644 --- a/src/routes/servers/server_create.rs +++ b/src/routes/servers/server_create.rs @@ -64,6 +64,7 @@ pub async fn req(user: User, info: Json) -> Result { name: "general".to_string(), description: None, icon: None, + last_message: None } .publish() .await?; diff --git a/src/util/variables.rs b/src/util/variables.rs index 9d4a136c..77ac65a3 100644 --- a/src/util/variables.rs +++ b/src/util/variables.rs @@ -37,7 +37,6 @@ lazy_static! { env::var("REVOLT_VAPID_PUBLIC_KEY").expect("Missing REVOLT_VAPID_PUBLIC_KEY environment variable."); // Application Flags - pub static ref DISABLE_REGISTRATION: bool = env::var("REVOLT_DISABLE_REGISTRATION").map_or(false, |v| v == "1"); pub static ref INVITE_ONLY: bool = env::var("REVOLT_INVITE_ONLY").map_or(false, |v| v == "1"); pub static ref USE_EMAIL: bool = env::var("REVOLT_USE_EMAIL_VERIFICATION").map_or( env::var("REVOLT_SMTP_HOST").is_ok()