From dd04b760a4fc90218597b9f02b8e3921b06dd874 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 22:46:44 +0200 Subject: [PATCH 1/6] Add Types --- src/types/entities/guild.rs | 105 +++++++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 6 deletions(-) diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index 3f59055..65fc986 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; + } +} From 09a83f1a1f26cc72c93cc5ff28602092ac26f510 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 22:46:58 +0200 Subject: [PATCH 2/6] Add GuildModifySchema --- src/types/schema/guild.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index 77c6725..b0d703b 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; use crate::types::entities::Channel; +use crate::types::Snowflake; #[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] #[serde(rename_all = "snake_case")] @@ -24,3 +25,20 @@ 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, +} From 24891b3fd58b9aa9aa2b8ba7160b4d2452d8717c Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 22:52:06 +0200 Subject: [PATCH 3/6] Complete GuildModifySchema --- src/types/schema/guild.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/types/schema/guild.rs b/src/types/schema/guild.rs index b0d703b..937c439 100644 --- a/src/types/schema/guild.rs +++ b/src/types/schema/guild.rs @@ -1,7 +1,11 @@ use serde::{Deserialize, Serialize}; use crate::types::entities::Channel; -use crate::types::Snowflake; +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")] @@ -40,5 +44,15 @@ pub struct GuildModifySchema { pub region: Option, pub afk_channel_id: Option, pub afk_timeout: Option, - pub verification_level: 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, } From 7eee08459bb41ba03125e8fb079032246783e32c Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 23:13:34 +0200 Subject: [PATCH 4/6] Add Guild::modify(); --- src/api/guilds/guilds.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) 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 { From 29d5fe947c159424ad1d59b4d7a698e5e00dab93 Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 23:24:06 +0200 Subject: [PATCH 5/6] Add modify_guild test --- tests/guilds.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) 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 +} From 5f532eff019fe6393067bf4c6b2994672d58da9e Mon Sep 17 00:00:00 2001 From: bitfl0wer Date: Sun, 20 Aug 2023 23:24:30 +0200 Subject: [PATCH 6/6] Fix deserialize error --- src/types/entities/guild.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types/entities/guild.rs b/src/types/entities/guild.rs index 65fc986..b6f3cd4 100644 --- a/src/types/entities/guild.rs +++ b/src/types/entities/guild.rs @@ -83,7 +83,7 @@ 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,