Skip to main content

twilight_model/guild/
feature.rs

1#![allow(deprecated)]
2use std::borrow::Cow;
3
4use serde::{Deserialize, Serialize};
5
6/// Special and optional guild features.
7///
8/// See [Discord Docs/Guild Features].
9///
10/// [Discord Docs/Guild Features]: https://discord.com/developers/docs/resources/guild#guild-object-guild-features
11#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
12#[non_exhaustive]
13#[serde(from = "String", into = "Cow<'static, str>")]
14pub enum GuildFeature {
15    /// Has access to set an animated guild banner image.
16    AnimatedBanner,
17    /// Has access to set an animated guild icon.
18    AnimatedIcon,
19    /// Guild is using the old permissions configuration behavior.
20    ApplicationCommandPermissionsV2,
21    /// Has set up auto moderation rules.
22    AutoModeration,
23    /// Has access to set a guild banner image.
24    Banner,
25    /// Can enable welcome screen, membership screening, stage channels,
26    /// discovery, and receives community updates.
27    Community,
28    /// Guild has enabled monetization.
29    CreatorMonetizableProvisional,
30    /// Guild has enabled the role subscription promotional page.
31    CreatorStorePage,
32    /// Guild has been set as a support server on the App Directory.
33    DeveloperSupportServer,
34    /// Is able to be discovered in the directory.
35    Discoverable,
36    /// Guild is able to set gradient colors to roles.
37    EnhancedRoleColors,
38    /// Is able to be featured in the directory.
39    Featurable,
40    /// Guild has access to guest invites.
41    GuestsEnabled,
42    /// Guild has access to set guild tags.
43    GuildTags,
44    /// Invites have been paused, this prevents new users from joining.
45    InvitesDisabled,
46    /// Has access to set an invite splash background.
47    InviteSplash,
48    /// Has enabled membership screening.
49    MemberVerificationGateEnabled,
50    /// Guild has increased custom soundboard sound slots.
51    MoreSoundboard,
52    /// Has increased custom sticker slots.
53    MoreStickers,
54    /// Has access to create news channels.
55    News,
56    /// Is partnered.
57    Partnered,
58    /// Can be previewed before joining via membership screening or the directory.
59    PreviewEnabled,
60    /// Has access to create private threads.
61    PrivateThreads,
62    /// Guild has enabled requiring admin to prune members.
63    ///
64    /// If this feature is enabled then the
65    /// [`ADMINISTRATOR`][`Permissions::ADMINISTRATOR`] guild permission is
66    /// required for guild prune operations; otherwise, only the
67    /// [`MANAGE_GUILD`][`Permissions::MANAGE_GUILD`] and
68    /// [`KICK_MEMBERS`][`Permissions::KICK_MEMBERS`] permissions are required.
69    ///
70    /// [`Permissions::ADMINISTRATOR`]: super::Permissions::ADMINISTRATOR
71    /// [`Permissions::KICK_MEMBERS`]: super::Permissions::KICK_MEMBERS
72    /// [`Permissions::MANAGE_GUILD`]: super::Permissions::MANAGE_GUILD
73    PruneRequiresAdmin,
74    /// Guild has disabled alerts for join raids in the configured safety alerts channel.
75    RaidAlertsDisabled,
76    /// Is able to set role icons.
77    RoleIcons,
78    /// Guild has role subscriptions that can be purchased.
79    RoleSubscriptionsAvailableForPurchase,
80    /// Guild has enabled role subscriptions.
81    RoleSubscriptionsEnabled,
82    /// Guild has created soundboard sounds.
83    Soundboard,
84    /// Has enabled ticketed events.
85    TicketedEventsEnabled,
86    /// Has access to set a vanity URL.
87    VanityUrl,
88    /// Is verified.
89    Verified,
90    /// Has access to set 384kps bitrate in voice (previously VIP voice servers).
91    VipRegions,
92    /// Has enabled the welcome screen.
93    WelcomeScreenEnabled,
94    /// Variant value is unknown to the library.
95    Unknown(String),
96}
97
98impl From<GuildFeature> for Cow<'static, str> {
99    fn from(value: GuildFeature) -> Self {
100        match value {
101            GuildFeature::AnimatedBanner => "ANIMATED_BANNER".into(),
102            GuildFeature::AnimatedIcon => "ANIMATED_ICON".into(),
103            GuildFeature::ApplicationCommandPermissionsV2 => {
104                "APPLICATION_COMMAND_PERMISSIONS_V2".into()
105            }
106            GuildFeature::AutoModeration => "AUTO_MODERATION".into(),
107            GuildFeature::Banner => "BANNER".into(),
108            GuildFeature::Community => "COMMUNITY".into(),
109            GuildFeature::CreatorMonetizableProvisional => "CREATOR_MONETIZABLE_PROVISIONAL".into(),
110            GuildFeature::CreatorStorePage => "CREATOR_STORE_PAGE".into(),
111            GuildFeature::DeveloperSupportServer => "DEVELOPER_SUPPORT_SERVER".into(),
112            GuildFeature::Discoverable => "DISCOVERABLE".into(),
113            GuildFeature::EnhancedRoleColors => "ENHANCED_ROLE_COLORS".into(),
114            GuildFeature::Featurable => "FEATURABLE".into(),
115            GuildFeature::GuestsEnabled => "GUESTS_ENABLED".into(),
116            GuildFeature::GuildTags => "GUILD_TAGS".into(),
117            GuildFeature::InvitesDisabled => "INVITES_DISABLED".into(),
118            GuildFeature::InviteSplash => "INVITE_SPLASH".into(),
119            GuildFeature::MemberVerificationGateEnabled => {
120                "MEMBER_VERIFICATION_GATE_ENABLED".into()
121            }
122            GuildFeature::MoreSoundboard => "MORE_SOUNDBOARD".into(),
123            GuildFeature::MoreStickers => "MORE_STICKERS".into(),
124            GuildFeature::News => "NEWS".into(),
125            GuildFeature::Partnered => "PARTNERED".into(),
126            GuildFeature::PreviewEnabled => "PREVIEW_ENABLED".into(),
127            GuildFeature::PrivateThreads => "PRIVATE_THREADS".into(),
128            GuildFeature::PruneRequiresAdmin => "PRUNE_REQUIRES_ADMIN".into(),
129            GuildFeature::RaidAlertsDisabled => "RAID_ALERTS_DISABLED".into(),
130            GuildFeature::RoleIcons => "ROLE_ICONS".into(),
131            GuildFeature::RoleSubscriptionsAvailableForPurchase => {
132                "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE".into()
133            }
134            GuildFeature::RoleSubscriptionsEnabled => "ROLE_SUBSCRIPTIONS_ENABLED".into(),
135            GuildFeature::Soundboard => "SOUNDBOARD".into(),
136            GuildFeature::TicketedEventsEnabled => "TICKETED_EVENTS_ENABLED".into(),
137            GuildFeature::VanityUrl => "VANITY_URL".into(),
138            GuildFeature::Verified => "VERIFIED".into(),
139            GuildFeature::VipRegions => "VIP_REGIONS".into(),
140            GuildFeature::WelcomeScreenEnabled => "WELCOME_SCREEN_ENABLED".into(),
141            GuildFeature::Unknown(unknown) => unknown.into(),
142        }
143    }
144}
145
146impl From<String> for GuildFeature {
147    fn from(value: String) -> Self {
148        match value.as_str() {
149            "ANIMATED_BANNER" => Self::AnimatedBanner,
150            "ANIMATED_ICON" => Self::AnimatedIcon,
151            "APPLICATION_COMMAND_PERMISSIONS_V2" => Self::ApplicationCommandPermissionsV2,
152            "AUTO_MODERATION" => Self::AutoModeration,
153            "BANNER" => Self::Banner,
154            "COMMUNITY" => Self::Community,
155            "CREATOR_MONETIZABLE_PROVISIONAL" => GuildFeature::CreatorMonetizableProvisional,
156            "CREATOR_STORE_PAGE" => GuildFeature::CreatorStorePage,
157            "DEVELOPER_SUPPORT_SERVER" => Self::DeveloperSupportServer,
158            "DISCOVERABLE" => Self::Discoverable,
159            "ENHANCED_ROLE_COLORS" => Self::EnhancedRoleColors,
160            "FEATURABLE" => Self::Featurable,
161            "GUESTS_ENABLED" => Self::GuestsEnabled,
162            "GUILD_TAGS" => Self::GuildTags,
163            "INVITES_DISABLED" => Self::InvitesDisabled,
164            "INVITE_SPLASH" => Self::InviteSplash,
165            "MEMBER_VERIFICATION_GATE_ENABLED" => Self::MemberVerificationGateEnabled,
166            "MORE_SOUNDBOARD" => Self::MoreSoundboard,
167            "MORE_STICKERS" => Self::MoreStickers,
168            "NEWS" => Self::News,
169            "PARTNERED" => Self::Partnered,
170            "PREVIEW_ENABLED" => Self::PreviewEnabled,
171            "PRIVATE_THREADS" => Self::PrivateThreads,
172            "PRUNE_REQUIRES_ADMIN" => Self::PruneRequiresAdmin,
173            "RAID_ALERTS_DISABLED" => Self::RaidAlertsDisabled,
174            "ROLE_ICONS" => Self::RoleIcons,
175            "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE" => {
176                GuildFeature::RoleSubscriptionsAvailableForPurchase
177            }
178            "ROLE_SUBSCRIPTIONS_ENABLED" => GuildFeature::RoleSubscriptionsEnabled,
179            "SOUNDBOARD" => Self::Soundboard,
180            "TICKETED_EVENTS_ENABLED" => Self::TicketedEventsEnabled,
181            "VANITY_URL" => Self::VanityUrl,
182            "VERIFIED" => Self::Verified,
183            "VIP_REGIONS" => Self::VipRegions,
184            "WELCOME_SCREEN_ENABLED" => Self::WelcomeScreenEnabled,
185            _ => Self::Unknown(value),
186        }
187    }
188}
189
190#[cfg(test)]
191mod tests {
192    use super::GuildFeature;
193    use serde_test::Token;
194
195    #[test]
196    fn variants() {
197        serde_test::assert_tokens(
198            &GuildFeature::AnimatedBanner,
199            &[Token::Str("ANIMATED_BANNER")],
200        );
201        serde_test::assert_tokens(&GuildFeature::AnimatedIcon, &[Token::Str("ANIMATED_ICON")]);
202        serde_test::assert_tokens(
203            &GuildFeature::ApplicationCommandPermissionsV2,
204            &[Token::Str("APPLICATION_COMMAND_PERMISSIONS_V2")],
205        );
206        serde_test::assert_tokens(
207            &GuildFeature::AutoModeration,
208            &[Token::Str("AUTO_MODERATION")],
209        );
210        serde_test::assert_tokens(&GuildFeature::Banner, &[Token::Str("BANNER")]);
211        serde_test::assert_tokens(&GuildFeature::Community, &[Token::Str("COMMUNITY")]);
212        serde_test::assert_tokens(
213            &GuildFeature::CreatorMonetizableProvisional,
214            &[Token::Str("CREATOR_MONETIZABLE_PROVISIONAL")],
215        );
216        serde_test::assert_tokens(
217            &GuildFeature::CreatorStorePage,
218            &[Token::Str("CREATOR_STORE_PAGE")],
219        );
220        serde_test::assert_tokens(
221            &GuildFeature::DeveloperSupportServer,
222            &[Token::Str("DEVELOPER_SUPPORT_SERVER")],
223        );
224        serde_test::assert_tokens(&GuildFeature::Discoverable, &[Token::Str("DISCOVERABLE")]);
225        serde_test::assert_tokens(
226            &GuildFeature::EnhancedRoleColors,
227            &[Token::Str("ENHANCED_ROLE_COLORS")],
228        );
229        serde_test::assert_tokens(&GuildFeature::Featurable, &[Token::Str("FEATURABLE")]);
230        serde_test::assert_tokens(
231            &GuildFeature::GuestsEnabled,
232            &[Token::Str("GUESTS_ENABLED")],
233        );
234        serde_test::assert_tokens(&GuildFeature::GuildTags, &[Token::Str("GUILD_TAGS")]);
235        serde_test::assert_tokens(
236            &GuildFeature::InvitesDisabled,
237            &[Token::Str("INVITES_DISABLED")],
238        );
239        serde_test::assert_tokens(&GuildFeature::InviteSplash, &[Token::Str("INVITE_SPLASH")]);
240        serde_test::assert_tokens(
241            &GuildFeature::MemberVerificationGateEnabled,
242            &[Token::Str("MEMBER_VERIFICATION_GATE_ENABLED")],
243        );
244        serde_test::assert_tokens(
245            &GuildFeature::MoreSoundboard,
246            &[Token::Str("MORE_SOUNDBOARD")],
247        );
248        serde_test::assert_tokens(&GuildFeature::MoreStickers, &[Token::Str("MORE_STICKERS")]);
249        serde_test::assert_tokens(&GuildFeature::News, &[Token::Str("NEWS")]);
250        serde_test::assert_tokens(&GuildFeature::Partnered, &[Token::Str("PARTNERED")]);
251        serde_test::assert_tokens(
252            &GuildFeature::PreviewEnabled,
253            &[Token::Str("PREVIEW_ENABLED")],
254        );
255        serde_test::assert_tokens(
256            &GuildFeature::PrivateThreads,
257            &[Token::Str("PRIVATE_THREADS")],
258        );
259        serde_test::assert_tokens(
260            &GuildFeature::PruneRequiresAdmin,
261            &[Token::Str("PRUNE_REQUIRES_ADMIN")],
262        );
263        serde_test::assert_tokens(&GuildFeature::RoleIcons, &[Token::Str("ROLE_ICONS")]);
264        serde_test::assert_tokens(
265            &GuildFeature::RoleSubscriptionsAvailableForPurchase,
266            &[Token::Str("ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE")],
267        );
268        serde_test::assert_tokens(
269            &GuildFeature::RoleSubscriptionsEnabled,
270            &[Token::Str("ROLE_SUBSCRIPTIONS_ENABLED")],
271        );
272        serde_test::assert_tokens(&GuildFeature::Soundboard, &[Token::Str("SOUNDBOARD")]);
273        serde_test::assert_tokens(
274            &GuildFeature::TicketedEventsEnabled,
275            &[Token::Str("TICKETED_EVENTS_ENABLED")],
276        );
277        serde_test::assert_tokens(&GuildFeature::VanityUrl, &[Token::Str("VANITY_URL")]);
278        serde_test::assert_tokens(&GuildFeature::Verified, &[Token::Str("VERIFIED")]);
279        serde_test::assert_tokens(&GuildFeature::VipRegions, &[Token::Str("VIP_REGIONS")]);
280        serde_test::assert_tokens(
281            &GuildFeature::WelcomeScreenEnabled,
282            &[Token::Str("WELCOME_SCREEN_ENABLED")],
283        );
284        serde_test::assert_tokens(
285            &GuildFeature::Unknown("UNKNOWN".to_owned()),
286            &[Token::Str("UNKNOWN")],
287        );
288    }
289}