diff --git a/src/builder/edit_current_appllication_info.rs b/src/builder/edit_current_appllication_info.rs new file mode 100644 index 00000000000..59750dab642 --- /dev/null +++ b/src/builder/edit_current_appllication_info.rs @@ -0,0 +1,182 @@ +use std::borrow::Cow; +use std::collections::HashMap; + +#[cfg(feature = "http")] +use crate::http::Http; +use crate::model::prelude::*; + +/// A builder for editing [`CurrentApplicationInfo`] i.e the current Application's information. +/// +/// The fields are optional, and only the ones explicitly set will be updated. +#[derive(Clone, Debug, Default, Serialize)] +#[must_use] +pub struct EditCurrentApplicationInfo<'a> { + /// Default custom authorization URL for the app, if enabled. + #[serde(skip_serializing_if = "Option::is_none")] + custom_install_url: Option>, + + /// Description of the app. + #[serde(skip_serializing_if = "Option::is_none")] + description: Option>, + + /// Role connection verification URL for the app. + #[serde(skip_serializing_if = "Option::is_none")] + role_connections_verification_url: Option>, + + /// Settings for the app's default in-app authorization link, if enabled. + #[serde(skip_serializing_if = "Option::is_none")] + install_params: Option, + + /// Default scopes and permissions for each supported installation context. + /// Value for each key is an integration type configuration object. + #[serde(skip_serializing_if = "Option::is_none")] + integration_types_config: Option>, + + /// App's public flags. + /// + /// Only limited intent flags (GATEWAY_PRESENCE_LIMITED, GATEWAY_GUILD_MEMBERS_LIMITED, + /// and GATEWAY_MESSAGE_CONTENT_LIMITED) can be updated via the API. + #[serde(skip_serializing_if = "Option::is_none")] + flags: Option, + + /// Icon for the app + #[serde(skip_serializing_if = "Option::is_none")] + icon: Option, + + /// Default rich presence invite cover image for the app. + #[serde(skip_serializing_if = "Option::is_none")] + cover_image: Option, + + /// Interactions endpoint URL for the app. + /// + /// To update an Interactions endpoint URL via the API, the URL must be valid according + /// to the [Receiving an Interaction] + /// (https://discord.com/developers/docs/interactions/receiving-and-responding#receiving-an-interaction) documentation. + #[serde(skip_serializing_if = "Option::is_none")] + interactions_endpoint_url: Option>, + + /// List of tags describing the content and functionality of the app (max of 20 characters per + /// tag). Max of 5 tags. + #[serde(skip_serializing_if = "Option::is_none")] + tags: Option>, + + /// Event webhooks URL for the app to receive webhook events. + #[serde(skip_serializing_if = "Option::is_none")] + event_webhooks_url: Option>, + + /// If webhook events are enabled for the app. 1 to disable, and 2 to enable. + #[serde(skip_serializing_if = "Option::is_none")] + event_webhook_status: Option, + + /// List of Webhook event types to subscribe to. + #[serde(skip_serializing_if = "Option::is_none")] + event_webhook_types: Option>, +} + +impl<'a> EditCurrentApplicationInfo<'a> { + /// Creates a new builder instance with all values set to None. + pub fn new() -> Self { + Self::default() + } + + /// Sets the custom installation URL. + pub fn install_url(mut self, url: impl Into>) -> Self { + self.custom_install_url = Some(url.into()); + self + } + + /// Sets the description of the application. + pub fn description(mut self, description: impl Into>) -> Self { + self.description = Some(description.into()); + self + } + + /// Sets the role connections verification URL. + pub fn verification_url(mut self, url: impl Into>) -> Self { + self.role_connections_verification_url = Some(url.into()); + self + } + + /// Sets the installation parameters for the application. + pub fn install_params(mut self, params: InstallParams) -> Self { + self.install_params = Some(params); + self + } + + /// Sets the integration types configuration. + pub fn integration_types_config( + mut self, + config: HashMap, + ) -> Self { + self.integration_types_config = Some(config); + self + } + + /// Sets the application flags. + pub fn flags(mut self, flags: ApplicationFlags) -> Self { + self.flags = Some(flags); + self + } + + /// Sets the application icon hash. + pub fn icon(mut self, hash: &str) -> Self { + if let Ok(image_hash) = hash.parse() { + self.icon = Some(image_hash); + } else { + println!("Error parsing image hash while constructing EditCurrentApplicationInfo"); + } + self + } + + /// Sets the cover image hash. + pub fn cover_image(mut self, hash: &str) -> Self { + if let Ok(image_hash) = hash.parse() { + self.cover_image = Some(image_hash); + } else { + println!("Error parsing image hash while constructing EditCurrentApplicationInfo"); + } + self + } + + /// Sets the interactions endpoint URL. + pub fn endpoint_url(mut self, url: impl Into>) -> Self { + self.interactions_endpoint_url = Some(url.into()); + self + } + + /// Sets the application tags. + pub fn tags(mut self, tags: Vec) -> Self { + self.tags = Some(tags); + self + } + + /// Sets the event webhooks URL. + pub fn webhooks_url(mut self, url: impl Into>) -> Self { + self.event_webhooks_url = Some(url.into()); + self + } + + /// Sets the event webhook status. + pub fn webhook_status(mut self, status: EventWebhookStatus) -> Self { + self.event_webhook_status = Some(status); + self + } + + /// Sets the event webhook types. + pub fn webhook_types(mut self, types: Vec) -> Self { + self.event_webhook_types = Some(types); + self + } + + /// Executes the builder, sending the configured application data to Discord. + /// Returns updated [`CurrentApplicationInfo`] on success. + /// + /// # Errors + /// + /// Returns an error if the HTTP request fails or if the Discord API + /// rejects the updated information. + #[cfg(feature = "http")] + pub async fn execute(self, http: &Http) -> Result { + http.edit_current_application_info(&self).await + } +} diff --git a/src/builder/mod.rs b/src/builder/mod.rs index d923cbcae63..0cf14030595 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -59,6 +59,7 @@ mod create_webhook; mod edit_automod_rule; mod edit_channel; mod edit_command; +mod edit_current_appllication_info; mod edit_guild; mod edit_guild_welcome_screen; mod edit_guild_widget; @@ -102,6 +103,7 @@ pub use create_webhook::*; pub use edit_automod_rule::*; pub use edit_channel::*; pub use edit_command::*; +pub use edit_current_appllication_info::*; pub use edit_guild::*; pub use edit_guild_welcome_screen::*; pub use edit_guild_widget::*;