From deffe663cb3539cce64b61cf8c00b2bceb422854 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 2 Sep 2022 15:32:11 +0100 Subject: [PATCH] feat: add ability to leave groups / servers silently --- .../src/routes/channels/channel_delete.rs | 25 +++++++++++++-- .../delta/src/routes/channels/channel_edit.rs | 2 ++ .../routes/channels/group_remove_member.rs | 2 +- .../delta/src/routes/servers/member_remove.rs | 2 +- .../delta/src/routes/servers/server_delete.rs | 25 +++++++++++++-- .../src/impl/generic/channels/channel.rs | 27 +++++++++------- .../quark/src/impl/generic/servers/server.rs | 31 ++++++++++--------- 7 files changed, 80 insertions(+), 34 deletions(-) diff --git a/crates/delta/src/routes/channels/channel_delete.rs b/crates/delta/src/routes/channels/channel_delete.rs index a31eeb0c..7b3638d6 100644 --- a/crates/delta/src/routes/channels/channel_delete.rs +++ b/crates/delta/src/routes/channels/channel_delete.rs @@ -2,13 +2,27 @@ use revolt_quark::{ models::{channel::PartialChannel, Channel, User}, perms, Db, EmptyResponse, Error, Permission, Ref, Result, }; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +/// # Query Parameters +#[derive(Validate, Serialize, Deserialize, JsonSchema, FromForm)] +pub struct OptionsChannelDelete { + /// Whether to not send a leave message + leave_silently: Option, +} /// # Close Channel /// /// Deletes a server channel, leaves a group or closes a group. #[openapi(tag = "Channel Information")] -#[delete("/")] -pub async fn req(db: &Db, user: User, target: Ref) -> Result { +#[delete("/?")] +pub async fn req( + db: &Db, + user: User, + target: Ref, + options: OptionsChannelDelete, +) -> Result { let mut channel = target.as_channel(db).await?; let mut perms = perms(&user).channel(&channel); perms.throw_permission(db, Permission::ViewChannel).await?; @@ -27,7 +41,12 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { .await .map(|_| EmptyResponse), Channel::Group { .. } => channel - .remove_user_from_group(db, &user.id, None) + .remove_user_from_group( + db, + &user.id, + None, + options.leave_silently.unwrap_or_default(), + ) .await .map(|_| EmptyResponse), Channel::TextChannel { .. } | Channel::VoiceChannel { .. } => { diff --git a/crates/delta/src/routes/channels/channel_edit.rs b/crates/delta/src/routes/channels/channel_edit.rs index 9af3b4e9..73c09690 100644 --- a/crates/delta/src/routes/channels/channel_edit.rs +++ b/crates/delta/src/routes/channels/channel_edit.rs @@ -29,6 +29,8 @@ pub struct DataEditChannel { icon: Option, /// Whether this channel is age-restricted nsfw: Option, + /// Whether this channel is archived + archived: Option, #[validate(length(min = 1))] remove: Option>, } diff --git a/crates/delta/src/routes/channels/group_remove_member.rs b/crates/delta/src/routes/channels/group_remove_member.rs index d342a219..5847e713 100644 --- a/crates/delta/src/routes/channels/group_remove_member.rs +++ b/crates/delta/src/routes/channels/group_remove_member.rs @@ -33,7 +33,7 @@ pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result Result, +} /// # Delete / Leave Server /// /// Deletes a server if owner otherwise leaves. #[openapi(tag = "Server Information")] -#[delete("/")] -pub async fn req(db: &Db, user: User, target: Ref) -> Result { +#[delete("/?")] +pub async fn req( + db: &Db, + user: User, + target: Ref, + options: OptionsServerDelete, +) -> Result { let server = target.as_server(db).await?; let member = db.fetch_member(&target.id, &user.id).await?; @@ -16,7 +30,12 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result { server.delete(db).await } else { server - .remove_member(db, member, RemovalIntention::Leave) + .remove_member( + db, + member, + RemovalIntention::Leave, + options.leave_silently.unwrap_or_default(), + ) .await } .map(|_| EmptyResponse) diff --git a/crates/quark/src/impl/generic/channels/channel.rs b/crates/quark/src/impl/generic/channels/channel.rs index 5cc39d59..65201ea8 100644 --- a/crates/quark/src/impl/generic/channels/channel.rs +++ b/crates/quark/src/impl/generic/channels/channel.rs @@ -286,6 +286,7 @@ impl Channel { db: &Database, user: &str, by: Option<&str>, + silent: bool, ) -> Result<()> { match &self { Channel::Group { @@ -329,20 +330,22 @@ impl Channel { .p(id.to_string()) .await; - if let Some(by) = by { - SystemMessage::UserRemove { - id: user.to_string(), - by: by.to_string(), - } - } else { - SystemMessage::UserLeft { - id: user.to_string(), + if !silent { + if let Some(by) = by { + SystemMessage::UserRemove { + id: user.to_string(), + by: by.to_string(), + } + } else { + SystemMessage::UserLeft { + id: user.to_string(), + } } + .into_message(id.to_string()) + .create(db, self, None) + .await + .ok(); } - .into_message(id.to_string()) - .create(db, self, None) - .await - .ok(); Ok(()) } diff --git a/crates/quark/src/impl/generic/servers/server.rs b/crates/quark/src/impl/generic/servers/server.rs index 63ec02c9..20b88f06 100644 --- a/crates/quark/src/impl/generic/servers/server.rs +++ b/crates/quark/src/impl/generic/servers/server.rs @@ -256,6 +256,7 @@ impl Server { db: &Database, member: Member, intention: RemovalIntention, + silent: bool, ) -> Result<()> { db.delete_member(&member.id).await?; @@ -266,20 +267,22 @@ impl Server { .p(member.id.server) .await; - if let Some(id) = self.system_messages.as_ref().and_then(|x| match intention { - RemovalIntention::Leave => x.user_left.as_ref(), - RemovalIntention::Kick => x.user_kicked.as_ref(), - RemovalIntention::Ban => x.user_banned.as_ref(), - }) { - match intention { - RemovalIntention::Leave => SystemMessage::UserLeft { id: member.id.user }, - RemovalIntention::Kick => SystemMessage::UserKicked { id: member.id.user }, - RemovalIntention::Ban => SystemMessage::UserBanned { id: member.id.user }, + if !silent { + if let Some(id) = self.system_messages.as_ref().and_then(|x| match intention { + RemovalIntention::Leave => x.user_left.as_ref(), + RemovalIntention::Kick => x.user_kicked.as_ref(), + RemovalIntention::Ban => x.user_banned.as_ref(), + }) { + match intention { + RemovalIntention::Leave => SystemMessage::UserLeft { id: member.id.user }, + RemovalIntention::Kick => SystemMessage::UserKicked { id: member.id.user }, + RemovalIntention::Ban => SystemMessage::UserBanned { id: member.id.user }, + } + .into_message(id.to_string()) + .create_no_web_push(db, id, false) + .await + .ok(); } - .into_message(id.to_string()) - .create_no_web_push(db, id, false) - .await - .ok(); } Ok(()) @@ -304,7 +307,7 @@ impl Server { member: Member, reason: Option, ) -> Result { - self.remove_member(db, member.clone(), RemovalIntention::Ban) + self.remove_member(db, member.clone(), RemovalIntention::Ban, false) .await?; self.ban_user(db, member.id, reason).await