diff --git a/src/database/entities/channel.rs b/src/database/entities/channel.rs index b0a6cedd3a841144f7dcf54819de900af549b39b..6cef965de94c234c37ef924d6d9381af47421fed 100644 --- a/src/database/entities/channel.rs +++ b/src/database/entities/channel.rs @@ -63,6 +63,8 @@ pub enum Channel { description: Option<String>, #[serde(skip_serializing_if = "Option::is_none")] icon: Option<File>, + #[serde(skip_serializing_if = "Option::is_none")] + last_message: Option<String>, }, } diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index a5b6eb9fa677a5b44411c3a046ff2cbf45613a1e..3609110a626075124f17178510c51522e1489e78 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::<String>() + "short": text.chars().take(128).collect::<String>() } } } 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 13337efdcab368a92d2d4e5986aaf5849badcece..5f4eaf0cc18a7fe83b747485418503f08d658414 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<Vec<Member>> { + 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::<Vec<Document>>() + .await + .into_iter() + .filter_map(|x| from_document(x).ok()) + .collect::<Vec<Member>>()) + } + pub async fn fetch_member_ids(id: &str) -> Result<Vec<String>> { Ok(get_collection("server_members") .find( diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs index b4bd4073a6e169737149be69b4ef4de3519fb0af..e1d67b8099d6b86b52338ca1dc16af51f42b903e 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<Options>) -> Result<Json ids.remove(&user.id); let user_ids = ids.into_iter().collect(); + let users = user.fetch_multiple_users(user_ids).await?; - Ok(json!({ - "messages": messages, - "users": user.fetch_multiple_users(user_ids).await? - })) + if let Channel::TextChannel { server, .. } = target { + Ok(json!({ + "messages": messages, + "users": users, + "members": Server::fetch_members(&server).await? + })) + } else { + Ok(json!({ + "messages": messages, + "users": users, + })) + } } else { Ok(json!(messages)) } diff --git a/src/routes/root.rs b/src/routes/root.rs index c1f40087c8088aa870e0b7a4f158fc754d25dcf3..8256477f35ba6c0731b02177fdc1469c6fb651de 100644 --- a/src/routes/root.rs +++ b/src/routes/root.rs @@ -1,5 +1,5 @@ use crate::util::variables::{ - APP_URL, AUTUMN_URL, DISABLE_REGISTRATION, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, + APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, USE_AUTUMN, USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, VOSO_WS_HOST, }; @@ -12,7 +12,6 @@ pub async fn root() -> 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 28fb8e9bc943c5bec43c2d07f79342c8be9e70ae..5990d15420721565f7d9e1ee551fe8e97719a5b8 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<Data>) -> Result<JsonValue> 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 28d27c473702ab52fa1ed21b263b86a44927b311..12cd741ac04cd94f21f4652ddb881baa2abc8017 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<Data>) -> Result<JsonValue> { 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 9d4a136cbda329dc8a58b9e361e50b26827e2b61..77ac65a3a9565764472ba6032cbe19d6123ca78d 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()