diff --git a/src/api/guilds/guilds.rs b/src/api/guilds/guilds.rs index d26c069..85a18b7 100644 --- a/src/api/guilds/guilds.rs +++ b/src/api/guilds/guilds.rs @@ -7,7 +7,9 @@ use crate::errors::ChorusError; use crate::errors::ChorusResult; use crate::instance::UserMeta; use crate::ratelimiter::ChorusRequest; -use crate::types::{Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema}; +use crate::types::{ + Channel, ChannelCreateSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildModifySchema, +}; use crate::types::{GuildBan, Snowflake}; impl Guild { @@ -161,6 +163,28 @@ impl Guild { .await?; Ok(response) } + + /// # Reference + /// + pub async fn modify( + guild_id: Snowflake, + schema: GuildModifySchema, + user: &mut UserMeta, + ) -> ChorusResult { + let chorus_request = ChorusRequest { + request: Client::new() + .patch(format!( + "{}/guilds/{}", + user.belongs_to.borrow().urls.api, + guild_id, + )) + .header("Authorization", user.token()) + .body(to_string(&schema).unwrap()), + limit_type: LimitType::Guild(guild_id), + }; + let response = chorus_request.deserialize_response::(user).await?; + Ok(response) + } } impl Channel { diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index 3f59055..b6f3cd4 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -14,6 +14,7 @@ use crate::types::{ utils::Snowflake, Composite, }; +use bitflags::bitflags; /// See #[derive(Serialize, Deserialize, Debug, Default, Clone, Updateable, Composite)] @@ -33,7 +34,7 @@ pub struct Guild { #[cfg_attr(feature = "sqlx", sqlx(skip))] #[observe_option_vec] pub channels: Option>>>, - pub default_message_notifications: Option, + pub default_message_notifications: Option, pub description: Option, pub discovery_splash: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] @@ -57,9 +58,9 @@ pub struct Guild { #[cfg_attr(feature = "sqlx", sqlx(skip))] pub max_stage_video_channel_users: Option, pub max_video_channel_users: Option, - pub mfa_level: Option, + pub mfa_level: Option, pub name: Option, - pub nsfw_level: Option, + pub nsfw_level: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] pub owner: Option, // True if requesting user is owner @@ -69,7 +70,7 @@ pub struct Guild { pub preferred_locale: Option, pub premium_progress_bar_enabled: Option, pub premium_subscription_count: Option, - pub premium_tier: Option, + pub premium_tier: Option, pub primary_category_id: Option, pub public_updates_channel_id: Option, pub region: Option, @@ -82,11 +83,11 @@ pub struct Guild { pub splash: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] pub stickers: Option>, - pub system_channel_flags: Option, + pub system_channel_flags: Option, pub system_channel_id: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] pub vanity_url_code: Option, - pub verification_level: Option, + pub verification_level: Option, #[cfg_attr(feature = "sqlx", sqlx(skip))] #[observe_option_vec] pub voice_states: Option>>>, @@ -199,3 +200,95 @@ pub enum GuildScheduledEventEntityType { pub struct GuildScheduledEventEntityMetadata { pub location: Option, } + +#[derive(Serialize, Deserialize, Debug, Default, Clone, Eq, PartialEq)] +pub struct VoiceRegion { + id: String, + name: String, + optimal: bool, + deprecated: bool, + custom: bool, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum MessageNotificationLevel { + #[default] + AllMessages = 0, + OnlyMentions = 1, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum ExplicitContentFilterLevel { + #[default] + Disabled = 0, + MembersWithoutRoles = 1, + AllMembers = 2, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum VerificationLevel { + #[default] + None = 0, + Low = 1, + Medium = 2, + High = 3, + VeryHigh = 4, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum MFALevel { + #[default] + None = 0, + Elevated = 1, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum NSFWLevel { + #[default] + Default = 0, + Explicit = 1, + Safe = 2, + AgeRestricted = 3, +} + +#[derive(Serialize_repr, Deserialize_repr, Debug, Default, Clone, Eq, PartialEq)] +#[repr(u8)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +/// See +pub enum PremiumTier { + #[default] + None = 0, + Tier1 = 1, + Tier2 = 2, + Tier3 = 3, +} + +bitflags! { + #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] + /// # Reference + /// See + pub struct SystemChannelFlags: u64 { + /// Indicates if an app uses the Auto Moderation API + const SUPPRESS_JOIN_NOTIFICATIONS = 1 << 0; + const SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1; + const SUPPRESS_GUILD_REMINDER_NOTIFICATIONS = 1 << 2; + const SUPPRESS_JOIN_NOTIFICATION_REPLIES = 1 << 3; + const SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATIONS = 1 << 4; + const SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATIONS_REPLIES = 1 << 5; + } +} diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index 77c6725..937c439 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -1,6 +1,11 @@ use serde::{Deserialize, Serialize}; use crate::types::entities::Channel; +use crate::types::types::guild_configuration::GuildFeatures; +use crate::types::{ + ExplicitContentFilterLevel, MessageNotificationLevel, Snowflake, SystemChannelFlags, + VerificationLevel, +}; #[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] #[serde(rename_all = "snake_case")] @@ -24,3 +29,30 @@ pub struct GuildBanCreateSchema { pub delete_message_days: Option, pub delete_message_seconds: Option, } + +#[derive(Debug, Deserialize, Serialize, Default, Clone, Eq, PartialEq)] +#[serde(rename_all = "snake_case")] +pub struct GuildModifySchema { + pub name: Option, + pub icon: Option>, + pub banner: Option>, + pub home_header: Option>, + pub splash: Option>, + pub discovery_splash: Option>, + pub owner_id: Option, + pub description: Option, + pub region: Option, + pub afk_channel_id: Option, + pub afk_timeout: Option, + pub verification_level: Option, + pub default_message_notifications: Option, + pub explicit_content_filter: Option, + pub features: Option>, + pub system_channel_id: Option, + pub system_channel_flags: Option, + pub rules_channel_id: Option, + pub public_updates_channel_id: Option, + pub safety_alerts_channel_id: Option, + pub preferred_locale: Option, + pub premium_progress_bar_enabled: Option, +} diff --git a/tests/guilds.rs b/tests/guilds.rs index 96e632a..8ae6596 100644 --- a/tests/guilds.rs +++ b/tests/guilds.rs @@ -1,4 +1,6 @@ -use chorus::types::{CreateChannelInviteSchema, Guild, GuildBanCreateSchema, GuildCreateSchema}; +use chorus::types::{ + CreateChannelInviteSchema, Guild, GuildBanCreateSchema, GuildCreateSchema, GuildModifySchema, +}; mod common; @@ -66,3 +68,18 @@ async fn guild_create_ban() { .is_err()); common::teardown(bundle).await } + +#[tokio::test] +async fn modify_guild() { + let mut bundle = common::setup().await; + let schema = GuildModifySchema { + name: Some("Mycoolguild".to_string()), + ..Default::default() + }; + let guild_id = bundle.guild.read().unwrap().id; + let result = Guild::modify(guild_id, schema, &mut bundle.user) + .await + .unwrap(); + assert_eq!(result.name.unwrap(), "Mycoolguild".to_string()); + common::teardown(bundle).await +}