refactor(core): use core crates for sending messages
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
use revolt_database::util::idempotency::IdempotencyKey;
|
||||
use revolt_quark::{
|
||||
models::{message::DataMessageSend, Message, User},
|
||||
perms,
|
||||
types::push::MessageAuthor,
|
||||
Db, Error, Permission, Ref, Result,
|
||||
use revolt_database::util::permissions::DatabasePermissionQuery;
|
||||
use revolt_database::{
|
||||
util::idempotency::IdempotencyKey, util::reference::Reference, Database, User,
|
||||
};
|
||||
|
||||
use revolt_database::{Interactions, Message};
|
||||
use revolt_models::v0;
|
||||
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||
use revolt_result::{create_error, Result};
|
||||
use rocket::serde::json::Json;
|
||||
use rocket::State;
|
||||
use validator::Validate;
|
||||
|
||||
/// # Send Message
|
||||
@@ -15,68 +16,63 @@ use validator::Validate;
|
||||
#[openapi(tag = "Messaging")]
|
||||
#[post("/<target>/messages", data = "<data>")]
|
||||
pub async fn message_send(
|
||||
db: &Db,
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
target: Ref,
|
||||
data: Json<DataMessageSend>,
|
||||
target: Reference,
|
||||
data: Json<v0::DataMessageSend>,
|
||||
idempotency: IdempotencyKey,
|
||||
) -> Result<Json<Message>> {
|
||||
) -> Result<Json<v0::Message>> {
|
||||
let data = data.into_inner();
|
||||
data.validate()
|
||||
.map_err(|error| Error::FailedValidation { error })?;
|
||||
data.validate().map_err(|error| {
|
||||
create_error!(FailedValidation {
|
||||
error: error.to_string()
|
||||
})
|
||||
})?;
|
||||
|
||||
// Ensure we have permissions to send a message
|
||||
let channel = target.as_channel(db).await?;
|
||||
|
||||
let mut permissions = perms(&user).channel(&channel);
|
||||
permissions
|
||||
.throw_permission_and_view_channel(db, Permission::SendMessage)
|
||||
.await?;
|
||||
let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel);
|
||||
let permissions = calculate_channel_permissions(&mut query).await;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::SendMessage)?;
|
||||
|
||||
// Verify permissions for masquerade
|
||||
if let Some(masq) = &data.masquerade {
|
||||
permissions
|
||||
.throw_permission(db, Permission::Masquerade)
|
||||
.await?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::Masquerade)?;
|
||||
|
||||
if masq.colour.is_some() {
|
||||
permissions
|
||||
.throw_permission(db, Permission::ManageRole)
|
||||
.await?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::ManageRole)?;
|
||||
}
|
||||
}
|
||||
|
||||
// Check permissions for embeds
|
||||
if data.embeds.as_ref().is_some_and(|v| !v.is_empty()) {
|
||||
permissions
|
||||
.throw_permission(db, Permission::SendEmbeds)
|
||||
.await?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::SendEmbeds)?;
|
||||
}
|
||||
|
||||
// Check permissions for files
|
||||
if data.attachments.as_ref().is_some_and(|v| !v.is_empty()) {
|
||||
permissions
|
||||
.throw_permission(db, Permission::UploadFiles)
|
||||
.await?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::UploadFiles)?;
|
||||
}
|
||||
|
||||
// Ensure interactions information is correct
|
||||
if let Some(interactions) = &data.interactions {
|
||||
interactions.validate(db, &mut permissions).await?;
|
||||
let interactions: Interactions = interactions.clone().into();
|
||||
interactions.validate(db, &permissions).await?;
|
||||
}
|
||||
|
||||
// Create the message
|
||||
let message = channel
|
||||
.send_message(
|
||||
let author: v0::User = user.clone().into(Some(&user)).await;
|
||||
Ok(Json(
|
||||
Message::create_from_api(
|
||||
db,
|
||||
channel,
|
||||
data,
|
||||
MessageAuthor::User(&user),
|
||||
v0::MessageAuthor::User(&author),
|
||||
idempotency,
|
||||
permissions
|
||||
.has_permission(db, Permission::SendEmbeds)
|
||||
.await?,
|
||||
true,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(Json(message))
|
||||
.await?
|
||||
.into(),
|
||||
))
|
||||
}
|
||||
|
||||
@@ -31,35 +31,37 @@ pub async fn webhook_execute(
|
||||
let webhook = webhook_id.as_webhook(db).await?;
|
||||
webhook.assert_token(&token)?;
|
||||
|
||||
let mut value: PermissionValue = webhook.permissions.into();
|
||||
value.throw_if_lacking_channel_permission(ChannelPermission::SendMessage)?;
|
||||
let permissions: PermissionValue = webhook.permissions.into();
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::SendMessage)?;
|
||||
|
||||
if data.attachments.as_ref().map_or(false, |v| !v.is_empty()) {
|
||||
value.throw_if_lacking_channel_permission(ChannelPermission::UploadFiles)?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::UploadFiles)?;
|
||||
}
|
||||
|
||||
if data.embeds.as_ref().map_or(false, |v| !v.is_empty()) {
|
||||
value.throw_if_lacking_channel_permission(ChannelPermission::SendEmbeds)?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::SendEmbeds)?;
|
||||
}
|
||||
|
||||
if data.masquerade.is_some() {
|
||||
value.throw_if_lacking_channel_permission(ChannelPermission::Masquerade)?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::Masquerade)?;
|
||||
}
|
||||
|
||||
if data.interactions.is_some() {
|
||||
value.throw_if_lacking_channel_permission(ChannelPermission::React)?;
|
||||
permissions.throw_if_lacking_channel_permission(ChannelPermission::React)?;
|
||||
}
|
||||
|
||||
let channel = db.fetch_channel(&webhook.channel_id).await?;
|
||||
let message = Message::create_from_api(
|
||||
db,
|
||||
channel,
|
||||
data,
|
||||
v0::MessageAuthor::Webhook(&webhook.into()),
|
||||
idempotency,
|
||||
true,
|
||||
)
|
||||
.await?;
|
||||
|
||||
Ok(Json(message.into()))
|
||||
Ok(Json(
|
||||
Message::create_from_api(
|
||||
db,
|
||||
channel,
|
||||
data,
|
||||
v0::MessageAuthor::Webhook(&webhook.into()),
|
||||
idempotency,
|
||||
true,
|
||||
)
|
||||
.await?
|
||||
.into(),
|
||||
))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user