diff --git a/DisCatSharp/Entities/Guild/DiscordGuild.Features.cs b/DisCatSharp/Entities/Guild/DiscordGuild.Features.cs
index 2e0abc308..e9dd1281a 100644
--- a/DisCatSharp/Entities/Guild/DiscordGuild.Features.cs
+++ b/DisCatSharp/Entities/Guild/DiscordGuild.Features.cs
@@ -1,528 +1,562 @@
// This file is part of the DisCatSharp project, based off DSharpPlus.
//
// Copyright (c) 2021-2022 AITSYS
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DisCatSharp.Enums;
namespace DisCatSharp.Entities;
///
/// Represents the guild features.
///
public class GuildFeatures
{
///
/// List of all guild features.
///
public List Features { get; }
///
/// Checks the guild features and constructs a new object.
///
/// Guild to check
public GuildFeatures(DiscordGuild guild)
{
this.Features = new List();
if (guild.RawFeatures.Contains("ANIMATED_ICON")) this.Features.Add(GuildFeaturesEnum.CanSetAnimatedIcon);
if (guild.RawFeatures.Contains("ANIMATED_BANNER")) this.Features.Add(GuildFeaturesEnum.CanSetAnimatedBanner);
if (guild.RawFeatures.Contains("BANNER")) this.Features.Add(GuildFeaturesEnum.CanSetBanner);
if (guild.RawFeatures.Contains("CHANNEL_BANNER")) this.Features.Add(GuildFeaturesEnum.CanSetChannelBanner);
if (guild.RawFeatures.Contains("COMMUNITY")) this.Features.Add(GuildFeaturesEnum.HasCommunityEnabled);
if (!guild.RawFeatures.Contains("DISCOVERABLE_DISABLED") && guild.RawFeatures.Contains("DISCOVERABLE")) this.Features.Add(GuildFeaturesEnum.IsDiscoverable);
if (guild.RawFeatures.Contains("FEATUREABLE")) this.Features.Add(GuildFeaturesEnum.IsFeatureable);
if (guild.RawFeatures.Contains("INVITE_SPLASH")) this.Features.Add(GuildFeaturesEnum.CanSetInviteSplash);
if (guild.RawFeatures.Contains("MEMBER_VERIFICATION_GATE_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasMembershipScreeningEnabled);
if (guild.RawFeatures.Contains("NEWS")) this.Features.Add(GuildFeaturesEnum.CanCreateNewsChannels);
if (guild.RawFeatures.Contains("PARTNERED")) this.Features.Add(GuildFeaturesEnum.IsPartnered);
if (guild.RawFeatures.Contains("MORE_EMOJI")) this.Features.Add(GuildFeaturesEnum.CanUploadMoreEmojis);
if (guild.RawFeatures.Contains("PREVIEW_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasPreviewEnabled);
if (guild.RawFeatures.Contains("VANITY_URL")) this.Features.Add(GuildFeaturesEnum.CanSetVanityUrl);
if (guild.RawFeatures.Contains("VERIFIED")) this.Features.Add(GuildFeaturesEnum.IsVerified);
if (guild.RawFeatures.Contains("VIP_REGIONS")) this.Features.Add(GuildFeaturesEnum.CanAccessVipRegions);
if (guild.RawFeatures.Contains("WELCOME_SCREEN_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasWelcomeScreenEnabled);
if (guild.RawFeatures.Contains("TICKETED_EVENTS_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasTicketedEventsEnabled);
if (guild.RawFeatures.Contains("MONETIZATION_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasMonetizationEnabled);
if (guild.RawFeatures.Contains("MORE_STICKERS")) this.Features.Add(GuildFeaturesEnum.CanUploadMoreStickers);
if (guild.RawFeatures.Contains("PRIVATE_THREADS")) this.Features.Add(GuildFeaturesEnum.CanCreatePrivateThreads);
if (guild.RawFeatures.Contains("HUB")) this.Features.Add(GuildFeaturesEnum.IsHub);
if (guild.RawFeatures.Contains("THREADS_ENABLED_TESTING")) this.Features.Add(GuildFeaturesEnum.HasThreadTestingEnabled);
if (guild.RawFeatures.Contains("THREADS_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasThreadsEnabled);
if (guild.RawFeatures.Contains("ROLE_ICONS")) this.Features.Add(GuildFeaturesEnum.CanSetRoleIcons);
if (guild.RawFeatures.Contains("NEW_THREAD_PERMISSIONS")) this.Features.Add(GuildFeaturesEnum.HasNewThreadPermissions);
if (guild.RawFeatures.Contains("ROLE_SUBSCRIPTIONS_ENABLED")) this.Features.Add(GuildFeaturesEnum.HasRoleSubscriptionsEnabled);
if (guild.RawFeatures.Contains("PREMIUM_TIER_3_OVERRIDE")) this.Features.Add(GuildFeaturesEnum.PremiumTierThreeOverride);
if (guild.RawFeatures.Contains("THREAD_DEFAULT_AUTO_ARCHIVE_DURATION")) this.Features.Add(GuildFeaturesEnum.CanSetThreadDefaultAutoArchiveDuration);
if (guild.RawFeatures.Contains("TEXT_IN_VOICE_ENABLED")) this.Features.Add(GuildFeaturesEnum.TextInVoiceEnabled);
if (guild.RawFeatures.Contains("HAS_DIRECTORY_ENTRY")) this.Features.Add(GuildFeaturesEnum.HasDirectoryEntry);
if (guild.RawFeatures.Contains("LINKED_TO_HUB")) this.Features.Add(GuildFeaturesEnum.IsLinkedToHub);
if (guild.RawFeatures.Contains("MEMBER_PROFILES")) this.Features.Add(GuildFeaturesEnum.HasMemberProfiles);
if (guild.RawFeatures.Contains("INTERNAL_EMPLOYEE_ONLY")) this.Features.Add(GuildFeaturesEnum.IsStaffOnly);
if (guild.RawFeatures.Contains("ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE")) this.Features.Add(GuildFeaturesEnum.RoleSubscriptionsIsAvailableForPurchase);
if (guild.RawFeatures.Contains("AUTO_MODERATION")) this.Features.Add(GuildFeaturesEnum.CanSetupAutoModeration);
if (guild.RawFeatures.Contains("GUILD_HOME_TEST")) this.Features.Add(GuildFeaturesEnum.GuildHomeTest);
if (guild.RawFeatures.Contains("INVITES_DISABLED")) this.Features.Add(GuildFeaturesEnum.InvitesDisabled);
+ if (guild.RawFeatures.Contains("ACTIVITIES_ALPHA")) this.Features.Add(GuildFeaturesEnum.ActivitiesAlpha);
+ if (guild.RawFeatures.Contains("ACTIVITIES_EMPLOYEE")) this.Features.Add(GuildFeaturesEnum.ActivitiesEmployee);
+ if (guild.RawFeatures.Contains("ACTIVITIES_INTERNAL_DEV")) this.Features.Add(GuildFeaturesEnum.ActivitiesInternalDev);
+ if (guild.RawFeatures.Contains("AUTOMOD_TRIGGER_KEYWORD_FILTER")) this.Features.Add(GuildFeaturesEnum.AutomodTriggerKeywordFilter);
+ if (guild.RawFeatures.Contains("AUTOMOD_TRIGGER_ML_SPAM_FILTER")) this.Features.Add(GuildFeaturesEnum.AutomodTriggerMlSpamFilter);
+ if (guild.RawFeatures.Contains("AUTOMOD_TRIGGER_SPAM_LINK_FILTERGuild")) this.Features.Add(GuildFeaturesEnum.AutomodTriggerSpamLinkFilterGuild);
+ if (guild.RawFeatures.Contains("AUTOMOD_DEFAULT_LIST")) this.Features.Add(GuildFeaturesEnum.AutomodDefaultList);
+ if (guild.RawFeatures.Contains("BFG")) this.Features.Add(GuildFeaturesEnum.Bfg);
+ if (guild.RawFeatures.Contains("BOOSTING_TIERS_EXPERIMENT_MEDIUM_GUILD")) this.Features.Add(GuildFeaturesEnum.BoostingTiersExperimentMediumGuild);
+ if (guild.RawFeatures.Contains("BOOSTING_TIERS_EXPERIMENT_SMALL_GUILD")) this.Features.Add(GuildFeaturesEnum.BoostingTiersExperimentSmallGuild);
+ if (guild.RawFeatures.Contains("BOT_DEVELOPER_EARLY_ACCESS")) this.Features.Add(GuildFeaturesEnum.BotDeveloperEarlyAccess);
+ if (guild.RawFeatures.Contains("CREATOR_MONETIZABLE")) this.Features.Add(GuildFeaturesEnum.CreatorMonetizable);
+ if (guild.RawFeatures.Contains("CREATOR_MONETIZABLE_DISABLED")) this.Features.Add(GuildFeaturesEnum.CreatorMonetizableDisabled);
+ if (guild.RawFeatures.Contains("CREATOR_MONETIZABLE_PROVISIONAL")) this.Features.Add(GuildFeaturesEnum.CreatorMonetizableProvisional);
+ if (guild.RawFeatures.Contains("CREATOR_MONETIZABLE_WHITEGLOVE")) this.Features.Add(GuildFeaturesEnum.CreatorMonetizableWhiteGlove);
+ if (guild.RawFeatures.Contains("CREATOR_MONETIZATION_APPLICATION_ALLOWLIST")) this.Features.Add(GuildFeaturesEnum.CreatorMonetizationApplicationAllowlist);
+ if (guild.RawFeatures.Contains("DEVELOPER_SUPPORT_SERVER")) this.Features.Add(GuildFeaturesEnum.DeveloperSupportServer);
+ if (guild.RawFeatures.Contains("EXPOSED_TO_ACTIVITIES_WTP_EXPERIMENT")) this.Features.Add(GuildFeaturesEnum.ExposedToActivitiesWtpExperiment);
+ if (guild.RawFeatures.Contains("GUILD_COMMUNICATION_DISABLED_GUILDS")) this.Features.Add(GuildFeaturesEnum.GuildCommunicationDisabledGuilds);
+ if (guild.RawFeatures.Contains("DISABLE_GUILD_COMMUNICATION")) this.Features.Add(GuildFeaturesEnum.DisableGuildCommunication);
+ if (guild.RawFeatures.Contains("GUILD_HOME_OVERRIDE")) this.Features.Add(GuildFeaturesEnum.GuildHomeOverride);
+ if (guild.RawFeatures.Contains("GUILD_AUTOMOD_DEFAULT_LIST")) this.Features.Add(GuildFeaturesEnum.GuildAutomodDefaultList);
+ if (guild.RawFeatures.Contains("GUILD_MEMBER_VERIFICATION_EXPERIMENT")) this.Features.Add(GuildFeaturesEnum.GuildMemberVerificationExperiment);
+ if (guild.RawFeatures.Contains("GUILD_ROLE_SUBSCRIPTION_PURCHASE_FEEDBACK_LOOP")) this.Features.Add(GuildFeaturesEnum.GuildRoleSubscriptionPurchaseFeedbackLoop);
+ if (guild.RawFeatures.Contains("GUILD_ROLE_SUBSCRIPTION_TRIALS")) this.Features.Add(GuildFeaturesEnum.GuildRoleSubscriptionTrials);
+ if (guild.RawFeatures.Contains("HAD_EARLY_ACTIVITIES_ACCESS")) this.Features.Add(GuildFeaturesEnum.HadEarlyActivitiesAccess);
+ if (guild.RawFeatures.Contains("INCREASED_THREAD_LIMIT")) this.Features.Add(GuildFeaturesEnum.IncreasedThreadLimit);
+ if (guild.RawFeatures.Contains("MOBILE_WEB_ROLE_SUBSCRIPTION_PURCHASE_PAGE")) this.Features.Add(GuildFeaturesEnum.MobileWebRoleSubscriptionPurchasePage);
+ if (guild.RawFeatures.Contains("RELAY_ENABLED")) this.Features.Add(GuildFeaturesEnum.RelayEnabled);
+ if (guild.RawFeatures.Contains("RESTRICT_SPAM_RISK_GUILDS")) this.Features.Add(GuildFeaturesEnum.RestrictSpamRiskGuilds);
+ if (guild.RawFeatures.Contains("ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE")) this.Features.Add(GuildFeaturesEnum.RoleSubscriptionsAvailableForPurchase);
+ if (guild.RawFeatures.Contains("THREADS_ENABLED_TESTING")) this.Features.Add(GuildFeaturesEnum.ThreadsEnabledTesting);
+ if (guild.RawFeatures.Contains("VOICE_CHANNEL_EFFECTS")) this.Features.Add(GuildFeaturesEnum.VoiceChannelEffects);
+ if (guild.RawFeatures.Contains("SOUNDBOARD")) this.Features.Add(GuildFeaturesEnum.Soundboard);
}
///
/// Checks whether the guild has a feature enabled.
///
/// The feature you'd like to check for.
/// Whether the guild has the requested feature.
public bool HasFeature(GuildFeaturesEnum flag)
=> this.Features.Contains(flag);
public string ToString(string separator, bool humanReadable)
{
if (!humanReadable) return string.Join(separator, this.Features);
else
{
var humanReadableFeatures = this.Features.Select(x => AddSpacesToWord(x.ToString()));
return string.Join(separator, humanReadableFeatures);
}
}
///
/// Converts a string of characters (here: enum) into a string of characters separated by spaces after a capital letter.
///
/// String of text to convert
/// String separated by a space after every capital letter.
private static string AddSpacesToWord(string text)
{
if (string.IsNullOrWhiteSpace(text))
return "";
var newText = new StringBuilder(text.Length * 2);
newText.Append(text[0]);
for (int i = 1; i < text.Length; i++)
{
if (char.IsUpper(text[i]) && text[i - 1] != ' ')
newText.Append(' ');
newText.Append(text[i]);
}
return newText.ToString();
}
}
///
/// Represents the guild features.
///
public enum GuildFeaturesEnum
{
///
/// Guild has access to set an animated guild icon.
///
CanSetAnimatedIcon,
///
/// Guild has access to set a guild banner image.
///
CanSetBanner,
///
/// Guild has access to use commerce features (i.e. create store channels)
///
[Obsolete("Store applications are EOL.")]
CanCreateStoreChannels,
///
/// Guild can enable Welcome Screen, Membership Screening, Stage Channels, News Channels and receives community updates.
/// Furthermore the guild can apply as a partner and for the discovery (if the prerequisites are given).
/// and is usable.
///
HasCommunityEnabled,
///
/// Guild is able to be discovered in the discovery.
///
IsDiscoverable,
///
/// Guild is able to be featured in the discovery.
///
IsFeatureable,
///
/// Guild has access to set an invite splash background.
///
CanSetInviteSplash,
///
/// Guild has enabled Membership Screening.
///
HasMembershipScreeningEnabled,
///
/// Guild has access to create news channels.
/// is usable.
///
CanCreateNewsChannels,
///
/// Guild is partnered.
///
IsPartnered,
///
/// Guild has increased custom emoji slots.
///
CanUploadMoreEmojis,
///
/// Guild can be previewed before joining via Membership Screening or the discovery.
///
HasPreviewEnabled,
///
/// Guild has access to set a vanity URL.
///
CanSetVanityUrl,
///
/// Guild is verified.
///
IsVerified,
///
/// Guild has access to set 384kbps bitrate in voice (previously VIP voice servers).
///
CanAccessVipRegions,
///
/// Guild has enabled the welcome screen.
///
HasWelcomeScreenEnabled,
///
/// Guild has enabled ticketed events.
///
HasTicketedEventsEnabled,
///
/// Guild has enabled monetization.
///
HasMonetizationEnabled,
///
/// Guild has increased custom sticker slots.
///
CanUploadMoreStickers,
///
/// Guild has access to the three day archive time for threads.
/// Needs Premium Tier 1 ().
///
[Obsolete("Auto archive duration isn't locked to boosts anymore.")]
CanSetThreadArchiveDurationThreeDays,
///
/// Guild has access to the seven day archive time for threads.
/// Needs Premium Tier 2 ().
///
[Obsolete("Auto archive duration isn't locked to boosts anymore.")]
CanSetThreadArchiveDurationSevenDays,
///
/// Guild has access to create private threads.
/// Needs Premium Tier 2 ().
///
CanCreatePrivateThreads,
///
/// Guild is a hub.
/// is usable.
///
IsHub,
///
/// Guild is in a hub.
/// https://github.com/discord/discord-api-docs/pull/3757/commits/4932d92c9d0c783861bc715bf7ebbabb15114e34
///
HasDirectoryEntry,
///
/// Guild is linked to a hub.
///
IsLinkedToHub,
///
/// Guild has full access to threads.
/// Old Feature.
///
HasThreadTestingEnabled,
///
/// Guild has access to threads.
///
HasThreadsEnabled,
///
/// Guild can set role icons.
///
CanSetRoleIcons,
///
/// Guild has the new thread permissions.
/// Old Feature.
///
HasNewThreadPermissions,
///
/// Guild can set thread default auto archive duration.
/// Old Feature.
///
CanSetThreadDefaultAutoArchiveDuration,
///
/// Guild has enabled role subscriptions.
///
HasRoleSubscriptionsEnabled,
///
/// Guild role subscriptions as purchaseable.
///
RoleSubscriptionsIsAvailableForPurchase,
///
/// Guild has premium tier 3 override.
///
PremiumTierThreeOverride,
///
/// Guild has access to text in voice.
/// Restricted to .
///
TextInVoiceEnabled,
///
/// Guild can set an animated banner.
/// Needs Premium Tier 3 ().
///
CanSetAnimatedBanner,
///
/// Guild can set an animated banner.
/// Needs Premium Tier 3 ().
///
[Obsolete("Feature was removed")]
CanSetChannelBanner,
///
/// Allows members to customize their avatar, banner and bio for that server.
///
HasMemberProfiles,
///
/// Guild is restricted to users with the badge.
///
IsStaffOnly,
///
/// Guild can use and setup the experimental auto moderation feature.
///
CanSetupAutoModeration,
///
/// Guild has access to home.
///
GuildHomeTest,
///
/// Guild has disabled invites.
///
InvitesDisabled,
///
///
///
ActivitiesAlpha,
///
///
///
ActivitiesEmployee,
///
///
///
ActivitiesInternalDev,
///
///
///
AutomodTriggerKeywordFilter,
///
///
///
AutomodTriggerMlSpamFilter,
///
///
///
AutomodTriggerSpamLinkFilterGuild,
///
///
///
AutomodDefaultList,
///
///
///
Bfg,
///
///
///
BoostingTiersExperimentMediumGuild,
///
///
///
BoostingTiersExperimentSmallGuild,
///
/// Guild has early access features for bot and library developers.
///
BotDeveloperEarlyAccess,
///
///
///
CreatorMonetizable,
///
///
///
CreatorMonetizableDisabled,
///
///
///
CreatorMonetizableProvisional,
///
///
///
CreatorMonetizableWhiteGlove,
///
///
///
CreatorMonetizationApplicationAllowlist,
///
/// Guild is set as a support server for an app in App Directory.
///
DeveloperSupportServer,
///
/// Guild was previously in the 2021-11_activities_baseline_engagement_bundle experiment.
///
ExposedToActivitiesWtpExperiment,
///
/// Guild was previously in the 2021-11_guild_communication_disabled_guilds experiment.
///
GuildCommunicationDisabledGuilds,
///
///
///
DisableGuildCommunication,
///
/// Guild has access to the Home feature, enables Treatment 2 of the 2022-01_home_tab_guild experiment.
///
GuildHomeOverride,
///
/// Guild was previously in the 2022-03_guild_automod_default_list experiment.
///
GuildAutomodDefaultList,
///
/// Guild was previously in the 2021-06_guild_role_subscriptions experiment.
///
GuildMemberVerificationExperiment,
///
/// Guilds was previously in the 2022-05_mobile_web_role_subscription_purchase_page experiment.
///
GuildRoleSubscriptionPurchaseFeedbackLoop,
///
/// Guilds previously in the 2022-01_guild_role_subscription_trials experiment.
///
GuildRoleSubscriptionTrials,
///
/// Guild previously had access to voice channel activities and can bypass the boost level requirement.
///
HadEarlyActivitiesAccess,
///
/// Allows the guild to have 1,000+ active threads.
///
IncreasedThreadLimit,
///
/// Guild was previously in the 2022-05_mobile_web_role_subscription_purchase_page experiment.
///
MobileWebRoleSubscriptionPurchasePage,
///
/// Shards connections to the guild to different nodes that relay information between each other.
///
RelayEnabled,
///
///
///
RestrictSpamRiskGuilds,
///
/// Allows guild's members to purchase role subscriptions.
///
RoleSubscriptionsAvailableForPurchase,
///
/// Used by bot developers to test their bots with threads in guilds with 5 or less members and a bot.
///
ThreadsEnabledTesting,
///
/// Guild was previously in the 2022-06_voice_channel_effects experiment.
///
VoiceChannelEffects,
///
/// Guild was previously in the 2021-12_soundboardl experiment.
///
Soundboard,
}