From 345c4c627c90dcc9101c96d53d910acda70c2794 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 3 Jan 2022 12:46:10 +0000 Subject: [PATCH 1/3] feat: add discoverability and analytics flags --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- set_version.sh | 2 +- src/database/entities/bots.rs | 8 ++++++++ src/database/entities/server.rs | 6 +++++- src/routes/bots/create.rs | 2 ++ src/routes/bots/edit.rs | 6 ++++++ src/routes/servers/server_create.rs | 4 +++- src/routes/servers/server_edit.rs | 10 +++++++--- src/version.rs | 2 +- 10 files changed, 36 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 45d21862..4ca2d84f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2852,7 +2852,7 @@ dependencies = [ [[package]] name = "rmp" version = "0.8.10" -source = "git+https://github.com/3Hren/msgpack-rust?rev=5bf2c24203ad422233cf35b7b7bfad9f7e811814#5bf2c24203ad422233cf35b7b7bfad9f7e811814" +source = "git+https://github.com/insertish/msgpack-rust?rev=5bf2c24203ad422233cf35b7b7bfad9f7e811814#5bf2c24203ad422233cf35b7b7bfad9f7e811814" dependencies = [ "byteorder", "num-traits", @@ -2861,7 +2861,7 @@ dependencies = [ [[package]] name = "rmp-serde" version = "0.15.5" -source = "git+https://github.com/3Hren/msgpack-rust?rev=5bf2c24203ad422233cf35b7b7bfad9f7e811814#5bf2c24203ad422233cf35b7b7bfad9f7e811814" +source = "git+https://github.com/insertish/msgpack-rust?rev=5bf2c24203ad422233cf35b7b7bfad9f7e811814#5bf2c24203ad422233cf35b7b7bfad9f7e811814" dependencies = [ "byteorder", "rmp", diff --git a/Cargo.toml b/Cargo.toml index fa80cfe0..749a9b82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ base64 = "0.13.0" serde_json = "1.0.57" serde = { version = "1.0.115", features = ["derive"] } validator = { version = "0.11", features = ["derive"] } -rmp-serde = { git = "https://github.com/3Hren/msgpack-rust", rev = "5bf2c24203ad422233cf35b7b7bfad9f7e811814" } +rmp-serde = { git = "https://github.com/insertish/msgpack-rust", rev = "5bf2c24203ad422233cf35b7b7bfad9f7e811814" } # async futures = "0.3.8" diff --git a/set_version.sh b/set_version.sh index eee299c7..06240d74 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.3-alpha.11 +export version=0.5.3-alpha.12 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/bots.rs b/src/database/entities/bots.rs index d99da9bf..d507615a 100644 --- a/src/database/entities/bots.rs +++ b/src/database/entities/bots.rs @@ -1,5 +1,9 @@ use serde::{Serialize, Deserialize}; +pub fn if_false(t: &bool) -> bool { + !t +} + #[derive(Serialize, Deserialize, Debug, Clone)] pub struct Bot { #[serde(rename = "_id")] @@ -7,6 +11,10 @@ pub struct Bot { pub owner: String, pub token: String, pub public: bool, + #[serde(skip_serializing_if = "if_false", default)] + pub analytics: bool, + #[serde(skip_serializing_if = "if_false", default)] + pub discoverable: bool, #[serde(skip_serializing_if = "Option::is_none")] pub interactions_url: Option, } diff --git a/src/database/entities/server.rs b/src/database/entities/server.rs index 880bb51c..d3832d92 100644 --- a/src/database/entities/server.rs +++ b/src/database/entities/server.rs @@ -110,7 +110,11 @@ pub struct Server { pub flags: Option, #[serde(skip_serializing_if = "if_false", default)] - pub nsfw: bool + pub nsfw: bool, + #[serde(skip_serializing_if = "if_false", default)] + pub analytics: bool, + #[serde(skip_serializing_if = "if_false", default)] + pub discoverable: bool } impl Server { diff --git a/src/routes/bots/create.rs b/src/routes/bots/create.rs index 8bb04041..4192a17f 100644 --- a/src/routes/bots/create.rs +++ b/src/routes/bots/create.rs @@ -48,6 +48,8 @@ pub async fn create_bot(user: User, info: Json) -> Result { owner: user.id.clone(), token, public: false, + analytics: false, + discoverable: false, interactions_url: None }; diff --git a/src/routes/bots/edit.rs b/src/routes/bots/edit.rs index 84fa853a..c562a28a 100644 --- a/src/routes/bots/edit.rs +++ b/src/routes/bots/edit.rs @@ -14,6 +14,7 @@ pub struct Data { #[serde(skip_serializing_if = "Option::is_none")] name: Option, public: Option, + analytics: Option, interactions_url: Option, remove: Option, } @@ -30,6 +31,7 @@ pub async fn edit_bot(user: User, target: Ref, data: Json) -> Result) -> Result) -> banner: None, flags: None, - nsfw: info.nsfw.unwrap_or_default() + nsfw: info.nsfw.unwrap_or_default(), + analytics: false, + discoverable: false, }; Channel::TextChannel { diff --git a/src/routes/servers/server_edit.rs b/src/routes/servers/server_edit.rs index 14d182f9..be1f8bea 100644 --- a/src/routes/servers/server_edit.rs +++ b/src/routes/servers/server_edit.rs @@ -18,8 +18,8 @@ pub struct Data { categories: Option>, system_messages: Option, remove: Option, - #[serde(skip_serializing_if = "Option::is_none")] - nsfw: Option + nsfw: Option, + analytics: Option, } #[patch("/", data = "")] @@ -28,7 +28,7 @@ pub async fn req(user: User, target: Ref, data: Json) -> Result) -> Result 0 { operations.insert("$set", &set); diff --git a/src/version.rs b/src/version.rs index 8b8b436c..35f921e9 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.3-alpha.11"; +pub const VERSION: &str = "0.5.3-alpha.12"; From ce68f7eeedb65835e34448781f0ea0f90a173d12 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 3 Jan 2022 15:21:12 +0000 Subject: [PATCH 2/3] fix: don't return all members on message query / search --- set_version.sh | 2 +- src/database/entities/server.rs | 24 ++++++++++++++++++++++++ src/database/entities/user.rs | 2 +- src/notifications/payload.rs | 2 +- src/routes/channels/members_fetch.rs | 2 +- src/routes/channels/message_query.rs | 4 ++-- src/routes/channels/message_search.rs | 8 ++++---- src/routes/servers/member_fetch_all.rs | 2 +- src/version.rs | 2 +- 9 files changed, 36 insertions(+), 12 deletions(-) diff --git a/set_version.sh b/set_version.sh index 06240d74..7b9e9d62 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.3-alpha.12 +export version=0.5.3-alpha.13 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/server.rs b/src/database/entities/server.rs index d3832d92..c92b370f 100644 --- a/src/database/entities/server.rs +++ b/src/database/entities/server.rs @@ -236,6 +236,30 @@ impl Server { .collect::>()) } + pub async fn fetch_members_with_ids(id: &str, ids: &Vec) -> Result> { + Ok(get_collection("server_members") + .find( + doc! { + "_id.server": id, + "_id.user": { + "$in": ids + } + }, + 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/database/entities/user.rs b/src/database/entities/user.rs index 060d4af9..1841de36 100644 --- a/src/database/entities/user.rs +++ b/src/database/entities/user.rs @@ -218,7 +218,7 @@ impl User { /// Utility function for fetching multiple users from the perspective of one. /// Assumes user has a mutual connection with others. - pub async fn fetch_multiple_users(&self, user_ids: Vec) -> Result> { + pub async fn fetch_multiple_users(&self, user_ids: &Vec) -> Result> { let mut users = vec![]; let mut cursor = get_collection("users") .find( diff --git a/src/notifications/payload.rs b/src/notifications/payload.rs index afc7cbaa..4a5704aa 100644 --- a/src/notifications/payload.rs +++ b/src/notifications/payload.rs @@ -104,7 +104,7 @@ pub async fn generate_ready(mut user: User) -> Result { user_ids.remove(&user.id); let mut users = if user_ids.len() > 0 { - user.fetch_multiple_users(user_ids.into_iter().collect::>()) + user.fetch_multiple_users(&user_ids.into_iter().collect::>()) .await? } else { vec![] diff --git a/src/routes/channels/members_fetch.rs b/src/routes/channels/members_fetch.rs index 1eabd8d4..4e4bc0d6 100644 --- a/src/routes/channels/members_fetch.rs +++ b/src/routes/channels/members_fetch.rs @@ -16,7 +16,7 @@ pub async fn req(user: User, target: Ref) -> Result { } if let Channel::Group { recipients, .. } = target { - Ok(json!(user.fetch_multiple_users(recipients).await?)) + Ok(json!(user.fetch_multiple_users(&recipients).await?)) } else { Err(Error::InvalidOperation) } diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs index 485c2cf8..f9f83e2b 100644 --- a/src/routes/channels/message_query.rs +++ b/src/routes/channels/message_query.rs @@ -166,13 +166,13 @@ pub async fn req(user: User, target: Ref, options: Options) -> Result { ids.remove(&user.id); let user_ids = ids.into_iter().collect(); - let users = user.fetch_multiple_users(user_ids).await?; + let 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? + "members": Server::fetch_members_with_ids(&server, &user_ids).await? })) } else { Ok(json!({ diff --git a/src/routes/channels/message_search.rs b/src/routes/channels/message_search.rs index 231e523e..e0df6b68 100644 --- a/src/routes/channels/message_search.rs +++ b/src/routes/channels/message_search.rs @@ -108,10 +108,10 @@ pub async fn req(user: User, target: Ref, options: Json) -> Result doc! { - "_id": -1 + "_id": -1 as i32 }, Sort::Oldest => doc! { - "_id": 1 + "_id": 1 as i32 } } ) @@ -142,13 +142,13 @@ pub async fn req(user: User, target: Ref, options: Json) -> Result Result { Ok(json!({ "members": members, - "users": user.fetch_multiple_users(member_ids).await? + "users": user.fetch_multiple_users(&member_ids).await? })) } diff --git a/src/version.rs b/src/version.rs index 35f921e9..e3168e31 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.3-alpha.12"; +pub const VERSION: &str = "0.5.3-alpha.13"; From c3f092aaefa1d0a097a101d23011e747c7d0b9d0 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Mon, 3 Jan 2022 15:26:29 +0000 Subject: [PATCH 3/3] feat(invite): allow direct invitation by id for discoverable servers --- src/database/guards/reference.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/database/guards/reference.rs b/src/database/guards/reference.rs index 2982833d..687dac30 100644 --- a/src/database/guards/reference.rs +++ b/src/database/guards/reference.rs @@ -58,7 +58,25 @@ impl Ref { } pub async fn fetch_invite(&self) -> Result { - self.fetch("channel_invites").await + match self.fetch("channel_invites").await { + Ok(invite) => Ok(invite), + Err(err) => { + if let Ok(server) = self.fetch::("servers").await { + if server.discoverable { + return Ok( + Invite::Server { + code: server.id.clone(), + server: server.id, + creator: server.owner, + channel: server.channels[0].clone(), + } + ) + } + } + + Err(err) + } + } } pub async fn fetch_bot(&self) -> Result {