Bitfl0wer/issue289 (#400)

Closes #289
This commit is contained in:
Flori 2023-08-20 23:30:00 +02:00 committed by GitHub
commit 391dcb6bf4
4 changed files with 174 additions and 8 deletions

View File

@ -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
/// <https://discord-userdoccers.vercel.app/resources/guild#modify-guild>
pub async fn modify(
guild_id: Snowflake,
schema: GuildModifySchema,
user: &mut UserMeta,
) -> ChorusResult<Guild> {
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::<Guild>(user).await?;
Ok(response)
}
}
impl Channel {

View File

@ -14,6 +14,7 @@ use crate::types::{
utils::Snowflake,
Composite,
};
use bitflags::bitflags;
/// See <https://discord.com/developers/docs/resources/guild>
#[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<Vec<Arc<RwLock<Channel>>>>,
pub default_message_notifications: Option<i32>,
pub default_message_notifications: Option<MessageNotificationLevel>,
pub description: Option<String>,
pub discovery_splash: Option<String>,
#[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<i32>,
pub max_video_channel_users: Option<i32>,
pub mfa_level: Option<i32>,
pub mfa_level: Option<MFALevel>,
pub name: Option<String>,
pub nsfw_level: Option<i32>,
pub nsfw_level: Option<NSFWLevel>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub owner: Option<bool>,
// True if requesting user is owner
@ -69,7 +70,7 @@ pub struct Guild {
pub preferred_locale: Option<String>,
pub premium_progress_bar_enabled: Option<bool>,
pub premium_subscription_count: Option<i32>,
pub premium_tier: Option<i32>,
pub premium_tier: Option<PremiumTier>,
pub primary_category_id: Option<Snowflake>,
pub public_updates_channel_id: Option<Snowflake>,
pub region: Option<String>,
@ -82,11 +83,11 @@ pub struct Guild {
pub splash: Option<String>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub stickers: Option<Vec<Sticker>>,
pub system_channel_flags: Option<i32>,
pub system_channel_flags: Option<u64>,
pub system_channel_id: Option<Snowflake>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
pub vanity_url_code: Option<String>,
pub verification_level: Option<i32>,
pub verification_level: Option<VerificationLevel>,
#[cfg_attr(feature = "sqlx", sqlx(skip))]
#[observe_option_vec]
pub voice_states: Option<Vec<Arc<RwLock<VoiceState>>>>,
@ -199,3 +200,95 @@ pub enum GuildScheduledEventEntityType {
pub struct GuildScheduledEventEntityMetadata {
pub location: Option<String>,
}
#[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 <https://discord-userdoccers.vercel.app/resources/guild#message-notification-level>
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 <https://discord-userdoccers.vercel.app/resources/guild#explicit-content-filter-level>
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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
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 <https://discord-userdoccers.vercel.app/resources/guild#verification-level>
pub enum PremiumTier {
#[default]
None = 0,
Tier1 = 1,
Tier2 = 2,
Tier3 = 3,
}
bitflags! {
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
/// # Reference
/// See <https://discord-userdoccers.vercel.app/resources/guild#system-channel-flags>
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;
}
}

View File

@ -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<u8>,
pub delete_message_seconds: Option<u32>,
}
#[derive(Debug, Deserialize, Serialize, Default, Clone, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct GuildModifySchema {
pub name: Option<String>,
pub icon: Option<Vec<u8>>,
pub banner: Option<Vec<u8>>,
pub home_header: Option<Vec<u8>>,
pub splash: Option<Vec<u8>>,
pub discovery_splash: Option<Vec<u8>>,
pub owner_id: Option<Snowflake>,
pub description: Option<String>,
pub region: Option<String>,
pub afk_channel_id: Option<Snowflake>,
pub afk_timeout: Option<u16>,
pub verification_level: Option<VerificationLevel>,
pub default_message_notifications: Option<MessageNotificationLevel>,
pub explicit_content_filter: Option<ExplicitContentFilterLevel>,
pub features: Option<Vec<GuildFeatures>>,
pub system_channel_id: Option<Snowflake>,
pub system_channel_flags: Option<SystemChannelFlags>,
pub rules_channel_id: Option<Snowflake>,
pub public_updates_channel_id: Option<Snowflake>,
pub safety_alerts_channel_id: Option<Snowflake>,
pub preferred_locale: Option<String>,
pub premium_progress_bar_enabled: Option<bool>,
}

View File

@ -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
}