use serde::Serialize;
#[cfg(feature = "model")]
use crate::builder::{
Builder,
CreateInteractionResponse,
CreateInteractionResponseFollowup,
CreateInteractionResponseMessage,
EditInteractionResponse,
};
#[cfg(feature = "model")]
use crate::http::{CacheHttp, Http};
use crate::internal::prelude::*;
use crate::model::prelude::*;
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(remote = "Self")]
#[non_exhaustive]
pub struct ModalInteraction {
pub id: InteractionId,
pub application_id: ApplicationId,
pub data: ModalInteractionData,
#[serde(skip_serializing_if = "Option::is_none")]
pub guild_id: Option<GuildId>,
pub channel: Option<PartialChannel>,
pub channel_id: ChannelId,
#[serde(skip_serializing_if = "Option::is_none")]
pub member: Option<Member>,
#[serde(default)]
pub user: User,
pub token: String,
pub version: u8,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<Box<Message>>,
pub app_permissions: Option<Permissions>,
pub locale: String,
pub guild_locale: Option<String>,
pub entitlements: Vec<Entitlement>,
}
#[cfg(feature = "model")]
impl ModalInteraction {
pub async fn get_response(&self, http: impl AsRef<Http>) -> Result<Message> {
http.as_ref().get_original_interaction_response(&self.token).await
}
pub async fn create_response(
&self,
cache_http: impl CacheHttp,
builder: CreateInteractionResponse,
) -> Result<()> {
builder.execute(cache_http, (self.id, &self.token)).await
}
pub async fn edit_response(
&self,
cache_http: impl CacheHttp,
builder: EditInteractionResponse,
) -> Result<Message> {
builder.execute(cache_http, &self.token).await
}
pub async fn delete_response(&self, http: impl AsRef<Http>) -> Result<()> {
http.as_ref().delete_original_interaction_response(&self.token).await
}
pub async fn create_followup(
&self,
cache_http: impl CacheHttp,
builder: CreateInteractionResponseFollowup,
) -> Result<Message> {
builder.execute(cache_http, (None, &self.token)).await
}
pub async fn edit_followup(
&self,
cache_http: impl CacheHttp,
message_id: impl Into<MessageId>,
builder: CreateInteractionResponseFollowup,
) -> Result<Message> {
builder.execute(cache_http, (Some(message_id.into()), &self.token)).await
}
pub async fn delete_followup<M: Into<MessageId>>(
&self,
http: impl AsRef<Http>,
message_id: M,
) -> Result<()> {
http.as_ref().delete_followup_message(&self.token, message_id.into()).await
}
pub async fn defer(&self, cache_http: impl CacheHttp) -> Result<()> {
self.create_response(cache_http, CreateInteractionResponse::Acknowledge).await
}
pub async fn defer_ephemeral(&self, cache_http: impl CacheHttp) -> Result<()> {
let builder = CreateInteractionResponse::Defer(
CreateInteractionResponseMessage::new().ephemeral(true),
);
self.create_response(cache_http, builder).await
}
}
impl<'de> Deserialize<'de> for ModalInteraction {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> StdResult<Self, D::Error> {
let mut interaction = Self::deserialize(deserializer)?; if let (Some(guild_id), Some(member)) = (interaction.guild_id, &mut interaction.member) {
member.guild_id = guild_id;
interaction.user = member.user.clone();
}
Ok(interaction)
}
}
impl Serialize for ModalInteraction {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> StdResult<S::Ok, S::Error> {
Self::serialize(self, serializer) }
}
#[cfg_attr(feature = "typesize", derive(typesize::derive::TypeSize))]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[non_exhaustive]
pub struct ModalInteractionData {
pub custom_id: String,
pub components: Vec<ActionRow>,
}