diff --git a/src/builder/edit_current_application_info.rs b/src/builder/edit_current_application_info.rs new file mode 100644 index 00000000000..85327d45638 --- /dev/null +++ b/src/builder/edit_current_application_info.rs @@ -0,0 +1,184 @@ +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> { + #[serde(skip_serializing_if = "Option::is_none")] + custom_install_url: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + description: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + role_connections_verification_url: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + install_params: Option, + #[serde(skip_serializing_if = "Option::is_none")] + integration_types_config: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + flags: Option, + #[serde(skip_serializing_if = "Option::is_none")] + icon: Option, + #[serde(skip_serializing_if = "Option::is_none")] + cover_image: Option, + #[serde(skip_serializing_if = "Option::is_none")] + interactions_endpoint_url: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + tags: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + event_webhooks_url: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + event_webhook_status: Option, + #[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() + } + + /// Default custom authorization URL for the app, if enabled. + pub fn install_url(mut self, url: impl Into>) -> Self { + self.custom_install_url = Some(url.into()); + self + } + + /// Description of the app. + pub fn description(mut self, description: impl Into>) -> Self { + self.description = Some(description.into()); + self + } + + /// Role connection verification URL for the app. + pub fn verification_url(mut self, url: impl Into>) -> Self { + self.role_connections_verification_url = Some(url.into()); + self + } + + /// Settings for the app's default in-app authorization link, if enabled. + pub fn install_params(mut self, params: CreateInstallParams) -> Self { + self.install_params = Some(params); + self + } + + /// Default scopes and permissions for each supported installation context. + /// Value for each key is an integration type configuration object. + pub fn integration_types_config( + mut self, + config: HashMap, + ) -> Self { + self.integration_types_config = Some(config); + self + } + + /// 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. + pub fn flags(mut self, flags: ApplicationFlags) -> Self { + self.flags = Some(flags); + self + } + + /// Icon for the app + 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 + } + + /// Default rich presence invite cover image for the app. + 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 + } + + /// 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. + pub fn endpoint_url(mut self, url: impl Into>) -> Self { + self.interactions_endpoint_url = Some(url.into()); + self + } + + /// List of tags describing the content and functionality of the app (max of 20 characters per + /// tag). Max of 5 tags. + pub fn tags(mut self, tags: Vec) -> Self { + self.tags = Some(tags); + self + } + + /// Event webhooks URL for the app to receive webhook events. + pub fn webhooks_url(mut self, url: impl Into>) -> Self { + self.event_webhooks_url = Some(url.into()); + self + } + + /// If webhook events are enabled for the app. + pub fn webhook_status(mut self, status: EventWebhookStatus) -> Self { + self.event_webhook_status = Some(status); + self + } + + /// List of Webhook event types to subscribe to. + 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 + } +} + +#[derive(Clone, Debug, Default, Serialize)] +pub struct CreateInstallParams { + pub scopes: Vec, + pub permissions: Permissions, +} + +impl CreateInstallParams { + #[must_use] + pub fn new(mut self, scopes: Vec, permissions: Permissions) -> Self { + self.scopes = scopes; + self.permissions = permissions; + self + } + + #[must_use] + pub fn scopes(mut self, scopes: Vec) -> Self { + self.scopes = scopes; + self + } + + #[must_use] + pub fn permissions(mut self, permissions: Permissions) -> Self { + self.permissions = permissions; + self + } +} diff --git a/src/builder/mod.rs b/src/builder/mod.rs index d923cbcae63..0bf920884b9 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_application_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_application_info::*; pub use edit_guild::*; pub use edit_guild_welcome_screen::*; pub use edit_guild_widget::*; diff --git a/src/model/application/mod.rs b/src/model/application/mod.rs index 6b2853338d3..772d18de04a 100644 --- a/src/model/application/mod.rs +++ b/src/model/application/mod.rs @@ -296,7 +296,7 @@ bitflags! { /// Settings for the application's default in-app authorization link /// /// [Discord docs](https://discord.com/developers/docs/resources/application#install-params-object-install-params-structure). -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, Serialize, Deserialize)] #[non_exhaustive] pub struct InstallParams { pub scopes: FixedArray,