forked from jmug/stoatchat
Merge remote-tracking branch 'origin/main' into chore/utoipa
This commit is contained in:
@@ -1,4 +1,8 @@
|
||||
use revolt_database::{util::reference::Reference, Channel, Database, User, AMQP};
|
||||
use revolt_database::{
|
||||
util::reference::Reference,
|
||||
voice::{is_in_voice_channel, remove_user_from_voice_channel, VoiceClient},
|
||||
Channel, Database, User, AMQP,
|
||||
};
|
||||
use revolt_permissions::ChannelPermission;
|
||||
use revolt_result::{create_error, Result};
|
||||
|
||||
@@ -18,6 +22,7 @@ use rocket_empty::EmptyResponse;
|
||||
#[delete("/<target>/recipients/<member>")]
|
||||
pub async fn remove_member(
|
||||
db: &State<Database>,
|
||||
voice_client: &State<VoiceClient>,
|
||||
amqp: &State<AMQP>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
@@ -29,32 +34,37 @@ pub async fn remove_member(
|
||||
|
||||
let channel = target.as_channel(db).await?;
|
||||
|
||||
match &channel {
|
||||
Channel::Group {
|
||||
owner, recipients, ..
|
||||
} => {
|
||||
if &user.id != owner {
|
||||
return Err(create_error!(MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel.to_string()
|
||||
}));
|
||||
}
|
||||
|
||||
let member = member.as_user(db).await?;
|
||||
if user.id == member.id {
|
||||
return Err(create_error!(CannotRemoveYourself));
|
||||
}
|
||||
|
||||
if !recipients.iter().any(|x| *x == member.id) {
|
||||
return Err(create_error!(NotInGroup));
|
||||
}
|
||||
|
||||
channel
|
||||
.remove_user_from_group(db, amqp, &member, Some(&user.id), false)
|
||||
.await
|
||||
.map(|_| EmptyResponse)
|
||||
if let Channel::Group {
|
||||
owner, recipients, ..
|
||||
} = &channel
|
||||
{
|
||||
if &user.id != owner {
|
||||
return Err(create_error!(MissingPermission {
|
||||
permission: ChannelPermission::ManageChannel.to_string()
|
||||
}));
|
||||
}
|
||||
_ => Err(create_error!(InvalidOperation)),
|
||||
}
|
||||
|
||||
let member = member.as_user(db).await?;
|
||||
if user.id == member.id {
|
||||
return Err(create_error!(CannotRemoveYourself));
|
||||
}
|
||||
|
||||
if !recipients.contains(&member.id) {
|
||||
return Err(create_error!(NotInGroup));
|
||||
}
|
||||
|
||||
channel
|
||||
.remove_user_from_group(db, amqp, &member, Some(&user.id), false)
|
||||
.await?;
|
||||
} else {
|
||||
return Err(create_error!(InvalidOperation));
|
||||
};
|
||||
|
||||
if is_in_voice_channel(&member.id, channel.id()).await? {
|
||||
remove_user_from_voice_channel(db, voice_client, channel.id(), &member.id).await?;
|
||||
};
|
||||
|
||||
Ok(EmptyResponse)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
||||
Reference in New Issue
Block a user