diff --git a/Configs/BetterDiscord/plugins/0BDFDB.config.json b/Configs/BetterDiscord/plugins/0BDFDB.config.json
new file mode 100644
index 0000000..51a08f1
--- /dev/null
+++ b/Configs/BetterDiscord/plugins/0BDFDB.config.json
@@ -0,0 +1,21 @@
+{
+ "all": {
+ "changeLogs": {
+ "BDFDB": "3.6.5",
+ "ThemeRepo": "2.5.6"
+ },
+ "choices": {
+ "toastPosition": "right"
+ },
+ "general": {
+ "shareData": true,
+ "showToasts": true,
+ "showSupportBadges": false,
+ "useChromium": false
+ },
+ "hashes": {
+ "0BDFDB.data.json": "1b7a7e66ef87e2db2cfff4be6e90f3678b59a105",
+ "0BDFDB.raw.css": "0ac0d6eaef018eafb63ad32897332e251a907ccb"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Configs/BetterDiscord/plugins/0BDFDB.data.json b/Configs/BetterDiscord/plugins/0BDFDB.data.json
new file mode 100644
index 0000000..1b7a7e6
--- /dev/null
+++ b/Configs/BetterDiscord/plugins/0BDFDB.data.json
@@ -0,0 +1,5515 @@
+{
+ "PluginNameMap": {},
+ "PluginUrlMap": {
+ "BDFDB": "https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js",
+ "CopyRawMessage": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/CopyRawMessage.plugin.js",
+ "CreationDate": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/CreationDate.plugin.js",
+ "ForceImagePreviews": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/ForceImagePreviews.plugin.js",
+ "JoinedAtDate": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/JoinedAtDate.plugin.js",
+ "ShowHiddenChannels": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/ShowHiddenChannels.plugin.js",
+ "ThemeSettings": "https://mwittrien.github.io/BetterDiscordAddons/_DEAD/ThemeSettings.plugin.js"
+ },
+ "LibraryRequires": ["electron", "fs", "path", "process", "request"],
+ "DiscordObjects": {
+ "Channel": {"props": ["getRecipientId", "isManaged", "getGuildId"]},
+ "Guild": {"strings": ["hasCommunityInfoSubheader()", "publicUpdatesChannelId", ".GuildFeatures.NON_COMMUNITY_RAID_ALERTS"]},
+ "Invite": {"props": ["getExpiresAt", "isExpired"]},
+ "Message": {"props": ["getReaction", "isEdited", "getChannelId"]},
+ "Messages": {"props": ["jumpToMessage", "hasAfterCached", "forEach"]},
+ "Timestamp": {"props": ["add", "dayOfYear", "hasAlignedHourOffset"]},
+ "User": {"props": ["addGuildAvatarHash", "isLocalBot"]}
+ },
+ "CustomDiscordConstants": {
+ "MenuItemColors": {
+ "BRAND": "brand",
+ "DANGER": "danger",
+ "DEFAULT": "default",
+ "PREMIUM": "premium",
+ "PREMIUMGRADIENT": "premiumgradient",
+ "SUCCESS": "success"
+ },
+ "ToastIcons": {
+ "info": "INFO",
+ "danger": "CLOSE_CIRCLE",
+ "success": "CHECKMARK_CIRCLE",
+ "warning": "WARNING"
+ },
+ "ToastPositions": {
+ "center": "toastscenter",
+ "left": "toastsleft",
+ "right": "toastsright"
+ },
+ "UserBadges": {
+ "active_developer": "6bdc42827a38498929a4920da12695d9",
+ "automod": "f2459b691ac7453ed6039bbcfaccbfcd",
+ "bot_commands": "6f9e37f9029ff57aef81db857890005e",
+ "bug_hunter_lvl1": "2717692c7dca7289b35297368a940dd0",
+ "bug_hunter_lvl2": "848f79194d4be5ff5f81505cbd0ce1e6",
+ "certified_moderator": "fee1624003e2fee35cb398e125dc479b",
+ "guild_booster_lvl1": "51040c70d4f20a921ad6674ff86fc95c",
+ "guild_booster_lvl2": "0e4080d1d333bc7ad29ef6528b6f2fb7",
+ "guild_booster_lvl3": "72bed924410c304dbe3d00a6e593ff59",
+ "guild_booster_lvl4": "df199d2050d3ed4ebf84d64ae83989f8",
+ "guild_booster_lvl5": "996b3e870e8a22ce519b3a50e6bdd52f",
+ "guild_booster_lvl6": "991c9f39ee33d7537d9f408c3e53141e",
+ "guild_booster_lvl7": "cb3ae83c15e970e8f3d410bc62cb8b99",
+ "guild_booster_lvl8": "7142225d31238f6387d9f09efaa02759",
+ "guild_booster_lvl9": "ec92202290b48d0879b7413d2dde3bab",
+ "hypesquad": "bf01d1073931f921909045f3a39fd264",
+ "hypesquad_house_1": "8a88d63823d8a71cd5e390baa45efa02",
+ "hypesquad_house_2": "011940fd013da3f7fb926e4a1cd2e618",
+ "hypesquad_house_3": "3aa41de486fa12454c3761e8e223442e",
+ "partner": "3f9748e53446a137a052f3454e2de41e",
+ "premium": "2ba85e8026a8614b640c2837bcdfe21b",
+ "premium_early_supporter": "7060786766c9c840eb3019e725d2b358",
+ "staff": "5e74e9b61934fc1f67c65515d1f7e60d",
+ "verified_developer": "6df5892e0f35b051f8b61eace34f4967"
+ },
+ "UserPremiumLevels": {"1": 1, "2": 2, "3": 3, "4": 6, "5": 9, "6": 12, "7": 15, "8": 18, "9": 24}
+ },
+ "DiscordConstants": {
+ "AutocompleterResultTypes": ["VOICE_CHANNEL", "TEXT_CHANNEL", "USER", "LINK"],
+ "ChannelTextAreaTypes": ["CREATE_FORUM_POST", "PROFILE_BIO_INPUT", "FORUM_CHANNEL_GUIDELINES"],
+ "Colors": ["SPOTIFY", "RED_100", "BLUE"],
+ "ColorsCSS": {"strings": ["var(--status-positive", "var(--bg-brand)"], "value": "default"},
+ "EmojiSprites": ["DiversityPerRow", "PickerCount", "PickerPerRow"],
+ "InboxTabs": ["MENTIONS", "UNREADS"],
+ "MessageTypeGroups": ["USER_MESSAGE", "UNDELETABLE"],
+ "ReadStateTypes": ["GUILD_EVENT", "NOTIFICATION_CENTER", "CHANNEL"],
+ "UserSettingsActionTypes": ["SLOW_USER_ACTION", "DAILY"]
+ },
+ "LibraryModules": {
+ "AckUtils": {"props": ["ack", "bulkAck", "localAck"]},
+ "ActivityUtils": {"props": ["sendActivityInvite", "updateActivity"]},
+ "AnalyticsUtils": {"props": ["isThrottled", "track"]},
+ "AnimationUtils": {"props": ["spring", "decay"]},
+ "APIEncodeUtils": {"props": ["stringify", "parse", "encode"]},
+ "APIUtils": {"props": ["getAPIBaseURL"]},
+ "AppearanceSettingsUtils": {"props": ["updateLocale", "updateTheme"]},
+ "ApplicationAssetUtils": {"props": ["getAssetImage", "getAssetIds"]},
+ "AppUtils": {"props": ["clipboard", "os"]},
+ "ArrayUtils": {"props": ["isArrayLike", "zipObject"]},
+ "CategoryCollapseUtils": {"props": ["categoryCollapse", "categoryExpand"]},
+ "ChannelUtils": {"props": ["selectChannel", "selectPrivateChannel"]},
+ "ChatRestrictionUtils": {"props": ["applyChatRestrictions"]},
+ "ConnectionMetadataUtils": {"props": ["generateEbayMetadataItems", "generatePaypalMetadataItems"], "exported": false, "value": "exports", "map": {
+ "getEbay": ["generateEbayMetadataItems"],
+ "getPaypal": ["generatePaypalMetadataItems"],
+ "getReddit": ["generateRedditMetadataItems"],
+ "getSteam": ["generateSteamMetadataItems"],
+ "getTiktok": ["generateTikTokMetadataItems"],
+ "getTwitter": ["generateTwitterMetadataItems"]
+ }},
+ "ConnectionProviderUtils": {"props": ["get", "isSupported", "filter"]},
+ "ConnectionUtils": {"props": ["setShowActivity", "setVisibility"]},
+ "ContextMenuUtils": {"props": ["openContextMenu", "closeContextMenu"]},
+ "CurrentUserStore": {"props": ["getCurrentUser"]},
+ "DesktopNotificationUtils": {"props": ["showNotification", "requestPermission"]},
+ "DispatchApiUtils": {"props": ["dispatch", "isDispatching"]},
+ "DispatchUtils": {"props": ["ComponentDispatch", "ComponentDispatcher"]},
+ "EmojiUtils": {"props": ["translateInlineEmojiToSurrogates", "translateSurrogatesToInlineEmoji"]},
+ "EmojiStateUtils": {"props": ["getURL", "isEmojiDisabled"]},
+ "Env": {"props": ["env"]},
+ "FolderSettingsUtils": {"props": ["saveGuildFolders", "saveClientTheme"]},
+ "GuildNotificationsUtils": {"props": ["updateChannelOverrideSettings", "updateGuildNotificationSettings"]},
+ "GuildUtils": {"props": ["selectGuild", "transitionToGuildSync"]},
+ "HistoryUtils": {"props": ["transitionTo", "transitionToGuild"]},
+ "IconUtils": {"props": ["getGuildIconURL", "getGuildBannerURL"]},
+ "InviteUtils": {"props": ["acceptInvite", "createInvite"]},
+ "InternalReactUtils": {"props": ["jsx", "jsxs", "Fragment"]},
+ "KeyCodeUtils": {"props": ["codeToKey", "keyToCode"]},
+ "KeyEvents": {"props": ["aliases", "code", "codes"]},
+ "LoginUtils": {"props": ["login", "logout"]},
+ "MediaComponentUtils": {"props": ["renderImageComponent", "renderVideoComponent"]},
+ "MediaEngineUtils": {"props": ["setOutputDevice", "setInputDevice"]},
+ "MemberDisplayUtils": {"props": ["getDisplayProfile", "default"], "exported": false, "value": "exports", "map": {
+ "getUserProfile": ["default"]
+ }},
+ "MentionUtils": {"props": ["isRawMessageMentioned", "isMentioned"]},
+ "MessageAuthorUtils": {"props": ["getMessageAuthor", "getUserAuthor"], "exported": false, "value": "exports", "map": {
+ "getAuthor": ["default"]
+ }},
+ "MessageComponentUtils": {"props": ["useClickReply", "useHoveredMessage"]},
+ "MessageManageUtils": {"props": ["copyLink", "replyToMessage"]},
+ "MessageParser": {"props": ["parseEmbedTitle", "defaultRules"]},
+ "MessagePinUtils": {"props": ["pinMessage", "unpinMessage"]},
+ "MessageUtils": {"props": ["receiveMessage", "editMessage"]},
+ "ModalUtils": {"props": ["openModal", "hasModalOpen", "useHasAnyModalOpen"]},
+ "NitroUtils": {"props": ["canUseIncreasedMessageLength", "canUsePremiumGuildMemberProfile"]},
+ "NotificationSettingsUtils": {"props": ["setDesktopType", "setTTSType"]},
+ "PlatformUtils": {"props": ["isAndroid", "isWindows"]},
+ "PermissionRoleUtils": {"props": ["can", "makeEveryoneOverwrite"]},
+ "PreferencesContext": {"strings": ["reducedMotion", "forcedColors", "alwaysShowLinkDecorations", "createContext"]},
+ "PrivateChannelUtils": {"props": ["addRecipient", "openPrivateChannel"]},
+ "QuerySearchUtils": {"props": ["queryGuilds", "queryGroupDMs"]},
+ "ReactionEmojiUtils": {"props": ["getReactionEmojiName", "getAccessibleEmojiDisplayName"]},
+ "RecentMentionUtils": {"props": ["deleteRecentMention", "fetchRecentMentions"]},
+ "RelationshipUtils": {"props": ["addRelationship", "removeRelationship"]},
+ "RoleIconUtils": {"props": ["canGuildUseRoleIcons", "getRoleIconData"]},
+ "RTCConnectionUtils": {"props": ["getChannelId", "getGuildId", "getRTCConnectionId"]},
+ "SearchPageUtils": {"props": ["changePage", "search", "clearHistory"]},
+ "SimpleMarkdownParser": {"props": ["parseBlock", "parseInline", "defaultOutput"]},
+ "SlateRichUtils": {"props": ["createState", "toRichValue"]},
+ "SlateTextUtils": {"props": ["serializeDescendant", "toTextValue"]},
+ "SoundParser": {"strings": ["discodo", "ddr-down", "mute"]},
+ "SoundUtils": {"props": ["createSound", "createSoundForPack", "playSound"]},
+ "SpotifyUtils": {"props": ["getAccessToken", "pause", "play"]},
+ "StoreChangeUtils": {"props": ["get", "set", "clear", "remove"]},
+ "TimeoutUtils": {"strings": ["_timeout.isStarted()"]},
+ "TimestampUtils": {"props": ["fromTimestamp", "extractTimestamp"]},
+ "UploadUtils": {"props": ["upload", "instantBatchUpload"]},
+ "URLParser": {"props": ["parse", "resolveObject"]},
+ "UserNameUtils": {"props": ["getNickname", "getName", "useName"]},
+ "UserPopoutUtils": {"props": ["openUserContextMenu", "openModerateRoleContextMenu"]},
+ "UserProfileUtils": {"props": ["fetchProfile", "getUser"]},
+ "UserSettingsProtoUtils": {"props": ["addDismissedContent", "updateUserChannelSettings"]},
+ "UserSettingsUtils": {"props": ["open", "updateAccount"]},
+ "Utilities": {"props": ["flatMap", "cloneDeep"]},
+ "WindowUtils": {"props": ["minimize", "maximize", "close"]}
+ },
+ "NativeSubComponents": {
+ "Button": {"props": ["Colors", "Hovers", "Looks"]},
+ "Checkbox": {"props": ["Aligns", "Shapes", "Types"]},
+ "Clickable": {"strings": [".ENTER", "renderNonInteractive", ".handleKeyPress"]},
+ "KeybindRecorder": {"strings": [".RECORDING", ".DEFAULT", "toggleRecordMode"]},
+ "PopoutContainer": {"props": ["Animation", "defaultProps"]},
+ "RadioGroup": {"strings": ["itemInfoClassName", "hasSelection", ".radioItemIconClassName"]},
+ "SearchBar": {"strings": ["this.inputRef", ".containerRef", ".handleOnChange"]},
+ "SearchableSelect": {"strings": ["serialize", "haspopup", "maxVisibleItems"]},
+ "Slider": {"strings": [".stickToMarkers", "sortedMarkers"]},
+ "TabBar": {"props": ["Item", "Header", "Panel"]},
+ "Table": {"props": ["SortDirection", "defaultProps"]},
+ "TextArea": {"strings": ["onKeyDown", "defaultDirty"]},
+ "TextInput": {"strings": ["onFocus", "MAXIMUM_LENGTH_ERROR", "getIsOverFlowing"]},
+ "TooltipContainer": {"strings": ["Tooltip cannot find DOM node", "shouldShowTooltip", "clickable"]}
+ },
+ "LibraryComponents": {
+ "Anchor": {"strings": ["anchorUnderlineOnHover", "noreferrer noopener"]},
+ "Animations": {"props": ["Controller", "Spring", "animated"]},
+ "AppReferencePositionLayer": {"props": ["AppReferencePositionLayer", "appLayerContext"], "funcStrings": ["{children:(", "{ref:"]},
+ "AutocompleterComponents": {"props": ["AutocompleterQuerySymbols", "createHeaderResult"]},
+ "AvatarConstants": {"strings": ["\"SIZE_20\"", "\"SIZE_32\""], "exported": false, "value": "exports", "map": {
+ "Sizes": ["\"SIZE_20\"", "\"SIZE_32\""]
+ }},
+ "Avatars": {"props": ["AnimatedAvatar", "Avatar"], "exported": false, "value": "exports", "map": {
+ "AnimatedAvatar": ["AnimatedAvatar"],
+ "Avatar": ["Avatar"]
+ }},
+ "Badges": {"strings": ["disableColor", "baseShapeRound", "textBadge"], "exported": false, "value": "exports", "map": {
+ "BadgeShapes": ["baseShapeRoundRight", "baseShapeRoundLeft"],
+ "IconBadge": [".iconBadge"],
+ "NumberBadge": [".numberBadge"],
+ "TextBadge": [".textBadge"]
+ }},
+ "Checkmark": {"strings": ["d:\"M8.99991 16.17L4.82991"], "funcStrings": ["foreground:"]},
+ "Emoji": {"strings": ["emojiName", "shouldAnimate", "jumboable"], "funcStrings": ["autoplay"]},
+ "EmojiButton": {"strings": ["renderButtonContents", "\"emojiButton\"", "SELECT_EMOJI"]},
+ "EmojiPicker": {"strings": ["emojiSize", "inspectedExpressionPosition", ",emojiPaddingHorizontal:"], "funcStrings": ["compare"]},
+ "Flex": {"props": ["Wrap", "Direction", "Child"]},
+ "FlowerStar": {"strings": ["flowerStarContainer", ".jsx)"]},
+ "FocusRingScope": {"strings": ["FocusRing", "ringTarget was not"]},
+ "FormComponents": {"props": ["FormText", "FormTitleTags", "FormDivider"], "exported": false, "value": "exports", "map": {
+ "FormDivider": ["FormDivider"],
+ "FormItem": ["FormItem"],
+ "FormNotice": ["FormNotice"],
+ "FormSection": ["FormSection"],
+ "FormTags": ["FormTitleTags"],
+ "FormText": ["FormText"],
+ "FormTextTypes": ["FormTextTypes"],
+ "FormTitle": ["FormTitle"]
+ }},
+ "GuildBadge": {"strings": ["foregroundDarkColor", "getBadgeCategory"]},
+ "GuildChild": {"strings": [".getAcronym", ",fontSize:", ".acronym"]},
+ "GuildIcon": {"strings": ["SMOL", "badgeStrokeColor"], "funcStrings": ["render()"]},
+ "GuildItem": {"strings": ["guildNode:", "useShouldShowInvitesDisabledNotif"]},
+ "GuildTooltipMutedText": {"strings": [".muteConfig", "color:\"text-muted\""]},
+ "Heading": {"strings": ["data-excessive", ".defaultColor"]},
+ "HeaderBarComponents": {"strings": ["isAuthenticated", ".HEADER_BAR"]},
+ "Image": {"strings": ["containerRef", "zoomable", "LOADING"]},
+ "ImageModal": {"strings": ["renderLinkComponent", ".Messages.OPEN_IN_BROWSER", "animated"]},
+ "ImageVideoModal": {"strings": ["renderLinkComponent", ".Messages.OPEN_IN_BROWSER", "videoWrapper"]},
+ "LayerContainerComponents": {"strings": ["layerContainerElement", "LayerProvider"], "exported": false, "value": "exports", "map": {
+ "createLayer": [".createContext"],
+ "LayerContainer": [".layerContainer", "missing parent"]
+ }},
+ "LazyImage": {"protos": ["loadImage", "getRatio", "getSrc"]},
+ "Mask": {"props": "Masks"},
+ "Menu": {"strings": ["Menu API only allows Items and groups of Items as children"]},
+ "MessageGroup": {"strings": [".ephemeral", "animateAvatar:", "getMessageByReference"]},
+ "MessagesPopoutComponents": {"strings": ["canCloseAllMessages", "loadingMore"], "exported": false, "value": "exports", "map": {
+ "EmptyState": [".emptyPlaceholder", "backgroundImage"],
+ "Header": [".header", "heading"],
+ "Popout": ["renderHeader", "renderEmptyState"]
+ }},
+ "ModalComponents": {"props": ["Modal", "ModalCloseButton"], "exported": false, "value": "exports", "map": {
+ "Modal": ["Modal"],
+ "ModalCloseButton": ["ModalCloseButton"],
+ "ModalContent": ["ModalContent"],
+ "ModalFooter": ["ModalFooter"],
+ "ModalHeader": ["ModalHeader"],
+ "ModalListContent": ["ModalListContent"],
+ "ModalRoot": ["ModalRoot"],
+ "ModalSize": ["ModalSize"]
+ }},
+ "Paginator": {"strings": ["totalPageCount", "selectedPage", "endButtonInner"]},
+ "PanelButton": {"strings": ["Masks.PANEL_BUTTON"]},
+ "PopoutFocusLock": {"strings": ["impressionName", "useImperativeHandle"], "funcStrings": ["impressionName"]},
+ "PrivateChannelItems": {"strings": ["getRecipientId", "LEAVE_GROUP_DM_MANAGED_BODY"], "exported": false, "value": "exports", "map": {
+ "DirectMessage": ["getUser", "getRecipientId"],
+ "LinkButton": [".apply(this"]
+ }},
+ "Scrollers": {"props": ["ScrollerThin", "ScrollerAuto", "ScrollerNone"], "exported": false, "value": "exports", "map": {
+ "Auto": ["ScrollerAuto"],
+ "None": ["ScrollerNone"],
+ "Thin": ["ScrollerThin"]
+ }},
+ "SearchResultsPagination": {"strings": ["pageLength", "changePage", "maxVisiblePages"]},
+ "SpinnerComponents": {"strings": ["WANDERING_CUBES", "wanderingCubes", ".spinningCircleInner"], "exported": false, "value": "exports", "map": {
+ "Spinner": [".spinningCircleInner"],
+ "Types": ["WANDERING_CUBES", "wanderingCubes"]
+ }},
+ "StatusComponents": {"props": ["Status", "StatusTypes"], "exported": false, "value": "exports", "map": {
+ "Status": ["Status"],
+ "Types": ["StatusTypes"]
+ }},
+ "Text": {"strings": ["lineClamp:", ".selectable", ".defaultColor"]},
+ "TextElement": {"strings": [".strong]", ".STANDARD"]},
+ "Timeout": {"protos": ["start", "stop", "isStarted"]},
+ "UserBadgeComponents": {"strings": [".PROFILE_USER_BADGES", "SIZE_24"], "exported": false, "value": "exports", "map": {
+ "UserBadges": [".PROFILE_USER_BADGES"],
+ "Sizes": ["\"SIZE_24\":"]
+ }},
+ "UserPopout": {"strings": ["{user:", "userId:", "\"Unexpected missing user\")", "getUser"], "value": "default"},
+ "UserPopoutSection": {"strings": [".section,", ".lastSection"]},
+ "UserSummaryItem": {"strings": ["popoutUserId:", ".clickableAvatar"]},
+ "VideoForwardRef": {"strings": ["HTMLSourceElement", "autoPlay"], "funcStrings": ["externalRef"]}
+ },
+ "ContextMenuTypes": {
+ "AudioDeviceContextMenu": "audio-device-context",
+ "ChannelContextMenu": "channel-context",
+ "DeveloperContextMenu": "dev-context",
+ "GroupDMContextMenu": "gdm-context",
+ "GuildContextMenu": "guild-context",
+ "GuilDiscoveryContextMenu": "guild-discovery-context-menu",
+ "GuildEntryContextMenu": "guild-entry-context",
+ "GuildHeaderContextMenu": "guild-header-popout",
+ "ImageContextMenu": "image-context",
+ "MessageContextMenu": "message",
+ "TextAreaContextMenu": "textarea-context",
+ "ThreadContextMenu": "thread-context",
+ "UserContextMenu": "user-context",
+ "UserSettingsCogContextMenu": "user-settings-cog"
+ },
+ "PatchModules": {
+ "Account": {"protos": ["renderAvatarWithPopout", "renderCopiableNameTag", "renderCopiedSuccess"]},
+ "AnalyticsContext": {"props": ["ObjectTypes", "Objects", "Pages", "Sections"]},
+ "AuditLogEntry": {"protos": ["renderRoleUpdate", "renderChangeDetails", "getActionTypeColor", "renderPermissionUpdate"]},
+ "AuditLogs": {"strings": ["Messages.SEARCH_MEMBERS", "._lastExpandedRef", ".handleActionFilterQueryClear"]},
+ "AuthWrapper": {"protos": ["renderDefault", "renderMobile", "mobileReplaceWith"]},
+ "Autocomplete": {"strings": ["autocompleteInner", "innerClassName:", "autocomplete"]},
+ "AutocompleteChannelResult": {"strings": ["channel:", "category:", ".type===", ".GUILD_CATEGORY?", "AutocompleteRowHeading"], "noSearch": true},
+ "AutocompleteRoleResult": {"strings": ["hideDescription:", "colorString:", ".Messages.MENTION_USERS_WITH_ROLE"], "noSearch": true},
+ "AutocompleteRowContentPrimary": {"strings": [".jsx)(\"div\"", "autocompleteRowContentPrimary"]},
+ "AutocompleteRowContentSecondary": {"strings": [".jsx)(", "autocompleteRowContentSecondary"]},
+ "AutocompleteRowIcon": {"strings": [".jsx)(\"div\"", "autocompleteRowIcon"]},
+ "AutocompleteUserResult": {"strings": ["hidePersonalInformation:", ".descriptionDiscriminator", "\"#\"", "Sizes.SIZE_24"], "noSearch": true},
+ "BlobMask": {"protos": ["getBadgePositionInterpolation", "getUpperBadgeStyles"]},
+ "BlockedMessageGroup": {"strings": ["collapsed-message-item", "isBeforeGroup", "collapsedReason"]},
+ "ChannelCall": {"strings": ["maybeLeaveFullScreen", "handleFullscreenParticipant", "CHANNEL_CALL_POPOUT"]},
+ "ChannelCallHeader": {"strings": ["focusedApplication:", "focusedParticipant:", ".getSelectedParticipant", "appContext"]},
+ "ChannelCallGrid": {"strings": ["totalNumberOfParticipants:", "keyExtractor:", "channel_user_limit:"]},
+ "ChannelCallVideoParticipants": {"strings": [".tileSizer", "participantTileWidth:", ".COVER"]},
+ "ChannelEmptyMessages": {"strings": [".Messages.BEGINNING_CHANNEL_WELCOME", ".Messages.BEGINNING_GROUP_DM_MANAGED", "showingBanner:"]},
+ "ChannelFloatingSidebar": {"strings": ["messageRequestSidebarWidth", "floatingLayer:", "chatLayerWrapper"]},
+ "ChannelItem": {"strings": ["hasActiveThreads", ".unreadImportant", "UNREAD_IMPORTANT"]},
+ "ChannelItemIcon": {"strings": ["hasActiveThreads:", "locked:", ".iconContainer"]},
+ "ChannelMembers": {"strings": ["MEMBER_LIST_VIEWED", "getDimensions", "member-"]},
+ "ChannelPins": {"strings": ["PINNED_MESSAGES", "renderEmptyState", "listName"]},
+ "ChannelReply": {"strings": [".messageReference", ".REPLY_MENTION_OFF", ".mentionIcon"]},
+ "ChannelSidebar": {"strings": ["ACCOUNT_PANEL", "RTC_CONNECTION_PANEL", "ACCOUNT_A11Y_LABEL"]},
+ "ChannelsList": {"protos": ["isUnreadVisible", "renderBottomUnread", "getSectionRowsFromChannel"]},
+ "ChannelTextAreaButtons": {"strings": [".buttons", "\"emoji\"", "activeCommandOption"]},
+ "ChannelTextAreaContainer": {"strings": ["TOGGLE_EMOJI_POPOUT", "textValue", "richValue"]},
+ "ChannelTextAreaCounter": {"strings": [".flairContainer", "CHARACTER_COUNT_CLOSE_TO_LIMIT"]},
+ "ChannelTextAreaEditor": {"strings": ["onHideAutocomplete", "onMaybeShowAutocomplete", "uploadPromptCharacterCount", "_focusBlurQueue"]},
+ "ChannelTextAreaForm": {"strings": ["renderApplicationCommandIcon", "handleTextareaChange", "handleSendMessage"]},
+ "ChannelThreadItem": {"strings": [".typeThread", ".modeUnread", ".Messages.GUILD_SIDEBAR_THREAD"]},
+ "CircleIconButton": {"strings": ["circleIconButton", "lowerBadge", "circleButtonMask"]},
+ "Clickable": {"strings": [".ENTER", "renderNonInteractive", ".handleKeyPress"]},
+ "CloseButton": {"strings": [".closeButton", ".closeIcon", "offset:{"]},
+ "ConnectedLazyImageZoomable": {"strings": ["isWindowFocused:", ",appContext:"]},
+ "CustomStatusModal": {"protos": ["renderCustomStatusInput", "renderClearAfter", "getEmojiButtonRenderer"]},
+ "DefaultChannelEmptyMessage": {"strings": [".CHANNEL_WELCOME", ".titleName", "handlePersonalize"]},
+ "DirectMessage": {"strings": ["getRecipientId", "Controller", "handleContextMenu", ".DM"]},
+ "DirectMessageAddPopout": {"strings": [".COPY_INSTANT_INVITE", ".handleInviteUsers=", ".selectedUsers", ".mobileToolsContainer"]},
+ "DirectMessageAddPopoutRow": {"strings": [".weightMedium", ".friendSelected", ".friendWrapper"]},
+ "DiscordTag": {"strings": ["hidePersonalInformation", "isVerifiedBot", "botType"]},
+ "Embed": {"strings": ["gridContainer", "renderEmbedContent", "hasThumbnail"]},
+ "EmojiPicker": {"strings": ["emojiSize", "disableEmojiTutorial", ",emojiPaddingHorizontal:"]},
+ "EmojiPickerHeader": {"strings": ["COMMUNITY_CONTENT_ONLY", "headerClassName", ".EmojiIntention.REACTION"]},
+ "EmojiPickerListRow": {"strings": ["emojiSize", "surrogateCodePoint", "showEmojiFavoriteTooltip"]},
+ "FocusRingScope": {"strings": ["FocusRing", "ringTarget was not"]},
+ "FolderHeader": {"strings": ["folderNode:", "expandedFolderIconWrapper", "forceCircular"]},
+ "FolderContextMenu": {"strings": ["GUILD_ACTIONS_MENU_LABEL", "navId:\"guild", "folderId:"], "noSearch": true},
+ "FolderIcon": {"strings": ["folderNode:", "folderIconWrapper", "closedFolderIconWrapper"]},
+ "FolderItem": {"strings": ["folderNode:", "expandedFolderBackground", "onExpandCollapse"]},
+ "FolderItemWrapper": {"strings": ["folderNode:", "isFolderExpanded", "defaultFolderName:"]},
+ "FolderSettingsModal": {"strings": [".handleNameChange", ".handleSubmit", "folderName:"], "noSearch": true},
+ "GuildBadge": {"strings": ["foregroundDarkColor", "getBadgeCategory"]},
+ "GuildBans": {"strings": [".Messages.BANS_NO_USERS_BANNED", ".Messages.BANS_SEARCH_PLACEHOLDER", ".getSortedBans"]},
+ "GuildChannelListContextMenu": {"strings": ["GUILD_ACTIONS_MENU_LABEL", "\"guild-context\",\"aria-label\""], "noSearch": true},
+ "GuildChild": {"strings": [".getAcronym", ",fontSize:", ".acronym"], "noSearch": true},
+ "GuildContextMenu": {"strings": ["GUILD_ACTIONS_MENU_LABEL", "navId:\"guild", "GuildContextMenu"], "noSearch": true},
+ "GuildEmojis": {"strings": ["getMaxEmojiSlots", "lightSrc:", ".Messages.NO_EMOJI"]},
+ "GuildFavorites": {"strings": [".favoriteIcon", "FAVORITES_GUILD_NAME"]},
+ "GuildHeader": {"strings": ["bannerVisible:", "disableBannerAnimation:", "onContextMenu"]},
+ "GuildIcon": {"strings": [",animate:", ",size:", "{active:!0"], "noSearch": true},
+ "GuildIconWrapper": {"strings": ["badgeStrokeColor:", "textScale:"]},
+ "GuildInvitationRow": {"strings": [".getSelectedInviteMetadata", ".getSuggestedProps", "inviteKey:"], "noSearch": true},
+ "GuildInvites": {"strings": [".NO_INVITES_BODY", ".DISABLE_INVITES", "submitting"]},
+ "GuildItem": {"strings": ["guildNode:", "guildJoinRequestStatus", "lowerBadgeWidth"]},
+ "GuildItemWrapper": {"strings": [".pauseBackground", ".isUnavailable", "guildJoinRequestStatus"]},
+ "GuildMemberEntry": {"strings": [".renderOwnerHelpIcon(", ".overflowButton", ".roleWrapper"]},
+ "GuildsBar": {"strings": ["unreadMentionsIndicatorTop", "disableAppDownload", ".GUILD_MEMBER_VERIFICATION"]},
+ "GuildSidebar": {"strings": ["\"guildsnav\"", "unreadMentionsIndicatorBottom"]},
+ "GuildTooltip": {"strings": ["tooltipClassName", "includeActivity", "listItemTooltip"]},
+ "HeaderBar": {"strings": [".hamburger", "scrollable", "themed"]},
+ "HeaderBarChannelName": {"strings": ["onDoubleClick", ".setName", "maxLen:"]},
+ "HeaderBarContainer": {"strings": ["isAuthenticated", ".HEADER_BAR"]},
+ "HeaderBarRecipient": {"strings": [".Messages.DIRECT_MESSAGE", "getRecipientId", ".avatar", "getName"]},
+ "HeaderBarTitle": {"strings": [".titleWrapper", ",onContextMenu", "forceLevel:"]},
+ "HeaderBarTitleIcon": {"strings": ["HEADER_BAR_BADGE", ".iconBadge", "iconClassName:"]},
+ "HomeButtonDefault": {"strings": [".DISCODO_ENABLED", "home_button_no_track", "tutorialContainer"]},
+ "I18nLoader": {"strings": [".Messages.I18N_LOCALE_LOADING_ERROR", ".loading"]},
+ "IconBadge": {"strings": [".icon}", "ROUND,disableColor", ".iconBadge,"]},
+ "ImageModal": {"strings": ["renderLinkComponent", ".Messages.OPEN_IN_BROWSER", "animated"], "noSearch": true},
+ "ImageVideoModal": {"strings": ["renderLinkComponent", ".Messages.OPEN_IN_BROWSER", "videoWrapper"], "noSearch": true},
+ "InboxHeader": {"strings": [".UNREADS", ".TODOS", ".controls"]},
+ "IncomingCallModal": {"strings": [".Messages.INCOMING_VIDEO_CALL_ELLIPSIS", ".isFocused", "maxX:window.innerWidth"]},
+ "InviteGuildName": {"strings": ["{guild:",".guildName",".guildNameWrapper", ".name", "jsx)(\"span\","], "noSearch": true},
+ "KeybindRecorder": {"strings": [".RECORDING", ".DEFAULT", "toggleRecordMode"], "noSearch": true},
+ "LayerProvider": {"strings": ["layerContainerElement", "getContextValue"]},
+ "LayersProvider": {"strings": ["._currentlyTransitioningKeys", "._keysToEnter", "._keyChildMapping"]},
+ "LazyImage": {"protos": ["loadImage", "getRatio", "getSrc"]},
+ "LazyImageZoomable": {"strings": ["renderLinkComponent", "onCloseImage"]},
+ "ListItemTooltip": {"strings": [".listItemWrapper", "tooltipClassName", "disableWrapper"]},
+ "MemberListItem": {"strings": ["ownerTooltipText", "onClickPremiumGuildIcon:", "Messages.GUILD_OWNER"]},
+ "Mention": {"strings": ["iconType:", "color:", "),backgroundColor:"]},
+ "Menu": {"strings": ["\"empty\"", "getItemProps", "isUsingKeyboardNavigation"]},
+ "Message": {"strings": ["childrenMessageContent", "childrenRepliedMessage", "zalgo", ".buttonContainer"]},
+ "MessageAccessories": {"protos": ["renderGiftCodes", "renderEmbeds", "renderActivityInvite"]},
+ "MessageActionsContextMenu": {"strings": ["canReport:", "navId:\"message-actions\"", "useMessageMenu"]},
+ "MessageContent": {"strings": [".SEND_FAILED", "editedTimestamp", ".MESSAGE_EDITED"]},
+ "MessageContextMenu": {"strings": ["MESSAGE_ACTIONS_MENU_LABEL", "navId:\"message", "getGuildId"]},
+ "MessageGroup": {"strings": [".ephemeral", "animateAvatar:", "getMessageByReference"]},
+ "MessageHeader": {"strings": ["showTimestampOnHover", "usernameClassName", "isVisibleOnlyOnHover:"], "noSearch": true},
+ "MessageReply": {"strings": [".isFirstMessageInForumPost", "referencedUsernameProfile:", "referencedMessage"]},
+ "MessageReplyHeader": {"strings": ["pollBadgeReplied", "referencedMessage"]},
+ "Messages": {"strings": ["messageGroupSpacing", "groupSpacing", "jumpToPresent"]},
+ "MessageSearchResultContextMenu": {"strings": ["MESSAGE_ACTIONS_MENU_LABEL", "navId:\"message"], "nonStrings": ["getGuildId"]},
+ "MessageTimestamp": {"strings": [".timestampVisibleOnHover", "MESSAGE_EDITED_TIMESTAMP", ".timestampTooltip"], "noSearch": true},
+ "MessageToolbar": {"strings": ["Messages.MORE", "hasDeveloperMode", "emojiPicker:"], "noSearch": true},
+ "MessageUsername": {"strings": ["\"username\"", "colorString", "compact"]},
+ "ModalCarousel": {"strings": [".gotoNext", "currentIndex", "gotoPrevThrottled"]},
+ "ModalHeader": {"strings": ["headerIdIsManaged:", ".header,", "Direction.HORIZONTAL"]},
+ "ModalFooter": {"strings": [".footerSeparator", ".separator", "Direction.HORIZONTAL_REVERSE"]},
+ "ModalRoot": {"strings": ["rootWithShadow", "ImpressionTypes.MODAL", "ModalTransitionState"]},
+ "NameContainer": {"strings": ["\"listitem\"", "wrappedName", "innerClassName"]},
+ "NameTag": {"strings": ["invertColor:", "usernameClass", "discriminatorClass"]},
+ "NavItem": {"strings": [".selected", ".acronym", "fontSize:"]},
+ "Note": {"strings": [".noteRef", "handleBlur", ".SPACE"]},
+ "NowPlayingHeader": {"strings": ["ACTIVITY_FEED_NOW_PLAYING_HEADER", "partiedMembers"]},
+ "NowPlayingItem": {"strings": [".wrapper", "padded:"]},
+ "PanelButton": {"strings": ["Masks.PANEL_BUTTON"]},
+ "ParticipantsForSelectedParticipant": {"strings": ["ACTIVITY", "maxVisibleUsers", "participantType"]},
+ "PeopleList": {"strings": [".SECTION_NO_RESULTS", ".section", "SUGGESTIONS"]},
+ "PeopleListItem": {"strings": ["height:new", "isFocused", "onOtherHover"]},
+ "PeopleListItemBlocked": {"strings": [".listItemContents", "UNKNOWN", ".BLOCKED"]},
+ "PeopleListItemFriend": {"strings": [".getMutablePrivateChannels", ".handleOpenPrivateChannel", "isActiveRow"]},
+ "PeopleListItemPending": {"strings": ["PENDING_INCOMING", ".DENY", "addRelationship"]},
+ "PeopleListSectionedLazy": {"strings": ["statusSections", "peopleList", "id:\"people-list\""]},
+ "PeopleListSectionedNonLazy": {"strings": ["statusSections", "peopleList", "id:\"people\""]},
+ "PictureInPictureVideo": {"strings": [".topControls", ".bottomControl", "screenMessage", "renderBottomLeftControls:"]},
+ "PrivateChannel": {"strings": ["LEAVE_GROUP_DM_MANAGED_BODY", "PrivateChannel.renderAvatar"]},
+ "PrivateChannelRecipients": {"strings": [".membersWrap", "recipients"]},
+ "PrivateChannelsList": {"strings": ["privateChannelIds", "privateChannelRecipientsInviteButtonIcon"]},
+ "QuickMessage": {"strings": ["QUICK_DM_USER", ".NORMAL"]},
+ "QuickSwitchChannelResult": {"strings": ["getAccessibilityLabel", ".contentUnread", "renderVoiceStates"]},
+ "QuickSwitcher": {"protos": ["getRowId", "renderSection", "renderResults", "renderProtip", "search"]},
+ "QuickSwitchGroupDMResult": {"strings": ["getAccessibilityLabel", ".contentUnread", "dmIconContainer"]},
+ "QuickSwitchGuildResult": {"strings": ["getAccessibilityLabel", ".contentUnread", "guildIconContainer"]},
+ "QuickSwitchUserResult": {"strings": ["getAccessibilityLabel", ".contentUnread", "getDisplayNickname"]},
+ "Reactions": {"strings": ["showImmediate:", ".BURST", "reactions:", ".emoji.name"], "noSearch": true},
+ "ReactionsModal": {"strings": [".BURST", ".reactions", ".emoji.name", "selectedReaction"], "noSearch": true},
+ "ReactionsModalUser": {"strings": ["currentUser cannot be undefined", "reactorDefault"]},
+ "ReactionsModalUsers": {"strings": ["hasMore", "emoji", "spinnerMore"], "noSearch": true},
+ "RecentMentions": {"strings": ["canCloseAllMessages", "RECENT_MENTIONS", "badgeState:"]},
+ "RecentsChannelHeader": {"strings": [".subtextContainer", ".channelNameSpan", ".channelNameHeader", "gotoChannel:"]},
+ "RichChannelMention": {"strings": ["iconType:", "Messages.UNKNOWN_CHANNEL", "\"locked\""], "noSearch": true},
+ "RichRoleMention": {"strings": ["\"@deleted-role\"", "guildId:", ".RoleDot"], "noSearch": true},
+ "RichUserMention": {"strings": ["hidePersonalInformation", "getUser", "userTooltip"], "noSearch": true},
+ "RTCConnection": {"strings": [".NOISE_CANCELLATION_POPOUT", ".voicePanelIntroductionButton"]},
+ "RTCConnectionVoiceUsers": {"strings": [".Messages.VOICE_PANEL_SHOW_EXTRAS", ".Messages.VOICE_PANEL_USERS", "voiceStates:"]},
+ "SearchBar": {"strings": ["this.inputRef", ".containerRef", ".handleOnChange"]},
+ "SearchPopout": {"strings": [".handleHintClick", ".selectedIndex", "token.start"]},
+ "SearchPopoutOption": {"strings": [".plusIcon", ".option,", ".filter"]},
+ "SearchResult": {"strings": ["onJump:", "message:", "handleMessageClick"]},
+ "SearchResults": {"strings": ["SEARCH_ERROR", "emptyResultsText", "isSearching"]},
+ "SearchResultsHeader": {"strings": [".Messages.SEARCH_OLDEST_SHOR", ".Messages.SEARCH_MOST_RELEVANT_SHORT", "searchByMode"]},
+ "SearchResultsInner": {"strings": ["SEARCH_HIDE_BLOCKED_MESSAGES", "totalResults", "\"search-result-\""]},
+ "SearchResultsPagination": {"strings": ["pageLength", "changePage", "maxVisiblePages"]},
+ "SettingsView": {"strings": ["tabBarItemContainer", "PROFILE_CUSTOMIZATION", "badgeCount"]},
+ "Shakeable": {"protos": ["shake", "getDefaultAnimProps", "stop"]},
+ "Spoiler": {"strings": [".removeObscurity", "onReveal:"]},
+ "SpoilerWarning": {"strings": [".spoilerWarning", ".SPOILER"]},
+ "StandardSidebarView": {"strings": ["standardSidebarView", "sidebarTheme:", "mobileSidebarHeader"]},
+ "SystemMessageThreadCreated": {"strings": ["threadOnClick:", ".SYSTEM_MESSAGE_THREAD_CREATED", "viewThreadsOnClick:"]},
+ "SystemMessageWrapper": {"strings": ["unknown message type", "\"SystemMessage\""]},
+ "TabBar": {"props": ["Item", "Header", "Panel"]},
+ "TextChannelEmptyMessage": {"strings": ["MANAGE_CHANNELS", ".BEGINNING_CHANNEL_DESCRIPTION", "topicHook:"]},
+ "TextInput": {"strings": ["onFocus", "MAXIMUM_LENGTH_ERROR", "getIsOverFlowing"], "noSearch": true},
+ "ThreadCard": {"strings": ["threadId:", ".container", ".threadName"]},
+ "ThreadCardDescription": {"strings": [".Messages.THREAD_BROWSER_STARTED_BY", ".bullet", ".lastMessageId"]},
+ "ThreadEmptyMessage": {"strings": [",{channel:", ".name", "{channelId:", ".iconWrapper", ".icon}"]},
+ "ThreadEmptyMessageAuthor": {"strings": [".threadCreatorName", ".unknownCreatorName", ".getUser"]},
+ "ThreadMessageAccessories": {"strings": ["threadMetadata", "NO_RECENT_THREAD_MESSAGES", ".Messages.THREAD"]},
+ "ThreadMessageAccessoryMessage": {"strings": [".threadMessageAccessoryPlaceholder", ".threadMessageAccessoryContent", "formatInline:"]},
+ "ThreadSidebar": {"strings": ["baseChannelId:", ".SIDEBAR", ".THREAD_HEADER_BAR"]},
+ "TooltipContainer": {"protos": ["renderTooltip", "setDomElement", "shouldShowTooltip", "toggleShow"]},
+ "TransitionGroup": {"protos": ["performAppear", "performEnter", "performLeave"]},
+ "TypingUsers": {"strings": ["Easing.quad", ".emphasizeSlowmodeCooldown", ".sequence("]},
+ "UnavailableGuildsButton": {"strings": [".errorInner", ".guildsError", "Messages.PARTIAL_OUTAGE"]},
+ "UnreadDMs": {"strings": ["getMutablePrivateChannels", "selectedVoiceGuildId", "selectedVoiceChannelId:"]},
+ "UserBadges": {"strings": [".PROFILE_USER_BADGES", "SIZE_24"]},
+ "UserBanner": {"strings": ["showPremiumBadgeUpsell:", ".isPremiumAtLeast", ".SETTINGS"]},
+ "UserBannerMask": {"strings": [".bannerSVGWrapper", "getAvatarSpecs", "foreignObject"]},
+ "UserBioSection": {"strings": ["isUsingGuildBio:", "aboutMeGuildIcon", "GUILD_IDENTITY_BIO_TOAST"]},
+ "UserConnectionsSection": {"strings": [".applicationRoleConnections)", ".CONNECTIONS_ROLE_POPOUT_VIEW_ALL"]},
+ "UserGenericContextMenu": {"strings": ["USER_ACTIONS_MENU_LABEL", "navId:\"user", ".USER_GENERIC_MENU"], "noSearch": true},
+ "UserInfo": {"strings": [".botTag", "isMobile:", ".discordTag"]},
+ "UserMemberContextMenu": {"strings": ["USER_ACTIONS_MENU_LABEL", "navId:\"user", ".GUILD_CHANNEL_USER_MENU"], "noSearch": true},
+ "UserMemberSince": {"strings": [".memberSince", ".USER_PROFILE_DISCORD_MEMBER_SINCE"]},
+ "UserMention": {"strings": ["inlinePreview", "\"@\"", "renderPopout:"]},
+ "UsernameSection": {"strings": ["shouldCopyOnClick:", ".userTagDiscriminatorNoNickname"]},
+ "UserPopout": {"strings": ["{user:", "userId:", "\"Unexpected missing user\")", "getUser"], "noSearch": true},
+ "UserPopoutAvatar": {"strings": [".avatarDecorationHint", ".VIEW_PROFILE"], "noSearch": true},
+ "UserPopoutBody": {"strings": ["customStatusActivity:", "canDM:", "hidePersonalInformation:", "showCopiableUsername:"]},
+ "UserProfile": {"strings": [".PROFILE_MODAL", "USER_INFO_CONNECTIONS", ".topSection"], "noSearch": true},
+ "UserProfileBody": {"strings": [".userInfoSectionHeader", "Messages.NOTE", "connectedAccounts:"], "noSearch": true},
+ "UserProfileHeader": {"strings": ["friendToken:", ".additionalActionsIcon", "onMessage"], "noSearch": true},
+ "UserProfileMutualFriends": {"strings": [".getMutualFriends", ".listScroller", ".emptyText"]},
+ "UserProfileMutualGuilds": {"strings": [".getMutualGuilds", ".listScroller", ".emptyText"]},
+ "UserProfileUsername": {"strings": [".customStatusEmoji", ".customStatusSoloEmoji", ".findActivity(", ".CUSTOM_STATUS"], "noSearch": true},
+ "UserRolesSection": {"strings": [".rolePillBorder", "numRoles", "roleClassName"]},
+ "UserSummaryItem": {"protos": ["renderMoreUsers", "renderUsers", "renderIcon"]},
+ "UserSettingsAppearance": {"protos": ["renderTheme", "renderDisplayMode", "renderMessageGroupSpacingSlider"]},
+ "UserTheme": {"strings": [".UserProfileThemeContextProvider", "pendingThemeColors:"], "noSearch": true},
+ "UserThemeContainer": {"strings": [".trackUserProfileAction", "guildId:", ".Provider"], "noSearch": true},
+ "VideoBackground": {"strings": ["backgroundSrc:", "pulseSpeakingIndicator:", ".avatarWrapper"]},
+ "VoiceUser": {"protos": ["renderPrioritySpeaker", "renderIcons", "renderAvatar"]},
+ "VoiceUsers": {"strings": ["hidePreview", "previewIsOpen", "Permissions.MOVE_MEMBERS"]}
+ },
+ "ModuleUtilsConfig": {
+ "QueuedComponents": [],
+ "ContextMenuTypes": [],
+ "ContextMenuTypesMap": {},
+ "ContextMenuSubItemsMap": {},
+ "PatchTypes": [],
+ "InstanceFunctions": [],
+ "PatchMap": {},
+ "Finder": {},
+ "LoadedInComponents": {}
+ },
+ "SvgIcons": {
+ "ACTIVITY": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16
+ },
+ "icon": ""
+ },
+ "ACTIVITY_DISABLED": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16,
+ "foreground": 16
+ },
+ "icon": ""
+ },
+ "ARROW_DOWN": {
+ "defaultProps": {
+ "width": 18,
+ "height": 18
+ },
+ "icon": ""
+ },
+ "ARROW_UP": {
+ "defaultProps": {
+ "width": 18,
+ "height": 18
+ },
+ "icon": ""
+ },
+ "BOOST": {
+ "defaultProps": {
+ "width": 24,
+ "height": 24,
+ "foreground": ""
+ },
+ "icon": ""
+ },
+ "CALENDAR": {
+ "icon": ""
+ },
+ "CHANGELOG": {
+ "icon": ""
+ },
+ "CHECKBOX": {
+ "defaultProps": {
+ "background": "",
+ "foreground": ""
+ },
+ "icon": ""
+ },
+ "CHECKBOX_EMPTY": {
+ "defaultProps": {
+ "foreground": ""
+ },
+ "icon": ""
+ },
+ "CHECKMARK": {
+ "defaultProps": {
+ "width": 18,
+ "height": 18
+ },
+ "icon": ""
+ },
+ "CHECKMARK_CIRCLE": {
+ "icon": ""
+ },
+ "CLOCK": {
+ "icon": ""
+ },
+ "CLOSE": {
+ "defaultProps": {
+ "width": 12,
+ "height": 12
+ },
+ "icon": ""
+ },
+ "CLOSE_CIRCLE": {
+ "icon": ""
+ },
+ "COG": {
+ "icon": ""
+ },
+ "CROWN": {
+ "icon": ""
+ },
+ "DOWNLOAD": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16
+ },
+ "icon": ""
+ },
+ "DROPPER": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16,
+ "foreground": ""
+ },
+ "icon": ""
+ },
+ "EYE": {
+ "icon": ""
+ },
+ "FAVORITE": {
+ "icon": ""
+ },
+ "FAVORITE_FILLED": {
+ "icon": ""
+ },
+ "FOLDER": {
+ "icon": ""
+ },
+ "GAMEPAD": {
+ "icon": ""
+ },
+ "GAMEPAD_DISABLED": {
+ "icon": ""
+ },
+ "GITHUB": {
+ "icon": ""
+ },
+ "GLOBE": {
+ "defaultProps": {
+ "width": 20,
+ "height": 20
+ },
+ "icon": ""
+ },
+ "GRADIENT": {
+ "defaultProps": {
+ "width": 36,
+ "height": 36
+ },
+ "icon": ""
+ },
+ "HEART": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16
+ },
+ "icon": ""
+ },
+ "INFO": {
+ "icon": ""
+ },
+ "LEFT_CARET": {
+ "icon": ""
+ },
+ "LEFT_DOUBLE_CARET": {
+ "icon": ""
+ },
+ "LOCK_CLOSED": {
+ "icon": ""
+ },
+ "LOCK_OPEN": {
+ "icon": ""
+ },
+ "MENU_CARET": {
+ "getClassName": {
+ "": ["menucaretarrow"],
+ "props.open": ["menucaretopen"]
+ },
+ "icon": ""
+ },
+ "METAMASK": {
+ "icon": ""
+ },
+ "MORE": {
+ "icon": ""
+ },
+ "NOVA_AT": {
+ "icon": ""
+ },
+ "NOVA_PIN": {
+ "icon": ""
+ },
+ "NOVA_TRASH": {
+ "icon": ""
+ },
+ "NUMPAD": {
+ "icon": ""
+ },
+ "OPEN_EXTERNAL": {
+ "icon": ""
+ },
+ "OVERLAY": {
+ "icon": ""
+ },
+ "OVERLAY_DISABLED": {
+ "icon": ""
+ },
+ "PATREON": {
+ "icon": ""
+ },
+ "PAYPAL": {
+ "icon": ""
+ },
+ "PENCIL": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16
+ },
+ "icon": ""
+ },
+ "PHANTOM": {
+ "icon": ""
+ },
+ "PIN": {
+ "defaultProps": {
+ "width": 16,
+ "height": 16
+ },
+ "icon": ""
+ },
+ "PODIUM": {
+ "icon": ""
+ },
+ "QUESTIONMARK": {
+ "icon": ""
+ },
+ "QUESTIONMARK_ACTIVITY": {
+ "defaultProps": {
+ "width": 40,
+ "height": 40
+ },
+ "icon": ""
+ },
+ "QUOTE": {
+ "icon": ""
+ },
+ "RAW_TEXT": {
+ "icon": ""
+ },
+ "RIGHT_CARET": {
+ "icon": ""
+ },
+ "RIGHT_DOUBLE_CARET": {
+ "icon": ""
+ },
+ "SEARCH": {
+ "defaultProps": {
+ "width": 18,
+ "height": 18
+ },
+ "icon": ""
+ },
+ "SPEAKER": {
+ "icon": ""
+ },
+ "STREAM": {
+ "icon": ""
+ },
+ "TRASH": {
+ "icon": ""
+ },
+ "WARNING": {
+ "icon": ""
+ }
+ },
+ "CustomClassModules": {
+ "BDFDB": {
+ "BDFDBundefined": "BDFDB_undefined",
+ "avatarDisabled": "disabled_6G33EE",
+ "badge": "badge_7R_W3s",
+ "badgeAvatar": "avatar_hF52Er",
+ "bdRepo": "repo_k8F4Sd",
+ "bdRepoEntry": "entry_9JnAPs",
+ "bdRepoFooterControls": "controls_p0SrvV",
+ "bdRepoHeaderControls": "controls_18FQsW",
+ "bdRepoListHeader": "repoHeader_2KfNvH",
+ "bdRepoListScroller": "repoScroller_9JnAPs",
+ "cardDisabled": "cardDisabled_wnh5ZW",
+ "cardHorizontal": "horizontal_0ffRsT",
+ "cardInner": "inner_OP_8zd",
+ "cardWrapper": "card_rT4Wbb",
+ "changeLogButton": "changeLogButton_L9FFs5",
+ "charCounter": "counter_uAzbKp",
+ "changeLogModal": "changeLogModal_ny_dHC",
+ "collapseContainer": "container_fAVkOf",
+ "collapseContainerCollapsed": "collapsed_2BUBZm",
+ "collapseContainerHeader": "header_2s6x-5",
+ "collapseContainerInner": "inner_TkGytd",
+ "collapseContainerMini": "container_fAVkOf containerMini__k6Rts",
+ "collapseContainerTitle": "title_ROsJi-",
+ "colorPicker": "colorPicker_h5sF8g",
+ "colorPickerAlpha": "alpha_VcPGeR",
+ "colorPickerAlphaCheckered": "alpha-checkered",
+ "colorPickerAlphaCursor": "alpha_cursor",
+ "colorPickerAlphaHorizontal": "alpha-horizontal",
+ "colorPickerGradient": "gradient_TJOYTr",
+ "colorPickerGradientCheckered": "gradient-checkered",
+ "colorPickerGradientCursor": "gradient_cursor",
+ "colorPickerGradientCursorEdge": "gradient-cursor-edge",
+ "colorPickerGradientCursorSelected": "gradient-cursor-selected",
+ "colorPickerGradientHorizontal": "gradient-horizontal",
+ "colorPickerGradientButton": "gradientButton_eBBuwD",
+ "colorPickerGradientButtonEnabled": "enabled_MypHME",
+ "colorPickerSwatches": "swatches_QxZw_N",
+ "colorPickerSwatchesDisabled": "disabled_2JgNxl",
+ "colorPickerSwatchSelected": "selected_f5IVXN",
+ "colorPickerSwatchSingle": "single_Fbb1wB",
+ "colorPickerSwatchSingleWrapper": "swatch_7FsRaa",
+ "confirmModal": "confirmModal_t-WDWJ",
+ "cursorPointer": "cursorPointer_B3uwDA",
+ "dateInputButton": "dateInputButton_jTGUJg",
+ "dateInputButtonSelected": "selected_8F23Ra",
+ "dateInputControls": "dateInputControls_cgfPf9",
+ "dateInputField": "dateInputField_2vhGP1",
+ "dateInputInner": "dateInputInner_ORXFwT",
+ "dateInputPreview": "dateInputPreview_lG5sMM",
+ "dateInputPreviewPrefix": "dateInputPreviewPrefix_6Fww21",
+ "dateInputPreviewSuffix": "dateInputPreviewSuffix_f4Sr32",
+ "dateInputWrapper": "dateInputWrapper_6tQOYp",
+ "dev": "dev_A7f2Rx",
+ "discoveryCard": "card_x5zW6z",
+ "discoveryCardAuthor": "author_d2JIcl",
+ "discoveryCardButton": "button_coQXfM",
+ "discoveryCardControls": "controls_T0w-Wc",
+ "discoveryCardCover": "cover_qyY86I",
+ "discoveryCardCoverBadge": "coverBadge_I41ZIY",
+ "discoveryCardCoverWrapper": "coverWrapper_J-mDGJ",
+ "discoveryCardDescription": "description_zXiu5E",
+ "discoveryCardFooter": "footer_C1KpS6",
+ "discoveryCardHeader": "header_4hHJgv",
+ "discoveryCardIcon": "icon_0jmVrJ",
+ "discoveryCardIconLoading": "loading_f8Gs22",
+ "discoveryCardIconWrapper": "iconWrapper_eK7GO6",
+ "discoveryCardInfo": "info_xw-o76",
+ "discoveryCardName": "name_OSUjF9",
+ "discoveryCards": "list_QuW8QR",
+ "discoveryCardStat": "stat_eRknnn",
+ "discoveryCardStatIcon": "statIcon_o40EX1",
+ "discoveryCardStats": "stats_Pc5tYW",
+ "discoveryCardTag": "tag_PbPfwP",
+ "discoveryCardTags": "tags_9KJ-1X",
+ "discoveryCardTitle": "title_SSzExd",
+ "discoveryCardTitleButton": "button_SxdSzE",
+ "favButtonContainer": "favbutton_8Fzu45",
+ "guild": "guild_r3yAE_",
+ "guildLowerLeftBadge": "lowerLeftBadge_zr4T_9",
+ "guildsLabel": "label_2wRs_g",
+ "guildSummaryClickableIcon": "clickableIcon_7I6aVc",
+ "guildSummaryContainer": "container_5VyO4t",
+ "guildSummaryEmptyGuild": "emptyGuild_Am9XfC",
+ "guildSummaryIcon": "icon_r6DlKo",
+ "guildSummaryIconContainer": "iconContainer_IBAtWs",
+ "guildSummaryIconContainerMasked": "iconContainerMasked_G-akdf iconContainer_IBAtWs",
+ "guildSummaryMoreGuilds": "moreGuilds_c5JVlC",
+ "guildSummarySvgIcon": "icon_5TsFrr",
+ "guildUpperLeftBadge": "upperLeftBadge_e35IpL",
+ "guildVoiceList": "guildVoiceList_9ads4k",
+ "hasBadge": "hasBadge_4rT8_u",
+ "hoverCardButton": "button_1yVL_7",
+ "hotkeyResetButton": "resetButton_hI9Ax7",
+ "hotkeyWrapper": "recorder_can0vx",
+ "inputNumberButton": "button_J9muv5",
+ "inputNumberButtonDown": "down_cOY7Qp button_J9muv5",
+ "inputNumberButtonUp": "up_mUs_72 button_J9muv5",
+ "inputNumberButtons": "buttons_our3p-",
+ "inputNumberWrapper": "numberInputWrapper_j4svZS",
+ "inputNumberWrapperDefault": "numberInputWrapperDefault_gRxcuK numberInputWrapper_j4svZS",
+ "inputNumberWrapperMini": "numberInputWrapperMini_wtUU31 numberInputWrapper_j4svZS",
+ "layerContainerZIndexDisabled": "zIndexDisabled_Pf4Txx",
+ "listInput": "listInput_11g5Sr",
+ "listInputDelete": "delete_M_nPTt",
+ "listInputItem": "item_wGC8aX",
+ "listInputItems": "items_D9PGwH",
+ "listRow": "listRow_7SfZww",
+ "loadingIcon": "loadingIcon_cOYMPl",
+ "loadingIconWrapper": "loadingIconWrapper_PsVJ9m",
+ "overflowEllipsis": "ellipsis_qlo9sA",
+ "pagination": "pagination_09Sd5R",
+ "paginationBottom": "bottom_jTb32i",
+ "paginationList": "list_PIKebU",
+ "paginationListAlphabet": "alphabet_2ANo0x",
+ "paginationListAlphabetChar": "alphabetChar_bq-8Go",
+ "paginationListAlphabetCharDisabled": "disabled_XmhCq2",
+ "paginationListContent": "listContent_aG3Fq8",
+ "paginationListMini": "mini_GMiniS",
+ "paginationMini": "mini_hODxXf",
+ "paginationTop": "top_v-18jZ",
+ "popoutArrow": "popoutArrow_g8f4Ss",
+ "popoutArrowBottom": "popoutArrowBottom_r5Tzui",
+ "popoutArrowTop": "popoutArrowTop_lK9F3a",
+ "popoutWrapper": "popout_xwjvsX",
+ "quickSelectWrapper": "quickSelectWrapper_UCfTKz",
+ "marginLeft4": "marginLeft4_58StzA",
+ "marginLeft8": "marginLeft8_3RhhAa",
+ "menuColorCustom": "colorCustom_44asd2",
+ "menuItemHint": "hint_BK71lM",
+ "modalHeaderShade": "shade_h6F4sT",
+ "modalHeaderHasSibling": "hasSiblings_fRyjyl",
+ "modalNoScroller": "noScroller_YgPpF3",
+ "modalSidebar": "sidebar__0OpfR",
+ "modalTabContent": "tabContent_nZ-1U5",
+ "modalTabContentOpen": "open_yICTYu",
+ "modalSubInner": "inner_t84Frz",
+ "modalTextContent": "text_8fSrts",
+ "modalWrapper": "modal_6GHvdM",
+ "multiInput": "multiInput_Ft9zQo",
+ "multiInputField": "multiInputField_GfMBpr",
+ "multiInputFirst": "multiInputFirst_5rMj_O",
+ "multiInputLast": "multiInputLast_HWxgTr",
+ "multiInputWrapper": "multiInputWrapper_g6Srtv",
+ "noticeClosing": "closing_g5Srr2",
+ "noticeText": "text_kRs522",
+ "noticeUpdate": "updateNotice_2DjjHs",
+ "noticeUpdateButtonAll": "all_iF7Saa",
+ "noticeUpdateButtonReload": "reload_LkMrac",
+ "noticeUpdateEntries": "entries_Br6Sda",
+ "noticeUpdateEntry": "entry_oFts5R",
+ "noticeUpdateText": "notice-message",
+ "noticeUpdateSeparator": "separator_g5DsaR",
+ "noticeWrapper": "noticeWrapper_8z511t",
+ "searchBarWrapper": "searchBarWrapper_1GpKvB",
+ "selectWrapper": "selectWrapper_yPjeij",
+ "settingsGuild": "guild_J3Egt5",
+ "settingsGuildDisabled": "disabled_b2o83O",
+ "settingsPanel": "settingsPanel_w2ySNR",
+ "settingsPanelList": "settingsList_eZjkXj",
+ "settingsPanelListWrapper": "wrapper_kRsR33",
+ "settingsPanelListWrapperMini": "mini_2Iug3W",
+ "settingsRow": "settingsRow_o9Ft44",
+ "settingsTableCard": "settingsTableCard_628t52",
+ "settingsTableCardConfigs": "settingsTableCardConfigs_w5X9-Z",
+ "settingsTableCardLabel": "settingsTableCardLabel_MElgIg",
+ "settingsTableHeaderOptions": "headerOptions_8F_5Ss",
+ "settingsTableHeaders": "settingsTableHeaders_WKzw9_",
+ "settingsTableHeaderVertical": "headerVertical_4MNxqk",
+ "settingsTableList": "settingsTableList_f6sW2y",
+ "sidebar": "sidebar_frSZx3",
+ "sidebarContent": "content_1SbgDG",
+ "sidebarList": "list_VCoBc2",
+ "sliderBubble": "bubble_3we2di",
+ "switchMini": "mini_6F2SSa",
+ "supporter": "supporter_Z3FfwL",
+ "supporterTier1": "tier1_841W86",
+ "supporterTier2": "tier2_VDTzC3",
+ "supporterTier3": "tier3_yTxjsy",
+ "supporterTier4": "tier4_5RNl6k",
+ "svgIcon": "icon_GhnIRB",
+ "svgIconWrapper": "iconWrapper_g20jFn",
+ "tabBarContainerBottom": "bottom_b8sdfs",
+ "table": "table_moqjM0",
+ "tableBodyCell": "bodyCell_dQam9V",
+ "tableHeaderCell": "headerCell_T6Fo3K",
+ "textScroller": "textScroller_dc9_kz",
+ "themedPopout": "themedPopout_1TrfdI",
+ "tooltipCustom": "tooltipCustom_hH39_Z",
+ "tooltipNote": "note_e4Jh6_",
+ "tooltipRowExtra": "extraRow_6F2Dss"
+ },
+ "BD": {
+ "bdAddonCard": "bd-addon-card",
+ "bdAddonList": "bd-addon-list",
+ "bdAddonModal": "bd-addon-modal",
+ "bdAddonModalFooter": "bd-addon-modal-footer",
+ "bdAddonModalHeader": "bd-addon-modal-header",
+ "bdAddonModalSettings": "bd-addon-modal-settings",
+ "bdAuthor": "bd-author",
+ "bdButton": "bd-button",
+ "bdButtonDanger": "bd-button-danger",
+ "bdControls": "bd-controls",
+ "bdControlsButton": "bd-addon-button",
+ "bdDescription": "bd-description",
+ "bdDescriptionWrap": "bd-description-wrap",
+ "bdFolderButton": "bd-pfbtn",
+ "bdFooter": "bd-footer",
+ "bdGuild": "bd-guild",
+ "bdGuildAnimatable": "bd-animatable",
+ "bdGuildAudio": "bd-audio",
+ "bdGuildSelected": "bd-selected",
+ "bdGuildSeparator": "bd-guild-separator",
+ "bdGuildUnread": "bd-unread",
+ "bdGuildVideo": "bd-video",
+ "bdHeader": "bd-addon-header",
+ "bdHeaderTitle": "bd-title",
+ "bdIcon": "bd-icon",
+ "bdLink": "bd-link",
+ "bdLinks": "bd-links",
+ "bdMeta": "bd-meta",
+ "bdMinimalMode": "bd-minimal",
+ "bdName": "bd-name",
+ "bdPillSelected": "bd-selected",
+ "bdPillUnread": "bd-unread",
+ "bdSwitch": "bd-switch",
+ "bdSwitchChecked": "bd-switch-checked",
+ "bdSwitchInner": "bd-checkbox",
+ "bdUpdatebtn": "bd-updatebtn",
+ "bdVersion": "bd-version",
+ "settings": "plugin-settings",
+ "settingsOpen": "settings-open",
+ "settingsClosed": "settings-closed",
+ "switch": "ui-switch",
+ "switchCheckbox": "ui-switch-checkbox",
+ "switchChecked": "checked",
+ "switchItem": "ui-switch-item",
+ "switchWrapper": "ui-switch-wrapper"
+ },
+ "BetterFriendList": {
+ "mutualGuilds": "mutualGuilds_s7F2aa",
+ "nameCell": "nameCell_7F4sRs",
+ "title": "title_3aDrFs"
+ },
+ "BetterNsfwTag": {
+ "nsfwTag": "nsfwTag_666omg"
+ },
+ "BetterSearchPage": {
+ "pagination": "pagination_shit69"
+ },
+ "ChatFilter": {
+ "blocked": "blocked_jUhayi",
+ "blockedStamp": "blockedStamp_ijVeNn",
+ "censored": "censored_UYfeYg",
+ "censoredStamp": "censoredStamp_fb2cYb"
+ },
+ "CharCounter": {
+ "charCounter": "charCounter_7fw40k",
+ "chatCounter": "chatCounter_XOMPsh",
+ "counterAdded": "charCounterAdded_zz9O4t",
+ "customStatusCounter": "customStatusCounter_G8FrsT",
+ "editCounter": "editCounter_pNT1Xe",
+ "popoutNoteCounter": "popoutNoteCounter_62U4Rh",
+ "profileNoteCounter": "profileNoteCounter_p0fWA_",
+ "threadCreation": "threadCreation_p0fWA_",
+ "uploadCounter": "uploadCounter_iEGQQk"
+ },
+ "CustomStatusPresets": {
+ "customStatusItem": "customStatusItem_f5Trsa",
+ "deleteButton": "deleteButton_k8a4Sa",
+ "deleteIcon": "deleteIcon_22SgHa",
+ "dragPreview": "dragPreview_3F0ssT",
+ "sortableCard": "sortableCard_oF6sTT",
+ "sortDivider": "sortDivider_d8SzzU",
+ "status": "status_0f5Sr2"
+ },
+ "DisplayServersAsChannels": {
+ "badge": "badge_fxFrUP",
+ "muted": "muted_k5Fraa",
+ "name": "name_z5133D",
+ "styled": "styledGuildsAsChannels_DNHtg_"
+ },
+ "EmojiStatistics": {
+ "amountCell": "amountCell_g_W6Rx",
+ "iconCell": "iconCell_-wniOu",
+ "nameCell": "nameCell_xyXENZ",
+ "statisticsButton": "statisticsButton_nW2KoM"
+ },
+ "FriendNotifications": {
+ "friendsOnline": "friendsOnline_2JkivW",
+ "friendsOnlineWrap": "friendsOnlineWrap_0gZ63m",
+ "logAvatar": "avatar_GgGssS",
+ "logContent": "content__3_FFs",
+ "logTime": "time_00Fs44",
+ "timeLogModal": "timeLogModal_9s4Rts",
+ "typeLabel": "label_9FgsSa"
+ },
+ "GameActivityToggle": {
+ "added": "gameActivityToggleAdded_Yd-YxC"
+ },
+ "ImageUtilities": {
+ "details": "details_9dkFPc",
+ "detailsAdded": "detailsAdded_fHiJlm",
+ "detailsLabel": "label_mrlccN",
+ "detailsWrapper": "detailsWrapper_TE1mu5",
+ "gallery": "gallery_JViwKR",
+ "imageDetails": "imageDetails_1t6Zms",
+ "imageDetailsAdded": "imageDetailsAdded_sda9Fa",
+ "lens": "zoomLens_uOK8xV",
+ "lensBackdrop": "lensBackdrop_yEm7Om",
+ "next": "next_SHEZrz",
+ "operations": "operations_3V47CY",
+ "previous": "previous_xsNq6B",
+ "sibling": "sibling_6vI7Pu",
+ "switchIcon": "switchIcon_QY6cR4"
+ },
+ "LastMessageDate": {
+ "icon": "icon_ocEw13"
+ },
+ "OldTitleBar": {
+ "oldTitleBarEnabled": "oldTitleBarEnabled_D8ppJQ",
+ "settingsToolbar": "settingsToolbar_wu4yfQ",
+ "toolbar": "toolbar_hRzFw-"
+ },
+ "PersonalPins": {
+ "messageTag": "messageTag_yRSUYg",
+ "messageTagAdd": "messageTagAdd_vKM0VY",
+ "messageTagAddActive": "active_G0VvAY",
+ "messageTagDelete": "messageTagDelete_QaGh6V",
+ "messageTagName": "messageTagName_dT8OZ4"
+ },
+ "PinDMs": {
+ "dragPreview": "dragPreview_nXiByA",
+ "dmChannelPinned": "pinned_0lM4wD",
+ "dmChannelPlaceholder": "placeholder_7bhR5s",
+ "pinnedChannelsHeaderAmount": "headerAmount__-7GrS",
+ "pinnedChannelsHeaderArrow": "pinnedChannelsHeaderArrow_44rrTz",
+ "pinnedChannelsHeaderCollapsed": "collapsed_3w_-ff",
+ "pinnedChannelsHeaderColored": "colored_oIzG5s",
+ "pinnedChannelsHeaderContainer": "pinnedChannelsHeaderContainer_89Gjv4",
+ "recentPinned": "pinned_jHvFrr",
+ "recentPlaceholder": "placeholder_Uff-gH",
+ "unpinButton": "unpinButton_z3-UVO",
+ "unpinIcon": "unpinIcon_79ZnEr"
+ },
+ "PluginRepo": {
+ "failNotice": "failNotice_OtHUGb",
+ "loadingIcon": "loadingIcon_dB3qSe",
+ "loadingTooltip": "loadingTooltip_SzsTEU",
+ "newEntriesNotice": "newEntriesNotice_qvvpPx",
+ "outdatedNotice": "outdatedNotice_9Q9gJv",
+ "repoNotice": "repoNotice_P5ss6R"
+ },
+ "ReadAllNotificationsButton": {
+ "button": "button_Jt-tIg",
+ "frame": "frame_oXWS21",
+ "innerFrame": "innerFrame_8Hg64E"
+ },
+ "ServerCounter": {
+ "serverCount": "serverCount_FsTTs1",
+ "serverCountWrap": "serverCountWrap_k8F5De"
+ },
+ "ServerDetails": {
+ "details": "details_08FrsT",
+ "icon": "icon_hSL42R",
+ "tooltip": "detailsTooltip_G9hSSa"
+ },
+ "ServerFolders": {
+ "dragPreview": "dragPreview_nXiByA",
+ "folderContent": "content_Pph8t6",
+ "folderContentClosed": "closed_j55_T-",
+ "folderContentIsOpen": "folderContentIsOpen_zz6FgW",
+ "guildPlaceholder": "placeholder_7bhR5s",
+ "hasSideBar": "hasSideBar_sda9Fa",
+ "iconSwatch": "iconSwatch__78Ghj",
+ "iconSwatchInner": "iconInner_aOY-qk",
+ "iconSwatchPreview": "preview_Bbg_24",
+ "iconSwatchNoPreview": "noPreview_G8SS4t",
+ "iconSwatchSelected": "selected_P5oePO"
+ },
+ "SpellCheck": {
+ "error": "error_k9z2IV",
+ "overlay": "spellCheckOverlay_cNSap5"
+ },
+ "ShowBadgesInChat": {
+ "badges": "badges_XRnWAp",
+ "badgesChat": "badgesChat_f_cbR8",
+ "badgesDMs": "badgesDMs_Aw_p52",
+ "badgesMembers": "badgesMembers_8Kf3S1",
+ "badgesSettings": "badgesSettings_ychoGn",
+ "indicator": "indicator_8F4GGw"
+ },
+ "ShowConnections": {
+ "connection": "connection_9Gh4sa",
+ "connectionIcon": "connectionIcon_888F4s",
+ "connections": "connections_pPr4as",
+ "verifiedBadge": "verifiedBadge_mH2YpO"
+ },
+ "SpotifyControls": {
+ "activityButton": "activityButton_5Fs4Aa",
+ "bar": "bar_g2ZMIm",
+ "barGabber": "grabber_7sd5f5",
+ "barFill": "barFill_Dhkah7",
+ "barText": "barText_lmqc5O",
+ "buttonActive": "active_6TsW-_",
+ "container": "container_6sXIoE",
+ "containerInner": "inner_WRV6k5",
+ "containerMaximized": "maximized_vv2Wr0",
+ "containerPaused": "paused_l9f3As",
+ "containerWithTimeline": "withTimeline_824fT_",
+ "cover": "cover_SwJ-ck",
+ "coverMaximizer": "maximizer_RVu85p",
+ "coverWrapper": "coverWrapper_YAplwJ",
+ "details": "details_ntX2k5",
+ "interpret": "interpret_F93iqP",
+ "settingsIcon": "icon_F4SSra",
+ "settingsLabel": "label_3f00Sr",
+ "song": "song_tIdBpF",
+ "timeline": "timeline_UWmgAx",
+ "volumeSlider": "volumeSlider_sR5g00"
+ },
+ "StaffTag": {
+ "adminIcon": "admin_Kv1Hp_",
+ "forumCreatorIcon": "forumCreator_5sOT2A",
+ "groupOwnerIcon": "groupOwner_g6FlmA",
+ "managementIcon": "management_3fF_o8",
+ "ownerIcon": "owner_FfFh3B",
+ "threadCreatorIcon": "threadCreator_lp5sXo"
+ },
+ "ThemeRepo": {
+ "dragBar": "dragBar_4FsRaa",
+ "dragCorner": "dragCorner_PgJJk2",
+ "dragInterface": "dragInterface_OT5s2A",
+ "failNotice": "failNotice_pZAzjZ",
+ "loadingIcon": "loadingIcon_h7OqHY",
+ "loadingTooltip": "loadingTooltip_YszEmb",
+ "moveBar": "moveBar_lZ555a",
+ "newEntriesNotice": "newEntriesNotice_abF6e1",
+ "preview": "preview_7Gh5tS",
+ "previewFullscreen": "fullscreen_h78TsW",
+ "previewMoving": "moving_Wa22fA",
+ "outdatedNotice": "outdatedNotice_fw8ams",
+ "repoNotice": "repoNotice_TV3RFr"
+ },
+ "ThemeSettings": {
+ "card": "card_h4Rts2",
+ "cardName": "card_jdf7Rs",
+ "grid": "settingsButton_60jFra"
+ },
+ "TimedLightDarkMode": {
+ "dateGrabber": "dateGrabber_QrRkIX",
+ "timerGrabber": "timerGrabber_zpRAIk",
+ "timerSettings": "timerSettings_wkvEfF"
+ },
+ "TopRolesEverywhere": {
+ "badgeStyle": "badgeStyle_tFiEQ8",
+ "chatTag": "chatTag_Y-5TDc",
+ "memberTag": "memberTag_QVWzGc",
+ "roleStyle": "roleStyle_jQ7KI2",
+ "tag": "tag_wWVHyf",
+ "voiceTag": "voiceTag_0F4Ss0"
+ },
+ "Translator": {
+ "configButton": "configButton_lLgMs2",
+ "translateButton": "translateButton_DhP9x8",
+ "translated": "translated_5YO8i3",
+ "translating": "translating_Yi-YxC"
+ },
+ "WriteUpperCase": {
+ "enabled": "enabled_7KI3Q2",
+ "quickToggleButton": "quickToggleButton_P2xDh8"
+ },
+ "NotFound": {
+ "_": "",
+ "emoji": "emoji",
+ "carouselModal": "carouselModal__7e22f",
+ "highlight": "highlight",
+ "mention": "mention",
+ "mentionInteractive": "interactive",
+ "mentionWrapper": "wrapper__53064",
+ "messagesLoadingWrapper": "wrapper__11501",
+ "nameContainer": "container_a48b21",
+ "nameContainerNameContainer": "container__43554",
+ "hueCursor": "hue_cursor",
+ "hueHorizontal": "hue-horizontal",
+ "hueVertical": "hue-vertical",
+ "saturationBlack": "saturation-black",
+ "saturationColor": "saturation-color",
+ "saturationCursor": "saturation-cursor",
+ "saturationWhite": "saturation-white",
+ "searchResultsPagination": "container__77df8",
+ "stopAnimations": "stop-animations",
+ "subtext": "subtext_ce73b4",
+ "themeCustomBackground": "custom-theme-background",
+ "themeDark": "theme-dark",
+ "themeLight": "theme-light",
+ "themeUndefined": "theme-undefined",
+ "userPopoutNote": "note_ba0c31"
+ },
+ "Toast": {
+ "avatar": "avatar_3xmbmC",
+ "bar": "bar_95Sdw1",
+ "barInner": "barInner_u7Frsw",
+ "bg": "bg_8df5St",
+ "brand": "colorBrand_WfDfzD",
+ "center": "center_9SpJeg",
+ "closable": "closable_7ShrRt",
+ "closeIcon": "closeIcon_8R553s",
+ "closing": "closing_K489s7",
+ "custom": "colorCustom_WKsPgT",
+ "customBar": "customBar_3RsUzs",
+ "danger": "colorDanger_O5wq9n",
+ "default": "colorDefault_XdNdIp",
+ "icon": "icon_OZgBPQ",
+ "info": "colorInfo_ujWH4-",
+ "inner": "inner_6Fsw34",
+ "left": "left_IXnX5I",
+ "opening": "opening_3TzSw2",
+ "right": "right_Eka_pI",
+ "success": "colorSuccess_6GreWs",
+ "text": "text_28VADE",
+ "toast": "toast_g4bfgI",
+ "toasts": "toasts_tApoHv",
+ "warning": "colorWarning_qZNMsx"
+ }
+ },
+ "DiscordClassModules": {
+ "AccountDetails": {"props": ["usernameContainer", "withTagAsButton"]},
+ "AccountDetailsButtons": {"props": ["button", "enabled", "disabled"]},
+ "Anchor": {"props": ["anchor", "anchorUnderlineOnHover"]},
+ "AnimationContainer": {"props": ["animatorLeft", "didRender"]},
+ "AppBase": {"props": ["container", "base", "panels"]},
+ "AppInner": {"props": ["app", "layers"]},
+ "AppMount": {"props": ["appMount"]},
+ "ApplicationStore": {"props": ["applicationStore", "navigation"]},
+ "AppOuter": {"props": ["app", "mobileApp"]},
+ "Attachment": {"props": ["wrapper", "video", "metadataDownload"]},
+ "AttachmentCover": {"props": ["cover", "icon", "iconWrapper"]},
+ "AuditLog": {"props": ["auditLog", "divider"]},
+ "AuthBox": {"props": ["authBox", "authBoxExpanded"]},
+ "AuthBoxBackground": {"props": ["splashBackground", "characterBackground"]},
+ "Autocomplete": {"props": ["autocomplete", "autocompleteRow"]},
+ "AutocompleteAliases": {"props": ["autocomplete", "stickerAutoComplete"]},
+ "Avatar": {"props": ["avatar", "mask", "wrapper"]},
+ "AvatarIcon": {"props": ["iconActiveLarge", "iconActiveMedium"]},
+ "Backdrop": {"props": ["backdrop", "withLayer"]},
+ "Badge": {"props": ["numberBadge", "textBadge", "iconBadge"]},
+ "BotTag": {"props": ["botTag", "botTagInvert"]},
+ "Button": {"props": ["colorBrand", "lookBlank"]},
+ "CallCurrent": {"props": ["wrapper", "fullScreen"]},
+ "CallDetails": {"props": ["container", "hotspot"]},
+ "CallIncoming": {"props": ["wrapper", "mainChannelInfo"]},
+ "CallScreenshare": {"props": ["videoControls", "topControls", "screenMessage"]},
+ "Card": {"props": ["card", "cardBrand"]},
+ "Category": {"props": ["wrapper", "children", "addButtonIcon"]},
+ "CategoryArrow": {"props": ["arrow", "open"]},
+ "ChangeLog": {"props": ["added", "fixed", "improved", "progress"]},
+ "Channel": {"props": ["wrapper", "newBadge", "modeSelected"]},
+ "ChannelContainer": {"props": ["actionIcon", "containerDefault"]},
+ "ChannelContainerMentionsBadge": {"props": ["mentionsBadge", "iconBase"]},
+ "ChannelLimit": {"props": ["users", "total", "wrapper"]},
+ "ChannelTextArea": {"props": ["textArea", "buttons"]},
+ "ChannelTextAreaAttachButton": {"props": ["attachButton", "attachWrapper"]},
+ "ChannelTextAreaButton": {"props": ["buttonWrapper", "active"]},
+ "ChannelTextAreaCharCounter": {"props": ["characterCount", "error"]},
+ "ChannelTextAreaSlate": {"props": ["slateContainer", "placeholder"]},
+ "ChatThreadSidebar": {"props": ["container", "floating", "resizeHandle"]},
+ "ChatWindow": {"props": ["chat", "channelTextArea", "chatContent"]},
+ "Checkbox": {"props": ["checkboxWrapper", "round"]},
+ "ColorPicker": {"props": ["customColorPicker", "colorPickerDropper"]},
+ "ColorPickerInner": {"props": ["hue", "saturation"]},
+ "Combobox": {"props": ["combobox", "itemLabel"]},
+ "Cursor": {"props": ["cursorDefault", "userSelectNone"]},
+ "CustomStatus": {"props": ["customStatusSoloEmoji", "customStatusText", "customStatus"]},
+ "CustomStatusIcon": {"props": ["textRuler", "emoji", "icon"]},
+ "CustomStatusModal": {"props": ["inputContainer", "emojiButton", "modalRoot"]},
+ "CustomStatusPopout": {"props": ["customStatusItem", "customEmoji"]},
+ "DmAddPopout": {"props": ["popout", "searchBarComponent"]},
+ "DmAddPopoutItems": {"props": ["friendSelected", "friendWrapper"]},
+ "DefaultChannelWelcome": {"props": ["titleName", "card", "playCircleIcon"]},
+ "DownloadLink": {"props": ["downloadLink"]},
+ "Embed": {"props": ["embed", "embedAuthorIcon"]},
+ "EmbedActions": {"props": ["iconPlay", "iconWrapperActive"]},
+ "Emoji": {"props": ["emoji"], "length": 1},
+ "EmojiButton": {"props": ["emojiButton", "sprite"]},
+ "EmojiPicker": {"props": ["emojiPicker", "inspector"]},
+ "EmojiPickerCustomEmoji": {"props": ["image", "imageLoading"]},
+ "EmojiPickerDiversitySelector": {"props": ["diversityEmojiItemImage", "diversitySelectorOptions"]},
+ "EmojiPickerItem": {"props": ["emojiSpriteImage"]},
+ "EmojiPickerInspector": {"props": ["inspector", "graphicPrimary"]},
+ "EmojiPickerInspectorEmoji": {"props": ["emoji", "glyphEmoji"]},
+ "ErrorScreen": {"props": ["wrapper", "flexWrapper", "note"]},
+ "ExpressionPicker": {"props": ["contentWrapper", "navButton", "navList"]},
+ "FavButton": {"props": ["gifFavoriteButton", "selected", "icon"]},
+ "File": {"props": ["downloadButton", "fileNameLink"]},
+ "Flex": {"props": ["alignBaseline", "alignCenter"], "length": 24, "smaller": true},
+ "FlexChild": {"props": ["flexChild", "flex"]},
+ "FlowerStar": {"props": ["flowerStarContainer", "flowerStar"]},
+ "FormText": {"props": ["description", "modeDefault"]},
+ "ForumPage": {"props": ["newPostsButton", "list", "searchIcon"]},
+ "Game": {"props": ["game", "gameName"]},
+ "GameIcon": {"props": ["gameIcon", "small", "xsmall"]},
+ "GameLibraryTable": {"props": ["stickyHeader", "emptyStateText"]},
+ "GifFavoriteButton": {"props": ["gifFavoriteButton", "showPulse"]},
+ "GoLiveDetails": {"props": ["panel", "gameWrapper"]},
+ "Guild": {"props": ["wrapper", "lowerBadge", "svg"]},
+ "GuildChannels": {"props": ["positionedContainer", "unreadBar"]},
+ "GuildChannelsWrapper": {"props": ["hubContainer", "container"]},
+ "GuildDiscovery": {"props": ["pageWrapper", "guildList"]},
+ "GuildDm": {"props": ["pill"], "length": 1},
+ "GuildEdges": {"props": ["wrapper", "target", "centerTarget"]},
+ "GuildFolder": {"props": ["folder", "expandedFolderIconWrapper"]},
+ "GuildHeader": {"props": ["header", "name", "bannerImage"]},
+ "GuildHeaderButton": {"props": ["button", "open"]},
+ "GuildItem": {"props": ["listItem", "serverEmoji"]},
+ "GuildIcon": {"props": ["acronym", "selected", "wrapper"]},
+ "GuildInvite": {"props": ["wrapper", "guildIconJoined"]},
+ "GuildsButton": {"props": ["circleIconButton", "circleIcon"], "length": 6, "smaller": true},
+ "GuildsDragPlaceholder": {"props": ["dragInner", "placeholderMask"], "length": 6, "smaller": true},
+ "GuildSeparator": {"props": ["guildSeparator"], "length": 6, "smaller": true},
+ "GuildServer": {"props": ["blobContainer", "pill"]},
+ "GuildSettingsBanned": {"props": ["bannedUser", "bannedUserAvatar"]},
+ "GuildSettingsEmoji": {"props": ["emojiRow", "emojiAliasPlaceholder"]},
+ "GuildSettingsInvite": {"props": ["countdownColumn", "inviteSettingsInviteRow"]},
+ "GuildSettingsMember": {"props": ["member", "membersFilterPopout"]},
+ "GuildsListItem": {"props": ["listItemWrapper", "listItemTooltip"], "length": 6, "smaller": true},
+ "GuildsItems": {"props": ["circleIcon", "guildsError"]},
+ "GuildsWrapper": {"props": ["scroller", "unreadMentionsBar", "wrapper"]},
+ "HeaderBar": {"props": ["container", "children", "toolbar"]},
+ "HeaderBarExtras": {"props": ["headerBarLoggedOut", "search"]},
+ "HeaderBarSearch": {"props": ["search", "searchBar", "open"]},
+ "HeaderBarTopic": {"props": ["topic", "expandable", "content"]},
+ "Heading": {"props": ["eyebrow", "code"]},
+ "HomeIcon": {"props": ["homeIcon"]},
+ "HotKeyRecorder": {"props": ["editIcon", "recording"]},
+ "HoverCard": {"props": ["card", "active"]},
+ "HoverCardRemoveButton": {"props": ["button", "filled", "default"]},
+ "IconDirection": {"props": ["directionDown", "directionUp"]},
+ "ImageAssets": {"props": ["pngImage", "stickerAsset"]},
+ "ImageModal": {"props": ["image", "modal"], "length": 4, "smaller": true},
+ "ImageMosaic": {"props": ["lazyImg", "oneByOneGridSingle"]},
+ "ImageWrapper": {"props": ["clickable", "imageWrapperBackground"]},
+ "Input": {"props": ["inputMini", "inputDefault"]},
+ "InviteModal": {"props": ["inviteRow", "modal"]},
+ "Item": {"props": ["item", "side", "header"]},
+ "ItemRole": {"props": ["role", "dragged"]},
+ "ItemLayerContainer": {"props": ["layer", "layerContainer"]},
+ "Layers": {"props": ["layer", "layers"]},
+ "LiveTag": {"props": ["liveLarge", "live"]},
+ "LoadingScreen": {"props": ["container", "problemsText", "problems"]},
+ "LottieIcon": {"props": ["lottieIcon"], "length": 1},
+ "Margins": {"props": ["marginBottom4", "marginCenterHorz"]},
+ "Menu": {"props": ["menu", "colorPremiumGradient", "item"]},
+ "MenuCaret": {"props": ["arrow", "open"]},
+ "MenuReactButton": {"props": ["wrapper", "icon", "focused", "button"]},
+ "MenuSlider": {"props": ["slider", "sliderContainer"]},
+ "Member": {"props": ["member", "ownerIcon"]},
+ "MemberSince": {"props": ["memberSince", "discordIcon"]},
+ "MembersWrapper": {"props": ["membersWrap", "membersGroup"]},
+ "Message": {"props": ["message", "mentioned"]},
+ "MessageAccessory": {"props": ["embedWrapper", "gifFavoriteButton"]},
+ "MessageAttachment": {"props": ["removeMosaicItemButton", "inline"]},
+ "MessageBlocked": {"props": ["blockedMessageText", "expanded"]},
+ "MessageBody": {"props": ["markupRtl", "edited"]},
+ "MessageDivider": {"props": ["isUnread", "divider"]},
+ "MessageElements": {"props": ["messageGroupBlockedBtn", "dividerRed"]},
+ "MessageFile": {"props": ["cancelButton", "filenameLinkWrapper"]},
+ "MessageLocalBot": {"props": ["ephemeralMessage", "icon"]},
+ "MessageMarkup": {"props": ["markup"]},
+ "MessagePopout": {"props": ["message", "spacing"]},
+ "MessageOperations": {"props": ["operations"], "length": 1},
+ "MessageReactions": {"props": ["reactions", "reactionMe"]},
+ "MessageReactionsModal": {"props": ["reactor", "reactionSelected"]},
+ "MessageReply": {"props": ["container", "text", "closeButton"]},
+ "MessagesPopout": {"props": ["messagesPopoutWrap", "jumpButton"]},
+ "MessagesPopoutButtons": {"props": ["secondary", "tertiary", "button"]},
+ "MessagesPopoutTabBar": {"props": ["header", "tabBar", "active", "controls"]},
+ "MessagesLoading": {"props": ["attachment", "blob", "cozy"]},
+ "MessagesWelcome": {"props": ["emptyChannelIcon", "description", "header"]},
+ "MessagesWelcomeButton": {"props": ["button", "buttonIcon"], "length": 2},
+ "MessagesWelcomeThread": {"props": ["iconWrapper", "threadCreatorName"]},
+ "MessagesWrap": {"props": ["messagesWrapper", "messageGroupBlocked"]},
+ "MessageSystem": {"props": ["container", "actionAnchor"]},
+ "MessageSystemAccessories": {"props": ["name", "spine", "cta"]},
+ "MessageToolbar": {"props": ["container", "icon", "isHeader"]},
+ "MessageToolbarItems": {"props": ["wrapper", "button", "separator"]},
+ "Modal": {"props": ["root", "small", "medium"]},
+ "ModalCarouselNav": {"props": ["nav", "navNext"]},
+ "ModalCarouselWrapper": {"props": ["modalCarouselWrapper", "zoomedCarouselModalRoot"]},
+ "ModalDivider": {"props": ["divider"], "length": 1},
+ "ModalItems": {"props": ["guildName", "checkboxContainer"]},
+ "ModalLayer": {"props": ["layer", "hidden", "backdrop"]},
+ "ModalMiniContent": {"props": ["modal", "content"], "length": 2},
+ "ModalSub": {"props": ["modal", "sizeLarge"]},
+ "NameContainer": {"props": ["nameAndDecorators", "name"]},
+ "NameContainerState": {"props": ["interactive", "selected", "muted"]},
+ "NameTag": {"props": ["bot", "nameTag"]},
+ "NitroStore": {"props": ["applicationStore", "marketingHeader"]},
+ "NoteTextarea": {"props": ["textarea"], "length": 1},
+ "Notice": {"props": ["notice", "platformIcon"]},
+ "NoticePlatform": {"props": ["iconAndroid", "textLink"]},
+ "PageImage": {"props": ["title", "image", "wrapper", "text"], "length": 5, "smaller": true},
+ "Pagination": {"props": ["pageButton", "pageControl"]},
+ "PeopleItem": {"props": ["peopleListItem", "active"]},
+ "PeopleItemInfo": {"props": ["listItemContents", "actions"], "length": 2},
+ "PeopleItemUser": {"props": ["userInfo", "discordTag"]},
+ "PeopleList": {"props": ["peopleList", "emptyStateContainer"]},
+ "Peoples": {"props": ["peopleColumn", "tabBar"]},
+ "PeoplesNowPlayingMember": {"props": ["memberItem", "unknown"]},
+ "PictureInPicture": {"props": ["pictureInPicture", "pictureInPictureWindow"]},
+ "PillWrapper": {"props": ["item", "wrapper"], "length": 2},
+ "PollModal": {"props": ["voter", "emoji", "close"]},
+ "PopoutActivity": {"props": ["ellipsis", "activityActivityFeed"]},
+ "PrivateChannel": {"props": ["channel", "closeButton"]},
+ "PrivateChannelList": {"props": ["privateChannels", "searchBar"]},
+ "PrivateChannelListScroller": {"props": ["privateChannelsHeaderContainer", "headerText"]},
+ "QuickMessage": {"props": ["input"], "length": 1},
+ "QuickSelect": {"props": ["quickSelectArrow", "selected"]},
+ "QuickSwitch": {"props": ["result", "guildIconContainer"]},
+ "QuickSwitchWrap": {"props": ["container", "miscContainer"]},
+ "RadioGroup": {"props": ["radioBar", "item"]},
+ "Reactions": {"props": ["reactionBtn", "reaction"]},
+ "RecentMentions": {"props": ["recentMentionsPopout"]},
+ "RecentMentionsHeader": {"props": ["channelName", "channelHeader", "dmIcon"]},
+ "Role": {"props": ["roleName", "roleRemoveIcon"]},
+ "RoleCircle": {"props": ["roleCircle", "dot"]},
+ "RoleIcon": {"props": ["clickable", "roleIcon"], "length": 4, "smaller": true},
+ "Roles": {"props": ["rolePill", "roles", "rolePillBorder"]},
+ "Scrollbar": {"props": ["scrollbar", "scrollbarGhost"]},
+ "Scroller": {"props": ["scrollerBase", "none", "fade"]},
+ "SearchBar": {"props": ["clear", "container", "pointer"]},
+ "SearchPopout": {"props": ["datePicker", "searchResultChannelIconBackground"]},
+ "SearchPopoutWrap": {"props": ["container", "queryContainer"]},
+ "SearchResults": {"props": ["noResults", "searchResultsWrap"]},
+ "SearchResultsElements": {"props": ["totalResults", "searchHeaderTabList"]},
+ "SearchResultsGroup": {"props": ["searchResultGroup", "channelNameContainer"]},
+ "SearchResultsMessage": {"props": ["message", "searchResult"]},
+ "Select": {"props": ["searchable", "option", "selectedIcon"]},
+ "SelectFilterPopout": {"props": ["selectFilterPopout", "avatar", "row"]},
+ "SettingsCloseButton": {"props": ["closeButton", "keybind"]},
+ "SettingsItems": {"props": ["labelRow", "note"]},
+ "SettingsTable": {"props": ["headerOption", "headerName"]},
+ "SettingsWindow": {"props": ["contentRegion", "standardSidebarView"]},
+ "SettingsWindowScroller": {"props": ["sidebarScrollable", "content", "scroller"]},
+ "Slider": {"props": ["slider", "grabber"]},
+ "Spinner": {"props": ["spinner", "chasingDots"]},
+ "Spoiler": {"props": ["spoilerContainer", "hidden"]},
+ "Switch": {"props": ["container", "slider", "input"]},
+ "Table": {"props": ["stickyHeader", "sortIcon"]},
+ "Text": {"props": ["defaultColor", "defaultMarginh1"]},
+ "Text2": {"props": ["defaultColor", "selectable", "lineClamp1"]},
+ "TextColor": {"props": ["colorStandard", "colorMuted", "colorError"]},
+ "TextColor2": {"props": ["muted", "wrapper", "base"]},
+ "TextSize": {"props": ["size10", "size14", "size20"]},
+ "TextStyle": {"props": ["strikethrough", "underline", "bold"]},
+ "ThreadCard": {"props": ["threadName", "container", "facepile"]},
+ "Tip": {"props": ["pro", "inline"]},
+ "TitleBar": {"props": ["titleBar", "wordmark"]},
+ "Tooltip": {"props": ["tooltip", "tooltipTop"]},
+ "TooltipGuild": {"props": ["rowIcon", "rowGuildName"]},
+ "Typing": {"props": ["cooldownWrapper", "typing"]},
+ "UnreadBar": {"props": ["active", "bar", "unread"]},
+ "UploadModal": {"props": ["uploadModal", "bgScale"]},
+ "UserBadges": {"props": ["profileBadge", "container"]},
+ "UserBanner": {"props": ["popoutBanner", "popoutBannerPremium"]},
+ "UserPopoutFooter": {"props": ["wumpusTooltip", "messageInputContainer"]},
+ "UserPopoutHeader": {"props": ["avatarHint", "profileBadges", "avatarWrapper"]},
+ "UserPopoutSection": {"props": ["section", "lastSection"]},
+ "UserPopoutSectionTitle": {"props": ["title", "body", "clydeMoreInfo"]},
+ "UserPopoutUsernameSection": {"props": ["userTagNoNickname", "nickname", "headerBotTag"]},
+ "UserProfile": {"props": ["root", "tabBarContainer"]},
+ "UserProfileHeader": {"props": ["additionalActionsIcon", "header", "relationshipButtons"]},
+ "UserProfileInfoSection": {"props": ["userInfoSection", "note"]},
+ "UserProfileList": {"props": ["listAvatar", "listRow"]},
+ "UserProfileListGuild": {"props": ["guildAvatar", "guildAvatarWithoutIcon"]},
+ "UserProfileUsernameSection": {"props": ["customStatusSoloEmoji", "nameTag", "discriminator"]},
+ "UserSettingsAppearancePreview": {"props": ["preview", "firstMessage"]},
+ "UserSettingsSocialLinks": {"props": ["socialLinks", "link"]},
+ "UserSummaryItem": {"props": ["avatarContainerMasked", "container"]},
+ "UserTheme": {"props": ["userPopoutOuter", "userProfileOuter"]},
+ "Video": {"props": ["video", "fullScreen", "chatSidebarOpen"]},
+ "VoiceChannel": {"props": ["avatarSpeaking", "voiceUser"]},
+ "VoiceChannelLimit": {"props": ["total", "users", "wrapper"]},
+ "VoiceChannelList": {"props": ["list", "collapsed"]},
+ "VoiceDetails": {"props": ["container", "customStatusContainer"]},
+ "VoiceDetailsPing": {"props": ["rtcConnectionQualityBad", "rtcConnectionQualityFine"]},
+ "WebhookCard": {"props": ["pulseBorder", "copyButton"]}
+ },
+ "DiscordClasses": {
+ "_bdguild": ["BD", "bdGuild"],
+ "_bdguildanimatable": ["BD", "bdGuildAnimatable"],
+ "_bdguildaudio": ["BD", "bdGuildAudio"],
+ "_bdguildselected": ["BD", "bdGuildSelected"],
+ "_bdguildseparator": ["BD", "bdGuildSeparator"],
+ "_bdguildunread": ["BD", "bdGuildUnread"],
+ "_bdguildvideo": ["BD", "bdGuildVideo"],
+ "_bdminimalmode": ["BD", "bdMinimalMode"],
+ "_bdpillselected": ["BD", "bdPillSelected"],
+ "_bdpillunread": ["BD", "bdPillUnread"],
+ "_betterfriendlistmutualguilds": ["BetterFriendList", "mutualGuilds"],
+ "_betterfriendlistnamecell": ["BetterFriendList", "nameCell"],
+ "_betterfriendlisttitle": ["BetterFriendList", "title"],
+ "_betternsfwtagtag": ["BetterNsfwTag", "nsfwTag"],
+ "_bettersearchpagepagination": ["BetterSearchPage", "pagination"],
+ "_chatfilterblocked": ["ChatFilter", "blocked"],
+ "_chatfilterblockedstamp": ["ChatFilter", "blockedStamp"],
+ "_chatfiltercensored": ["ChatFilter", "censored"],
+ "_chatfiltercensoredstamp": ["ChatFilter", "censoredStamp"],
+ "_charcountercounter": ["CharCounter", "charCounter"],
+ "_charcounterchatcounter": ["CharCounter", "chatCounter"],
+ "_charcountercounteradded": ["CharCounter", "counterAdded"],
+ "_charcountercustomstatuscounter": ["CharCounter", "customStatusCounter"],
+ "_charcountereditcounter": ["CharCounter", "editCounter"],
+ "_charcounterpopoutnotecounter": ["CharCounter", "popoutNoteCounter"],
+ "_charcounterprofilenotecounter": ["CharCounter", "profileNoteCounter"],
+ "_charcounterthreadcreationcounter": ["CharCounter", "threadCreation"],
+ "_charcounteruploadcounter": ["CharCounter", "uploadCounter"],
+ "_customstatuspresetscustomstatusitem": ["CustomStatusPresets", "customStatusItem"],
+ "_customstatuspresetsdeletebutton": ["CustomStatusPresets", "deleteButton"],
+ "_customstatuspresetsdeleteicon": ["CustomStatusPresets", "deleteIcon"],
+ "_customstatuspresetsdragpreview": ["CustomStatusPresets", "dragPreview"],
+ "_customstatuspresetssortablecard": ["CustomStatusPresets", "sortableCard"],
+ "_customstatuspresetssortdivider": ["CustomStatusPresets", "sortDivider"],
+ "_customstatuspresetsstatus": ["CustomStatusPresets", "status"],
+ "_displayserversaschannelsbadge": ["DisplayServersAsChannels", "badge"],
+ "_displayserversaschannelsmuted": ["DisplayServersAsChannels", "muted"],
+ "_displayserversaschannelsname": ["DisplayServersAsChannels", "name"],
+ "_displayserversaschannelsstyled": ["DisplayServersAsChannels", "styled"],
+ "_emojistatisticsstatisticsbutton": ["EmojiStatistics", "statisticsButton"],
+ "_emojistatisticsamountcell": ["EmojiStatistics", "amountCell"],
+ "_emojistatisticsiconcell": ["EmojiStatistics", "iconCell"],
+ "_emojistatisticsnamecell": ["EmojiStatistics", "nameCell"],
+ "_friendnotificationslogavatar": ["FriendNotifications", "logAvatar"],
+ "_friendnotificationslogcontent": ["FriendNotifications", "logContent"],
+ "_friendnotificationslogtime": ["FriendNotifications", "logTime"],
+ "_friendnotificationsfriendsonline": ["FriendNotifications", "friendsOnline"],
+ "_friendnotificationsfriendsonlinewrap": ["FriendNotifications", "friendsOnlineWrap"],
+ "_friendnotificationstimelogmodal": ["FriendNotifications", "timeLogModal"],
+ "_friendnotificationstypelabel": ["FriendNotifications", "typeLabel"],
+ "_gameactivitytoggleadded": ["GameActivityToggle", "added"],
+ "_imageutilitiesdetails": ["ImageUtilities", "details"],
+ "_imageutilitiesdetailsadded": ["ImageUtilities", "detailsAdded"],
+ "_imageutilitiesdetailslabel": ["ImageUtilities", "detailsLabel"],
+ "_imageutilitiesdetailswrapper": ["ImageUtilities", "detailsWrapper"],
+ "_imageutilitiesgallery": ["ImageUtilities", "gallery"],
+ "_imageutilitiesimagedetails": ["ImageUtilities", "imageDetails"],
+ "_imageutilitiesimagedetailsadded": ["ImageUtilities", "imageDetailsAdded"],
+ "_imageutilitieslense": ["ImageUtilities", "lens"],
+ "_imageutilitieslensebackdrop": ["ImageUtilities", "lensBackdrop"],
+ "_imageutilitiesnext": ["ImageUtilities", "next"],
+ "_imageutilitiesoperations": ["ImageUtilities", "operations"],
+ "_imageutilitiesprevious": ["ImageUtilities", "previous"],
+ "_imageutilitiessibling": ["ImageUtilities", "sibling"],
+ "_imageutilitiesswitchicon": ["ImageUtilities", "switchIcon"],
+ "_lastmessagedateicon": ["LastMessageDate", "icon"],
+ "_oldtitlebarenabled": ["OldTitleBar", "oldTitleBarEnabled"],
+ "_oldtitlebarsettingstoolbar": ["OldTitleBar", "settingsToolbar"],
+ "_oldtitlebartoolbar": ["OldTitleBar", "toolbar"],
+ "_personalpinsmessagetag": ["PersonalPins", "messageTag"],
+ "_personalpinsmessagetagadd": ["PersonalPins", "messageTagAdd"],
+ "_personalpinsmessagetagaddactive": ["PersonalPins", "messageTagAddActive"],
+ "_personalpinsmessagetagdelete": ["PersonalPins", "messageTagDelete"],
+ "_personalpinsmessagetagname": ["PersonalPins", "messageTagName"],
+ "_pindmsdragpreview": ["PinDMs", "dragPreview"],
+ "_pindmsdmchannelpinned": ["PinDMs", "dmChannelPinned"],
+ "_pindmsdmchannelplaceholder": ["PinDMs", "dmChannelPlaceholder"],
+ "_pindmspinnedchannelsheaderamount": ["PinDMs", "pinnedChannelsHeaderAmount"],
+ "_pindmspinnedchannelsheaderarrow": ["PinDMs", "pinnedChannelsHeaderArrow"],
+ "_pindmspinnedchannelsheadercollapsed": ["PinDMs", "pinnedChannelsHeaderCollapsed"],
+ "_pindmspinnedchannelsheadercolored": ["PinDMs", "pinnedChannelsHeaderColored"],
+ "_pindmspinnedchannelsheadercontainer": ["PinDMs", "pinnedChannelsHeaderContainer"],
+ "_pindmsrecentpinned": ["PinDMs", "recentPinned"],
+ "_pindmsrecentplaceholder": ["PinDMs", "recentPlaceholder"],
+ "_pindmsunpinbutton": ["PinDMs", "unpinButton"],
+ "_pindmsunpinicon": ["PinDMs", "unpinIcon"],
+ "_pluginrepofailnotice": ["PluginRepo", "failNotice"],
+ "_pluginrepoloadingicon": ["PluginRepo", "loadingIcon"],
+ "_pluginrepoloadingtooltip": ["PluginRepo", "loadingTooltip"],
+ "_pluginreponewentriesnotice": ["PluginRepo", "newEntriesNotice"],
+ "_pluginreponotice": ["PluginRepo", "repoNotice"],
+ "_pluginrepooutdatednotice": ["PluginRepo", "outdatedNotice"],
+ "_readallnotificationsbuttonbutton": ["ReadAllNotificationsButton", "button"],
+ "_readallnotificationsbuttonframe": ["ReadAllNotificationsButton", "frame"],
+ "_readallnotificationsbuttoninner": ["ReadAllNotificationsButton", "innerFrame"],
+ "_servercounterservercount": ["ServerCounter", "serverCount"],
+ "_servercounterservercountwrap": ["ServerCounter", "serverCountWrap"],
+ "_serverdetailsdetails": ["ServerDetails", "details"],
+ "_serverdetailsicon": ["ServerDetails", "icon"],
+ "_serverdetailstooltip": ["ServerDetails", "tooltip"],
+ "_serverfoldersdragpreview": ["ServerFolders", "dragPreview"],
+ "_serverfoldersfoldercontent": ["ServerFolders", "folderContent"],
+ "_serverfoldersfoldercontentclosed": ["ServerFolders", "folderContentClosed"],
+ "_serverfoldersfoldercontentisopen": ["ServerFolders", "folderContentIsOpen"],
+ "_serverfoldersguildplaceholder": ["ServerFolders", "guildPlaceholder"],
+ "_serverfoldershassidebar": ["ServerFolders", "hasSideBar"],
+ "_serverfoldersiconswatch": ["ServerFolders", "iconSwatch"],
+ "_serverfoldersiconswatchinner": ["ServerFolders", "iconSwatchInner"],
+ "_serverfoldersiconswatchpreview": ["ServerFolders", "iconSwatchPreview"],
+ "_serverfoldersiconswatchnopreview": ["ServerFolders", "iconSwatchNoPreview"],
+ "_serverfoldersiconswatchselected": ["ServerFolders", "iconSwatchSelected"],
+ "_showbadgesinchatbadges": ["ShowBadgesInChat", "badges"],
+ "_showbadgesinchatbadgeschat": ["ShowBadgesInChat", "badgesChat"],
+ "_showbadgesinchatbadgesdmslist": ["ShowBadgesInChat", "badgesDMs"],
+ "_showbadgesinchatbadgesmemberlist": ["ShowBadgesInChat", "badgesMembers"],
+ "_showbadgesinchatbadgessettings": ["ShowBadgesInChat", "badgesSettings"],
+ "_showbadgesinchatindicator": ["ShowBadgesInChat", "indicator"],
+ "_showconnectionsconnection": ["ShowConnections", "connection"],
+ "_showconnectionsconnections": ["ShowConnections", "connections"],
+ "_showconnectionsicon": ["ShowConnections", "connectionIcon"],
+ "_showconnectionsverifiedbadge": ["ShowConnections", "verifiedBadge"],
+ "_spellcheckerror": ["SpellCheck", "error"],
+ "_spellcheckoverlay": ["SpellCheck", "overlay"],
+ "_spotifycontrolsactivitybutton": ["SpotifyControls", "activityButton"],
+ "_spotifycontrolsbar": ["SpotifyControls", "bar"],
+ "_spotifycontrolsbarfill": ["SpotifyControls", "barFill"],
+ "_spotifycontrolsbargrabber": ["SpotifyControls", "barGabber"],
+ "_spotifycontrolsbartext": ["SpotifyControls", "barText"],
+ "_spotifycontrolsbuttonactive": ["SpotifyControls", "buttonActive"],
+ "_spotifycontrolscontainer": ["SpotifyControls", "container"],
+ "_spotifycontrolscontainerinner": ["SpotifyControls", "containerInner"],
+ "_spotifycontrolscontainermaximized": ["SpotifyControls", "containerMaximized"],
+ "_spotifycontrolscontainerpaused": ["SpotifyControls", "containerPaused"],
+ "_spotifycontrolscontainerwithtimeline": ["SpotifyControls", "containerWithTimeline"],
+ "_spotifycontrolscover": ["SpotifyControls", "cover"],
+ "_spotifycontrolscovermaximizer": ["SpotifyControls", "coverMaximizer"],
+ "_spotifycontrolscoverwrapper": ["SpotifyControls", "coverWrapper"],
+ "_spotifycontrolsdetails": ["SpotifyControls", "details"],
+ "_spotifycontrolsinterpret": ["SpotifyControls", "interpret"],
+ "_spotifycontrolssettingsicon": ["SpotifyControls", "settingsIcon"],
+ "_spotifycontrolssettingslabel": ["SpotifyControls", "settingsLabel"],
+ "_spotifycontrolssong": ["SpotifyControls", "song"],
+ "_spotifycontrolstimeline": ["SpotifyControls", "timeline"],
+ "_spotifycontrolsvolumeslider": ["SpotifyControls", "volumeSlider"],
+ "_stafftagadminicon": ["StaffTag", "adminIcon"],
+ "_stafftagforumcreatoricon": ["StaffTag", "forumCreatorIcon"],
+ "_stafftaggroupownericon": ["StaffTag", "groupOwnerIcon"],
+ "_stafftagmanagementicon": ["StaffTag", "managementIcon"],
+ "_stafftagownericon": ["StaffTag", "ownerIcon"],
+ "_stafftagthreadcreatoricon": ["StaffTag", "threadCreatorIcon"],
+ "_themerepodragbar": ["ThemeRepo", "dragBar"],
+ "_themerepodragcorner": ["ThemeRepo", "dragCorner"],
+ "_themerepodraginterface": ["ThemeRepo", "dragInterface"],
+ "_themerepofailnotice": ["ThemeRepo", "failNotice"],
+ "_themerepoloadingicon": ["ThemeRepo", "loadingIcon"],
+ "_themerepoloadingtooltip": ["ThemeRepo", "loadingTooltip"],
+ "_themerepomovebar": ["ThemeRepo", "moveBar"],
+ "_themereponewentriesnotice": ["ThemeRepo", "newEntriesNotice"],
+ "_themereponotice": ["ThemeRepo", "repoNotice"],
+ "_themerepooutdatednotice": ["ThemeRepo", "outdatedNotice"],
+ "_themerepopreview": ["ThemeRepo", "preview"],
+ "_themerepopreviewfullscreen": ["ThemeRepo", "previewFullscreen"],
+ "_themerepopreviewmoving": ["ThemeRepo", "previewMoving"],
+ "_themesettingscard": ["ThemeSettings", "card"],
+ "_themesettingscardname": ["ThemeSettings", "cardName"],
+ "_themesettingsgrid": ["ThemeSettings", "grid"],
+ "_timedlightdarkmodedategrabber": ["TimedLightDarkMode", "dateGrabber"],
+ "_timedlightdarkmodetimergrabber": ["TimedLightDarkMode", "timerGrabber"],
+ "_timedlightdarkmodetimersettings": ["TimedLightDarkMode", "timerSettings"],
+ "_toproleseverywherebadgestyle": ["TopRolesEverywhere", "badgeStyle"],
+ "_toproleseverywherechattag": ["TopRolesEverywhere", "chatTag"],
+ "_toproleseverywheremembertag": ["TopRolesEverywhere", "memberTag"],
+ "_toproleseverywhererolestyle": ["TopRolesEverywhere", "roleStyle"],
+ "_toproleseverywheretag": ["TopRolesEverywhere", "tag"],
+ "_toproleseverywherevoicetag": ["TopRolesEverywhere", "voiceTag"],
+ "_translatorconfigbutton": ["Translator", "configButton"],
+ "_translatortranslatebutton": ["Translator", "translateButton"],
+ "_translatortranslated": ["Translator", "translated"],
+ "_translatortranslating": ["Translator", "translating"],
+ "_writeuppercasequicktogglebutton": ["WriteUpperCase", "quickToggleButton"],
+ "_writeuppercasequicktogglebuttonenabled": ["WriteUpperCase", "enabled"],
+ "_repoauthor": ["BD", "bdAuthor"],
+ "_repobutton": ["BD", "bdButton"],
+ "_repobuttondanger": ["BD", "bdButtonDanger"],
+ "_repocard": ["BD", "bdAddonCard"],
+ "_repochangelogbutton": ["BDFDB", "changeLogButton"],
+ "_repocheckbox": ["BD", "switchCheckbox"],
+ "_repocheckboxchecked": ["BD", "switchChecked"],
+ "_repocheckboxinner": ["BD", "switch"],
+ "_repocheckboxitem": ["BD", "switchItem"],
+ "_repocheckboxwrap": ["BD", "switchWrapper"],
+ "_repocontrols": ["BD", "bdControls"],
+ "_repocontrolsbutton": ["BD", "bdControlsButton"],
+ "_repodescription": ["BD", "bdDescription"],
+ "_repodescriptionwrap": ["BD", "bdDescriptionWrap"],
+ "_repoentry": ["BDFDB", "bdRepoEntry"],
+ "_repofolderbutton": ["BD", "bdFolderButton"],
+ "_repofooter": ["BD", "bdFooter"],
+ "_repofootercontrols": ["BDFDB", "bdRepoFooterControls"],
+ "_repoheader": ["BD", "bdHeader"],
+ "_repoheadercontrols": ["BDFDB", "bdRepoHeaderControls"],
+ "_repoheadertitle": ["BD", "bdHeaderTitle"],
+ "_repo": ["BDFDB", "bdRepo"],
+ "_repoicon": ["BD", "bdIcon"],
+ "_repolist": ["BD", "bdAddonList"],
+ "_repolistheader": ["BDFDB", "bdRepoListHeader"],
+ "_repolistscroller": ["BDFDB", "bdRepoListScroller"],
+ "_repolink": ["BD", "bdLink"],
+ "_repolinks": ["BD", "bdLinks"],
+ "_repometa": ["BD", "bdMeta"],
+ "_repomodal": ["BD", "bdAddonModal"],
+ "_repomodalfooter": ["BD", "bdAddonModalFooter"],
+ "_repomodalheader": ["BD", "bdAddonModalHeader"],
+ "_repomodalsettings": ["BD", "bdAddonModalSettings"],
+ "_reponame": ["BD", "bdName"],
+ "_reposettings": ["BD", "settings"],
+ "_reposettingsopen": ["BD", "settingsOpen"],
+ "_reposettingsclosed": ["BD", "settingsClosed"],
+ "_reposwitch": ["BD", "bdSwitch"],
+ "_reposwitchchecked": ["BD", "bdSwitchChecked"],
+ "_reposwitchinner": ["BD", "bdSwitchInner"],
+ "_repoupdatebutton": ["BD", "bdUpdatebtn"],
+ "_repoversion": ["BD", "bdVersion"],
+ "accountinfo": ["AccountDetails", "container"],
+ "accountinfoavatar": ["AccountDetails", "avatar"],
+ "accountinfoavatarwrapper": ["AccountDetails", "avatarWrapper"],
+ "accountinfobutton": ["AccountDetailsButtons", "button"],
+ "accountinfobuttondisabled": ["AccountDetailsButtons", "disabled"],
+ "accountinfobuttonenabled": ["AccountDetailsButtons", "enabled"],
+ "accountinfobuttonstrikethrough": ["AccountDetails", "strikethrough"],
+ "accountinfodetails": ["AccountDetails", "usernameContainer"],
+ "accountinfonametag": ["AccountDetails", "nameTag"],
+ "accountinfowithtagasbutton": ["AccountDetails", "withTagAsButton"],
+ "accountinfowithtagless": ["AccountDetails", "withTagAsButton"],
+ "aliasautocomplete": ["AutocompleteAliases", "autocomplete"],
+ "anchor": ["Anchor", "anchor"],
+ "anchorunderlineonhover": ["Anchor", "anchorUnderlineOnHover"],
+ "animationcontainerbottom": ["AnimationContainer", "animatorBottom"],
+ "animationcontainercenter": ["AnimationContainer", "animatorCenter"],
+ "animationcontainerfade": ["AnimationContainer", "fade"],
+ "animationcontainerleft": ["AnimationContainer", "animatorLeft"],
+ "animationcontainerright": ["AnimationContainer", "animatorRight"],
+ "animationcontainertop": ["AnimationContainer", "animatorTop"],
+ "animationcontainerrender": ["AnimationContainer", "didRender"],
+ "animationcontainerscale": ["AnimationContainer", "scale"],
+ "animationcontainertranslate": ["AnimationContainer", "translate"],
+ "app": ["AppOuter", "app"],
+ "appcontainer": ["AppBase", "container"],
+ "appinner": ["AppInner", "app"],
+ "appmount": ["AppMount", "appMount"],
+ "applayers": ["AppInner", "layers"],
+ "applicationstore": ["ApplicationStore", "applicationStore"],
+ "attachment": ["Attachment", "wrapper"],
+ "attachmentcontrolshidden": ["Attachment", "wrapperControlsHidden"],
+ "attachmentcover": ["AttachmentCover", "cover"],
+ "attachmentcovericon": ["AttachmentCover", "icon"],
+ "attachmentvideo": ["Attachment", "video"],
+ "attachmentvideocontrols": ["Attachment", "videoControls"],
+ "auditlog": ["AuditLog", "auditLog"],
+ "auditlogoverflowellipsis": ["AuditLog", "overflowEllipsis"],
+ "auditlogtimestamp": ["AuditLog", "timestamp"],
+ "auditloguserhook": ["AuditLog", "userHook"],
+ "authbox": ["AuthBox", "authBox"],
+ "authboxcharacterbackground": ["AuthBoxBackground", "characterBackground"],
+ "authboxsplashbackground": ["AuthBoxBackground", "splashBackground"],
+ "autocomplete": ["Autocomplete", "autocomplete"],
+ "autocompletecontenttitle": ["Autocomplete", "contentTitle"],
+ "autocompletedescriptiondiscriminator": ["Autocomplete", "descriptionDiscriminator"],
+ "autocompleteemoji": ["Autocomplete", "emojiImage"],
+ "autocompleteicon": ["Autocomplete", "icon"],
+ "autocompleteiconforeground": ["Autocomplete", "iconForeground"],
+ "autocompleteinner": ["Autocomplete", "autocompleteInner"],
+ "autocompleterow": ["Autocomplete", "autocompleteRow"],
+ "autocompleterowcontent": ["Autocomplete", "autocompleteRowContent"],
+ "autocompleterowcontentprimary": ["Autocomplete", "autocompleteRowContentPrimary"],
+ "autocompleterowcontentsecondary": ["Autocomplete", "autocompleteRowContentSecondary"],
+ "autocompleterowhorizontal": ["Autocomplete", "autocompleteRowHorizontal"],
+ "autocompleterowicon": ["Autocomplete", "autocompleteRowIcon"],
+ "autocompleterowsubheading": ["Autocomplete", "autocompleteRowSubheading"],
+ "autocompleterowvertical": ["Autocomplete", "autocompleteRowVertical"],
+ "avatar": ["Avatar", "avatar"],
+ "avatarcursordefault": ["Avatar", "cursorDefault"],
+ "avatardisabled": ["BDFDB", "avatarDisabled"],
+ "avataricon": ["AvatarIcon", "icon"],
+ "avatariconactivelarge": ["AvatarIcon", "iconActiveLarge"],
+ "avatariconactivemedium": ["AvatarIcon", "iconActiveMedium"],
+ "avatariconactivemini": ["AvatarIcon", "iconActiveMini"],
+ "avatariconactivesmall": ["AvatarIcon", "iconActiveSmall"],
+ "avatariconactivexlarge": ["AvatarIcon", "iconActiveXLarge"],
+ "avatariconinactive": ["AvatarIcon", "iconInactive"],
+ "avatariconsizelarge": ["AvatarIcon", "iconSizeLarge"],
+ "avatariconsizemedium": ["AvatarIcon", "iconSizeMedium"],
+ "avatariconsizemini": ["AvatarIcon", "iconSizeMini"],
+ "avatariconsizesmol": ["AvatarIcon", "iconSizeSmol"],
+ "avatariconsizesmall": ["AvatarIcon", "iconSizeSmall"],
+ "avatariconsizexlarge": ["AvatarIcon", "iconSizeXLarge"],
+ "avatarmask": ["Avatar", "mask"],
+ "avatarnoicon": ["AvatarIcon", "noIcon"],
+ "avatarpointer": ["Avatar", "pointer"],
+ "avatarpointerevents": ["Avatar", "pointerEvents"],
+ "avatarstack": ["Avatar", "avatarStack"],
+ "avatarsvg": ["Avatar", "svg"],
+ "avatarwrapper": ["Avatar", "wrapper"],
+ "backdrop": ["Backdrop", "backdrop"],
+ "backdropwithlayer": ["Backdrop", "withLayer"],
+ "badgebase": ["Badge", "base"],
+ "badgeicon": ["Badge", "icon"],
+ "badgeiconbadge": ["Badge", "iconBadge"],
+ "badgenumberbadge": ["Badge", "numberBadge"],
+ "badgeshaperound": ["Badge", "baseShapeRound"],
+ "badgeshaperoundleft": ["Badge", "baseShapeRoundLeft"],
+ "badgeshaperoundright": ["Badge", "baseShapeRoundRight"],
+ "badgetextbadge": ["Badge", "textBadge"],
+ "bdfdbbadge": ["BDFDB", "badge"],
+ "bdfdbbadgeavatar": ["BDFDB", "badgeAvatar"],
+ "bdfdbdev": ["BDFDB", "dev"],
+ "bdfdbhasbadge": ["BDFDB", "hasBadge"],
+ "bdfdbsupporter": ["BDFDB", "supporter"],
+ "bdfdbsupportert1": ["BDFDB", "supporterTier1"],
+ "bdfdbsupportert2": ["BDFDB", "supporterTier2"],
+ "bdfdbsupportert3": ["BDFDB", "supporterTier3"],
+ "bdfdbsupportert4": ["BDFDB", "supporterTier4"],
+ "bold": ["TextStyle", "bold"],
+ "bottag": ["BotTag", "botTag"],
+ "bottaginvert": ["BotTag", "botTagInvert"],
+ "bottagmember": ["Member", "botTag"],
+ "bottagnametag": ["NameTag", "bot"],
+ "bottagpx": ["BotTag", "px"],
+ "bottagregular": ["BotTag", "botTagRegular"],
+ "bottagrem": ["BotTag", "rem"],
+ "bottagtext": ["BotTag", "botText"],
+ "bottagverified": ["BotTag", "botTagVerified"],
+ "button": ["Button", "button"],
+ "buttoncolorbrand": ["Button", "colorBrand"],
+ "buttoncolorbrandnew": ["Button", "colorBrandNew"],
+ "buttoncolorgreen": ["Button", "colorGreen"],
+ "buttoncolorlink": ["Button", "colorLink"],
+ "buttoncolorprimary": ["Button", "colorPrimary"],
+ "buttoncolorred": ["Button", "colorRed"],
+ "buttoncolortransparent": ["Button", "colorTransparent"],
+ "buttoncolorwhite": ["Button", "colorWhite"],
+ "buttoncoloryellow": ["Button", "colorYellow"],
+ "buttoncontents": ["Button", "contents"],
+ "buttondisabledoverlay": ["Button", "disabledButtonOverlay"],
+ "buttondisabledwrapper": ["Button", "disabledButtonWrapper"],
+ "buttonfullwidth": ["Button", "fullWidth"],
+ "buttongrow": ["Button", "grow"],
+ "buttonhashover": ["Button", "hasHover"],
+ "buttonhoverbrand": ["Button", "hoverBrand"],
+ "buttonhoverbrandnew": ["Button", "hoverBrandNew"],
+ "buttonhovergreen": ["Button", "hoverGreen"],
+ "buttonhoverlink": ["Button", "hoverLink"],
+ "buttonhoverprimary": ["Button", "hoverPrimary"],
+ "buttonhoverred": ["Button", "hoverRed"],
+ "buttonhovertransparent": ["Button", "hoverTransparent"],
+ "buttonhoverwhite": ["Button", "hoverWhite"],
+ "buttonhoveryellow": ["Button", "hoverYellow"],
+ "buttonlookblank": ["Button", "lookBlank"],
+ "buttonlookfilled": ["Button", "lookFilled"],
+ "buttonlookinverted": ["Button", "lookInverted"],
+ "buttonlooklink": ["Button", "lookLink"],
+ "buttonlookoutlined": ["Button", "lookOutlined"],
+ "buttonsizeicon": ["Button", "sizeIcon"],
+ "buttonsizelarge": ["Button", "sizeLarge"],
+ "buttonsizemax": ["Button", "sizeMax"],
+ "buttonsizemedium": ["Button", "sizeMedium"],
+ "buttonsizemin": ["Button", "sizeMin"],
+ "buttonsizesmall": ["Button", "sizeSmall"],
+ "buttonsizexlarge": ["Button", "sizeXlarge"],
+ "buttonspinner": ["Button", "spinner"],
+ "buttonspinneritem": ["Button", "spinnerItem"],
+ "buttonsubmitting": ["Button", "submitting"],
+ "callcurrentchatsidebaropen": ["Video", "chatSidebarOpen"],
+ "callcurrentcontainer": ["CallCurrent", "wrapper"],
+ "callcurrentdetails": ["CallDetails", "container"],
+ "callcurrentvideo": ["Video", "video"],
+ "callincomingicon": ["CallIncoming", "icon"],
+ "callincomingroot": ["CallIncoming", "root"],
+ "callincomingtitle": ["CallIncoming", "title"],
+ "callincomingwrapper": ["CallIncoming", "wrapper"],
+ "callscreensharebottomcontrols": ["CallScreenshare", "bottomControls"],
+ "callscreensharechatbutton": ["CallScreenshare", "chatButton"],
+ "callscreensharetopcontrols": ["CallScreenshare", "topControls"],
+ "callscreensharevideocontrols": ["CallScreenshare", "videoControls"],
+ "card": ["Card", "card"],
+ "cardbrand": ["Card", "cardBrand"],
+ "cardbrandoutline": ["Card", "cardBrandOutline"],
+ "carddanger": ["Card", "cardDanger"],
+ "carddangeroutline": ["Card", "cardDangerOutline"],
+ "cardprimary": ["Card", "cardPrimary"],
+ "cardprimaryeditable": ["Card", "cardPrimaryEditable"],
+ "cardprimaryoutline": ["Card", "cardPrimaryOutline"],
+ "cardprimaryoutlineeditable": ["Card", "cardPrimaryOutlineEditable"],
+ "cardsuccess": ["Card", "cardSuccess"],
+ "cardsuccessoutline": ["Card", "cardSuccessOutline"],
+ "cardwarning": ["Card", "cardWarning"],
+ "cardwarningoutline": ["Card", "cardWarningOutline"],
+ "categoryarrow": ["CategoryArrow", "arrow"],
+ "categoryarrowopen": ["CategoryArrow", "open"],
+ "categoryaddbutton": ["Category", "addButton"],
+ "categoryaddbuttonicon": ["Category", "addButtonIcon"],
+ "categorychildren": ["Category", "children"],
+ "categoryclickable": ["Category", "clickable"],
+ "categorycollapsed": ["Category", "collapsed"],
+ "categorycontainerdefault": ["Category", "containerDefault"],
+ "categoryforcevisible": ["Category", "forceVisible"],
+ "categoryicon": ["Category", "icon"],
+ "categoryiconvisibility": ["Category", "iconVisibility"],
+ "categorymaincontent": ["Category", "mainContent"],
+ "categorymuted": ["Category", "muted"],
+ "categoryname": ["Category", "name"],
+ "categorywrapper": ["Category", "wrapper"],
+ "changelogadded": ["ChangeLog", "added"],
+ "changelogcontainer": ["ChangeLog", "container"],
+ "changelogfixed": ["ChangeLog", "fixed"],
+ "changelogfooter": ["ChangeLog", "footer"],
+ "changelogimproved": ["ChangeLog", "improved"],
+ "changelogprogress": ["ChangeLog", "progress"],
+ "changelogsociallink": ["ChangeLog", "socialLink"],
+ "changelogtitle": ["ChangeLog", "title"],
+ "channelactionicon": ["ChannelContainer", "actionIcon"],
+ "channelchildicon": ["ChannelContainer", "iconItem"],
+ "channelchildiconbase": ["ChannelContainer", "iconBase"],
+ "channelchildren": ["Channel", "children"],
+ "channelcontainerdefault": ["ChannelContainer", "containerDefault"],
+ "channelcontent": ["Channel", "link"],
+ "channelheaderavatar": ["ChatWindow", "avatar"],
+ "channelheaderchannelname": ["ChatWindow", "channelName"],
+ "channelheaderchildren": ["HeaderBar", "children"],
+ "channelheadercursorpointer": ["ChatWindow", "cursorPointer"],
+ "channelheaderdivider": ["HeaderBar", "divider"],
+ "channelheaderheaderbar": ["HeaderBar", "container"],
+ "channelheaderheaderbarthemed": ["HeaderBar", "themed"],
+ "channelheaderheaderbartitle": ["HeaderBar", "title"],
+ "channelheadericon": ["HeaderBar", "icon"],
+ "channelheadericonbadge": ["HeaderBar", "iconBadge"],
+ "channelheadericonclickable": ["HeaderBar", "clickable"],
+ "channelheadericonselected": ["HeaderBar", "selected"],
+ "channelheadericonwrapper": ["HeaderBar", "iconWrapper"],
+ "channelheadertitle": ["ChatWindow", "title"],
+ "channelheadertitlewrapper": ["ChatWindow", "titleWrapper"],
+ "channelheadersearch": ["HeaderBarExtras", "search"],
+ "channelheadersearchbar": ["HeaderBarSearch", "searchBar"],
+ "channelheadersearchicon": ["HeaderBarSearch", "icon"],
+ "channelheadersearchinner": ["HeaderBarSearch", "search"],
+ "channelheadertoolbar": ["HeaderBar", "toolbar"],
+ "channelheadertoolbar2": ["HeaderBarExtras", "toolbar"],
+ "channelheadertopic": ["HeaderBarTopic", "topic"],
+ "channelheadertopicexpandable": ["HeaderBarTopic", "expandable"],
+ "channelicon": ["Channel", "icon"],
+ "channeliconcontainer": ["Channel", "iconContainer"],
+ "channeliconitem": ["ChannelContainer", "iconItem"],
+ "channeliconvisibility": ["ChannelContainer", "iconVisibility"],
+ "channelinfo": ["ChannelContainer", "channelInfo"],
+ "channelmentionsbadge": ["ChannelContainerMentionsBadge", "mentionsBadge"],
+ "channelmentionsbadgebase": ["ChannelContainerMentionsBadge", "iconBase"],
+ "channelmodeconnected": ["Channel", "modeConnected"],
+ "channelmodelocked": ["Channel", "modeLocked"],
+ "channelmodemuted": ["Channel", "modeMuted"],
+ "channelmodeselected": ["Channel", "modeSelected"],
+ "channelmodeunread": ["Channel", "modeUnread"],
+ "channelname": ["Channel", "name"],
+ "channelpanel": ["AppBase", "activityPanel"],
+ "channelpanels": ["AppBase", "panels"],
+ "channels": ["AppBase", "sidebar"],
+ "channelselected": ["ChannelContainer", "selected"],
+ "channelsscroller": ["GuildChannels", "scroller"],
+ "channelsunreadbar": ["GuildChannels", "unreadBar"],
+ "channelsunreadbarcontainer": ["GuildChannels", "positionedContainer"],
+ "channelsunreadbarbottom": ["GuildChannels", "unreadBottom"],
+ "channelsunreadbarunread": ["GuildChannels", "unread"],
+ "channelsunreadbartop": ["GuildChannels", "unreadTop"],
+ "channelunread": ["Channel", "unread"],
+ "channelunreadrelevant": ["Channel", "unreadRelevant"],
+ "channeluserlimit": ["ChannelLimit", "wrapper"],
+ "channeluserlimittotal": ["ChannelLimit", "total"],
+ "channeluserlimitusers": ["ChannelLimit", "users"],
+ "channelwrapper": ["Channel", "wrapper"],
+ "charcounter": ["BDFDB", "charCounter"],
+ "chat": ["ChatWindow", "chat"],
+ "chatbase": ["AppBase", "base"],
+ "chatcontent": ["ChatWindow", "chatContent"],
+ "chatform": ["ChatWindow", "form"],
+ "chatinner": ["ChatWindow", "content"],
+ "chatspacer": ["AppBase", "content"],
+ "chatthreadsidebar": ["ChatThreadSidebar", "container"],
+ "chatthreadsidebaropen": ["ChatWindow", "threadSidebarOpen"],
+ "checkbox": ["Checkbox", "checkbox"],
+ "checkboxbox": ["Checkbox", "box"],
+ "checkboxchecked": ["Checkbox", "checked"],
+ "checkboxcontainer": ["ModalItems", "checkboxContainer"],
+ "checkboxinput": ["Checkbox", "input"],
+ "checkboxinputdefault": ["Checkbox", "inputDefault"],
+ "checkboxinputdisabled": ["Checkbox", "inputDisabled"],
+ "checkboxinputreadonly": ["Checkbox", "inputReadonly"],
+ "checkboxlabel": ["Checkbox", "label"],
+ "checkboxlabelclickable": ["Checkbox", "labelClickable"],
+ "checkboxlabeldisabled": ["Checkbox", "labelDisabled"],
+ "checkboxlabelforward": ["Checkbox", "labelForward"],
+ "checkboxlabelreversed": ["Checkbox", "labelReversed"],
+ "checkboxround": ["Checkbox", "round"],
+ "checkboxwrapper": ["Checkbox", "checkboxWrapper"],
+ "checkboxwrapperdisabled": ["Checkbox", "checkboxWrapperDisabled"],
+ "collapsecontainer": ["BDFDB", "collapseContainer"],
+ "collapsecontainercollapsed": ["BDFDB", "collapseContainerCollapsed"],
+ "collapsecontainerheader": ["BDFDB", "collapseContainerHeader"],
+ "collapsecontainerinner": ["BDFDB", "collapseContainerInner"],
+ "collapsecontainermini": ["BDFDB", "collapseContainerMini"],
+ "collapsecontainertitle": ["BDFDB", "collapseContainerTitle"],
+ "colorbase": ["TextColor2", "base"],
+ "colormuted": ["TextColor2", "muted"],
+ "colorpicker": ["ColorPicker", "customColorPicker"],
+ "colorpickeralpha": ["BDFDB", "colorPickerAlpha"],
+ "colorpickeralphacheckered": ["BDFDB", "colorPickerAlphaCheckered"],
+ "colorpickeralphacursor": ["BDFDB", "colorPickerAlphaCursor"],
+ "colorpickeralphahorizontal": ["BDFDB", "colorPickerAlphaHorizontal"],
+ "colorpickergradient": ["BDFDB", "colorPickerGradient"],
+ "colorpickergradientbutton": ["BDFDB", "colorPickerGradientButton"],
+ "colorpickergradientbuttonenabled": ["BDFDB", "colorPickerGradientButtonEnabled"],
+ "colorpickergradientcheckered": ["BDFDB", "colorPickerGradientCheckered"],
+ "colorpickergradientcursor": ["BDFDB", "colorPickerGradientCursor"],
+ "colorpickergradientcursoredge": ["BDFDB", "colorPickerGradientCursorEdge"],
+ "colorpickergradientcursorselected": ["BDFDB", "colorPickerGradientCursorSelected"],
+ "colorpickergradienthorizontal": ["BDFDB", "colorPickerGradientHorizontal"],
+ "colorpickerhexinput": ["ColorPicker", "customColorPickerInput"],
+ "colorpickerhue": ["ColorPickerInner", "hue"],
+ "colorpickerhuecursor": ["NotFound", "hueCursor"],
+ "colorpickerhuehorizontal": ["NotFound", "hueHorizontal"],
+ "colorpickerhuevertical": ["NotFound", "hueVertical"],
+ "colorpickerinner": ["ColorPickerInner", "wrapper"],
+ "colorpickerrow": ["ColorPicker", "colorPickerRow"],
+ "colorpickersaturation": ["ColorPickerInner", "saturation"],
+ "colorpickersaturationblack": ["NotFound", "saturationBlack"],
+ "colorpickersaturationcolor": ["NotFound", "saturationColor"],
+ "colorpickersaturationcursor": ["NotFound", "saturationCursor"],
+ "colorpickersaturationwhite": ["NotFound", "saturationWhite"],
+ "colorpickerswatch": ["ColorPicker", "colorPickerSwatch"],
+ "colorpickerswatches": ["BDFDB", "colorPickerSwatches"],
+ "colorpickerswatchescontainer": ["ColorPicker", "container"],
+ "colorpickerswatchesdisabled": ["BDFDB", "colorPickerSwatchesDisabled"],
+ "colorpickerswatchcustom": ["ColorPicker", "custom"],
+ "colorpickerswatchcustomcontainer": ["ColorPicker", "customContainer"],
+ "colorpickerswatchdefault": ["ColorPicker", "default"],
+ "colorpickerswatchdefaultcontainer": ["ColorPicker", "defaultContainer"],
+ "colorpickerswatchdisabled": ["ColorPicker", "disabled"],
+ "colorpickerswatchdropper": ["ColorPicker", "colorPickerDropper"],
+ "colorpickerswatchdropperfg": ["ColorPicker", "colorPickerDropperFg"],
+ "colorpickerswatchnocolor": ["ColorPicker", "noColor"],
+ "colorpickerswatchselected": ["BDFDB", "colorPickerSwatchSelected"],
+ "colorpickerswatchsingle": ["BDFDB", "colorPickerSwatchSingle"],
+ "colorpickerswatchsinglewrapper": ["BDFDB", "colorPickerSwatchSingleWrapper"],
+ "colorpickerwrapper": ["BDFDB", "colorPicker"],
+ "colorprimary": ["TextColor", "colorHeaderPrimary"],
+ "colorred": ["TextColor", "colorStatusRed"],
+ "colorsecondary": ["TextColor", "colorHeaderSecondary"],
+ "colorselectable": ["TextColor", "selectable"],
+ "colorstandard": ["TextColor", "colorStandard"],
+ "coloryellow": ["TextColor", "colorStatusYellow"],
+ "combobox": ["Combobox", "combobox"],
+ "comboboxitem": ["Combobox", "item"],
+ "comboboxitemlabel": ["Combobox", "itemLabel"],
+ "cursordefault": ["Cursor", "cursorDefault"],
+ "cursorpointer": ["BDFDB", "cursorPointer"],
+ "customstatusemoji": ["CustomStatusIcon", "emoji"],
+ "customstatusicon": ["CustomStatusIcon", "icon"],
+ "customstatusitem": ["CustomStatusPopout", "statusItem"],
+ "customstatusitemclearbutton": ["CustomStatusPopout", "clearStatusButton"],
+ "customstatusitemclearicon": ["CustomStatusPopout", "clearStatusIcon"],
+ "customstatusitemcustom": ["CustomStatusPopout", "customStatusItem"],
+ "customstatusitemcustomtext": ["CustomStatusPopout", "customText"],
+ "customstatusitemcustomwithemoji": ["CustomStatusPopout", "customStatusWithEmoji"],
+ "customstatusitememoji": ["CustomStatusPopout", "customEmoji"],
+ "customstatusmodal": ["CustomStatusModal", "modalRoot"],
+ "dateinputbutton": ["BDFDB", "dateInputButton"],
+ "dateinputbuttonselected": ["BDFDB", "dateInputButtonSelected"],
+ "dateinputcontrols": ["BDFDB", "dateInputControls"],
+ "dateinputfield": ["BDFDB", "dateInputField"],
+ "dateinputinner": ["BDFDB", "dateInputInner"],
+ "dateinputpreview": ["BDFDB", "dateInputPreview"],
+ "dateinputpreviewprefix": ["BDFDB", "dateInputPreviewPrefix"],
+ "dateinputpreviewsuffix": ["BDFDB", "dateInputPreviewSuffix"],
+ "dateinputwrapper": ["BDFDB", "dateInputWrapper"],
+ "defaultcolor": ["Text", "defaultColor"],
+ "description": ["FormText", "description"],
+ "directiondown": ["IconDirection", "directionDown"],
+ "directionleft": ["IconDirection", "directionLeft"],
+ "directionright": ["IconDirection", "directionRight"],
+ "directionup": ["IconDirection", "directionUp"],
+ "directiontransition": ["IconDirection", "transition"],
+ "discoverycard": ["BDFDB", "discoveryCard"],
+ "discoverycardauthor": ["BDFDB", "discoveryCardAuthor"],
+ "discoverycardbutton": ["BDFDB", "discoveryCardButton"],
+ "discoverycardcontrols": ["BDFDB", "discoveryCardControls"],
+ "discoverycardcover": ["BDFDB", "discoveryCardCover"],
+ "discoverycardcoverbadge": ["BDFDB", "discoveryCardCoverBadge"],
+ "discoverycardcoverwrapper": ["BDFDB", "discoveryCardCoverWrapper"],
+ "discoverycarddescription": ["BDFDB", "discoveryCardDescription"],
+ "discoverycardfooter": ["BDFDB", "discoveryCardFooter"],
+ "discoverycardheader": ["BDFDB", "discoveryCardHeader"],
+ "discoverycardicon": ["BDFDB", "discoveryCardIcon"],
+ "discoverycardiconloading": ["BDFDB", "discoveryCardIconLoading"],
+ "discoverycardiconwrapper": ["BDFDB", "discoveryCardIconWrapper"],
+ "discoverycardinfo": ["BDFDB", "discoveryCardInfo"],
+ "discoverycardname": ["BDFDB", "discoveryCardName"],
+ "discoverycards": ["BDFDB", "discoveryCards"],
+ "discoverycardstat": ["BDFDB", "discoveryCardStat"],
+ "discoverycardstaticon": ["BDFDB", "discoveryCardStatIcon"],
+ "discoverycardstats": ["BDFDB", "discoveryCardStats"],
+ "discoverycardtag": ["BDFDB", "discoveryCardTag"],
+ "discoverycardtags": ["BDFDB", "discoveryCardTags"],
+ "discoverycardtitle": ["BDFDB", "discoveryCardTitle"],
+ "discoverycardtitlebutton": ["BDFDB", "discoveryCardTitleButton"],
+ "divider": ["ModalDivider", "divider"],
+ "dividerdefault": ["SettingsItems", "dividerDefault"],
+ "dmaddpopout": ["DmAddPopout", "popout"],
+ "dmaddpopoutdiscordtag": ["DmAddPopoutItems", "discordTag"],
+ "dmaddpopoutfriend": ["DmAddPopoutItems", "friend"],
+ "dmaddpopoutfriendwrapper": ["DmAddPopoutItems", "friendWrapper"],
+ "dmaddpopoutnickname": ["DmAddPopoutItems", "nickname"],
+ "dmchannel": ["PrivateChannel", "channel"],
+ "dmchannelactivity": ["PrivateChannel", "activity"],
+ "dmchannelactivityemoji": ["PrivateChannel", "activityEmoji"],
+ "dmchannelactivitytext": ["PrivateChannel", "activityText"],
+ "dmchannelclose": ["PrivateChannel", "closeButton"],
+ "dmchannelheadercontainer": ["PrivateChannelListScroller", "privateChannelsHeaderContainer"],
+ "dmchannelheadertext": ["PrivateChannelListScroller", "headerText"],
+ "dmchannels": ["PrivateChannelList", "privateChannels"],
+ "dmchannelsempty": ["PrivateChannelListScroller", "empty"],
+ "dmchannelsscroller": ["PrivateChannelListScroller", "scroller"],
+ "dmpill": ["GuildDm", "pill"],
+ "defaultchannelwelcome": ["DefaultChannelWelcome", "container"],
+ "defaultchannelwelcometitle": ["DefaultChannelWelcome", "titleName"],
+ "downloadlink": ["DownloadLink", "downloadLink"],
+ "ellipsis": ["PopoutActivity", "ellipsis"],
+ "embed": ["Embed", "embed"],
+ "embedauthor": ["Embed", "embedAuthor"],
+ "embedauthoricon": ["Embed", "embedAuthorIcon"],
+ "embedauthorname": ["Embed", "embedAuthorName"],
+ "embedauthornamelink": ["Embed", "embedAuthorNameLink"],
+ "embedcentercontent": ["Embed", "centerContent"],
+ "embeddescription": ["Embed", "embedDescription"],
+ "embedfield": ["Embed", "embedField"],
+ "embedfieldname": ["Embed", "embedFieldName"],
+ "embedfields": ["Embed", "embedFields"],
+ "embedfieldvalue": ["Embed", "embedFieldValue"],
+ "embedfooter": ["Embed", "embedFooter"],
+ "embedfootericon": ["Embed", "embedFooterIcon"],
+ "embedfooterseparator": ["Embed", "embedFooterSeparator"],
+ "embedfootertext": ["Embed", "embedFooterText"],
+ "embedfull": ["Embed", "embedFull"],
+ "embedgiftag": ["Embed", "embedGIFTag"],
+ "embedgrid": ["Embed", "grid"],
+ "embedgridcontainer": ["Embed", "gridContainer"],
+ "embedhasthumbnail": ["Embed", "hasThumbnail"],
+ "embedhiddenspoiler": ["Embed", "hiddenSpoiler"],
+ "embediframe": ["Embed", "embedIframe"],
+ "embedimage": ["Embed", "embedImage"],
+ "embedinlinemedia": ["Embed", "inlineMediaEmbed"],
+ "embedlink": ["Embed", "embedLink"],
+ "embedmargin": ["Embed", "embedMargin"],
+ "embedmedia": ["Embed", "embedMedia"],
+ "embedprovider": ["Embed", "embedProvider"],
+ "embedspoilerattachment": ["Embed", "spoilerAttachment"],
+ "embedspoilerembed": ["Embed", "spoilerEmbed"],
+ "embedspotify": ["Embed", "embedSpotify"],
+ "embedthumbnail": ["Embed", "embedThumbnail"],
+ "embedtitle": ["Embed", "embedTitle"],
+ "embedtitlelink": ["Embed", "embedTitleLink"],
+ "embedvideo": ["Embed", "embedVideo"],
+ "embedvideoaction": ["Embed", "embedVideoAction"],
+ "embedvideoactions": ["Embed", "embedVideoActions"],
+ "embedvideoimagecomponent": ["Embed", "embedVideoImageComponent"],
+ "embedvideoimagecomponentinner": ["Embed", "embedVideoImageComponentInner"],
+ "embedwrapper": ["MessageAccessory", "embedWrapper"],
+ "emoji": ["Emoji", "emoji"],
+ "emojiold": ["NotFound", "emoji"],
+ "emojibutton": ["EmojiButton", "emojiButton"],
+ "emojibuttonhovered": ["EmojiButton", "emojiButtonHovered"],
+ "emojibuttonnormal": ["EmojiButton", "emojiButtonNormal"],
+ "emojibuttonsprite": ["EmojiButton", "sprite"],
+ "emojibuttonspritegreyscale": ["EmojiButton", "spriteGreyscale"],
+ "emojiinput": ["CustomStatusModal", "input"],
+ "emojiinputbutton": ["CustomStatusModal", "emojiButton"],
+ "emojiinputbuttoncontainer": ["CustomStatusModal", "emojiButtonContainer"],
+ "emojiinputbuttonemoji": ["CustomStatusModal", "emoji"],
+ "emojiinputclearbutton": ["CustomStatusModal", "clearButton"],
+ "emojiinputclearicon": ["CustomStatusModal", "clearIcon"],
+ "emojiinputcontainer": ["CustomStatusModal", "inputContainer"],
+ "emojipickerbutton": ["Reactions", "reactionBtn"],
+ "emojipicker": ["EmojiPicker", "emojiPicker"],
+ "emojipickercustomemoji": ["EmojiPickerCustomEmoji", "image"],
+ "emojipickerdiversityemojiitem": ["EmojiPickerDiversitySelector", "diversityEmojiItem"],
+ "emojipickerdiversityemojiitemimage": ["EmojiPickerDiversitySelector", "diversityEmojiItemImage"],
+ "emojipickerdiversityselector": ["EmojiPicker", "diversitySelector"],
+ "emojipickerdiversityselectoroptions": ["EmojiPickerDiversitySelector", "diversitySelectorOptions"],
+ "emojipickerdiversityselectorwrapper": ["EmojiPicker", "diversitySelector"],
+ "emojipickeremojispriteimage": ["EmojiPickerItem", "emojiSpriteImage"],
+ "emojipickerheader": ["EmojiPicker", "header"],
+ "emojipickerinspector": ["EmojiPickerInspector", "inspector"],
+ "emojipickerinspectoremoji": ["EmojiPickerInspectorEmoji", "emoji"],
+ "errorscreen": ["ErrorScreen", "wrapper"],
+ "expressionpicker": ["ExpressionPicker", "contentWrapper"],
+ "expressionpickernav": ["ExpressionPicker", "nav"],
+ "expressionpickernavbutton": ["ExpressionPicker", "navButton"],
+ "expressionpickernavbuttonactive": ["ExpressionPicker", "navButtonActive"],
+ "expressionpickernavitem": ["ExpressionPicker", "navItem"],
+ "expressionpickernavlist": ["ExpressionPicker", "navList"],
+ "favbutton": ["FavButton", "gifFavoriteButton"],
+ "favbuttoncontainer": ["BDFDB", "favButtonContainer"],
+ "favbuttonicon": ["FavButton", "icon"],
+ "favbuttonselected": ["FavButton", "selected"],
+ "fileattachment": ["File", "attachment"],
+ "fileattachmentinner": ["File", "attachmentInner"],
+ "filecancelbutton": ["File", "cancelButton"],
+ "filedownloadbutton": ["File", "downloadButton"],
+ "filename": ["File", "filename"],
+ "filenamelink": ["File", "fileNameLink"],
+ "filenamelinkwrapper": ["File", "filenameLinkWrapper"],
+ "filenamewrapper": ["File", "filenameWrapper"],
+ "flex": ["FlexChild", "flex"],
+ "flex2": ["Flex", "flex"],
+ "flexalignbaseline": ["Flex", "alignBaseline"],
+ "flexaligncenter": ["Flex", "alignCenter"],
+ "flexalignend": ["Flex", "alignEnd"],
+ "flexalignstart": ["Flex", "alignStart"],
+ "flexalignstretch": ["Flex", "alignStretch"],
+ "flexcenter": ["Flex", "flexCenter"],
+ "flexchild": ["FlexChild", "flexChild"],
+ "flexdirectioncolumn": ["Flex", "directionColumn"],
+ "flexdirectionrow": ["Flex", "directionRow"],
+ "flexdirectionrowreverse": ["Flex", "directionRowReverse"],
+ "flexhorizontal": ["FlexChild", "horizontal"],
+ "flexhorizontalreverse": ["FlexChild", "horizontalReverse"],
+ "flexjustifycenter": ["Flex", "justifyCenter"],
+ "flexjustifyend": ["Flex", "justifyEnd"],
+ "flexjustifystart": ["Flex", "justifyStart"],
+ "flexmarginreset": ["FlexChild", "flexMarginReset"],
+ "flexnowrap": ["Flex", "noWrap"],
+ "flexspacer": ["Flex", "spacer"],
+ "flexvertical": ["Flex", "vertical"],
+ "flexwrap": ["Flex", "wrap"],
+ "flexwrapreverse": ["Flex", "wrapReverse"],
+ "flowerstar": ["FlowerStar", "flowerStar"],
+ "flowerstarchild": ["FlowerStar", "childContainer"],
+ "flowerstarcontainer": ["FlowerStar", "flowerStarContainer"],
+ "formtext": ["FormText", "formText"],
+ "forumpagelist": ["ForumPage", "list"],
+ "game": ["Game", "game"],
+ "gameicon": ["GameIcon", "gameIcon"],
+ "gameiconlarge": ["GameIcon", "large"],
+ "gameiconmedium": ["GameIcon", "medium"],
+ "gameiconsmall": ["GameIcon", "small"],
+ "gameiconxsmall": ["GameIcon", "xsmall"],
+ "gamelibrarytable": ["GameLibraryTable", "table"],
+ "gamelibrarytableheader": ["GameLibraryTable", "header"],
+ "gamelibrarytableheadercell": ["GameLibraryTable", "headerCell"],
+ "gamelibrarytableheadercellsorted": ["GameLibraryTable", "headerCellSorted"],
+ "gamelibrarytablerow": ["GameLibraryTable", "row"],
+ "gamelibrarytablerowwrapper": ["GameLibraryTable", "rowWrapper"],
+ "gamelibrarytablestickyheader": ["GameLibraryTable", "stickyHeader"],
+ "gamename": ["Game", "gameName"],
+ "gamenameinput": ["Game", "gameNameInput"],
+ "giffavoritebutton": ["MessageAccessory", "gifFavoriteButton"],
+ "giffavoritecolor": ["GifFavoriteButton", "gifFavoriteButton"],
+ "giffavoriteicon": ["GifFavoriteButton", "icon"],
+ "giffavoriteshowpulse": ["GifFavoriteButton", "showPulse"],
+ "giffavoritesize": ["GifFavoriteButton", "size"],
+ "giffavoriteselected": ["GifFavoriteButton", "selected"],
+ "goliveactions": ["GoLiveDetails", "actions"],
+ "golivebody": ["GoLiveDetails", "body"],
+ "goliveclickablegamewrapper": ["GoLiveDetails", "clickableGameWrapper"],
+ "golivegameicon": ["GoLiveDetails", "gameIcon"],
+ "golivegamename": ["GoLiveDetails", "gameName"],
+ "golivegamewrapper": ["GoLiveDetails", "gameWrapper"],
+ "goliveinfo": ["GoLiveDetails", "info"],
+ "golivepanel": ["GoLiveDetails", "panel"],
+ "guild": ["BDFDB", "guild"],
+ "guildbuttonbase": ["GuildsItems", "circleButtonBase"],
+ "guildbuttoninner": ["GuildsButton", "circleIconButton"],
+ "guildbuttonicon": ["GuildsButton", "circleIcon"],
+ "guildbuttonpill": ["GuildsButton", "pill"],
+ "guildbuttonselected": ["GuildsButton", "selected"],
+ "guildchannels": ["GuildChannelsWrapper", "container"],
+ "guildcontainer": ["GuildServer", "blobContainer"],
+ "guilddiscovery": ["GuildDiscovery", "pageWrapper"],
+ "guildfolder": ["GuildFolder", "folder"],
+ "guildfolderexpandedbackground": ["GuildFolder", "expandedFolderBackground"],
+ "guildfolderexpandedbackgroundcollapsed": ["GuildFolder", "collapsed"],
+ "guildfolderexpandedbackgroundhover": ["GuildFolder", "hover"],
+ "guildfolderguildicon": ["GuildFolder", "guildIcon"],
+ "guildfoldericonwrapper": ["GuildFolder", "folderIconWrapper"],
+ "guildfoldericonwrapperclosed": ["GuildFolder", "closedFolderIconWrapper"],
+ "guildfoldericonwrapperexpanded": ["GuildFolder", "expandedFolderIconWrapper"],
+ "guildfolderwrapper": ["GuildFolder", "wrapper"],
+ "guildheader": ["GuildHeader", "container"],
+ "guildheaderbanneranimatedhoverlayer": ["GuildHeader", "animatedBannerHoverLayer"],
+ "guildheaderbannerimage": ["GuildHeader", "bannerImage"],
+ "guildheaderbannerimagecontainer": ["GuildHeader", "animatedContainer"],
+ "guildheaderbannervisible": ["GuildHeader", "bannerVisible"],
+ "guildheaderbutton": ["GuildHeaderButton", "button"],
+ "guildheaderbuttonopen": ["GuildHeaderButton", "open"],
+ "guildheaderclickable": ["GuildHeader", "clickable"],
+ "guildheaderhasbanner": ["GuildHeader", "hasBanner"],
+ "guildheaderheader": ["GuildHeader", "header"],
+ "guildheadername": ["GuildHeader", "name"],
+ "guildicon": ["GuildIcon", "icon"],
+ "guildiconacronym": ["GuildIcon", "acronym"],
+ "guildiconbadge": ["GuildsItems", "iconBadge"],
+ "guildiconchildwrapper": ["GuildIcon", "childWrapper"],
+ "guildiconselected": ["GuildIcon", "selected"],
+ "guildiconwrapper": ["GuildIcon", "wrapper"],
+ "guildinner": ["Guild", "wrapper"],
+ "guildinnerwrapper": ["GuildsItems", "listItemWrapper"],
+ "guildlistitem": ["GuildsListItem", "listItemWrapper"],
+ "guildlistitemtooltip": ["GuildsListItem", "listItemTooltip"],
+ "guildlowerbadge": ["Guild", "lowerBadge"],
+ "guildlowerleftbadge": ["BDFDB", "guildLowerLeftBadge"],
+ "guildouter": ["GuildItem", "listItem"],
+ "guildpill": ["GuildServer", "pill"],
+ "guildpillitem": ["PillWrapper", "item"],
+ "guildpillwrapper": ["PillWrapper", "wrapper"],
+ "guildplaceholder": ["GuildsDragPlaceholder", "dragInner"],
+ "guildplaceholdermask": ["GuildsDragPlaceholder", "placeholderMask"],
+ "guilds": ["AppBase", "guilds"],
+ "guildseparator": ["GuildSeparator", "guildSeparator"],
+ "guildserror": ["GuildsItems", "guildsError"],
+ "guildserrorinner": ["GuildsItems", "errorInner"],
+ "guildsettingsbannedcard": ["GuildSettingsBanned", "bannedUser"],
+ "guildsettingsbanneddiscrim": ["GuildSettingsBanned", "discrim"],
+ "guildsettingsbannedusername": ["GuildSettingsBanned", "username"],
+ "guildsettingsemojicard": ["GuildSettingsEmoji", "emojiRow"],
+ "guildsettingsinvitecard": ["GuildSettingsInvite", "inviteSettingsInviteRow"],
+ "guildsettingsinvitechannelname": ["GuildSettingsInvite", "channelName"],
+ "guildsettingsinviteusername": ["GuildSettingsInvite", "username"],
+ "guildsettingsmembercard": ["GuildSettingsMember", "member"],
+ "guildsettingsmembername": ["GuildSettingsMember", "name"],
+ "guildsettingsmembernametag": ["GuildSettingsMember", "nameTag"],
+ "guildslabel": ["BDFDB", "guildsLabel"],
+ "guildsscroller": ["GuildsWrapper", "scroller"],
+ "guildstree": ["GuildsWrapper", "tree"],
+ "guildsummaryclickableicon": ["BDFDB", "guildSummaryClickableIcon"],
+ "guildsummarycontainer": ["BDFDB", "guildSummaryContainer"],
+ "guildsummaryemptyguild": ["BDFDB", "guildSummaryEmptyGuild"],
+ "guildsummaryicon": ["BDFDB", "guildSummaryIcon"],
+ "guildsummaryiconcontainer": ["BDFDB", "guildSummaryIconContainer"],
+ "guildsummaryiconcontainermasked": ["BDFDB", "guildSummaryIconContainerMasked"],
+ "guildsummarymoreguilds": ["BDFDB", "guildSummaryMoreGuilds"],
+ "guildsummarysvgicon": ["BDFDB", "guildSummarySvgIcon"],
+ "guildsvg": ["Guild", "svg"],
+ "guildswrapper": ["GuildsWrapper", "wrapper"],
+ "guildswrapperhidden": ["GuildsWrapper", "hidden"],
+ "guildswrapperunreadmentionsbar": ["GuildsWrapper", "unreadMentionsBar"],
+ "guildswrapperunreadmentionsbarbottom": ["GuildsWrapper", "unreadMentionsIndicatorBottom"],
+ "guildswrapperunreadmentionsbartop": ["GuildsWrapper", "unreadMentionsIndicatorTop"],
+ "guildtarget": ["GuildEdges", "target"],
+ "guildtargetcenter": ["GuildEdges", "centerTarget"],
+ "guildtargetwrapper": ["GuildEdges", "wrapper"],
+ "guildtutorialcontainer": ["GuildsItems", "tutorialContainer"],
+ "guildupperbadge": ["Guild", "upperBadge"],
+ "guildupperleftbadge": ["BDFDB", "guildUpperLeftBadge"],
+ "guildvoicelist": ["BDFDB", "guildVoiceList"],
+ "h1": ["Text", "h1"],
+ "h1defaultmargin": ["Text", "defaultMarginh1"],
+ "h2": ["Text", "h2"],
+ "h2defaultmargin": ["Text", "defaultMarginh2"],
+ "h3": ["Text", "h3"],
+ "h3defaultmargin": ["Text", "defaultMarginh3"],
+ "h4": ["Text", "h4"],
+ "h4defaultmargin": ["Text", "defaultMarginh4"],
+ "h5": ["Text", "h5"],
+ "h5defaultmargin": ["Text", "defaultMarginh5"],
+ "headertitle": ["Text", "title"],
+ "headerwrapper": ["TextColor2", "wrapper"],
+ "highlight": ["NotFound", "highlight"],
+ "homebuttonicon": ["HomeIcon", "homeIcon"],
+ "homebuttonpill": ["HomeIcon", "pill"],
+ "hotkeybutton": ["HotKeyRecorder", "button"],
+ "hotkeycontainer": ["HotKeyRecorder", "container"],
+ "hotkeydisabled": ["HotKeyRecorder", "disabled"],
+ "hotkeyediticon": ["HotKeyRecorder", "editIcon"],
+ "hotkeyhasvalue": ["HotKeyRecorder", "hasValue"],
+ "hotkeyinput": ["HotKeyRecorder", "input"],
+ "hotkeyinput2": ["HotKeyRecorder", "input"],
+ "hotkeylayout": ["HotKeyRecorder", "layout"],
+ "hotkeylayout2": ["HotKeyRecorder", "layout"],
+ "hotkeyrecording": ["HotKeyRecorder", "recording"],
+ "hotkeyresetbutton": ["BDFDB", "hotkeyResetButton"],
+ "hotkeyshadowpulse": ["HotKeyRecorder", "shadowPulse"],
+ "hotkeytext": ["HotKeyRecorder", "text"],
+ "hotkeywrapper": ["BDFDB", "hotkeyWrapper"],
+ "hovercard": ["HoverCard", "card"],
+ "hovercardbutton": ["BDFDB", "hoverCardButton"],
+ "hovercarddisabled": ["BDFDB", "cardDisabled"],
+ "hovercardhorizontal": ["BDFDB", "cardHorizontal"],
+ "hovercardinner": ["BDFDB", "cardInner"],
+ "hovercardremovebutton": ["HoverCardRemoveButton", "button"],
+ "hovercardremovebuttondefault": ["HoverCardRemoveButton", "default"],
+ "hovercardremovebuttonfilled": ["HoverCardRemoveButton", "filled"],
+ "hovercardwrapper": ["BDFDB", "cardWrapper"],
+ "icon": ["EmbedActions", "icon"],
+ "iconactionswrapper": ["EmbedActions", "wrapper"],
+ "iconexternal": ["EmbedActions", "iconExternal"],
+ "iconexternalmargins": ["EmbedActions", "iconExternalMargins"],
+ "iconplay": ["EmbedActions", "iconPlay"],
+ "iconwrapper": ["EmbedActions", "iconWrapper"],
+ "iconwrapperactive": ["EmbedActions", "iconWrapperActive"],
+ "imageaccessory": ["ImageWrapper", "imageAccessory"],
+ "imagealttext": ["MessageElements", "altText"],
+ "imagealttextcontainer": ["MessageElements", "mediaMosaicAltTextContainer"],
+ "imageclickable": ["ImageWrapper", "clickable"],
+ "imageerror": ["ImageWrapper", "imageError"],
+ "imageoriginallink": ["ImageWrapper", "originalLink"],
+ "imageplaceholderoverlay": ["ImageWrapper", "imagePlaceholderOverlay"],
+ "imagemodal": ["ImageModal", "modal"],
+ "imagemodalimage": ["ImageModal", "image"],
+ "imagemodalnavbutton": ["ModalCarouselNav", "nav"],
+ "imagemodalnavbuttonprev": ["ModalCarouselNav", "navPrev"],
+ "imagemodalnavbuttonnext": ["ModalCarouselNav", "navNext"],
+ "imagemosaicattachmentscontainer": ["ImageMosaic", "visualMediaItemContainer"],
+ "imagemosaiconebyonegridsingle": ["ImageMosaic", "oneByOneGridSingle"],
+ "imagesticker": ["ImageAssets", "stickerAsset"],
+ "imagewrapper": ["ImageWrapper", "imageWrapper"],
+ "imagewrapperbackground": ["ImageWrapper", "imageWrapperBackground"],
+ "imagezoom": ["ImageWrapper", "imageZoom"],
+ "itemlayer": ["ItemLayerContainer", "layer"],
+ "itemlayercontainer": ["ItemLayerContainer", "layerContainer"],
+ "itemlayercontainerzindexdisabled": ["BDFDB", "layerContainerZIndexDisabled"],
+ "itemlayerdisabledpointerevents": ["ItemLayerContainer", "disabledPointerEvents"],
+ "input": ["Input", "input"],
+ "inputdefault": ["Input", "inputDefault"],
+ "inputdisabled": ["Input", "disabled"],
+ "inputeditable": ["Input", "editable"],
+ "inputerror": ["Input", "error"],
+ "inputfocused": ["Input", "focused"],
+ "inputlist": ["BDFDB", "listInput"],
+ "inputlistdelete": ["BDFDB", "listInputDelete"],
+ "inputlistitem": ["BDFDB", "listInputItem"],
+ "inputlistitems": ["BDFDB", "listInputItems"],
+ "inputmini": ["Input", "inputMini"],
+ "inputmulti": ["BDFDB", "multiInput"],
+ "inputmultifield": ["BDFDB", "multiInputField"],
+ "inputmultifirst": ["BDFDB", "multiInputFirst"],
+ "inputmultilast": ["BDFDB", "multiInputLast"],
+ "inputmultiwrapper": ["BDFDB", "multiInputWrapper"],
+ "inputnumberbutton": ["BDFDB", "inputNumberButton"],
+ "inputnumberbuttondown": ["BDFDB", "inputNumberButtonDown"],
+ "inputnumberbuttonup": ["BDFDB", "inputNumberButtonUp"],
+ "inputnumberbuttons": ["BDFDB", "inputNumberButtons"],
+ "inputnumberwrapper": ["BDFDB", "inputNumberWrapper"],
+ "inputnumberwrapperdefault": ["BDFDB", "inputNumberWrapperDefault"],
+ "inputnumberwrappermini": ["BDFDB", "inputNumberWrapperMini"],
+ "inputprefix": ["Input", "inputPrefix"],
+ "inputsuccess": ["Input", "success"],
+ "inputwrapper": ["Input", "inputWrapper"],
+ "invite": ["GuildInvite", "wrapper"],
+ "invitebutton": ["GuildInvite", "button"],
+ "invitebuttonfornonmember": ["GuildInvite", "buttonForNonMember"],
+ "invitebuttonresolving": ["GuildInvite", "invite-button-resolving"],
+ "invitebuttonsize": ["GuildInvite", "buttonSize"],
+ "invitechannel": ["GuildInvite", "channel"],
+ "invitechannelicon": ["GuildInvite", "channelIcon"],
+ "invitechannelname": ["GuildInvite", "channelName"],
+ "invitecontent": ["GuildInvite", "content"],
+ "invitecount": ["GuildInvite", "count"],
+ "invitecursordefault": ["GuildInvite", "cursorDefault"],
+ "invitedestination": ["GuildInvite", "inviteDestination"],
+ "invitedestinationexpired": ["GuildInvite", "inviteDestinationExpired"],
+ "invitedestinationjoined": ["GuildInvite", "inviteDestinationJoined"],
+ "inviteguildbadge": ["GuildInvite", "guildBadge"],
+ "inviteguilddetail": ["GuildInvite", "guildDetail"],
+ "inviteguildicon": ["GuildInvite", "guildIcon"],
+ "inviteguildiconexpired": ["GuildInvite", "guildIconExpired"],
+ "inviteguildiconimage": ["GuildInvite", "guildIconImage"],
+ "inviteguildiconimagejoined": ["GuildInvite", "guildIconImageJoined"],
+ "inviteguildiconjoined": ["GuildInvite", "guildIconJoined"],
+ "inviteguildinfo": ["GuildInvite", "guildInfo"],
+ "inviteguildname": ["GuildInvite", "guildName"],
+ "inviteguildnamewrapper": ["GuildInvite", "guildNameWrapper"],
+ "inviteheader": ["GuildInvite", "header"],
+ "invitemodal": ["InviteModal", "modal"],
+ "invitemodalinviterow": ["InviteModal", "inviteRow"],
+ "invitemodalinviterowname": ["InviteModal", "inviteRowName"],
+ "invitemodalwrapper": ["InviteModal", "wrapper"],
+ "invitesplash": ["GuildInvite", "inviteSplash"],
+ "invitesplashimage": ["GuildInvite", "inviteSplashImage"],
+ "invitesplashimageloaded": ["GuildInvite", "inviteSplashImageLoaded"],
+ "inviteresolving": ["GuildInvite", "resolving"],
+ "inviteresolvingbackground": ["GuildInvite", "resolvingBackground"],
+ "invitestatus": ["GuildInvite", "status"],
+ "invitestatuscounts": ["GuildInvite", "statusCounts"],
+ "invitestatusoffline": ["GuildInvite", "statusOffline"],
+ "invitestatusonline": ["GuildInvite", "statusOnline"],
+ "inviteuserselectnone": ["GuildInvite", "userSelectNone"],
+ "italics": ["TextStyle", "italics"],
+ "layer": ["Layers", "layer"],
+ "layerbase": ["Layers", "baseLayer"],
+ "layers": ["Layers", "layers"],
+ "layersbg": ["Layers", "bg"],
+ "linedefaultcolor": ["Text2", "defaultColor"],
+ "listavatar": ["UserProfileList", "listAvatar"],
+ "listdiscriminator": ["UserProfileList", "listDiscriminator"],
+ "listguildavatar": ["UserProfileListGuild", "guildAvatar"],
+ "listguildavatarwithouticon": ["UserProfileListGuild", "guildAvatarWithoutIcon"],
+ "listname": ["UserProfileList", "listName"],
+ "listrow": ["UserProfileList", "listRow"],
+ "listrowcontent": ["UserProfileList", "listRowContent"],
+ "listrowwrapper": ["BDFDB", "listRow"],
+ "listscroller": ["UserProfileList", "listScroller"],
+ "livetag": ["LiveTag", "live"],
+ "livetaggrey": ["LiveTag", "grey"],
+ "livetaglarge": ["LiveTag", "liveLarge"],
+ "livetagsmall": ["LiveTag", "liveSmall"],
+ "loadingicon": ["BDFDB", "loadingIcon"],
+ "loadingiconwrapper": ["BDFDB", "loadingIconWrapper"],
+ "loadingscreen": ["LoadingScreen", "container"],
+ "lottieicon": ["LottieIcon", "lottieIcon"],
+ "marginbottom4": ["Margins", "marginBottom4"],
+ "marginbottom8": ["Margins", "marginBottom8"],
+ "marginbottom20": ["Margins", "marginBottom20"],
+ "marginbottom40": ["Margins", "marginBottom40"],
+ "marginbottom60": ["Margins", "marginBottom60"],
+ "margincenterhorz": ["Margins", "marginCenterHorz"],
+ "marginleft4": ["BDFDB", "marginLeft4"],
+ "marginleft8": ["BDFDB", "marginLeft8"],
+ "marginreset": ["Margins", "marginReset"],
+ "margintop4": ["Margins", "marginTop4"],
+ "margintop8": ["Margins", "marginTop8"],
+ "margintop20": ["Margins", "marginTop20"],
+ "margintop40": ["Margins", "marginTop40"],
+ "margintop60": ["Margins", "marginTop60"],
+ "member": ["Member", "member"],
+ "memberactivity": ["Member", "activity"],
+ "membericon": ["Member", "icon"],
+ "memberinner": ["Member", "memberInner"],
+ "memberoffline": ["Member", "offline"],
+ "memberownericon": ["Member", "ownerIcon"],
+ "memberpremiumicon": ["Member", "premiumIcon"],
+ "members": ["MembersWrapper", "members"],
+ "membersince": ["MemberSince", "memberSince"],
+ "membersgroup": ["MembersWrapper", "membersGroup"],
+ "memberswrap": ["MembersWrapper", "membersWrap"],
+ "memberusername": ["Member", "username"],
+ "mention": ["NotFound", "mention"],
+ "mentioninteractive": ["NotFound", "mentionInteractive"],
+ "mentionwrapper": ["NotFound", "mentionWrapper"],
+ "menu": ["Menu", "menu"],
+ "menucaret": ["Menu", "caret"],
+ "menucaretarrow": ["MenuCaret", "arrow"],
+ "menucaretopen": ["MenuCaret", "open"],
+ "menucheck": ["Menu", "check"],
+ "menucheckbox": ["Menu", "checkbox"],
+ "menucolorbrand": ["Menu", "colorBrand"],
+ "menucolorcustom": ["BDFDB", "menuColorCustom"],
+ "menucolordanger": ["Menu", "colorDanger"],
+ "menucolordefault": ["Menu", "colorDefault"],
+ "menucolorpremium": ["Menu", "colorPremium"],
+ "menucolorpremiumgradient": ["Menu", "colorPremiumGradient"],
+ "menucolorsuccess": ["Menu", "colorSuccess"],
+ "menucustomitem": ["Menu", "customItem"],
+ "menudisabled": ["Menu", "disabled"],
+ "menufocused": ["Menu", "focused"],
+ "menuhideinteraction": ["Menu", "hideInteraction"],
+ "menuhint": ["BDFDB", "menuItemHint"],
+ "menuhintcontainer": ["Menu", "hintContainer"],
+ "menuicon": ["Menu", "icon"],
+ "menuiconcontainer": ["Menu", "iconContainer"],
+ "menuiconcontainerleft": ["Menu", "iconContainerLeft"],
+ "menuimage": ["Menu", "image"],
+ "menuimagecontainer": ["Menu", "imageContainer"],
+ "menuitem": ["Menu", "item"],
+ "menulabel": ["Menu", "label"],
+ "menulabelcontainer": ["Menu", "labelContainer"],
+ "menureactbuttonfocused": ["MenuReactButton", "focused"],
+ "menureactbuttonicon": ["MenuReactButton", "icon"],
+ "menureactbuttons": ["MenuReactButton", "wrapper"],
+ "menuscroller": ["Menu", "scroller"],
+ "menuseparator": ["Menu", "separator"],
+ "menuslider": ["MenuSlider", "slider"],
+ "menuslidercontainer": ["MenuSlider", "sliderContainer"],
+ "menustylefixed": ["Menu", "styleFixed"],
+ "menustyleflexible": ["Menu", "styleFlexible"],
+ "menusubmenu": ["Menu", "submenu"],
+ "menusubmenucontainer": ["Menu", "submenuContainer"],
+ "menusubtext": ["Menu", "subtext"],
+ "message": ["Message", "message"],
+ "messageaccessory": ["MessageAccessory", "container"],
+ "messageattachment": ["MessageAttachment", "messageAttachment"],
+ "messageattachmentremovebutton": ["MessageAttachment", "removeMosaicItemButton"],
+ "messageavatar": ["MessageBody", "avatar"],
+ "messageavatarclickable": ["MessageBody", "clickable"],
+ "messagebackgroundflash": ["Message", "backgroundFlash"],
+ "messagebarbase": ["MessageElements", "barBase"],
+ "messagebarbuttonalt": ["MessageElements", "barButtonAlt"],
+ "messagebarbuttonbase": ["MessageElements", "barButtonBase"],
+ "messagebarbuttonicon": ["MessageElements", "barButtonIcon"],
+ "messagebarbuttonmain": ["MessageElements", "barButtonMain"],
+ "messagebarhasmore": ["MessageElements", "hasMore"],
+ "messagebarjumptopresentbar": ["MessageElements", "jumpToPresentBar"],
+ "messagebarloadingmore": ["MessageElements", "loadingMore"],
+ "messagebarnewmessagesbar": ["MessageElements", "newMessagesBar"],
+ "messagebarspan": ["MessageElements", "span"],
+ "messagebarspinner": ["MessageElements", "spinner"],
+ "messagebarspinneritem": ["MessageElements", "spinnerItem"],
+ "messagebeforegroup": ["Message", "beforeGroup"],
+ "messageblockedaction": ["MessageBlocked", "blockedAction"],
+ "messageblockedcontainer": ["MessageBlocked", "container"],
+ "messageblockedexpanded": ["MessageBlocked", "expanded"],
+ "messageblockedicon": ["MessageBlocked", "blockedIcon"],
+ "messageblockedsystemmessage": ["MessageBlocked", "blockedSystemMessage"],
+ "messageblockedtext": ["MessageBlocked", "blockedMessageText"],
+ "messageblockquotecontainer": ["MessageMarkup", "blockquoteContainer"],
+ "messageblockquotedivider": ["MessageMarkup", "blockquoteDivider"],
+ "messagebottag": ["MessageBody", "botTag"],
+ "messagebottagcompact": ["MessageBody", "botTagCompact"],
+ "messagebottagcozy": ["MessageBody", "botTagCozy"],
+ "messagebuttoncontainer": ["MessageBody", "buttonContainer"],
+ "messagebuttons": ["Message", "buttons"],
+ "messagechanneltextarea": ["Message", "channelTextArea"],
+ "messagecompact": ["MessageBody", "compact"],
+ "messagecontents": ["MessageBody", "contents"],
+ "messagecozy": ["MessageBody", "cozy"],
+ "messagecozymessage": ["Message", "cozyMessage"],
+ "messagedisableinteraction": ["Message", "disableInteraction"],
+ "messagedivider": ["Message", "divider"],
+ "messagedividerhascontent": ["Message", "hasContent"],
+ "messageedited": ["MessageBody", "edited"],
+ "messagegroupstart": ["Message", "groupStart"],
+ "messagegroupblocked": ["MessageElements", "messageGroupBlocked"],
+ "messagegroupblockedbtn": ["MessageElements", "messageGroupBlockedBtn"],
+ "messagegroupblockedrevealed": ["MessageElements", "revealed"],
+ "messageheader": ["MessageBody", "header"],
+ "messageheadertext": ["MessageBody", "headerText"],
+ "messagelistitem": ["Message", "messageListItem"],
+ "messagelocalbot": ["Message", "ephemeral"],
+ "messagelocalboticon": ["MessageLocalBot", "icon"],
+ "messagelocalbotoperations": ["MessageLocalBot", "ephemeralMessage"],
+ "messagemarkup": ["MessageMarkup", "markup"],
+ "messagemarkupcompact": ["MessageBody", "compact"],
+ "messagemarkupcontent": ["MessageBody", "messageContent"],
+ "messagemarkupcozy": ["MessageBody", "cozy"],
+ "messagemarkupisfailed": ["MessageBody", "isFailed"],
+ "messagemarkupissending": ["MessageBody", "isSending"],
+ "messagemarkuprtl": ["MessageBody", "markupRtl"],
+ "messagemarkuptimestamp": ["MessageMarkup", "timestamp"],
+ "messagemarkuptimestamptooltip": ["MessageMarkup", "timestampTooltip"],
+ "messagementioned": ["Message", "mentioned"],
+ "messagepopout": ["MessagePopout", "message"],
+ "messageoperations": ["MessageOperations", "operations"],
+ "messagereaction": ["MessageReactions", "reaction"],
+ "messagereactionme": ["MessageReactions", "reactionMe"],
+ "messagereactions": ["MessageReactions", "reactions"],
+ "messagereactionsmodalemoji": ["MessageReactionsModal", "emoji"],
+ "messagereactionsmodalname": ["MessageReactionsModal", "name"],
+ "messagereactionsmodalnickname": ["MessageReactionsModal", "nickname"],
+ "messagereactionsmodalreactor": ["MessageReactionsModal", "reactor"],
+ "messagereactionsmodalusername": ["MessageReactionsModal", "username"],
+ "messagerepliedmessage": ["MessageBody", "repliedMessage"],
+ "messagerepliedmessagecontent": ["MessageBody", "repliedTextContent"],
+ "messagerepliedmessagecontentclickable": ["MessageBody", "clickable"],
+ "messagerepliedmessagepreview": ["MessageBody", "repliedTextPreview"],
+ "messagereply": ["MessageReply", "container"],
+ "messagereplyname": ["MessageReply", "name"],
+ "messagereplytext": ["MessageReply", "text"],
+ "messageroleicon": ["MessageBody", "roleIcon"],
+ "messageselected": ["Message", "selected"],
+ "messages": ["MessagesWrap", "messages"],
+ "messagesdivider": ["MessagesWrap", "divider"],
+ "messagesloadingavatar": ["MessagesLoading", "avatar"],
+ "messagesloadingcompact": ["MessagesLoading", "compact"],
+ "messagesloadingcozy": ["MessagesLoading", "cozy"],
+ "messagesloadingmessage": ["MessagesLoading", "wrapper"],
+ "messagesloadingwrapper": ["NotFound", "messagesLoadingWrapper"],
+ "messagespopout": ["MessagesPopout", "messagesPopout"],
+ "messagespopoutactionbuttons": ["MessagesPopout", "actionButtons"],
+ "messagespopoutbody": ["MessagesPopout", "body"],
+ "messagespopoutbottom": ["MessagesPopout", "bottom"],
+ "messagespopoutbutton": ["MessagesPopoutButtons", "button"],
+ "messagespopoutbuttonsecondary": ["MessagesPopoutButtons", "secondary"],
+ "messagespopoutbuttonsize24": ["MessagesPopoutButtons", "size24"],
+ "messagespopoutbuttonsize32": ["MessagesPopoutButtons", "size32"],
+ "messagespopoutbuttonsize36": ["MessagesPopoutButtons", "size36"],
+ "messagespopoutbuttontertiary": ["MessagesPopoutButtons", "tertiary"],
+ "messagespopoutchannelname": ["MessagesPopout", "channelName"],
+ "messagespopoutchannelseparator": ["MessagesPopout", "channelSeparator"],
+ "messagespopoutclosebutton": ["MessagesPopout", "closeIcon"],
+ "messagespopoutcontrols": ["MessagesPopoutTabBar", "controls"],
+ "messagespopoutemptyplaceholder": ["MessagesPopout", "emptyPlaceholder"],
+ "messagespopoutfooter": ["MessagesPopout", "footer"],
+ "messagespopoutguildname": ["MessagesPopout", "guildName"],
+ "messagespopoutgroupcozy": ["MessagesPopout", "messageGroupCozy"],
+ "messagespopoutgroupwrapper": ["MessagesPopout", "messageGroupWrapper"],
+ "messagespopouthasmore": ["MessagesPopout", "hasMore"],
+ "messagespopoutheader": ["MessagesPopout", "header"],
+ "messagespopoutimage": ["MessagesPopout", "image"],
+ "messagespopoutjumpbutton": ["MessagesPopout", "jumpButton"],
+ "messagespopoutloading": ["MessagesPopout", "loading"],
+ "messagespopoutloadingmore": ["MessagesPopout", "loadingMore"],
+ "messagespopoutloadingplaceholder": ["MessagesPopout", "loadingPlaceholder"],
+ "messagespopoutscrollingfooterwrap": ["MessagesPopout", "scrollingFooterWrap"],
+ "messagespopoutspinner": ["MessagesPopout", "spinner"],
+ "messagespopouttabbar": ["MessagesPopoutTabBar", "tabBar"],
+ "messagespopouttabbarheader": ["MessagesPopoutTabBar", "header"],
+ "messagespopouttabbartab": ["MessagesPopoutTabBar", "tab"],
+ "messagespopouttabbartabactive": ["MessagesPopoutTabBar", "active"],
+ "messagespopouttitle": ["MessagesPopout", "title"],
+ "messagespopoutvisible": ["MessagesPopout", "visible"],
+ "messagespopoutwrap": ["MessagesPopout", "messagesPopoutWrap"],
+ "messagesscroller": ["MessagesWrap", "scroller"],
+ "messagesscrollercontent": ["MessagesWrap", "scrollerContent"],
+ "messagesscrollerinner": ["MessagesWrap", "scrollerInner"],
+ "messagesscrollerwrapper": ["MessagesWrap", "scrollerWrap"],
+ "messageswelcome": ["MessagesWelcome", "container"],
+ "messageswelcomebutton": ["MessagesWelcomeButton", "button"],
+ "messageswelcomebuttonicon": ["MessagesWelcomeButton", "buttonIcon"],
+ "messageswelcomedescription": ["MessagesWelcome", "description"],
+ "messageswelcomeemptychannelicon": ["MessagesWelcome", "emptyChannelIcon"],
+ "messageswelcomeheader": ["MessagesWelcome", "header"],
+ "messageswelcomelocked": ["MessagesWelcome", "locked"],
+ "messageswelcomethreadcreator": ["MessagesWelcomeThread", "threadCreatorName"],
+ "messageswrapper": ["MessagesWrap", "messagesWrapper"],
+ "messagesystem": ["Message", "systemMessage"],
+ "messagesystemaccessories": ["MessageBody", "systemMessageAccessories"],
+ "messagesystemcontainer": ["MessageSystem", "container"],
+ "messagesystemcontent": ["MessageSystem", "content"],
+ "messagesystemicon": ["MessageSystem", "icon"],
+ "messagesystemiconcontainer": ["MessageSystem", "iconContainer"],
+ "messagesystemiconsize": ["MessageSystem", "iconSize"],
+ "messagesystemname": ["MessageSystemAccessories", "name"],
+ "messagethreadaccessory": ["MessageBody", "threadMessageAccessory"],
+ "messagethreadaccessoryavatar": ["MessageBody", "threadMessageAccessoryAvatar"],
+ "messagethreadaccessorypreview": ["MessageBody", "threadMessageAccessoryPreview"],
+ "messagetimedivider": ["MessageDivider", "divider"],
+ "messagetimedividercontent": ["MessageDivider", "content"],
+ "messagetimedividerhascontent": ["MessageDivider", "hasContent"],
+ "messagetimedividerisunread": ["MessageDivider", "isUnread"],
+ "messagetimedividerunreadpill": ["MessageDivider", "unreadPill"],
+ "messagetimedividerunreadpillcap": ["MessageDivider", "unreadPillCap"],
+ "messagetimedividerunreadpillcapstroke": ["MessageDivider", "unreadPillCapStroke"],
+ "messagetimestampasiancompact": ["MessageBody", "asianCompactTimeStamp"],
+ "messagetimestamp": ["MessageBody", "timestamp"],
+ "messagetimestampalt": ["MessageBody", "alt"],
+ "messagetimestampinline": ["MessageBody", "timestampInline"],
+ "messagetimestamplatin12compact": ["MessageBody", "latin12CompactTimeStamp"],
+ "messagetimestamplatin24compact": ["MessageBody", "latin24CompactTimeStamp"],
+ "messagetimestampseparator": ["MessageBody", "separator"],
+ "messagetimestampsystem": ["MessageSystem", "timestamp"],
+ "messagetimestamptooltip": ["MessageBody", "timestampTooltip"],
+ "messagetimestampvisibleonhover": ["MessageBody", "timestampVisibleOnHover"],
+ "messagetoolbar": ["MessageToolbar", "container"],
+ "messagetoolbarbutton": ["MessageToolbarItems", "button"],
+ "messagetoolbarbuttondisabled": ["MessageToolbarItems", "disabled"],
+ "messagetoolbarbuttonselected": ["MessageToolbarItems", "selected"],
+ "messagetoolbaricon": ["MessageToolbar", "icon"],
+ "messagetoolbarinner": ["MessageToolbarItems", "wrapper"],
+ "messagetoolbarisheader": ["MessageToolbar", "isHeader"],
+ "messagetoolbarseparator": ["MessageToolbarItems", "separator"],
+ "messageuploadcancel": ["MessageFile", "cancelButton"],
+ "messageusername": ["MessageBody", "username"],
+ "messagewrapper": ["MessageBody", "wrapper"],
+ "messagezalgo": ["MessageBody", "zalgo"],
+ "modal": ["Modal", "root"],
+ "modalcancelbutton": ["CustomStatusModal", "cancelButton"],
+ "modalcarouselmodal": ["NotFound", "carouselModal"],
+ "modalcarouselmodalzoomed": ["ModalCarouselWrapper", "modalCarouselWrapper"],
+ "modalcarouselwrapper": ["ModalCarouselWrapper", "modalCarouselWrapper"],
+ "modalclose": ["Modal", "close"],
+ "modalchangelogmodal": ["BDFDB", "changeLogModal"],
+ "modalconfirmmodal": ["BDFDB", "confirmModal"],
+ "modalcontent": ["Modal", "content"],
+ "modalfooter": ["Modal", "footer"],
+ "modalguildname": ["ModalItems", "guildName"],
+ "modalheader": ["Modal", "header"],
+ "modalheaderhassibling": ["BDFDB", "modalHeaderHasSibling"],
+ "modalheadershade": ["BDFDB", "modalHeaderShade"],
+ "modallarge": ["Modal", "large"],
+ "modallayer": ["ModalLayer", "layer"],
+ "modallayerbackdrop": ["ModalLayer", "backdrop"],
+ "modallayerhidden": ["ModalLayer", "hidden"],
+ "modalmedium": ["Modal", "medium"],
+ "modalmini": ["ModalMiniContent", "modal"],
+ "modalminicontent": ["ModalMiniContent", "content"],
+ "modalminitext": ["HeaderBarTopic", "content"],
+ "modalnoscroller": ["BDFDB", "modalNoScroller"],
+ "modalseparator": ["Modal", "separator"],
+ "modalsidebar": ["BDFDB", "modalSidebar"],
+ "modalsmall": ["Modal", "small"],
+ "modalsub": ["ModalSub", "modal"],
+ "modalsublarge": ["ModalSub", "sizeLarge"],
+ "modalsubmedium": ["ModalSub", "sizeMedium"],
+ "modalsubsmall": ["ModalSub", "sizeSmall"],
+ "modalsubinner": ["BDFDB", "modalSubInner"],
+ "modaltabcontent": ["BDFDB", "modalTabContent"],
+ "modaltabcontentopen": ["BDFDB", "modalTabContentOpen"],
+ "modaltextcontent": ["BDFDB", "modalTextContent"],
+ "modalwrapper": ["BDFDB", "modalWrapper"],
+ "modedefault": ["FormText", "modeDefault"],
+ "modedisabled": ["FormText", "modeDisabled"],
+ "modeselectable": ["FormText", "modeSelectable"],
+ "namecontainer": ["NotFound", "nameContainer"],
+ "namecontaineravatar": ["NameContainer", "avatar"],
+ "namecontainercontent": ["NameContainer", "content"],
+ "namecontainerinteractive": ["NameContainerState", "interactive"],
+ "namecontainerlayout": ["NameContainer", "layout"],
+ "namecontainermuted": ["NameContainerState", "muted"],
+ "namecontainername": ["NameContainer", "name"],
+ "namecontainernamecontainer": ["NotFound", "nameContainerNameContainer"],
+ "namecontainernamewrapper": ["NameContainer", "nameAndDecorators"],
+ "namecontainerselected": ["NameContainerState", "selected"],
+ "namecontainersubtext": ["NameContainer", "subText"],
+ "nametag": ["NameTag", "nameTag"],
+ "nitrostore": ["NitroStore", "applicationStore"],
+ "nochannel": ["ChatWindow", "noChat"],
+ "notice": ["Notice", "notice"],
+ "noticebrand": ["Notice", "colorBrand"],
+ "noticebutton": ["Notice", "button"],
+ "noticebuttonminor": ["Notice", "buttonMinor"],
+ "noticeclosing": ["BDFDB", "noticeClosing"],
+ "noticecustom": ["Notice", "colorCustom"],
+ "noticedanger": ["Notice", "colorDanger"],
+ "noticedefault": ["Notice", "colorDefault"],
+ "noticedismiss": ["Notice", "closeButton"],
+ "noticedismissicon": ["Notice", "closeIcon"],
+ "noticeicon": ["NoticePlatform", "icon"],
+ "noticeiconandroid": ["NoticePlatform", "iconAndroid"],
+ "noticeiconapple": ["NoticePlatform", "iconApple"],
+ "noticeiconwindows": ["NoticePlatform", "iconWindows"],
+ "noticeinfo": ["Notice", "colorInfo"],
+ "noticeneutral": ["Notice", "colorNeutral"],
+ "noticeplatformicon": ["NoticePlatform", "platformIcon"],
+ "noticeplaystation": ["Notice", "colorPlayStation"],
+ "noticepremium": ["Notice", "colorPremium"],
+ "noticepremiumaction": ["NoticePlatform", "premiumAction"],
+ "noticepremiumicon": ["NoticePlatform", "premiumIcon"],
+ "noticepremiumlogo": ["NoticePlatform", "premiumLogo"],
+ "noticepremiumtext": ["NoticePlatform", "premiumText"],
+ "noticepremiumtier0": ["Notice", "colorPremiumTier0"],
+ "noticepremiumtier1": ["Notice", "colorPremiumTier1"],
+ "noticepremiumtier2": ["Notice", "colorPremiumTier2"],
+ "noticespotify": ["Notice", "colorSpotify"],
+ "noticestreamer": ["Notice", "colorStreamerMode"],
+ "noticesuccess": ["Notice", "colorSuccess"],
+ "noticetext": ["BDFDB", "noticeText"],
+ "noticetextlink": ["NoticePlatform", "textLink"],
+ "noticeupdate": ["BDFDB", "noticeUpdate"],
+ "noticeupdatebuttonall": ["BDFDB", "noticeUpdateButtonAll"],
+ "noticeupdatebuttonreload": ["BDFDB", "noticeUpdateButtonReload"],
+ "noticeupdateentries": ["BDFDB", "noticeUpdateEntries"],
+ "noticeupdateentry": ["BDFDB", "noticeUpdateEntry"],
+ "noticeupdatetext": ["BDFDB", "noticeUpdateText"],
+ "noticeupdateseparator": ["BDFDB", "noticeUpdateSeparator"],
+ "noticewarning": ["Notice", "colorWarning"],
+ "noticewrapper": ["BDFDB", "noticeWrapper"],
+ "overflowellipsis": ["BDFDB", "overflowEllipsis"],
+ "pageimage": ["PageImage", "image"],
+ "pageimagetext": ["PageImage", "text"],
+ "pageimagewrapper": ["PageImage", "wrapper"],
+ "pagination": ["BDFDB", "pagination"],
+ "paginationbottom": ["BDFDB", "paginationBottom"],
+ "paginationbutton": ["Pagination", "pageButton"],
+ "paginationbuttonactive": ["Pagination", "activeButton"],
+ "paginationbuttonend": ["Pagination", "endButton"],
+ "paginationbuttonendinner": ["Pagination", "endButtonInner"],
+ "paginationbuttonround": ["Pagination", "roundButton"],
+ "paginationcontainer": ["Pagination", "pageControlContainer"],
+ "paginationcontrol": ["Pagination", "pageControl"],
+ "paginationgap": ["Pagination", "gap"],
+ "paginationicon": ["Pagination", "iconCaret"],
+ "paginationlist": ["BDFDB", "paginationList"],
+ "paginationlistalphabet": ["BDFDB", "paginationListAlphabet"],
+ "paginationlistalphabetchar": ["BDFDB", "paginationListAlphabetChar"],
+ "paginationlistalphabetchardisabled": ["BDFDB", "paginationListAlphabetCharDisabled"],
+ "paginationlistcontent": ["BDFDB", "paginationListContent"],
+ "paginationlistmini": ["BDFDB", "paginationListMini"],
+ "paginationmini": ["BDFDB", "paginationMini"],
+ "paginationtop": ["BDFDB", "paginationTop"],
+ "peoples": ["Peoples", "container"],
+ "peoplesactions": ["PeopleItemInfo", "actions"],
+ "peoplesavatar": ["PeopleItemUser", "avatar"],
+ "peoplesbadge": ["Peoples", "badge"],
+ "peoplescontents": ["PeopleItemInfo", "listItemContents"],
+ "peoplesdiscordtag": ["PeopleItemUser", "discordTag"],
+ "peoplesdiscriminator": ["PeopleItemUser", "discriminator"],
+ "peoplesitem": ["PeopleItem", "peopleListItem"],
+ "peopleslist": ["PeopleList", "peopleList"],
+ "peopleslistempty": ["PeopleList", "emptyStateContainer"],
+ "peoplesnowplayingcolumn": ["Peoples", "nowPlayingColumn"],
+ "peoplesnowplayingmember": ["PeoplesNowPlayingMember", "memberItem"],
+ "peoplespeoplecolumn": ["Peoples", "peopleColumn"],
+ "peoplestabbar": ["Peoples", "tabBar"],
+ "peoplestabbaritem": ["Peoples", "item"],
+ "peoplessubtext": ["PeopleItemUser", "subtext"],
+ "peoplestext": ["PeopleItemUser", "text"],
+ "peoplesuser": ["PeopleItemUser", "userInfo"],
+ "peoplesuserhovered": ["PeopleItemUser", "hovered"],
+ "peoplesusername": ["PeopleItemUser", "username"],
+ "pictureinpicture": ["PictureInPicture", "pictureInPicture"],
+ "pictureinpicturewindow": ["PictureInPicture", "pictureInPictureWindow"],
+ "pollmodalemoji": ["PollModal", "emoji"],
+ "popoutarrow": ["BDFDB", "popoutArrow"],
+ "popoutarrowbottom": ["BDFDB", "popoutArrowBottom"],
+ "popoutarrowtop": ["BDFDB", "popoutArrowTop"],
+ "popoutthemedpopout": ["BDFDB", "themedPopout"],
+ "popoutwrapper": ["BDFDB", "popoutWrapper"],
+ "quickmessage": ["QuickMessage", "input"],
+ "quickselect": ["QuickSelect", "quickSelect"],
+ "quickselectarrow": ["QuickSelect", "quickSelectArrow"],
+ "quickselectclick": ["QuickSelect", "quickSelectClick"],
+ "quickselectlabel": ["QuickSelect", "quickSelectLabel"],
+ "quickselectvalue": ["QuickSelect", "quickSelectValue"],
+ "quickselectwrapper": ["BDFDB", "quickSelectWrapper"],
+ "quickswitcher": ["QuickSwitchWrap", "quickswitcher"],
+ "quickswitchresult": ["QuickSwitch", "result"],
+ "quickswitchresultguildicon": ["QuickSwitch", "guildIcon"],
+ "quickswitchresulticon": ["QuickSwitch", "icon"],
+ "quickswitchresulticoncontainer": ["QuickSwitch", "iconContainer"],
+ "quickswitchresultmatch": ["QuickSwitch", "match"],
+ "quickswitchresultmisccontainer": ["QuickSwitchWrap", "miscContainer"],
+ "quickswitchresultname": ["QuickSwitch", "name"],
+ "quickswitchresultnote": ["QuickSwitch", "note"],
+ "quickswitchresultusername": ["QuickSwitch", "username"],
+ "radiogroup": ["RadioGroup", "item"],
+ "radiogroupinner": ["RadioGroup", "radioBar"],
+ "recentmentionschannelname": ["RecentMentionsHeader", "channelName"],
+ "recentmentionschannelnameheader": ["RecentMentionsHeader", "channelNameHeader"],
+ "recentmentionschannelnamespan": ["RecentMentionsHeader", "channelNameSpan"],
+ "recentmentionsclosebutton": ["RecentMentions", "closeButton"],
+ "recentmentionsdmicon": ["RecentMentionsHeader", "dmIcon"],
+ "recentmentionsguildicon": ["RecentMentionsHeader", "guildIcon"],
+ "recentmentionsguildname": ["RecentMentionsHeader", "guildName"],
+ "recentmentionsjumpbutton": ["RecentMentions", "jumpButton"],
+ "recentmentionspopout": ["RecentMentions", "recentMentionsPopout"],
+ "roleicon": ["RoleIcon", "roleIcon"],
+ "scrollbar": ["Scrollbar", "scrollbar"],
+ "scrollbardefault": ["Scrollbar", "scrollbarDefault"],
+ "scrollbarghost": ["Scrollbar", "scrollbarGhost"],
+ "scrollbarghosthairline": ["Scrollbar", "scrollbarGhostHairline"],
+ "scroller": ["Scroller", "scrollerBase"],
+ "scrollerauto": ["Scroller", "auto"],
+ "scrollercontent": ["Scroller", "content"],
+ "scrollerdisablescrollanchor": ["Scroller", "disableScrollAnchor"],
+ "scrollerfade": ["Scroller", "fade"],
+ "scrollernone": ["Scroller", "none"],
+ "scrollerscrolling": ["Scroller", "scrolling"],
+ "scrollerthin": ["Scroller", "thin"],
+ "searchbar": ["SearchBar", "container"],
+ "searchbarclear": ["SearchBar", "clear"],
+ "searchbarclose": ["SearchBar", "close"],
+ "searchbaricon": ["SearchBar", "icon"],
+ "searchbariconlayout": ["SearchBar", "iconLayout"],
+ "searchbariconwrap": ["SearchBar", "iconContainer"],
+ "searchbarinner": ["SearchBar", "inner"],
+ "searchbarinput": ["SearchBar", "input"],
+ "searchbarlarge": ["SearchBar", "large"],
+ "searchbarmedium": ["SearchBar", "medium"],
+ "searchbarsmall": ["SearchBar", "small"],
+ "searchbartag": ["SearchBar", "tag"],
+ "searchbarvisible": ["SearchBar", "visible"],
+ "searchbarwrapper": ["BDFDB", "searchBarWrapper"],
+ "searchpopout": ["SearchPopoutWrap", "container"],
+ "searchpopoutanswer": ["SearchPopout", "answer"],
+ "searchpopoutdatepicker": ["SearchPopout", "datePicker"],
+ "searchpopoutdatepickerhint": ["SearchPopout", "datePickerHint"],
+ "searchpopoutdisplayavatar": ["SearchPopout", "displayAvatar"],
+ "searchpopoutdisplayusername": ["SearchPopout", "displayUsername"],
+ "searchpopoutdisplayednick": ["SearchPopout", "displayedNick"],
+ "searchpopoutfilter": ["SearchPopout", "filter"],
+ "searchpopoutheader": ["SearchPopout", "header"],
+ "searchpopouthint": ["SearchPopout", "hint"],
+ "searchpopouthintvalue": ["SearchPopout", "hintValue"],
+ "searchpopoutlinksource": ["SearchPopout", "linkSource"],
+ "searchpopoutnontext": ["SearchPopout", "nonText"],
+ "searchpopoutoption": ["SearchPopout", "option"],
+ "searchpopoutplusicon": ["SearchPopout", "plusIcon"],
+ "searchpopoutresultchannel": ["SearchPopout", "resultChannel"],
+ "searchpopoutresultsgroup": ["SearchPopout", "resultsGroup"],
+ "searchpopoutsearchclearhistory": ["SearchPopout", "searchClearHistory"],
+ "searchpopoutsearchlearnmore": ["SearchPopout", "searchLearnMore"],
+ "searchpopoutsearchoption": ["SearchPopout", "searchOption"],
+ "searchpopoutsearchresultchannelcategory": ["SearchPopout", "searchResultChannelCategory"],
+ "searchpopoutsearchresultchannelicon": ["SearchPopout", "searchResultChannelIcon"],
+ "searchpopoutsearchresultchanneliconbackground": ["SearchPopout", "searchResultChannelIconBackground"],
+ "searchpopoutuser": ["SearchPopout", "user"],
+ "searchresultschannelname": ["SearchResultsGroup", "channelNameText"],
+ "searchresultsblocked": ["SearchResultsGroup", "resultsBlocked"],
+ "searchresultsgroup": ["SearchResultsGroup", "searchResultGroup"],
+ "searchresultsmessage": ["SearchResultsMessage", "message"],
+ "searchresultspagination": ["NotFound", "searchResultsPagination"],
+ "searchresultsresult": ["SearchResultsMessage", "searchResult"],
+ "searchresultswrap": ["SearchResults", "searchResultsWrap"],
+ "select": ["Select", "select"],
+ "selectable": ["TextColor2", "selectable"],
+ "selectfilterpopout": ["SelectFilterPopout", "selectFilterPopout"],
+ "selectfilterpopoutavatar": ["SelectFilterPopout", "avatar"],
+ "selectoption": ["Select", "option"],
+ "selectouter": ["Select", "wrapper"],
+ "selectsearchinput": ["Select", "searchInput"],
+ "selectselectedicon": ["Select", "selectedIcon"],
+ "selectwrapper": ["BDFDB", "selectWrapper"],
+ "settingsclosebutton": ["SettingsCloseButton", "closeButton"],
+ "settingsclosebuttoncontainer": ["SettingsCloseButton", "container"],
+ "settingsguild": ["BDFDB", "settingsGuild"],
+ "settingsguilddisabled": ["BDFDB", "settingsGuildDisabled"],
+ "settingsheader": ["Item", "header"],
+ "settingsitem": ["Item", "item"],
+ "settingsitemdragged": ["ItemRole", "dragged"],
+ "settingsitemdlock": ["ItemRole", "lock"],
+ "settingsitemrole": ["ItemRole", "role"],
+ "settingsitemroleinner": ["ItemRole", "roleInner"],
+ "settingsitemselected": ["Item", "selected"],
+ "settingsitemthemed": ["Item", "themed"],
+ "settingspanel": ["BDFDB", "settingsPanel"],
+ "settingspanellist": ["BDFDB", "settingsPanelList"],
+ "settingspanellistwrapper": ["BDFDB", "settingsPanelListWrapper"],
+ "settingspanellistwrappermini": ["BDFDB", "settingsPanelListWrapperMini"],
+ "settingsrow": ["SettingsItems", "container"],
+ "settingsrowcontainer": ["BDFDB", "settingsRow"],
+ "settingsrowcontrol": ["SettingsItems", "control"],
+ "settingsrowdisabled": ["SettingsItems", "disabled"],
+ "settingsrowlabel": ["SettingsItems", "labelRow"],
+ "settingsrownote": ["SettingsItems", "note"],
+ "settingsrowtitle": ["SettingsItems", "title"],
+ "settingsrowtitledefault": ["SettingsItems", "titleDefault"],
+ "settingsrowtitlemini": ["SettingsItems", "titleMini"],
+ "settingsseparator": ["Item", "separator"],
+ "settingstableheader": ["SettingsTable", "header"],
+ "settingstableheadername": ["SettingsTable", "headerName"],
+ "settingstableheaderoption": ["SettingsTable", "headerOption"],
+ "settingstableheaderoptions": ["BDFDB", "settingsTableHeaderOptions"],
+ "settingstableheaders": ["BDFDB", "settingsTableHeaders"],
+ "settingstableheadervertical": ["BDFDB", "settingsTableHeaderVertical"],
+ "settingstablecard": ["BDFDB", "settingsTableCard"],
+ "settingstablecardconfigs": ["BDFDB", "settingsTableCardConfigs"],
+ "settingstablecardlabel": ["BDFDB", "settingsTableCardLabel"],
+ "settingstablelist": ["BDFDB", "settingsTableList"],
+ "settingswindowcontentcolumn": ["SettingsWindow", "contentColumn"],
+ "settingswindowcontentcolumndefault": ["SettingsWindow", "contentColumnDefault"],
+ "settingswindowcontentregion": ["SettingsWindow", "contentRegion"],
+ "settingswindowcontentregionscroller": ["SettingsWindow", "contentRegionScroller"],
+ "settingswindowsidebar": ["SettingsWindow", "sidebar"],
+ "settingswindowsidebarregion": ["SettingsWindow", "sidebarRegion"],
+ "settingswindowsidebarregionscroller": ["SettingsWindow", "sidebarRegionScroller"],
+ "settingswindowstandardsidebarview": ["SettingsWindow", "standardSidebarView"],
+ "settingswindowsubsidebarcontent": ["SettingsWindowScroller", "content"],
+ "settingswindowsubsidebarscroller": ["SettingsWindowScroller", "scroller"],
+ "settingswindowtoolscontainer": ["SettingsWindow", "toolsContainer"],
+ "sidebar": ["BDFDB", "sidebar"],
+ "sidebarcontent": ["BDFDB", "sidebarContent"],
+ "sidebarlist": ["BDFDB", "sidebarList"],
+ "size10": ["TextSize", "size10"],
+ "size12": ["TextSize", "size12"],
+ "size14": ["TextSize", "size14"],
+ "size16": ["TextSize", "size16"],
+ "size20": ["TextSize", "size20"],
+ "size24": ["TextSize", "size24"],
+ "size32": ["TextSize", "size32"],
+ "slider": ["Slider", "slider"],
+ "sliderbar": ["Slider", "bar"],
+ "sliderbarfill": ["Slider", "barFill"],
+ "sliderbubble": ["BDFDB", "sliderBubble"],
+ "sliderdisabled": ["Slider", "disabled"],
+ "slidergrabber": ["Slider", "grabber"],
+ "slidermark": ["Slider", "mark"],
+ "slidermarkabove": ["Slider", "markAbove"],
+ "slidermarkbelow": ["Slider", "markBelow"],
+ "slidermarkdash": ["Slider", "markDash"],
+ "slidermarkdashsimple": ["Slider", "markDashSimple"],
+ "slidermarkvalue": ["Slider", "markValue"],
+ "slidermini": ["Slider", "mini"],
+ "slidertrack": ["Slider", "track"],
+ "spinner": ["Spinner", "spinner"],
+ "spoilercontainer": ["Spoiler", "spoilerContainer"],
+ "spoilerhidden": ["Spoiler", "hidden"],
+ "spoilertext": ["Spoiler", "spoilerContent"],
+ "spoilerwarning": ["Spoiler", "spoilerWarning"],
+ "strikethrough": ["TextStyle", "strikethrough"],
+ "status": ["Avatar", "status"],
+ "stopanimations": ["NotFound", "stopAnimations"],
+ "subtext": ["NotFound", "subtext"],
+ "svgicon": ["BDFDB", "svgIcon"],
+ "svgiconwrapper": ["BDFDB", "svgIconWrapper"],
+ "switch": ["Switch", "container"],
+ "switchchecked": ["Switch", "checked"],
+ "switchinner": ["Switch", "input"],
+ "switchmini": ["BDFDB", "switchMini"],
+ "switchslider": ["Switch", "slider"],
+ "tabbar": ["UserProfile", "tabBar"],
+ "tabbarcontainer": ["UserProfile", "tabBarContainer"],
+ "tabbarcontainerbottom": ["BDFDB", "tabBarContainerBottom"],
+ "tabbaritem": ["UserProfile", "tabBarItem"],
+ "tabbarside": ["Item", "side"],
+ "tabbartop": ["Item", "top"],
+ "tabbartoppill": ["Item", "topPill"],
+ "table": ["BDFDB", "table"],
+ "tablebodycell": ["BDFDB", "tableBodyCell"],
+ "tableheadercell": ["BDFDB", "tableHeaderCell"],
+ "tableheadercellclickable": ["Table", "clickable"],
+ "tableheadercellcontent": ["Table", "headerCellContent"],
+ "tableheadercellsorted": ["Table", "headerCellSorted"],
+ "tableheadercellwrapper": ["Table", "headerCell"],
+ "tableheadersorticon": ["Table", "sortIcon"],
+ "tablerow": ["Table", "row"],
+ "tablestickyheader": ["Table", "stickyHeader"],
+ "textarea": ["ChannelTextArea", "textArea"],
+ "textareaattachbutton": ["ChannelTextAreaAttachButton", "attachButton"],
+ "textareaattachbuttoninner": ["ChannelTextAreaAttachButton", "attachButtonInner"],
+ "textareaattachbuttonplus": ["ChannelTextAreaAttachButton", "attachButtonPlus"],
+ "textareaattachwrapper": ["ChannelTextAreaAttachButton", "attachWrapper"],
+ "textareabutton": ["ChannelTextAreaButton", "button"],
+ "textareabuttonactive": ["ChannelTextAreaButton", "active"],
+ "textareabuttonpulse": ["ChannelTextAreaButton", "pulseButton"],
+ "textareabuttonwrapper": ["ChannelTextAreaButton", "buttonWrapper"],
+ "textareacharcounter": ["ChannelTextAreaCharCounter", "characterCount"],
+ "textareacharcountererror": ["ChannelTextAreaCharCounter", "error"],
+ "textareacharcounterupsell": ["ChannelTextAreaCharCounter", "upsell"],
+ "textareadisabled": ["ChannelTextArea", "textAreaDisabled"],
+ "textareafontsize12padding": ["ChannelTextArea", "fontSize12Padding"],
+ "textareafontsize14padding": ["ChannelTextArea", "fontSize14Padding"],
+ "textareafontsize15padding": ["ChannelTextArea", "fontSize15Padding"],
+ "textareafontsize16padding": ["ChannelTextArea", "fontSize16Padding"],
+ "textareafontsize18padding": ["ChannelTextArea", "fontSize18Padding"],
+ "textareafontsize20padding": ["ChannelTextArea", "fontSize20Padding"],
+ "textareafontsize24padding": ["ChannelTextArea", "fontSize24Padding"],
+ "textareaicon": ["ChannelTextAreaButton", "icon"],
+ "textareaiconpulse": ["ChannelTextAreaButton", "pulseIcon"],
+ "textareainner": ["ChannelTextArea", "inner"],
+ "textareainnerdisabled": ["ChannelTextArea", "innerDisabled"],
+ "textareapickerbutton": ["ChannelTextArea", "button"],
+ "textareapickerbuttoncontainer": ["ChannelTextArea", "buttonContainer"],
+ "textareapickerbuttons": ["ChannelTextArea", "buttons"],
+ "textareascrollablecontainer": ["ChannelTextArea", "scrollableContainer"],
+ "textareaslate": ["ChannelTextArea", "textAreaSlate"],
+ "textareaslatemarkup": ["ChannelTextAreaSlate", "slateTextArea"],
+ "textareaslatecontainer": ["ChannelTextAreaSlate", "slateContainer"],
+ "textareaslateplaceholder": ["ChannelTextAreaSlate", "placeholder"],
+ "textareauploadinput": ["ChannelTextAreaAttachButton", "uploadInput"],
+ "textareawebkit": ["ChannelTextArea", "webkit"],
+ "textareawrapall": ["ChannelTextArea", "channelTextArea"],
+ "textareawrapchat": ["ChatWindow", "channelTextArea"],
+ "textareawrapdisabled": ["ChannelTextArea", "channelTextAreaDisabled"],
+ "textrow": ["PopoutActivity", "textRow"],
+ "textscroller": ["BDFDB", "textScroller"],
+ "themecustombackground": ["NotFound", "themeCustomBackground"],
+ "themedark": ["NotFound", "themeDark"],
+ "themelight": ["NotFound", "themeLight"],
+ "themeundefined": ["NotFound", "themeUndefined"],
+ "threadcard": ["ThreadCard", "container"],
+ "threadcardauthor": ["ThreadCard", "authorName"],
+ "threadcardavatar": ["ThreadCard", "avatar"],
+ "threadcardname": ["ThreadCard", "threadName"],
+ "threadcardstartedby": ["ThreadCard", "startedByName"],
+ "tip": ["Tip", "tip"],
+ "tipblock": ["Tip", "block"],
+ "tippro": ["Tip", "pro"],
+ "tipinline": ["Tip", "inline"],
+ "titlebar": ["TitleBar", "titleBar"],
+ "titlebarmac": ["TitleBar", "typeMacOS"],
+ "titlebarmacbutton": ["TitleBar", "macButton"],
+ "titlebarmacbuttonclose": ["TitleBar", "macButtonClose"],
+ "titlebarmacbuttonmin": ["TitleBar", "macButtonMinimize"],
+ "titlebarmacbuttonmax": ["TitleBar", "macButtonMaximize"],
+ "titlebarmacbuttons": ["TitleBar", "macButtons"],
+ "titlebarmacwithframe": ["TitleBar", "typeMacOSWithFrame"],
+ "titlebarwinbutton": ["TitleBar", "winButton"],
+ "titlebarwinbuttonclose": ["TitleBar", "winButtonClose"],
+ "titlebarwinbuttonminmax": ["TitleBar", "winButtonMinMax"],
+ "titlebarwindows": ["TitleBar", "typeWindows"],
+ "titlebarwithframe": ["TitleBar", "withFrame"],
+ "titlebarwordmark": ["TitleBar", "wordmark"],
+ "titlebarwordmarkmac": ["TitleBar", "wordmarkMacOS"],
+ "titlebarwordmarkwindows": ["TitleBar", "wordmarkWindows"],
+ "toast": ["Toast", "toast"],
+ "toastavatar": ["Toast", "avatar"],
+ "toastbar": ["Toast", "bar"],
+ "toastbarinner": ["Toast", "barInner"],
+ "toastbg": ["Toast", "bg"],
+ "toastbrand": ["Toast", "brand"],
+ "toastclosable": ["Toast", "closable"],
+ "toastcloseicon": ["Toast", "closeIcon"],
+ "toastclosing": ["Toast", "closing"],
+ "toastcustom": ["Toast", "custom"],
+ "toastcustombar": ["Toast", "customBar"],
+ "toastdanger": ["Toast", "danger"],
+ "toastdefault": ["Toast", "default"],
+ "toasticon": ["Toast", "icon"],
+ "toastinfo": ["Toast", "info"],
+ "toastinner": ["Toast", "inner"],
+ "toastopening": ["Toast", "opening"],
+ "toasts": ["Toast", "toasts"],
+ "toastscenter": ["Toast", "center"],
+ "toastsleft": ["Toast", "left"],
+ "toastsright": ["Toast", "right"],
+ "toastsuccess": ["Toast", "success"],
+ "toasttext": ["Toast", "text"],
+ "toastwarning": ["Toast", "warning"],
+ "tooltip": ["Tooltip", "tooltip"],
+ "tooltipactivityicon": ["TooltipGuild", "activityIcon"],
+ "tooltipblack": ["Tooltip", "tooltipBlack"],
+ "tooltipbottom": ["Tooltip", "tooltipBottom"],
+ "tooltipbrand": ["Tooltip", "tooltipBrand"],
+ "tooltipcontent": ["Tooltip", "tooltipContent"],
+ "tooltipcontentallowoverflow": ["Tooltip", "tooltipContentAllowOverflow"],
+ "tooltipcustom": ["BDFDB", "tooltipCustom"],
+ "tooltipgreen": ["Tooltip", "tooltipGreen"],
+ "tooltipgrey": ["Tooltip", "tooltipGrey"],
+ "tooltipguildnametext": ["TooltipGuild", "guildNameText"],
+ "tooltipguildnametextlimitedsize": ["TooltipGuild", "guildNameTextLimitedSize"],
+ "tooltipleft": ["Tooltip", "tooltipLeft"],
+ "tooltiplistitem": ["GuildsItems", "listItemTooltip"],
+ "tooltipmutetext": ["TooltipGuild", "muteText"],
+ "tooltipmutetextwithactivity": ["TooltipGuild", "muteTextWithActivity"],
+ "tooltipnote": ["BDFDB", "tooltipNote"],
+ "tooltippointer": ["Tooltip", "tooltipPointer"],
+ "tooltipprimary": ["Tooltip", "tooltipPrimary"],
+ "tooltipred": ["Tooltip", "tooltipRed"],
+ "tooltipright": ["Tooltip", "tooltipRight"],
+ "tooltiprow": ["TooltipGuild", "row"],
+ "tooltiprowextra": ["BDFDB", "tooltipRowExtra"],
+ "tooltiprowguildname": ["TooltipGuild", "rowGuildName"],
+ "tooltiprowicon": ["TooltipGuild", "rowIcon"],
+ "tooltiprowiconv2": ["TooltipGuild", "rowIconV2"],
+ "tooltiptop": ["Tooltip", "tooltipTop"],
+ "tooltipyellow": ["Tooltip", "tooltipYellow"],
+ "typing": ["Typing", "typing"],
+ "typingcooldownwrapper": ["Typing", "cooldownWrapper"],
+ "typingtext": ["Typing", "text"],
+ "underline": ["TextStyle", "underline"],
+ "unreadbar": ["UnreadBar", "bar"],
+ "unreadbaractive": ["UnreadBar", "active"],
+ "unreadbarcontainer": ["UnreadBar", "container"],
+ "unreadbaricon": ["UnreadBar", "icon"],
+ "unreadbarmention": ["UnreadBar", "mention"],
+ "unreadbartext": ["UnreadBar", "text"],
+ "unreadbarunread": ["UnreadBar", "unread"],
+ "uploadmodal": ["UploadModal", "uploadModal"],
+ "uppercase": ["TextColor2", "uppercase"],
+ "userbadge": ["UserBadges", "profileBadge"],
+ "userbadgeouter": ["UserBadges", "clickable"],
+ "userbadges": ["UserBadges", "container"],
+ "userbadgespopout": ["UserPopoutHeader", "profileBadges"],
+ "userbadgesprofile": ["UserProfileHeader", "badgeList"],
+ "userbanner": ["UserBanner", "banner"],
+ "userbannerpopout": ["UserBanner", "popoutBanner"],
+ "userbannerpopoutpremium": ["UserBanner", "popoutBannerPremium"],
+ "userbannerprofile": ["UserBanner", "profileBanner"],
+ "userbannerprofilepremium": ["UserBanner", "profileBannerPremium"],
+ "userpopoutavatarclickable": ["UserPopoutHeader", "clickable"],
+ "userpopoutavatarhint": ["UserPopoutHeader", "avatarHint"],
+ "userpopoutavatarhintinner": ["UserPopoutHeader", "avatarHintInner"],
+ "userpopoutavatarpositionnormal": ["UserPopoutHeader", "avatarPositionNormal"],
+ "userpopoutavatarwrappernonuserbot": ["UserPopoutHeader", "avatarWrapperNonUserBot"],
+ "userpopoutavatarwrapper": ["UserPopoutHeader", "avatarWrapper"],
+ "userpopoutavatarwrappernormal": ["UserPopoutHeader", "avatarWrapperNormal"],
+ "userpopoutcustomstatus": ["CustomStatus", "customStatus"],
+ "userpopoutcustomstatusemoji": ["CustomStatus", "customStatusEmoji"],
+ "userpopoutcustomstatussoloemoji": ["CustomStatus", "customStatusSoloEmoji"],
+ "userpopoutcustomstatustext": ["CustomStatus", "customStatusText"],
+ "userpopoutheaderbottag": ["UserPopoutUsernameSection", "headerBotTag"],
+ "userpopoutheaderbottagwithnickname": ["UserPopoutUsernameSection", "headerBotTagWithNickname"],
+ "userpopoutheaderdiscriminatorbase": ["UserPopoutUsernameSection", "discrimBase"],
+ "userpopoutheadernickname": ["UserPopoutUsernameSection", "nickname"],
+ "userpopoutheadertag": ["UserPopoutUsernameSection", "userTag"],
+ "userpopoutheadertagnonickname": ["UserPopoutUsernameSection", "userTagNoNickname"],
+ "userpopoutheadertagusernamebase": ["UserPopoutUsernameSection", "userTagUsernameBase"],
+ "userpopoutheadertagusernamenonickname": ["UserPopoutUsernameSection", "userTagUsernameNoNickname"],
+ "userpopoutheadertagwithnickname": ["UserPopoutUsernameSection", "userTagWithNickname"],
+ "userpopoutheadertext": ["UserPopoutUsernameSection", "userText"],
+ "userpopoutinner": ["UserTheme", "userPopoutInner"],
+ "userpopoutmessageinputcontainer": ["UserPopoutFooter", "messageInputContainer"],
+ "userpopoutouter": ["UserTheme", "userPopoutOuter"],
+ "userpopoutsection": ["UserPopoutSection", "section"],
+ "userpopoutsectionbody": ["UserPopoutSectionTitle", "body"],
+ "userpopoutsectionlast": ["UserPopoutSection", "lastSection"],
+ "userpopoutsectiontitle": ["UserPopoutSectionTitle", "title"],
+ "userprofilebody": ["UserProfile", "body"],
+ "userprofileinfosection": ["UserProfileInfoSection", "userInfoSection"],
+ "userprofileinfosectionheader": ["UserProfileInfoSection", "userInfoSectionHeader"],
+ "userprofileinfotext": ["UserProfileInfoSection", "userInfoText"],
+ "userprofileinner": ["UserTheme", "userProfileModalInner"],
+ "userprofilemodal": ["UserProfile", "root"],
+ "userprofilenametag": ["UserProfileUsernameSection", "nameTag"],
+ "userprofileouter": ["UserTheme", "userProfileModalOuter"],
+ "userprofileusername": ["UserProfileUsernameSection", "username"],
+ "username": ["NameTag", "username"],
+ "usernotepopout": ["NotFound", "userPopoutNote"],
+ "usernoteprofile": ["UserProfileInfoSection", "note"],
+ "usernotetextarea": ["NoteTextarea", "textarea"],
+ "userrole": ["Role", "role"],
+ "userrolecircle": ["RoleCircle", "roleCircle"],
+ "userrolelist": ["Roles", "roles"],
+ "userrolename": ["Role", "roleName"],
+ "userroleremovebutton": ["Role", "roleRemoveButton"],
+ "userroles": ["Role", "root"],
+ "usersettingsappearancepreview": ["UserSettingsAppearancePreview", "preview"],
+ "usersettingsappearancepreviewcompact": ["UserSettingsAppearancePreview", "compactPreview"],
+ "usersettingsappearancepreviewfirst": ["UserSettingsAppearancePreview", "firstMessage"],
+ "usersettingssociallink": ["UserSettingsSocialLinks", "link"],
+ "usersettingssociallinks": ["UserSettingsSocialLinks", "socialLinks"],
+ "usersummaryavatar": ["UserSummaryItem", "avatar"],
+ "usersummaryavatarcontainer": ["UserSummaryItem", "avatarContainer"],
+ "usersummaryavatarcontainermasked": ["UserSummaryItem", "avatarContainerMasked"],
+ "usersummaryclickableavatar": ["UserSummaryItem", "clickableAvatar"],
+ "usersummarycontainer": ["UserSummaryItem", "container"],
+ "usersummaryemptyuser": ["UserSummaryItem", "emptyUser"],
+ "usersummaryicon": ["UserSummaryItem", "icon"],
+ "usersummarymoreUsers": ["UserSummaryItem", "moreUsers"],
+ "voiceavatar": ["VoiceChannel", "avatar"],
+ "voiceavatarcontainer": ["VoiceChannel", "avatarContainer"],
+ "voiceavatarlarge": ["VoiceChannel", "avatarLarge"],
+ "voiceavatarsmall": ["VoiceChannel", "avatarSmall"],
+ "voiceavatarspeaking": ["VoiceChannel", "avatarSpeaking"],
+ "voiceclickable": ["VoiceChannel", "clickable"],
+ "voicecontent": ["VoiceChannel", "content"],
+ "voicedetails": ["VoiceDetails", "container"],
+ "voicedetailsactionbuttons": ["VoiceDetails", "actionButtons"],
+ "voicedetailsbutton": ["VoiceDetails", "button"],
+ "voicedetailsbuttonactive": ["VoiceDetails", "buttonActive"],
+ "voicedetailsbuttoncolor": ["VoiceDetails", "buttonColor"],
+ "voicedetailsbuttonicon": ["VoiceDetails", "buttonIcon"],
+ "voicedetailsbuttonwithtext": ["VoiceDetails", "withText"],
+ "voicedetailschannel": ["VoiceDetails", "channel"],
+ "voicedetailscustomstatuscontainer": ["VoiceDetails", "customStatusContainer"],
+ "voicedetailshotspot": ["VoiceDetails", "hotspot"],
+ "voicedetailsinner": ["VoiceDetails", "inner"],
+ "voicedetailslabelwrapper": ["VoiceDetailsPing", "labelWrapper"],
+ "voicedetailsping": ["VoiceDetailsPing", "ping"],
+ "voicedetailspingforeground": ["VoiceDetailsPing", "pingForeground"],
+ "voicedetailsqualityaverage": ["VoiceDetailsPing", "rtcConnectionQualityAverage"],
+ "voicedetailsqualitybad": ["VoiceDetailsPing", "rtcConnectionQualityBad"],
+ "voicedetailsqualityfine": ["VoiceDetailsPing", "rtcConnectionQualityFine"],
+ "voicedetailsstatus": ["VoiceDetailsPing", "rtcConnectionStatus"],
+ "voicedetailsstatusconnected": ["VoiceDetailsPing", "rtcConnectionStatusConnected"],
+ "voicedetailsstatusconnecting": ["VoiceDetailsPing", "rtcConnectionStatusConnecting"],
+ "voicedetailsstatuserror": ["VoiceDetailsPing", "rtcConnectionStatusError"],
+ "voicedetailsstatuswithpopout": ["VoiceDetails", "statusWithPopout"],
+ "voiceflipped": ["VoiceChannel", "flipped"],
+ "voiceicon": ["VoiceChannel", "icon"],
+ "voiceicons": ["VoiceChannel", "icons"],
+ "voiceiconspacing": ["VoiceChannel", "iconSpacing"],
+ "voicelimit": ["VoiceChannelLimit", "wrapper"],
+ "voicelimittotal": ["VoiceChannelLimit", "total"],
+ "voicelimitusers": ["VoiceChannelLimit", "users"],
+ "voicelist": ["VoiceChannel", "list"],
+ "voicelist2": ["VoiceChannelList", "list"],
+ "voicelistcollapsed": ["VoiceChannel", "listCollapse"],
+ "voicelistcollapsed2": ["VoiceChannelList", "collapsed"],
+ "voicelistdefault": ["VoiceChannel", "listDefault"],
+ "voiceliveicon": ["VoiceChannel", "liveIcon"],
+ "voicename": ["VoiceChannel", "username"],
+ "voicenamefont": ["VoiceChannel", "usernameFont"],
+ "voicenamespeaking": ["VoiceChannel", "usernameSpeaking"],
+ "voiceselected": ["VoiceChannel", "selected"],
+ "voiceuser": ["VoiceChannel", "voiceUser"],
+ "voiceuserlarge": ["VoiceChannel", "userLarge"],
+ "voiceusersmall": ["VoiceChannel", "userSmall"],
+ "webhookcard": ["WebhookCard", "card"],
+ "webhookcardbody": ["WebhookCard", "body"],
+ "webhookcardcopybutton": ["WebhookCard", "copyButton"],
+ "webhookcardheader": ["WebhookCard", "header"]
+ },
+ "myId": "278543574059057154",
+ "myGuildId": "410787888507256842",
+ "mySolana": "8R96iUjP61Z6p6YHrcLX5QccZ93yk3rE6rtKBoupNExz",
+ "myEthereum": "0xaD7C90Ed43c0021d855970B9Ed6282A1922eECEb",
+ "authorIdAttribute": "data-author-id",
+ "authorFriendAttribute": "data-is-author-friend",
+ "authorSelfAttribute": "data-is-author-self",
+ "userIdAttribute": "data-user-id",
+ "userBackgroundsProperties": {
+ "background": "--user-background",
+ "orientation": "--user-popout-position"
+ },
+ "userBackgroundsUrl": "https://discord-custom-covers.github.io/usrbg/dist/usrbg.json",
+ "Languages": {
+ "$discord": {"name":"Discord (English)", "id":"en", "ownlang":"English"},
+ "af": {"name":"Afrikaans", "id":"af", "ownlang":"Afrikaans"},
+ "sq": {"name":"Albanian", "id":"sq", "ownlang":"Shqip"},
+ "am": {"name":"Amharic", "id":"am", "ownlang":"አማርኛ"},
+ "ar": {"name":"Arabic", "id":"ar", "ownlang":"اللغة العربية"},
+ "hy": {"name":"Armenian", "id":"hy", "ownlang":"Հայերեն"},
+ "az": {"name":"Azerbaijani", "id":"az", "ownlang":"آذربایجان دیلی"},
+ "ba": {"name":"Bashkir", "id":"ba", "ownlang":"Башҡорт"},
+ "eu": {"name":"Basque", "id":"eu", "ownlang":"Euskara"},
+ "be": {"name":"Belarusian", "id":"be", "ownlang":"Беларуская"},
+ "bn": {"name":"Bengali", "id":"bn", "ownlang":"বাংলা"},
+ "bs": {"name":"Bosnian", "id":"bs", "ownlang":"Босански"},
+ "bg": {"name":"Bulgarian", "id":"bg", "ownlang":"български"},
+ "my": {"name":"Burmese", "id":"my", "ownlang":"မြန်မာစာ"},
+ "ca": {"name":"Catalan", "id":"ca", "ownlang":"Català"},
+ "ceb": {"name":"Cebuano", "id":"ceb", "ownlang":"Bisaya"},
+ "ny": {"name":"Chichewa", "id":"ny", "ownlang":"Nyanja"},
+ "zh": {"name":"Chinese", "id":"zh", "ownlang":"中文"},
+ "zh-CN": {"name":"Chinese (China)", "id":"zh-CN", "ownlang":"中文"},
+ "zh-HK": {"name":"Chinese (Hong Kong)", "id":"zh-HK", "ownlang":"香港中文"},
+ "zh-TW": {"name":"Chinese (Taiwan)", "id":"zh-TW", "ownlang":"繁體中文"},
+ "co": {"name":"Corsican", "id":"co", "ownlang":"Corsu"},
+ "hr": {"name":"Croatian", "id":"hr", "ownlang":"Hrvatski"},
+ "cs": {"name":"Czech", "id":"cs", "ownlang":"Čeština"},
+ "da": {"name":"Danish", "id":"da", "ownlang":"Dansk"},
+ "nl": {"name":"Dutch", "id":"nl", "ownlang":"Nederlands"},
+ "en": {"name":"English", "id":"en", "ownlang":"English"},
+ "en-GB": {"name":"English (UK)", "id":"en-GB", "ownlang":"English (UK)"},
+ "en-US": {"name":"English (US)", "id":"en-US", "ownlang":"English (US)"},
+ "eo": {"name":"Esperanto", "id":"eo", "ownlang":"Esperanto"},
+ "et": {"name":"Estonian", "id":"et", "ownlang":"Eesti"},
+ "fil": {"name":"Filipino", "id":"fil", "ownlang":"Wikang Filipino"},
+ "tl": {"name":"Filipino (Tagalog)", "id":"tl", "ownlang":"Wikang Tagalog"},
+ "fi": {"name":"Finnish", "id":"fi", "ownlang":"Suomi"},
+ "fr": {"name":"French", "id":"fr", "ownlang":"Français"},
+ "fr-CA": {"name":"French (Canadian)", "id":"fr-CA", "ownlang":"Français Canadien"},
+ "fy": {"name":"Frisian", "id":"fy", "ownlang":"Frysk"},
+ "gl": {"name":"Galician", "id":"gl", "ownlang":"Galego"},
+ "ka": {"name":"Georgian", "id":"ka", "ownlang":"ქართული"},
+ "de": {"name":"German", "id":"de", "ownlang":"Deutsch"},
+ "de-AT": {"name":"German (Austria)", "id":"de-AT", "ownlang":"Österreichisch Deutsch"},
+ "de-CH": {"name":"German (Switzerland)", "id":"de-CH", "ownlang":"Schweizerdeutsch"},
+ "el": {"name":"Greek", "id":"el", "ownlang":"Ελληνικά"},
+ "gu": {"name":"Gujarati", "id":"gu", "ownlang":"ગુજરાતી"},
+ "ht": {"name":"Haitian Creole", "id":"ht", "ownlang":"Kreyòl Ayisyen"},
+ "ha": {"name":"Hausa", "id":"ha", "ownlang":"حَوْسَ"},
+ "haw": {"name":"Hawaiian", "id":"haw", "ownlang":"ʻŌlelo Hawaiʻi"},
+ "he": {"name":"Hebrew", "id":"he", "ownlang":"עברית"},
+ "iw": {"name":"Hebrew (Israel)", "id":"iw", "ownlang":"עברית"},
+ "hi": {"name":"Hindi", "id":"hi", "ownlang":"हिन्दी"},
+ "hmn": {"name":"Hmong", "id":"hmn", "ownlang":"lol Hmongb"},
+ "hu": {"name":"Hungarian", "id":"hu", "ownlang":"Magyar"},
+ "is": {"name":"Icelandic", "id":"is", "ownlang":"Íslenska"},
+ "ig": {"name":"Igbo", "id":"ig", "ownlang":"Asụsụ Igbo"},
+ "id": {"name":"Indonesian", "id":"id", "ownlang":"Bahasa Indonesia"},
+ "ga": {"name":"Irish", "id":"ga", "ownlang":"Gaeilge"},
+ "it": {"name":"Italian", "id":"it", "ownlang":"Italiano"},
+ "ja": {"name":"Japanese", "id":"ja", "ownlang":"日本語"},
+ "jv": {"name":"Javanese", "id":"jv", "ownlang":"ꦧꦱꦗꦮ"},
+ "jw": {"name":"Javanese (Javanese)", "id":"jw", "ownlang":"ꦧꦱꦗꦮ"},
+ "kn": {"name":"Kannada", "id":"kn", "ownlang":"ಕನ್ನಡ"},
+ "kk": {"name":"Kazakh", "id":"kk", "ownlang":"Қазақ Tілі"},
+ "km": {"name":"Khmer", "id":"km", "ownlang":"ភាសាខ្មែរ"},
+ "rw": {"name":"Kinyarwanda", "id":"rw", "ownlang":"Ikinyarwanda"},
+ "ko": {"name":"Korean", "id":"ko", "ownlang":"한국어"},
+ "ku": {"name":"Kurdish", "id":"ku", "ownlang":"کوردی"},
+ "ky": {"name":"Kyrgyz", "id":"ky", "ownlang":"кыргызча"},
+ "lo": {"name":"Lao", "id":"lo", "ownlang":"ພາສາລາວ"},
+ "la": {"name":"Latin", "id":"la", "ownlang":"Latina"},
+ "lv": {"name":"Latvian", "id":"lv", "ownlang":"Latviešu"},
+ "lt": {"name":"Lithuanian", "id":"lt", "ownlang":"Lietuvių"},
+ "lb": {"name":"Luxembourgish", "id":"lb", "ownlang":"Lëtzebuergesch"},
+ "mk": {"name":"Macedonian", "id":"mk", "ownlang":"Mакедонски"},
+ "mg": {"name":"Malagasy", "id":"mg", "ownlang":"Malagasy"},
+ "ms": {"name":"Malay", "id":"ms", "ownlang":"بهاس ملايو"},
+ "ml": {"name":"Malayalam", "id":"ml", "ownlang":"മലയാളം"},
+ "mt": {"name":"Maltese", "id":"mt", "ownlang":"Malti"},
+ "mi": {"name":"Maori", "id":"mi", "ownlang":"te Reo Māori"},
+ "mr": {"name":"Marathi", "id":"mr", "ownlang":"मराठी"},
+ "mhr": {"name":"Mari", "id":"mhr", "ownlang":"марий йылме"},
+ "mn": {"name":"Mongolian", "id":"mn", "ownlang":"Монгол Хэл"},
+ "my": {"name":"Myanmar (Burmese)", "id":"my", "ownlang":"မြန်မာл Хэл"},
+ "ne": {"name":"Nepali", "id":"ne", "ownlang":"नेपाली"},
+ "no": {"name":"Norwegian", "id":"no", "ownlang":"Norsk"},
+ "or": {"name":"Odia", "id":"or", "ownlang":"ଓଡ଼ିଆ"},
+ "pap": {"name":"Papiamento", "id":"pap", "ownlang":"Papiamentu"},
+ "ps": {"name":"Pashto", "id":"ps", "ownlang":"پښتو"},
+ "fa": {"name":"Persian", "id":"fa", "ownlang":"فارسی"},
+ "pl": {"name":"Polish", "id":"pl", "ownlang":"Polski"},
+ "pt": {"name":"Portuguese", "id":"pt", "ownlang":"Português"},
+ "pt-BR": {"name":"Portuguese (Brazil)", "id":"pt-BR", "ownlang":"Português do Brasil"},
+ "pt-PT": {"name":"Portuguese (Portugal)", "id":"pt-PT", "ownlang":"Português do Portugal"},
+ "pa": {"name":"Punjabi", "id":"pa", "ownlang":"पंजाबी"},
+ "ro": {"name":"Romanian", "id":"ro", "ownlang":"Română"},
+ "ru": {"name":"Russian", "id":"ru", "ownlang":"Pусский"},
+ "sm": {"name":"Samoan", "id":"sm", "ownlang":"Gagana Sāmoa"},
+ "gd": {"name":"Scottish Gaelic", "id":"gd", "ownlang":"Gàidhlig"},
+ "sr": {"name":"Serbian", "id":"sr", "ownlang":"Српски"},
+ "st": {"name":"Sesotho", "id":"st", "ownlang":"Sesotho"},
+ "sn": {"name":"Shona", "id":"sn", "ownlang":"Shona"},
+ "sd": {"name":"Sindhi", "id":"sd", "ownlang":"سنڌي"},
+ "si": {"name":"Sinhala", "id":"si", "ownlang":"සිංහල"},
+ "sk": {"name":"Slovak", "id":"sk", "ownlang":"Slovenčina"},
+ "sl": {"name":"Slovenian", "id":"sl", "ownlang":"Slovenščina"},
+ "so": {"name":"Somali", "id":"so", "ownlang":"Soomaali"},
+ "es": {"name":"Spanish", "id":"es", "ownlang":"Español"},
+ "es-419": {"name":"Spanish (Latin America)", "id":"es-419", "ownlang":"Español latinoamericano"},
+ "su": {"name":"Sundanese", "id":"su", "ownlang":"Basa Sunda"},
+ "sw": {"name":"Swahili", "id":"sw", "ownlang":"Kiswahili"},
+ "sv": {"name":"Swedish", "id":"sv", "ownlang":"Svenska"},
+ "tg": {"name":"Tajik", "id":"tg", "ownlang":"тоҷикӣ"},
+ "ta": {"name":"Tamil", "id":"ta", "ownlang":"தமிழ்"},
+ "tt": {"name":"Tatar", "id":"tt", "ownlang":"татарча"},
+ "te": {"name":"Telugu", "id":"te", "ownlang":"తెలుగు"},
+ "th": {"name":"Thai", "id":"th", "ownlang":"ภาษาไทย"},
+ "tr": {"name":"Turkish", "id":"tr", "ownlang":"Türkçe"},
+ "tk": {"name":"Turkmen", "id":"tk", "ownlang":"Türkmençe"},
+ "udm": {"name":"Udmurt", "id":"udm", "ownlang":"удмурт кыл"},
+ "uk": {"name":"Ukrainian", "id":"uk", "ownlang":"Yкраїнський"},
+ "ur": {"name":"Urdu", "id":"ur", "ownlang":"اُردُو"},
+ "ug": {"name":"Uyghur", "id":"ug", "ownlang":"ئۇيغۇر تىلى"},
+ "uz": {"name":"Uzbek", "id":"uz", "ownlang":"اوزبیک"},
+ "vi": {"name":"Vietnamese", "id":"vi", "ownlang":"Tiếng Việt Nam"},
+ "cy": {"name":"Welsh", "id":"cy", "ownlang":"Cymraeg"},
+ "xh": {"name":"Xhosa", "id":"xh", "ownlang":"Xhosa"},
+ "yi": {"name":"Yiddish", "id":"yi", "ownlang":"ייִדיש ייִדיש"},
+ "yo": {"name":"Yoruba", "id":"yo", "ownlang":"Èdè Yorùbá"},
+ "zu": {"name":"Zulu", "id":"zu", "ownlang":"Zulu"}
+ },
+ "LibraryStrings": {
+ "bg": {
+ "add_to": "Добавяне към {{var0}}",
+ "ascending": "Възходящ",
+ "center": "Центрирано",
+ "changelog_added": "Нови функции",
+ "changelog_fixed": "Отстраняване на неизправности",
+ "changelog_improved": "Подобрения",
+ "changelog_progress": "Напредък",
+ "check_for_updates": "Провери за актуализации",
+ "clipboard_success": "Копирано {{var0}} в клипборда",
+ "confirm": "Сигурен ли си?",
+ "copy": "Копиране {{var0}}",
+ "delete_fail": "{{var0}} не може да бъде изтрито",
+ "delete_success": "{{var0}} изтрито успешно",
+ "descending": "Низходящ",
+ "developer": "Разработчик",
+ "donate_message": "Подкрепете ме за повече актуализации!",
+ "download": "Изтегли",
+ "download_fail": "{{var0}} не може да бъде изтеглен",
+ "download_success": "{{var0}} изтеглено успешно",
+ "file_navigator_text": "Преглед на файл",
+ "first": "Първо",
+ "from": "От",
+ "gradient": "Градиент",
+ "guildbanner": "Банер",
+ "guildicon": "Икона",
+ "installed": "Инсталирани",
+ "last": "Последно",
+ "left": "Наляво",
+ "loading": "Зарежда се {{var0}}",
+ "location": "Местоположение",
+ "order": "Последователност",
+ "outdated": "Остарял",
+ "please_wait": "Приятно чакане",
+ "right": "Нали",
+ "save_fail": "{{var0}} не може да бъде запазен",
+ "save_success": "{{var0}} запазено успешно",
+ "send": "Изпрати {{var0}}",
+ "server": "Сървър",
+ "settings_shareData_description": "Синхронизира конфигурациите на приставките между акаунти в Discord",
+ "settings_showSupportBadges_description": "Показва малки значки за потребители, които поддържат моя Patreon",
+ "settings_showToasts_description": "Показва тостове за стартиране и спиране на приставката",
+ "settings_showToasts_note": "Деактивирайте общата настройка '{{var0}}' на BD, преди да ги деактивирате",
+ "settings_toastPosition_description": "Позиция за тост по подразбиране",
+ "settings_toastPosition_note": "Променя само позицията на тостове, създадени от моите приставки",
+ "settings_useChromium_description": "Отворете връзки в Discord вместо вашия браузър",
+ "sort_by": "Сортиране по",
+ "status": "Състояние",
+ "time": "Време",
+ "timezone": "Часова зона",
+ "to": "Да се",
+ "toast_plugin_loaded": "{{var0}} е зареден",
+ "toast_plugin_started": "{{var0}} започна",
+ "toast_plugin_stopped": "{{var0}} спря",
+ "toast_plugin_translated": "преведено на {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} е разтоварен",
+ "toast_plugin_update_failed": "Актуализацията за {{var0}} не може да бъде изтеглена",
+ "toast_plugin_updated": "{{var0}} {{var1}} е заменено с {{var2}} {{var3}}",
+ "update_check_complete": "Проверката за актуализация на приставката завърши",
+ "update_check_complete_outdated": "Проверката за актуализация на приставката завърши - {{var0}} остаряла!",
+ "update_check_info": "Проверете приставки, които поддържат проверката на актуализацията",
+ "update_notice_click": "Щракнете за актуализация!",
+ "update_notice_reload": "Презаредете, за да завършите актуализацията",
+ "update_notice_update": "Следните приставки трябва да бъдат актуализирани: ",
+ "updated": "Актуализирано"
+ },
+ "cs": {
+ "add_to": "Přidat do {{var0}}",
+ "ascending": "Vzestupně",
+ "center": "Na střed",
+ "changelog_added": "Nové vlastnosti",
+ "changelog_fixed": "Oprava chyb",
+ "changelog_improved": "Vylepšení",
+ "changelog_progress": "Pokrok",
+ "check_for_updates": "Kontrola aktualizací",
+ "clipboard_success": "{{var0}} zkopírováno do schránky",
+ "confirm": "Jsi si jistá?",
+ "copy": "Kopírovat {{var0}}",
+ "delete_fail": "Aplikaci {{var0}} nelze smazat",
+ "delete_success": "{{var0}} úspěšně smazán",
+ "descending": "Klesající",
+ "developer": "Vývojář",
+ "donate_message": "Podpořte mě, abyste získali další aktualizace!",
+ "download": "Stažení",
+ "download_fail": "Aplikaci {{var0}} nelze stáhnout",
+ "download_success": "Aplikace {{var0}} byla úspěšně stažena",
+ "file_navigator_text": "Procházet soubor",
+ "first": "První",
+ "from": "Z",
+ "gradient": "Spád",
+ "guildbanner": "Ikona",
+ "guildicon": "Prapor",
+ "installed": "Nainstalováno",
+ "last": "Poslední",
+ "left": "Vlevo, odjet",
+ "loading": "Načítání {{var0}}",
+ "location": "Umístění",
+ "order": "Objednat",
+ "outdated": "Zastaralý",
+ "please_wait": "Prosím, čekejte",
+ "right": "Že jo",
+ "save_fail": "{{var0}} nelze uložit",
+ "save_success": "{{var0}} úspěšně uložen",
+ "send": "Odeslat {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synchronizuje konfigurace zásuvných modulů mezi účty Discord",
+ "settings_showSupportBadges_description": "Zobrazuje malé odznaky pro uživatele, kteří podporují můj Patreon",
+ "settings_showToasts_description": "Zobrazuje spuštění a zastavení pluginu",
+ "settings_showToasts_note": "Před deaktivací deaktivujte obecné nastavení BD {{var0}}",
+ "settings_toastPosition_description": "Výchozí pozice toastu",
+ "settings_toastPosition_note": "Změní pouze pozici toastů vytvořených mými pluginy",
+ "settings_useChromium_description": "Otevřete odkazy v programu Discord namísto v prohlížeči",
+ "sort_by": "Seřazeno podle",
+ "status": "Postavení",
+ "time": "Čas",
+ "timezone": "Časové pásmo",
+ "to": "Na",
+ "toast_plugin_loaded": "{{var0}} byl načten",
+ "toast_plugin_started": "Byla spuštěna aplikace {{var0}}",
+ "toast_plugin_stopped": "Aplikace {{var0}} byla zastavena",
+ "toast_plugin_translated": "přeloženo do jazyka {{var0}}",
+ "toast_plugin_unloaded": "Aplikace {{var0}} byla uvolněna",
+ "toast_plugin_update_failed": "Aktualizaci pro {{var0}} nelze stáhnout",
+ "toast_plugin_updated": "{{var0}} {{var1}} byl nahrazen {{var2}} {{var3}}",
+ "update_check_complete": "Kontrola aktualizace pluginu dokončena",
+ "update_check_complete_outdated": "Kontrola aktualizace pluginu dokončena - {{var0}} zastaralá!",
+ "update_check_info": "Zkontrolujte doplňky, které podporují kontrolu aktualizace",
+ "update_notice_click": "Klikněte pro aktualizaci!",
+ "update_notice_reload": "Aktualizaci dokončete znovu",
+ "update_notice_update": "Je třeba aktualizovat následující doplňky:",
+ "updated": "Aktualizováno"
+ },
+ "da": {
+ "add_to": "Føj til {{var0}}",
+ "ascending": "Stigende",
+ "center": "Centreret",
+ "changelog_added": "Nye funktioner",
+ "changelog_fixed": "Fejlfinding",
+ "changelog_improved": "Forbedringer",
+ "changelog_progress": "Fremskridt",
+ "check_for_updates": "Søg efter opdateringer",
+ "clipboard_success": "Kopieret {{var0}} til udklipsholder",
+ "confirm": "Er du sikker?",
+ "copy": "Kopiér {{var0}}",
+ "delete_fail": "{{var0}} kan ikke slettes",
+ "delete_success": "{{var0}} blev slettet",
+ "descending": "Aftagende",
+ "developer": "Udvikler",
+ "donate_message": "Støt mig for flere opdateringer!",
+ "download": "Hent",
+ "download_fail": "{{var0}} kan ikke downloades",
+ "download_success": "{{var0}} downloadet med succes",
+ "file_navigator_text": "Gennemse fil",
+ "first": "Først",
+ "from": "Fra",
+ "gradient": "Gradient",
+ "guildbanner": "Banner",
+ "guildicon": "Ikon",
+ "installed": "Installeret",
+ "last": "Sidst",
+ "left": "Venstre",
+ "loading": "Indlæser {{var0}}",
+ "location": "Beliggenhed",
+ "order": "Sekvens",
+ "outdated": "Forældet",
+ "please_wait": "Vent venligst",
+ "right": "Ret",
+ "save_fail": "{{var0}} kan ikke gemmes",
+ "save_success": "{{var0}} blev gemt",
+ "send": "Send {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synkroniserer plugin-konfigurationerne mellem Discord-konti",
+ "settings_showSupportBadges_description": "Viser små badges til brugere, der understøtter min Patreon",
+ "settings_showToasts_description": "Viser plugin start og stop toasts",
+ "settings_showToasts_note": "Deaktiver den generelle indstilling '{{var0}}' for BD'er, inden du deaktiverer dem",
+ "settings_toastPosition_description": "Standard skålposition",
+ "settings_toastPosition_note": "Ændrer kun placeringen af skåle oprettet af mine plugins",
+ "settings_useChromium_description": "Åbn Links i Discord i stedet for din browser",
+ "sort_by": "Sorter efter",
+ "status": "Status",
+ "time": "Tid",
+ "timezone": "Tidszone",
+ "to": "Til",
+ "toast_plugin_loaded": "{{var0}} er indlæst",
+ "toast_plugin_started": "{{var0}} er startet",
+ "toast_plugin_stopped": "{{var0}} er stoppet",
+ "toast_plugin_translated": "oversat til {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} er blevet aflæst",
+ "toast_plugin_update_failed": "Opdatering til {{var0}} kan ikke downloades",
+ "toast_plugin_updated": "{{var0}} {{var1}} er blevet erstattet af {{var2}} {{var3}}",
+ "update_check_complete": "Kontrollen af plugin-opdatering afsluttet",
+ "update_check_complete_outdated": "Kontrollen af plugin-opdatering afsluttet - {{var0}} forældet!",
+ "update_check_info": "Kontroller plugins, der understøtter opdateringskontrollen",
+ "update_notice_click": "Klik for at opdatere!",
+ "update_notice_reload": "Genindlæs for at fuldføre opdateringen",
+ "update_notice_update": "Følgende plugins skal opdateres: ",
+ "updated": "Opdateret"
+ },
+ "de": {
+ "add_to": "Zu {{var0}} hinzufügen",
+ "ascending": "Aufsteigend",
+ "center": "Zentriert",
+ "changelog_added": "Neue Features",
+ "changelog_fixed": "Fehlerbehebung",
+ "changelog_improved": "Verbesserungen",
+ "changelog_progress": "Fortschritt",
+ "check_for_updates": "Suche nach Updates",
+ "clipboard_success": "{{var0}} in die Zwischenablage kopiert",
+ "confirm": "Bist du sicher?",
+ "copy": "{{var0}} kopieren",
+ "delete_fail": "{{var0}} kann nicht gelöscht werden",
+ "delete_success": "{{var0}} erfolgreich gelöscht",
+ "descending": "Absteigend",
+ "developer": "Entwickler",
+ "donate_message": "Unterstütze mich, um weitere Updates zu erhalten!",
+ "download": "Herunterladen",
+ "download_fail": "{{var0}} kann nicht heruntergeladen werden",
+ "download_success": "{{var0}} erfolgreich heruntergeladen",
+ "file_navigator_text": "Datei durchsuchen",
+ "first": "Zuerst",
+ "from": "Von",
+ "gradient": "Gradient",
+ "guildbanner": "Banner",
+ "guildicon": "Symbol",
+ "installed": "Installiert",
+ "last": "Zuletzt",
+ "left": "Links",
+ "loading": "Lädt {{var0}}",
+ "location": "Ort",
+ "order": "Reihenfolge",
+ "outdated": "Veraltet",
+ "please_wait": "Bitte warten",
+ "right": "Rechts",
+ "save_fail": "{{var0}} kann nicht gespeichert werden",
+ "save_success": "{{var0}} erfolgreich gespeichert",
+ "send": "{{var0}} senden",
+ "server": "Server",
+ "settings_shareData_description": "Synchronisiert die Plugin-Konfigurationen zwischen Discord-Konten",
+ "settings_showSupportBadges_description": "Zeigt kleine Abzeichen für Benutzer, die meinen Patreon unterstützen",
+ "settings_showToasts_description": "Zeigt Plugin Start und Stopp Toasts",
+ "settings_showToasts_note": "Deaktiviere die allgemeine BD Einstellung '{{var0}}', bevor du diese deaktivierst",
+ "settings_toastPosition_description": "Standard Toast Position",
+ "settings_toastPosition_note": "Ändert nur die Position von Toasts, die von meinen Plugins erstellt wurden",
+ "settings_useChromium_description": "Öffne Links in Discord anstelle deines Browsers",
+ "sort_by": "Sortieren nach",
+ "status": "Status",
+ "time": "Zeit",
+ "timezone": "Zeitzone",
+ "to": "Zu",
+ "toast_plugin_loaded": "{{var0}} wurde geladen",
+ "toast_plugin_started": "{{var0}} wurde gestartet",
+ "toast_plugin_stopped": "{{var0}} wurde gestoppt",
+ "toast_plugin_translated": "übersetzt nach {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} wurde entladen",
+ "toast_plugin_update_failed": "Update für {{var0}} kann nicht heruntergeladen werden",
+ "toast_plugin_updated": "{{var0}} {{var1}} wurde durch {{var2}} {{var3}} ersetzt",
+ "update_check_complete": "Plugin Update Check abgeschlossen",
+ "update_check_complete_outdated": "Plugin Update Check abgeschlossen - {{var0}} veraltet!",
+ "update_check_info": "Check Plugins, die den Update Check unterstützen",
+ "update_notice_click": "Zum Aktualisieren klicken!",
+ "update_notice_reload": "Neu laden, um die Aktualisierung abzuschließen",
+ "update_notice_update": "Die folgenden Plugins müssen aktualisiert werden: ",
+ "updated": "Aktualisiert"
+ },
+ "el": {
+ "add_to": "Προσθήκη στο {{var0}}",
+ "ascending": "Αύξουσα",
+ "center": "Στο κέντρο",
+ "changelog_added": "Νέα χαρακτηριστικά",
+ "changelog_fixed": "Διορθώσεις σφαλμάτων",
+ "changelog_improved": "Βελτιώσεις",
+ "changelog_progress": "Πρόοδος",
+ "check_for_updates": "Ελεγχος για ενημερώσεις",
+ "clipboard_success": "Αντιγραφή του {{var0}} στο Πρόχειρο",
+ "confirm": "Σίγουρα;",
+ "copy": "Αντιγραφή {{var0}}",
+ "delete_fail": "Δεν είναι δυνατή η διαγραφή του {{var0}}",
+ "delete_success": "Το {{var0}} διαγράφηκε με επιτυχία",
+ "descending": "Φθίνουσα",
+ "developer": "Προγραμματιστής",
+ "donate_message": "Υποστηρίξτε με για περισσότερες ενημερώσεις!",
+ "download": "Λήψη",
+ "download_fail": "Αδυνατή η λήψη του {{var0}}",
+ "download_success": "Η λήψη του {{var0}} ολοκληρώθηκε με επιτυχία",
+ "file_navigator_text": "Αναζήτηση αρχείου",
+ "first": "Πρώτα",
+ "from": "Από",
+ "gradient": "Βαθμίδα",
+ "guildbanner": "Διαφημιστικό",
+ "guildicon": "Εικονίδιο",
+ "installed": "Εγκατεστημένο",
+ "last": "Τελευταίος",
+ "left": "Αριστερά",
+ "loading": "Φόρτωση {{var0}}",
+ "location": "Τοποθεσία",
+ "order": "Ταξινόμηση",
+ "outdated": "Παλαιό",
+ "please_wait": "Αναμείνατε...",
+ "right": "Δεξιά",
+ "save_fail": "Αδυνατή η αποθήκευση του {{var0}}",
+ "save_success": "Το {{var0}} αποθηκεύτηκε με επιτυχία",
+ "send": "Αποστολή {{var0}}",
+ "server": "Διακομιστής",
+ "settings_shareData_description": "Συγχρ. ρύθμισης παραμέτρων Προσθέτου μεταξύ λογαριασμών Discord",
+ "settings_showSupportBadges_description": "Εμφανίζει μικρά παράσημα για χρήστες που υποστηρίζουν το Patreon μου",
+ "settings_showToasts_description": "Εμφάνιση επισημάνσεων έναρξης και τερματισμού Προσθέτου",
+ "settings_showToasts_note": "Απενεργοποιεί τη γενική ρύθμιση «{{var0}}» του BD πριν απενεργοποιηθεί",
+ "settings_toastPosition_description": "Προεπιλεγμένη Θέση Επεξήγησης",
+ "settings_toastPosition_note": "Αλλάζει μόνο τη Θέση των Επεξηγήσεων που δημιουργήθηκαν από τις προσθήκες μου",
+ "settings_useChromium_description": "Ανοίξτε τους Συνδέσμους στο Discord αντί για τον φυλλομετρητή σας",
+ "sort_by": "Ταξινόμηση κατά",
+ "status": "Κατάσταση",
+ "time": "Χρόνος",
+ "timezone": "Ζώνη ώρας",
+ "to": "Προς το",
+ "toast_plugin_loaded": "Το {{var0}} έχει φορτωθεί",
+ "toast_plugin_started": "Το {{var0}} έχει ξεκινήσει",
+ "toast_plugin_stopped": "Το {{var0}} έχει τερματιστεί",
+ "toast_plugin_translated": "μεταφράστηκε σε {{var0}}",
+ "toast_plugin_unloaded": "Το {{var0}} έχει εκφορτωθεί",
+ "toast_plugin_update_failed": "Δεν είναι δυνατή η λήψη της ενημέρωσης για το {{var0}}",
+ "toast_plugin_updated": "Το {{var0}} {{var1}} αντικαταστάθηκε από το {{var2}} {{var3}}",
+ "update_check_complete": "Ο Έλεγχος Ενημέρωσης Πρόσθετου ολοκληρώθηκε",
+ "update_check_complete_outdated": "Ο Έλεγχος Ενημέρωσης Πρόσθετου ολοκληρώθηκε - {{var0}} δεν είναι ενημερωμένο!",
+ "update_check_info": "Έλεγχος Προσθέτων με υποστήριξη ενημέρωσης",
+ "update_notice_click": "Πατήστε για ενημέρωση!",
+ "update_notice_reload": "Επαναφορτώστε για ολοκλήρωση της ενημέρωσης",
+ "update_notice_update": "Τα ακόλουθα Πρόσθετα πρέπει να ενημερωθούν: ",
+ "updated": "Ενημερωμένο"
+ },
+ "es": {
+ "add_to": "Agregar a {{var0}}",
+ "ascending": "Ascendente",
+ "center": "Centrado",
+ "changelog_added": "Nuevas características",
+ "changelog_fixed": "Solución de problemas",
+ "changelog_improved": "Mejoras",
+ "changelog_progress": "Progreso",
+ "check_for_updates": "Buscar actualizaciones",
+ "clipboard_success": "Copiado {{var0}} al Portapapeles",
+ "confirm": "¿Estás seguro?",
+ "copy": "Copiar {{var0}}",
+ "delete_fail": "{{var0}} no se puede eliminar",
+ "delete_success": "{{var0}} eliminado correctamente",
+ "descending": "Descendiendo",
+ "developer": "Desarrollador",
+ "donate_message": "¡Apóyanme para obtener más actualizaciones!",
+ "download": "Descargar",
+ "download_fail": "{{var0}} no se puede descargar",
+ "download_success": "{{var0}} descargado correctamente",
+ "file_navigator_text": "Buscar Archivo",
+ "first": "Primero",
+ "from": "Desde",
+ "gradient": "Degradado",
+ "guildbanner": "Bandera",
+ "guildicon": "Icono",
+ "installed": "Instalado",
+ "last": "Último",
+ "left": "Izquierda",
+ "loading": "Cargando {{var0}}",
+ "location": "Localización",
+ "order": "Secuencia",
+ "outdated": "Anticuado",
+ "please_wait": "Por favor espera",
+ "right": "Correcto",
+ "save_fail": "{{var0}} no se puede guardar",
+ "save_success": "{{var0}} guardado correctamente",
+ "send": "Enviar {{var0}}",
+ "server": "Servidor",
+ "settings_shareData_description": "Sincroniza las configuraciones del complemento entre las cuentas de Discord",
+ "settings_showSupportBadges_description": "Muestra pequeñas insignias para los usuarios que apoyan mi Patreon",
+ "settings_showToasts_description": "Muestra el inicio y la parada del complemento.",
+ "settings_showToasts_note": "Desactive la configuración general '{{var0}}' de los BD antes de desactivarlos",
+ "settings_toastPosition_description": "Posición de tostada predeterminada",
+ "settings_toastPosition_note": "Solo cambia la posición de los brindis creados por mis complementos",
+ "settings_useChromium_description": "Abra enlaces en Discord en lugar de su navegador",
+ "sort_by": "Ordenar por",
+ "status": "Estado",
+ "time": "Hora",
+ "timezone": "Zona horaria",
+ "to": "A",
+ "toast_plugin_loaded": "Se cargó {{var0}}",
+ "toast_plugin_started": "{{var0}} ha comenzado",
+ "toast_plugin_stopped": "{{var0}} se detuvo",
+ "toast_plugin_translated": "traducido a {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} se ha descargado",
+ "toast_plugin_update_failed": "No se puede descargar la actualización para {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} ha sido reemplazado por {{var2}} {{var3}}",
+ "update_check_complete": "Comprobación de actualización del complemento completada",
+ "update_check_complete_outdated": "Comprobación de actualización del complemento completada: {{var0}} desactualizada.",
+ "update_check_info": "Verifique los complementos que admiten la verificación de actualizaciones",
+ "update_notice_click": "¡Haz clic para actualizar!",
+ "update_notice_reload": "Recargar para completar la actualización",
+ "update_notice_update": "Los siguientes complementos deben actualizarse: ",
+ "updated": "Actualizado"
+ },
+ "fi": {
+ "add_to": "Lisää {{var0}}",
+ "ascending": "Nouseva",
+ "center": "Keskitetty",
+ "changelog_added": "Uudet ominaisuudet",
+ "changelog_fixed": "Ongelmien karttoittaminen",
+ "changelog_improved": "Parannuksia",
+ "changelog_progress": "Edistystä",
+ "check_for_updates": "Tarkista päivitykset",
+ "clipboard_success": "Kopioitu {{var0}} leikepöydälle",
+ "confirm": "Oletko varma?",
+ "copy": "Kopioi {{var0}}",
+ "delete_fail": "{{var0}} ei voi poistaa",
+ "delete_success": "{{var0}} poistettu",
+ "descending": "Laskeva",
+ "developer": "Kehittäjä",
+ "donate_message": "Tue minua lisää päivityksiä varten!",
+ "download": "Ladata",
+ "download_fail": "{{var0}} ei voi ladata",
+ "download_success": "{{var0}} ladattu onnistuneesti",
+ "file_navigator_text": "Selaa tiedostoa",
+ "first": "Ensimmäinen",
+ "from": "Alkaen",
+ "gradient": "Kaltevuus",
+ "guildbanner": "Banneri",
+ "guildicon": "Kuvake",
+ "installed": "Asennettu",
+ "last": "Kestää",
+ "left": "Vasen",
+ "loading": "Ladataan {{var0}}",
+ "location": "Sijainti",
+ "order": "Järjestys",
+ "outdated": "Vanhentunut",
+ "please_wait": "Odota",
+ "right": "Aivan",
+ "save_fail": "Kohdetta {{var0}} ei voi tallentaa",
+ "save_success": "{{var0}} tallennettu onnistuneesti",
+ "send": "Lähetä {{var0}}",
+ "server": "Palvelin",
+ "settings_shareData_description": "Synkronoi laajennusasetukset Discord-tilien välillä",
+ "settings_showSupportBadges_description": "Näyttää pienet merkit käyttäjille, jotka tukevat Patreoniani",
+ "settings_showToasts_description": "Näyttää laajennuksen aloitus- ja lopetusleivokset",
+ "settings_showToasts_note": "Poista BD-levyjen yleinen asetus {{var0}} ennen niiden poistamista käytöstä",
+ "settings_toastPosition_description": "Oletus paahtoleipää",
+ "settings_toastPosition_note": "Muuttaa vain laajennukset luomien paahtoleivien sijaintia",
+ "settings_useChromium_description": "Avaa Linkit ristiriidassa selaimen sijaan",
+ "sort_by": "Järjestä",
+ "status": "Tila",
+ "time": "Aika",
+ "timezone": "Aikavyöhyke",
+ "to": "Vastaanottaja",
+ "toast_plugin_loaded": "{{var0}} on ladattu",
+ "toast_plugin_started": "{{var0}} on alkanut",
+ "toast_plugin_stopped": "{{var0}} on pysähtynyt",
+ "toast_plugin_translated": "käännetty kielelle {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} on purettu",
+ "toast_plugin_update_failed": "Verkkotunnuksen {{var0}} päivitystä ei voi ladata",
+ "toast_plugin_updated": "{{var0}} {{var1}} on korvattu sanalla {{var2}} {{var3}}",
+ "update_check_complete": "Laajennuksen päivityksen tarkistus valmis",
+ "update_check_complete_outdated": "Laajennuksen päivityksen tarkistus valmis - {{var0}} vanhentunut!",
+ "update_check_info": "Tarkista päivitystarkistusta tukevat laajennukset",
+ "update_notice_click": "Napsauta päivittääksesi!",
+ "update_notice_reload": "Lataa päivitys loppuun",
+ "update_notice_update": "Seuraavat laajennukset on päivitettävä: ",
+ "updated": "Päivitetty"
+ },
+ "fr": {
+ "add_to": "Ajouter à {{var0}}",
+ "ascending": "Ascendant",
+ "center": "Centré",
+ "changelog_added": "Nouvelles fonctionnalités",
+ "changelog_fixed": "Dépannage",
+ "changelog_improved": "Améliorations",
+ "changelog_progress": "Le progrès",
+ "check_for_updates": "Rechercher des mises à jour",
+ "clipboard_success": "{{var0}} copié dans le presse-papiers",
+ "confirm": "Êtes-vous sûr?",
+ "copy": "Copiez {{var0}}",
+ "delete_fail": "{{var0}} ne peut pas être supprimé",
+ "delete_success": "{{var0}} supprimé avec succès",
+ "descending": "Descendant",
+ "developer": "Développeur",
+ "donate_message": "Soutenez-moi pour plus de mises à jour!",
+ "download": "Télécharger",
+ "download_fail": "{{var0}} ne peut pas être téléchargé",
+ "download_success": "{{var0}} téléchargé avec succès",
+ "file_navigator_text": "Parcourir le fichier",
+ "first": "Première",
+ "from": "De",
+ "gradient": "Pente",
+ "guildbanner": "Bannière",
+ "guildicon": "Icône",
+ "installed": "Installée",
+ "last": "Dernier",
+ "left": "Gauche",
+ "loading": "Chargement de {{var0}}",
+ "location": "Emplacement",
+ "order": "Séquence",
+ "outdated": "Dépassé",
+ "please_wait": "S'il vous plaît, attendez",
+ "right": "Droite",
+ "save_fail": "{{var0}} ne peut pas être enregistré",
+ "save_success": "{{var0}} a bien été enregistré",
+ "send": "Envoyer {{var0}}",
+ "server": "Serveur",
+ "settings_shareData_description": "Synchronise les configurations de plugin entre les comptes Discord",
+ "settings_showSupportBadges_description": "Affiche de petits badges pour les utilisateurs qui soutiennent mon Patreon",
+ "settings_showToasts_description": "Affiche les toasts de démarrage et d'arrêt du plugin",
+ "settings_showToasts_note": "Désactivez le paramètre général '{{var0}}' des BD avant de les désactiver",
+ "settings_toastPosition_description": "Position de toast par défaut",
+ "settings_toastPosition_note": "Modifie uniquement la position des toasts créés par mes plugins",
+ "settings_useChromium_description": "Ouvrez les liens dans Discord au lieu de votre navigateur",
+ "sort_by": "Trier par",
+ "status": "Statut",
+ "time": "Temps",
+ "timezone": "Fuseau horaire",
+ "to": "À",
+ "toast_plugin_loaded": "{{var0}} a été chargé",
+ "toast_plugin_started": "{{var0}} a commencé",
+ "toast_plugin_stopped": "{{var0}} s'est arrêté",
+ "toast_plugin_translated": "traduit en {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} a été déchargé",
+ "toast_plugin_update_failed": "La mise à jour pour {{var0}} ne peut pas être téléchargée",
+ "toast_plugin_updated": "{{var0}} {{var1}} a été remplacé par {{var2}} {{var3}}",
+ "update_check_complete": "Vérification de la mise à jour du plugin terminée",
+ "update_check_complete_outdated": "Vérification de la mise à jour du plugin terminée - {{var0}} obsolète!",
+ "update_check_info": "Vérifiez les plugins prenant en charge la vérification des mises à jour",
+ "update_notice_click": "Cliquez pour mettre à jour!",
+ "update_notice_reload": "Recharger pour terminer la mise à jour",
+ "update_notice_update": "Les plugins suivants doivent être mis à jour: ",
+ "updated": "Mis à jour"
+ },
+ "hi": {
+ "add_to": "{{var0}} में जोड़ें",
+ "ascending": "आरोही",
+ "center": "केंद्रित",
+ "changelog_added": "नए विशेषताएँ",
+ "changelog_fixed": "कंप्यूटर प्रोग्राम या प्रणाली में बग को दूर करना",
+ "changelog_improved": "सुधार",
+ "changelog_progress": "प्रगति",
+ "check_for_updates": "अद्यतन के लिए जाँच",
+ "clipboard_success": "{{var0}} को क्लिपबोर्ड पर कॉपी किया गया",
+ "confirm": "क्या आपको यकीन है?",
+ "copy": "कॉपी {{var0}}",
+ "delete_fail": "{{var0}} को हटाया नहीं जा सकता",
+ "delete_success": "{{var0}} सफलतापूर्वक हटाया गया",
+ "descending": "अवरोही",
+ "developer": "डेवलपर",
+ "donate_message": "आगे के अपडेट प्राप्त करने के लिए मेरा समर्थन करें!",
+ "download": "डाउनलोड",
+ "download_fail": "{{var0}} डाउनलोड नहीं किया जा सकता",
+ "download_success": "{{var0}} सफलतापूर्वक डाउनलोड किया गया",
+ "file_navigator_text": "फाइल खोजो",
+ "first": "प्रथम",
+ "from": "से",
+ "gradient": "ढाल",
+ "guildbanner": "बैनर",
+ "guildicon": "आइकन",
+ "installed": "स्थापित",
+ "last": "पिछले",
+ "left": "बाएं",
+ "loading": "लोड हो रहा है {{var0}}",
+ "location": "स्थान",
+ "order": "गण",
+ "outdated": "रगड़ा हुआ",
+ "please_wait": "कृपया प्रतीक्षा करें",
+ "right": "सही",
+ "save_fail": "{{var0}} सहेजा नहीं जा सकता",
+ "save_success": "{{var0}} सफलतापूर्वक सहेजा गया",
+ "send": "भेजें {{var0}}",
+ "server": "सर्वर",
+ "settings_shareData_description": "डिस्कॉर्ड खातों के बीच प्लगइन कॉन्फिग को सिंक्रोनाइज़ करता है",
+ "settings_showSupportBadges_description": "मेरे Patreon का समर्थन करने वाले उपयोगकर्ताओं के लिए छोटे बैज दिखाता है",
+ "settings_showToasts_description": "प्लगिन को दिखाता है टोस्ट शुरू और बंद करो",
+ "settings_showToasts_note": "इसे अक्षम करने से पहले BDs सामान्य '{{var0}}' सेटिंग अक्षम करें",
+ "settings_toastPosition_description": "डिफ़ॉल्ट टोस्ट स्थिति",
+ "settings_toastPosition_note": "केवल मेरे प्लगइन्स द्वारा बनाए गए टोस्ट की स्थिति बदलता है",
+ "settings_useChromium_description": "अपने ब्राउज़र के बजाय डिस्कॉर्ड में लिंक खोलें",
+ "sort_by": "इसके अनुसार क्रमबद्ध करें",
+ "status": "स्थिति",
+ "time": "समय",
+ "timezone": "समय क्षेत्र",
+ "to": "सेवा",
+ "toast_plugin_loaded": "{{var0}} लोड कर दिया गया है",
+ "toast_plugin_started": "{{var0}} शुरू कर दिया गया है",
+ "toast_plugin_stopped": "{{var0}} रोक दिया गया है",
+ "toast_plugin_translated": "{{var0}} में अनुवादित",
+ "toast_plugin_unloaded": "{{var0}} अनलोड कर दिया गया है",
+ "toast_plugin_update_failed": "{{var0}} के लिए अपडेट डाउनलोड नहीं किया जा सकता",
+ "toast_plugin_updated": "{{var0}} {{var1}} को {{var2}} {{var3}} से बदल दिया गया है",
+ "update_check_complete": "प्लगइन अद्यतन जाँच पूर्ण",
+ "update_check_complete_outdated": "प्लगिन अपडेट जांच पूरी हुई - {{var0}} पुरानी!",
+ "update_check_info": "चेक प्लगइन्स जो अपडेट चेक का समर्थन करते हैं",
+ "update_notice_click": "अपडेट करने के लिए क्लिक करें!",
+ "update_notice_reload": "अद्यतन पूरा करने के लिए पुनः लोड करें",
+ "update_notice_update": "निम्नलिखित प्लगइन्स को अद्यतन करने की आवश्यकता है:",
+ "updated": "अद्यतन"
+ },
+ "hr": {
+ "add_to": "Dodaj u {{var0}}",
+ "ascending": "Uzlazni",
+ "center": "Centrirano",
+ "changelog_added": "Nove značajke",
+ "changelog_fixed": "Rješavanje problema",
+ "changelog_improved": "Poboljšanja",
+ "changelog_progress": "Napredak",
+ "check_for_updates": "Provjerite ima li ažuriranja",
+ "clipboard_success": "Kopirano {{var0}} u međuspremnik",
+ "confirm": "Jesi li siguran?",
+ "copy": "Kopiraj {{var0}}",
+ "delete_fail": "{{var0}} nije moguće izbrisati",
+ "delete_success": "{{var0}} uspješno je izbrisano",
+ "descending": "Silazni",
+ "developer": "Programer",
+ "donate_message": "Podržite me za još novosti!",
+ "download": "Preuzimanje datoteka",
+ "download_fail": "{{var0}} nije moguće preuzeti",
+ "download_success": "{{var0}} uspješno preuzeto",
+ "file_navigator_text": "Pregledaj datoteku",
+ "first": "Prvi",
+ "from": "Iz",
+ "gradient": "Gradijent",
+ "guildbanner": "Natpis",
+ "guildicon": "Ikona",
+ "installed": "Instaliran",
+ "last": "Posljednji",
+ "left": "Lijevo",
+ "loading": "Učitavanje {{var0}}",
+ "location": "Mjesto",
+ "order": "Slijed",
+ "outdated": "Zastario",
+ "please_wait": "Drago mi je čekati",
+ "right": "Pravo",
+ "save_fail": "{{var0}} nije moguće spremiti",
+ "save_success": "{{var0}} uspješno spremljeno",
+ "send": "Pošalji {{var0}}",
+ "server": "Poslužitelju",
+ "settings_shareData_description": "Sinkronizira konfiguracije dodataka između Discord računa",
+ "settings_showSupportBadges_description": "Prikazuje male značke za korisnike koji podržavaju moj Patreon",
+ "settings_showToasts_description": "Prikazuje tost za pokretanje i zaustavljanje dodatka",
+ "settings_showToasts_note": "Onemogućite opću postavku '{{var0}}' BD-ova prije nego što ih onemogućite",
+ "settings_toastPosition_description": "Zadani položaj tosta",
+ "settings_toastPosition_note": "Mijenja samo položaj zdravica koje su stvorili moji dodatke",
+ "settings_useChromium_description": "Otvorite veze u Discordu umjesto u pregledniku",
+ "sort_by": "Poredati po",
+ "status": "Status",
+ "time": "Vrijeme",
+ "timezone": "Vremenska zona",
+ "to": "Do",
+ "toast_plugin_loaded": "Učitana je {{var0}}",
+ "toast_plugin_started": "{{var0}} je započeo",
+ "toast_plugin_stopped": "{{var0}} je zaustavljen",
+ "toast_plugin_translated": "prevedeno na {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} je istovaren",
+ "toast_plugin_update_failed": "Ažuriranje za {{var0}} nije moguće preuzeti",
+ "toast_plugin_updated": "{{var0}} {{var1}} zamijenjen je s {{var2}} {{var3}}",
+ "update_check_complete": "Provjera ažuriranja dodatka dovršena",
+ "update_check_complete_outdated": "Provjera ažuriranja dodatka dovršena - {{var0}} zastarjelo!",
+ "update_check_info": "Provjerite dodatke koji podržavaju provjeru ažuriranja",
+ "update_notice_click": "Kliknite za ažuriranje!",
+ "update_notice_reload": "Ponovo učitajte da biste dovršili ažuriranje",
+ "update_notice_update": "Treba ažurirati sljedeće dodatke: ",
+ "updated": "Ažurirano"
+ },
+ "hu": {
+ "add_to": "Hozzáadás a következőhöz: {{var0}}",
+ "ascending": "Növekvő",
+ "center": "Középre",
+ "changelog_added": "Új funkciók",
+ "changelog_fixed": "Hibaelhárítás",
+ "changelog_improved": "Fejlesztések",
+ "changelog_progress": "Előrehalad",
+ "check_for_updates": "Frissítések keresése",
+ "clipboard_success": "{{var0}} a vágólapra másolva",
+ "confirm": "Biztos vagy ebben?",
+ "copy": "Másolás {{var0}}",
+ "delete_fail": "A {{var0}} nem törölhető",
+ "delete_success": "{{var0}} sikeresen törölve",
+ "descending": "Csökkenő",
+ "developer": "Fejlesztő",
+ "donate_message": "Támogasson további frissítésekért!",
+ "download": "Letöltés",
+ "download_fail": "A {{var0}} nem tölthető le",
+ "download_success": "A {{var0}} letöltése sikeresen megtörtént",
+ "file_navigator_text": "Tallózás a fájlban",
+ "first": "Első",
+ "from": "Erről",
+ "gradient": "Gradiens",
+ "guildbanner": "Banner",
+ "guildicon": "Ikon",
+ "installed": "Telepítve",
+ "last": "Utolsó",
+ "left": "Bal",
+ "loading": "{{var0}} betöltése",
+ "location": "Elhelyezkedés",
+ "order": "Sorrend",
+ "outdated": "Elavult",
+ "please_wait": "Várj",
+ "right": "Jobb",
+ "save_fail": "A {{var0}} nem menthető",
+ "save_success": "{{var0}} sikeresen mentve",
+ "send": "{{var0}} küldése",
+ "server": "Szerver",
+ "settings_shareData_description": "Szinkronizálja a beépülő modulok beállításait a Discord fiókok között",
+ "settings_showSupportBadges_description": "Apró jelvényeket mutat azoknak a felhasználóknak, akik támogatják a Patreon-t",
+ "settings_showToasts_description": "Mutatja a bővítmény start és stop pirítósokat",
+ "settings_showToasts_note": "Mielőtt letiltaná őket, tiltsa le a BD-k '{{var0}} ” általános beállítását",
+ "settings_toastPosition_description": "Alapértelmezett pirítós pozíció",
+ "settings_toastPosition_note": "Csak a bővítményeket által létrehozott pirítósok pozícióját változtatja meg",
+ "settings_useChromium_description": "Nyissa meg a Linkeket a diszkordban a böngészője helyett",
+ "sort_by": "Sorrend",
+ "status": "Állapot",
+ "time": "Idő",
+ "timezone": "Időzóna",
+ "to": "Erre",
+ "toast_plugin_loaded": "{{var0}} betöltve",
+ "toast_plugin_started": "A {{var0}} elindult",
+ "toast_plugin_stopped": "A {{var0}} leállt",
+ "toast_plugin_translated": "lefordítva {{var0}} nyelvre",
+ "toast_plugin_unloaded": "{{var0}} kirakva",
+ "toast_plugin_update_failed": "A {{var0}} frissítése nem tölthető le",
+ "toast_plugin_updated": "A {{var0}} {{var1}} helyébe a következő lépett: {{var2}} {{var3}}",
+ "update_check_complete": "A bővítmény modul frissítésének ellenőrzése befejeződött",
+ "update_check_complete_outdated": "A bővítmény modul frissítésének ellenőrzése befejeződött - {{var0}} elavult!",
+ "update_check_info": "Ellenőrizze a Frissítés ellenőrzését támogató bővítményeket modulokat",
+ "update_notice_click": "Kattintson a frissítéshez!",
+ "update_notice_reload": "Töltse be újra a frissítés befejezéséhez",
+ "update_notice_update": "A következő bővítményeket frissíteni kell: ",
+ "updated": "Frissítve"
+ },
+ "it": {
+ "add_to": "Aggiungi a {{var0}}",
+ "ascending": "Ascendente",
+ "center": "Centrato",
+ "changelog_added": "Nuove caratteristiche",
+ "changelog_fixed": "Risoluzione dei problemi",
+ "changelog_improved": "Miglioramenti",
+ "changelog_progress": "Progresso",
+ "check_for_updates": "Controlla gli aggiornamenti",
+ "clipboard_success": "{{var0}} copiato negli Appunti",
+ "confirm": "Sei sicuro?",
+ "copy": "Copia {{var0}}",
+ "delete_fail": "{{var0}} non può essere eliminato",
+ "delete_success": "{{var0}} eliminato correttamente",
+ "descending": "Discendente",
+ "developer": "Sviluppatore",
+ "donate_message": "Supportami per ulteriori aggiornamenti!",
+ "download": "Scarica",
+ "download_fail": "{{var0}} non può essere scaricato",
+ "download_success": "{{var0}} scaricato correttamente",
+ "file_navigator_text": "Sfoglia file",
+ "first": "Primo",
+ "from": "A partire dal",
+ "gradient": "Pendenza",
+ "guildbanner": "Banner",
+ "guildicon": "Icona",
+ "installed": "Installato",
+ "last": "Scorso",
+ "left": "Sinistra",
+ "loading": "Caricamento di {{var0}}",
+ "location": "Posizione",
+ "order": "Sequenza",
+ "outdated": "Obsoleto",
+ "please_wait": "Attendere prego",
+ "right": "Destra",
+ "save_fail": "{{var0}} non può essere salvato",
+ "save_success": "{{var0}} salvato correttamente",
+ "send": "Invia {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Sincronizza le configurazioni dei plug-in tra gli account Discord",
+ "settings_showSupportBadges_description": "Mostra piccoli badge per gli utenti che supportano il mio Patreon",
+ "settings_showToasts_description": "Mostra l'avvio e l'arresto del plugin",
+ "settings_showToasts_note": "Disabilita l'impostazione generale '{{var0}}' dei BD prima di disabilitarli",
+ "settings_toastPosition_description": "Posizione predefinita del toast",
+ "settings_toastPosition_note": "Cambia solo la posizione dei toast creati dai miei plugins",
+ "settings_useChromium_description": "Apri link in Discord invece che nel tuo browser",
+ "sort_by": "Ordina per",
+ "status": "Stato",
+ "time": "Tempo",
+ "timezone": "Fuso orario",
+ "to": "Per",
+ "toast_plugin_loaded": "{{var0}} è stato caricato",
+ "toast_plugin_started": "{{var0}} è iniziato",
+ "toast_plugin_stopped": "{{var0}} si è fermato",
+ "toast_plugin_translated": "tradotto in {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} è stato scaricato",
+ "toast_plugin_update_failed": "Impossibile scaricare l'aggiornamento per {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} è stato sostituito da {{var2}} {{var3}}",
+ "update_check_complete": "Controllo dell'aggiornamento del plugin completato",
+ "update_check_complete_outdated": "Controllo dell'aggiornamento del plugin completato - {{var0}} non aggiornato!",
+ "update_check_info": "Controlla i plugins che supportano il controllo degli aggiornamenti",
+ "update_notice_click": "Fare clic per aggiornare!",
+ "update_notice_reload": "Ricarica per completare l'aggiornamento",
+ "update_notice_update": "I seguenti plugins devono essere aggiornati: ",
+ "updated": "Aggiornato"
+ },
+ "ja": {
+ "add_to": "{{var0}} に追加",
+ "ascending": "昇順",
+ "center": "中央揃え",
+ "changelog_added": "新機能",
+ "changelog_fixed": "修正点",
+ "changelog_improved": "改善点",
+ "changelog_progress": "進行中",
+ "check_for_updates": "アップデートを確認",
+ "clipboard_success": "{{var0}}をクリップボードにコピーしました",
+ "confirm": "本気ですか?",
+ "copy": "{{var0}}をコピーします",
+ "delete_fail": "{{var0}}の削除に失敗しました",
+ "delete_success": "{{var0}}が正常に削除されました",
+ "descending": "降順",
+ "developer": "開発者",
+ "donate_message": "もっといっぱいアップデートするために私をサポートしてください!",
+ "download": "ダウンロード",
+ "download_fail": "{{var0}} のダウンロードに失敗しました",
+ "download_success": "{{var0}} が正常にダウンロードされました",
+ "file_navigator_text": "ファイルの参照",
+ "first": "最初",
+ "from": "から",
+ "gradient": "変化の割合",
+ "guildbanner": "バナー",
+ "guildicon": "アイコン",
+ "installed": "インストール済み",
+ "last": "最後",
+ "left": "左",
+ "loading": "{{var0} を読み込んでいます}",
+ "location": "位置",
+ "order": "順序",
+ "outdated": "古いバージョン",
+ "please_wait": "お待ちください",
+ "right": "右",
+ "save_fail": "{{var0}}は保存できませんでした",
+ "save_success": "{{var0}}が正常に保存されました",
+ "send": "{{var0}}を送信します",
+ "server": "サーバー",
+ "settings_shareData_description": "プラグイン構成の同期",
+ "settings_showSupportBadges_description": "私へ寄付いただいたユーザーに小さなバッジを表示します",
+ "settings_showToasts_description": "プラグインの開始と停止のトースト通知を表示します",
+ "settings_showToasts_note": "先にBD の一般設定の '{{var0}}' を無効にしてください",
+ "settings_toastPosition_description": "デフォルトのトースト通知の位置",
+ "settings_toastPosition_note": "プラグインによるトーストの位置のみを変更します",
+ "settings_useChromium_description": "ブラウザの代わりにDiscord内でリンクを開く",
+ "sort_by": "並べ替え",
+ "status": "状態",
+ "time": "時間",
+ "timezone": "タイムゾーン",
+ "to": "に",
+ "toast_plugin_loaded": "{{var0}} が読み込まれました",
+ "toast_plugin_started": "{{var0}} を開始しました",
+ "toast_plugin_stopped": "{{var0}} を停止しました",
+ "toast_plugin_translated": "{{var0}} に変換されました",
+ "toast_plugin_unloaded": "{{var0}} をアンロードしました",
+ "toast_plugin_update_failed": "{{var0}} の更新に失敗しました",
+ "toast_plugin_updated": "{{var0}} {{var1}} は {{var2}} {{var3}} に置き換えられました",
+ "update_check_complete": "プラグインの更新チェックが完了しました",
+ "update_check_complete_outdated": "プラグインの更新チェックが完了しました- {{var0}} が古くなっています!",
+ "update_check_info": "アップデート機能を持つプラグインをチェックします",
+ "update_notice_click": "クリックして更新!",
+ "update_notice_reload": "リロードして更新を完了します",
+ "update_notice_update": "プラグインを更新する必要があります。",
+ "updated": "更新が完了しました"
+ },
+ "ko": {
+ "add_to": "{{var0}}에 추가",
+ "ascending": "오름차순",
+ "center": "중앙",
+ "changelog_added": "새로운 기능",
+ "changelog_fixed": "문제 해결",
+ "changelog_improved": "개선됨",
+ "changelog_progress": "진행중",
+ "check_for_updates": "업데이트 확인",
+ "clipboard_success": "{{var0}}을(를) 클립보드에 복사했습니다.",
+ "confirm": "확실한가요?",
+ "copy": "{{var0}} 복사",
+ "delete_fail": "{{var0}}을(를) 삭제할 수 없습니다.",
+ "delete_success": "{{var0}}이(가) 성공적으로 삭제되었습니다.",
+ "descending": "내림차순",
+ "developer": "개발자",
+ "donate_message": "더 많은 업데이트를 위해 저를 후원해주세요!",
+ "download": "다운로드",
+ "download_fail": "{{var0}}을(를) 다운로드 할 수 없습니다.",
+ "download_success": "{{var0}}을(를) 다운로드 완료했습니다",
+ "file_navigator_text": "파일 찾아보기",
+ "first": "먼저",
+ "from": "에서",
+ "gradient": "그라데이션",
+ "guildbanner": "배너",
+ "guildicon": "상",
+ "installed": "설치됨",
+ "last": "마지막",
+ "left": "좌측",
+ "loading": "로드 중 {{var0}}",
+ "location": "위치",
+ "order": "순서",
+ "outdated": "구버전",
+ "please_wait": "잠시만 기다려주세요",
+ "right": "우측",
+ "save_fail": "{{var0}}을(를) 저장할 수 없습니다.",
+ "save_success": "{{var0}}이(가) 성공적으로 저장되었습니다.",
+ "send": "{{var0}} 보내기",
+ "server": "서버",
+ "settings_shareData_description": "Discord 계정 간에 플러그인 구성을 동기화합니다.",
+ "settings_showSupportBadges_description": "개발자의 Patreon으로 후원해주는 사용자에게 작은 배지를 표시합니다.",
+ "settings_showToasts_description": "플러그인 시작 및 중지 알림 표시",
+ "settings_showToasts_note": "BD를 비활성화하기 전에 BD를 일반 설정 '{{var0}}'을(를) 비활성화하세요.",
+ "settings_toastPosition_description": "기본 토스트창(Toast) 위치",
+ "settings_toastPosition_note": "위 옵션은 내 플러그인에 의해 생성된 토스트창에만 해당됩니다.",
+ "settings_useChromium_description": "브라우저 대신 Discord 에서 링크 열기",
+ "sort_by": "정렬 기준",
+ "status": "상태",
+ "time": "시각",
+ "timezone": "시간대",
+ "to": "에",
+ "toast_plugin_loaded": "{{var0}}이(가) 로드되었습니다.",
+ "toast_plugin_started": "{{var0}}이(가) 시작되었습니다.",
+ "toast_plugin_stopped": "{{var0}}이(가) 중지되었습니다.",
+ "toast_plugin_translated": "{{var0}} 로 번역됨",
+ "toast_plugin_unloaded": "{{var0}}이(가) 언로드되었습니다.",
+ "toast_plugin_update_failed": "{{var0}} 에 대한 업데이트를 다운로드 할 수 없습니다.",
+ "toast_plugin_updated": "{{var0}} {{var1}}이(가) {{var2}} {{var3}}으(로) 교체되었습니다.",
+ "update_check_complete": "플러그인 업데이트 확인 완료",
+ "update_check_complete_outdated": "플러그인 업데이트 확인 완료 - {{var0}}이(가) 구버전입니다!",
+ "update_check_info": "업데이트 기능을 지원하는 모든 플러그인 업데이트",
+ "update_notice_click": "업데이트하려면 클릭하세요!",
+ "update_notice_reload": "업데이트를 완료하려면 새로고침하세요.",
+ "update_notice_update": "다음 플러그인을 업데이트해야합니다: ",
+ "updated": "업데이트됨"
+ },
+ "lt": {
+ "add_to": "Pridėti prie {{var0}}",
+ "ascending": "Kylanti",
+ "center": "Centruotas",
+ "changelog_added": "Naujos savybės",
+ "changelog_fixed": "Problemų sprendimas",
+ "changelog_improved": "Patobulinimai",
+ "changelog_progress": "Progresas",
+ "check_for_updates": "Tikrinti, ar yra atnaujinimų",
+ "clipboard_success": "{{var0}} nukopijuotas į mainų sritį",
+ "confirm": "Ar tu tuo tikras?",
+ "copy": "Kopijuoti {{var0}}",
+ "delete_fail": "{{var0}} negalima ištrinti",
+ "delete_success": "{{var0}} sėkmingai ištrinta",
+ "descending": "Mažėjantis",
+ "developer": "Programuotojas",
+ "donate_message": "Palaikykite mane, kad gautumėte daugiau naujinių!",
+ "download": "Parsisiųsti",
+ "download_fail": "{{var0}} negalima atsisiųsti",
+ "download_success": "{{var0}} sėkmingai atsisiųsta",
+ "file_navigator_text": "Naršyti failą",
+ "first": "Pirmas",
+ "from": "Nuo",
+ "gradient": "Gradientas",
+ "guildbanner": "Reklamjuostė",
+ "guildicon": "Piktograma",
+ "installed": "Įdiegta",
+ "last": "Paskutinis",
+ "left": "Kairėje",
+ "loading": "Įkeliama {{var0}}",
+ "location": "Vieta",
+ "order": "Seka",
+ "outdated": "Pasenęs",
+ "please_wait": "Maloniai palauk",
+ "right": "Teisingai",
+ "save_fail": "{{var0}} negalima išsaugoti",
+ "save_success": "{{var0}} išsaugota sėkmingai",
+ "send": "Siųsti {{var0}}",
+ "server": "Serverio",
+ "settings_shareData_description": "Sinchronizuoja įskiepio konfigūracijas tarp „Discord“ paskyrų",
+ "settings_showSupportBadges_description": "Rodo mažus ženklelius vartotojams, palaikantiems mano Patreon",
+ "settings_showToasts_description": "Parodo įskiepių paleidimo ir sustabdymo tostus",
+ "settings_showToasts_note": "Prieš išjungdami, išjunkite bendrą BD nustatymą '{{var0}}'",
+ "settings_toastPosition_description": "Numatytoji skrudintos duonos padėtis",
+ "settings_toastPosition_note": "Keičia tik mano įskiepiai sukurtų tostų poziciją",
+ "settings_useChromium_description": "Vietoj savo naršyklės atidarykite nuorodas nesantaikoje",
+ "sort_by": "Rūšiuoti pagal",
+ "status": "Būsena",
+ "time": "Laikas",
+ "timezone": "Laiko zona",
+ "to": "Į",
+ "toast_plugin_loaded": "{{var0}} buvo įkelta",
+ "toast_plugin_started": "{{var0}} prasidėjo",
+ "toast_plugin_stopped": "{{var0}} sustabdyta",
+ "toast_plugin_translated": "išversta į {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} buvo iškrautas",
+ "toast_plugin_update_failed": "Negalima atsisiųsti {{var0}} naujinio",
+ "toast_plugin_updated": "{{var0}} {{var1}} pakeista į {{var2}} {{var3}}",
+ "update_check_complete": "Įskiepių atnaujinimo patikrinimas baigtas",
+ "update_check_complete_outdated": "Įskiepių atnaujinimo patikrinimas baigtas - {{var0}} pasenęs!",
+ "update_check_info": "Patikrinkite įskiepiai, kurie palaiko naujinimo patikrą",
+ "update_notice_click": "Spustelėkite norėdami atnaujinti!",
+ "update_notice_reload": "Įkelkite iš naujo, kad užbaigtumėte atnaujinimą",
+ "update_notice_update": "Reikia atnaujinti šiuos įskiepiai: ",
+ "updated": "Atnaujinta"
+ },
+ "nl": {
+ "add_to": "Toevoegen aan {{var0}}",
+ "ascending": "Oplopend",
+ "center": "Gecentreerd",
+ "changelog_added": "Nieuwe features",
+ "changelog_fixed": "Probleemoplossen",
+ "changelog_improved": "Verbeteringen",
+ "changelog_progress": "Vooruitgang",
+ "check_for_updates": "Controleer op updates",
+ "clipboard_success": "{{var0}} gekopieerd naar klembord",
+ "confirm": "Weet je zeker dat?",
+ "copy": "Kopieer {{var0}}",
+ "delete_fail": "{{var0}} kan niet worden verwijderd",
+ "delete_success": "{{var0}} is verwijderd",
+ "descending": "Aflopend",
+ "developer": "Ontwikkelaar",
+ "donate_message": "Steun mij voor meer updates!",
+ "download": "Downloaden",
+ "download_fail": "{{var0}} kan niet worden gedownload",
+ "download_success": "{{var0}} succesvol gedownload",
+ "file_navigator_text": "Bestand zoeken",
+ "first": "Eerste",
+ "from": "Van",
+ "gradient": "Verloop",
+ "guildbanner": "Banner",
+ "guildicon": "Icoon",
+ "installed": "Geïnstalleerd",
+ "last": "Laatste",
+ "left": "Links",
+ "loading": "Laden {{var0}}",
+ "location": "Plaats",
+ "order": "Volgorde",
+ "outdated": "Verouderd",
+ "please_wait": "Wacht even",
+ "right": "Rechtsaf",
+ "save_fail": "{{var0}} kan niet worden opgeslagen",
+ "save_success": "{{var0}} succesvol opgeslagen",
+ "send": "Stuur {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synchroniseert de plug-inconfiguraties tussen Discord-accounts",
+ "settings_showSupportBadges_description": "Toont kleine badges voor gebruikers die mijn Patreon ondersteunen",
+ "settings_showToasts_description": "Toont plugin start en stop toasts",
+ "settings_showToasts_note": "Schakel de algemene instelling '{{var0}}' van BD's uit voordat u ze uitschakelt",
+ "settings_toastPosition_description": "Standaard toastpositie",
+ "settings_toastPosition_note": "Verandert alleen de positie van toast gemaakt door mijn plugins",
+ "settings_useChromium_description": "Open links in Discord in plaats van uw browser",
+ "sort_by": "Sorteer op",
+ "status": "Toestand",
+ "time": "Tijd",
+ "timezone": "Tijdzone",
+ "to": "Naar",
+ "toast_plugin_loaded": "{{var0}} is geladen",
+ "toast_plugin_started": "{{var0}} is gestart",
+ "toast_plugin_stopped": "{{var0}} is gestopt",
+ "toast_plugin_translated": "vertaald naar {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} is verwijderd",
+ "toast_plugin_update_failed": "Update voor {{var0}} kan niet worden gedownload",
+ "toast_plugin_updated": "{{var0}} {{var1}} is vervangen door {{var2}} {{var3}}",
+ "update_check_complete": "Controle op update van plugin voltooid",
+ "update_check_complete_outdated": "Controle van update van plugin voltooid - {{var0}} verouderd!",
+ "update_check_info": "Controleer plugins die de updatecontrole ondersteunen",
+ "update_notice_click": "Klik om te updaten!",
+ "update_notice_reload": "Laad opnieuw om de update te voltooien",
+ "update_notice_update": "De volgende plugins moeten worden bijgewerkt: ",
+ "updated": "Bijgewerkt"
+ },
+ "no": {
+ "add_to": "Legg til i {{var0}}",
+ "ascending": "Stigende",
+ "center": "Sentrert",
+ "changelog_added": "Nye funksjoner",
+ "changelog_fixed": "Feilsøking",
+ "changelog_improved": "Forbedringer",
+ "changelog_progress": "Framgang",
+ "check_for_updates": "Se etter oppdateringer",
+ "clipboard_success": "Kopierte {{var0}} til utklippstavlen",
+ "confirm": "Er du sikker?",
+ "copy": "Kopier {{var0}}",
+ "delete_fail": "{{var0}} kan ikke slettes",
+ "delete_success": "{{var0}} ble slettet",
+ "descending": "Fallende",
+ "developer": "Utvikler",
+ "donate_message": "Støtt meg for flere oppdateringer!",
+ "download": "Nedlasting",
+ "download_fail": "{{var0}} kan ikke lastes ned",
+ "download_success": "{{var0}} lastet ned",
+ "file_navigator_text": "Bla gjennom filen",
+ "first": "Først",
+ "from": "Fra",
+ "gradient": "Gradient",
+ "guildbanner": "Banner",
+ "guildicon": "Ikon",
+ "installed": "Installert",
+ "last": "Siste",
+ "left": "Venstre",
+ "loading": "Laster inn {{var0}}",
+ "location": "Plassering",
+ "order": "Sekvens",
+ "outdated": "Utdatert",
+ "please_wait": "Vennligst vent",
+ "right": "Ikke sant",
+ "save_fail": "{{var0}} kan ikke lagres",
+ "save_success": "{{var0}} lagret",
+ "send": "Send {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synkroniserer plugin-konfigurasjonene mellom Discord-kontoer",
+ "settings_showSupportBadges_description": "Viser små merker for brukere som støtter min Patreon",
+ "settings_showToasts_description": "Viser plugin start og stopp toasts",
+ "settings_showToasts_note": "Deaktiver den generelle innstillingen '{{var0}}' for BD-er før du deaktiverer dem",
+ "settings_toastPosition_description": "Standard toastposisjon",
+ "settings_toastPosition_note": "Endrer bare posisjonen for ristet brød opprettet av plugins mine",
+ "settings_useChromium_description": "Åpne koblinger i Discord i stedet for nettleseren din",
+ "sort_by": "Sorter etter",
+ "status": "Status",
+ "time": "Tid",
+ "timezone": "Tidssone",
+ "to": "Til",
+ "toast_plugin_loaded": "{{var0}} er lastet inn",
+ "toast_plugin_started": "{{var0}} har startet",
+ "toast_plugin_stopped": "{{var0}} har stoppet",
+ "toast_plugin_translated": "oversatt til {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} er lastet ut",
+ "toast_plugin_update_failed": "Oppdatering for {{var0}} kan ikke lastes ned",
+ "toast_plugin_updated": "{{var0}} {{var1}} er erstattet av {{var2}} {{var3}}",
+ "update_check_complete": "Sjekk plugin-oppdatering fullført",
+ "update_check_complete_outdated": "Sjekk plugin-oppdatering fullført - {{var0}} utdatert!",
+ "update_check_info": "Sjekk plugins som støtter oppdateringskontrollen",
+ "update_notice_click": "Klikk for å oppdatere!",
+ "update_notice_reload": "Last inn for å fullføre oppdateringen",
+ "update_notice_update": "Følgende plugins må oppdateres: ",
+ "updated": "Oppdatert"
+ },
+ "pl": {
+ "add_to": "Dodaj do {{var0}}",
+ "ascending": "Rosnąco",
+ "center": "Środek",
+ "changelog_added": "Dodano",
+ "changelog_fixed": "Naprawiono",
+ "changelog_improved": "Ulepszono",
+ "changelog_progress": "Postęp",
+ "check_for_updates": "Sprawdź aktualizacje",
+ "clipboard_success": "Skopiowano {{var0}} do schowka",
+ "confirm": "Na pewno?",
+ "copy": "Kopiuj {{var0}}",
+ "delete_fail": "Nie można usunąć {{var0}}",
+ "delete_success": "Pomyślnie usunięto {{var0}}",
+ "descending": "Malejąco",
+ "developer": "Deweloper",
+ "donate_message": "Wesprzyj mnie, aby uzyskać więcej aktualizacji!",
+ "download": "Pobieranie",
+ "download_fail": "Nie można pobrać {{var0}}",
+ "download_success": "Pomyślnie pobrano {{var0}}",
+ "file_navigator_text": "Przeglądaj plik",
+ "first": "Pierwszy",
+ "from": "Od",
+ "gradient": "Gradient",
+ "guildbanner": "Transparent",
+ "guildicon": "Ikona",
+ "installed": "Zainstalowany",
+ "last": "Ostatni",
+ "left": "Lewo",
+ "loading": "Ładowanie {{var0}}",
+ "location": "Lokalizacja",
+ "order": "Kolejność",
+ "outdated": "Przestarzały",
+ "please_wait": "Proszę czekać",
+ "right": "Prawo",
+ "save_fail": "Nie można zapisać {{var0}}",
+ "save_success": "Pomyślnie zapisano {{var0}}",
+ "send": "Wyślij {{var0}}",
+ "server": "Serwer",
+ "settings_shareData_description": "Synchronizuje konfiguracje wtyczek między kontami Discord",
+ "settings_showSupportBadges_description": "Pokazuje małe odznaki dla wspierających mojego Patreona",
+ "settings_showToasts_description": "Pokazuje toasty uruchamiające i zatrzymujące wtyczki",
+ "settings_showToasts_note": "Wyłącz ogólne ustawienie '{{var0}} ” dysków BD przed ich wyłączeniem",
+ "settings_toastPosition_description": "Domyślna pozycja toastów",
+ "settings_toastPosition_note": "Zmienia tylko pozycję toastów utworzonych przez moje wtyczki",
+ "settings_useChromium_description": "Otwieraj linki w Discordzie zamiast w przeglądarce",
+ "sort_by": "Sortuj według",
+ "status": "Status",
+ "time": "Czas",
+ "timezone": "Strefa czasowa",
+ "to": "Do",
+ "toast_plugin_loaded": "Załadowano {{var0}}",
+ "toast_plugin_started": "Rozpoczęto {{var0}}",
+ "toast_plugin_stopped": "{{var0}} został zatrzymany",
+ "toast_plugin_translated": "przetłumaczone na {{var0}}",
+ "toast_plugin_unloaded": "Usunięto {{var0}}",
+ "toast_plugin_update_failed": "Nie można pobrać aktualizacji dla {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} został zastąpiony przez {{var2}} {{var3}}",
+ "update_check_complete": "Sprawdzanie aktualizacji wtyczki zakończone",
+ "update_check_complete_outdated": "Sprawdzanie aktualizacji wtyczki zakończone - {{var0}} nieaktualne!",
+ "update_check_info": "Sprawdź wtyczki obsługujące sprawdzanie aktualizacji",
+ "update_notice_click": "Kliknij, aby zaktualizować!",
+ "update_notice_reload": "Załaduj ponownie, aby zakończyć aktualizację",
+ "update_notice_update": "Należy zaktualizować następujące wtyczki: ",
+ "updated": "Zaktualizowano"
+ },
+ "pt-BR": {
+ "add_to": "Adicionar a {{var0}}",
+ "ascending": "Ascendente",
+ "center": "Centrado",
+ "changelog_added": "Novas características",
+ "changelog_fixed": "Solução de problemas",
+ "changelog_improved": "Melhorias",
+ "changelog_progress": "Progresso",
+ "check_for_updates": "Verifique se há atualizações",
+ "clipboard_success": "Copiado {{var0}} para a área de transferência",
+ "confirm": "Você tem certeza?",
+ "copy": "Copiar {{var0}}",
+ "delete_fail": "{{var0}} não pode ser excluído",
+ "delete_success": "{{var0}} excluído com sucesso",
+ "descending": "Descendente",
+ "developer": "Desenvolvedor",
+ "donate_message": "Apoie-me para mais atualizações!",
+ "download": "Baixar",
+ "download_fail": "{{var0}} não pode ser baixado",
+ "download_success": "{{var0}} baixado com sucesso",
+ "file_navigator_text": "Procurar arquivo",
+ "first": "Primeiro",
+ "from": "De",
+ "gradient": "Gradiente",
+ "guildbanner": "Bandeira",
+ "guildicon": "Ícone",
+ "installed": "Instalado",
+ "last": "Último",
+ "left": "Esquerda",
+ "loading": "Carregando {{var0}}",
+ "location": "Localização",
+ "order": "Seqüência",
+ "outdated": "Desatualizado",
+ "please_wait": "Por favor espere",
+ "right": "Direito",
+ "save_fail": "{{var0}} não pode ser salvo",
+ "save_success": "{{var0}} salvo com sucesso",
+ "send": "Enviar {{var0}}",
+ "server": "Servidor",
+ "settings_shareData_description": "Sincroniza as configurações de plug-in entre contas do Discord",
+ "settings_showSupportBadges_description": "Mostra pequenos emblemas para usuários que apóiam meu Patreon",
+ "settings_showToasts_description": "Mostra o início e o fim do plugin do brinde",
+ "settings_showToasts_note": "Desative a configuração geral '{{var0}}' de BDs antes de desativá-los",
+ "settings_toastPosition_description": "Posição padrão do brinde",
+ "settings_toastPosition_note": "Apenas altera a posição dos brindes criados pelos meus plugins",
+ "settings_useChromium_description": "Abra links no Discord em vez do seu navegador",
+ "sort_by": "Ordenar por",
+ "status": "Status",
+ "time": "Tempo",
+ "timezone": "Fuso horário",
+ "to": "Para",
+ "toast_plugin_loaded": "{{var0}} foi carregado",
+ "toast_plugin_started": "{{var0}} começou",
+ "toast_plugin_stopped": "{{var0}} parou",
+ "toast_plugin_translated": "traduzido para {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} foi descarregado",
+ "toast_plugin_update_failed": "A atualização para {{var0}} não pode ser baixada",
+ "toast_plugin_updated": "{{var0}} {{var1}} foi substituído por {{var2}} {{var3}}",
+ "update_check_complete": "Verificação de atualização do plugin concluída",
+ "update_check_complete_outdated": "Verificação de atualização do plugin concluída - {{var0}} desatualizado!",
+ "update_check_info": "Verifique os plugins que suportam a verificação de atualização",
+ "update_notice_click": "Clique para atualizar!",
+ "update_notice_reload": "Recarregue para completar a atualização",
+ "update_notice_update": "Os seguintes plugins precisam ser atualizados: ",
+ "updated": "Atualizada"
+ },
+ "ro": {
+ "add_to": "Adăugați la {{var0}}",
+ "ascending": "Ascendent",
+ "center": "Centrat",
+ "changelog_added": "Functii noi",
+ "changelog_fixed": "Depanare",
+ "changelog_improved": "Îmbunătățiri",
+ "changelog_progress": "Progres",
+ "check_for_updates": "Verifică pentru actualizări",
+ "clipboard_success": "{{var0}} a fost copiat în Clipboard",
+ "confirm": "Esti sigur?",
+ "copy": "Copiați {{var0}}",
+ "delete_fail": "{{var0}} nu poate fi șters",
+ "delete_success": "{{var0}} șters cu succes",
+ "descending": "Descendentă",
+ "developer": "Dezvoltator",
+ "donate_message": "Sprijină-mă pentru mai multe actualizări!",
+ "download": "Descarca",
+ "download_fail": "{{var0}} nu poate fi descărcat",
+ "download_success": "{{var0}} descărcat cu succes",
+ "file_navigator_text": "Răsfoiți fișierul",
+ "first": "Primul",
+ "from": "Din",
+ "gradient": "Gradient",
+ "guildbanner": "Banner",
+ "guildicon": "Pictogramă",
+ "installed": "Instalat",
+ "last": "Ultimul",
+ "left": "Stânga",
+ "loading": "Se încarcă {{var0}}",
+ "location": "Locație",
+ "order": "Secvenţă",
+ "outdated": "Învechit",
+ "please_wait": "Așteptați plăcut",
+ "right": "Dreapta",
+ "save_fail": "{{var0}} nu poate fi salvat",
+ "save_success": "{{var0}} salvat cu succes",
+ "send": "Trimite {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Sincronizează configurațiile pluginurilor între conturile Discord",
+ "settings_showSupportBadges_description": "Afișează insigne mici pentru utilizatorii care acceptă Patreon",
+ "settings_showToasts_description": "Afișează pornirea și oprirea toastelor pluginului",
+ "settings_showToasts_note": "Dezactivați setarea generală '{{var0}} ” a BD-urilor înainte de a le dezactiva",
+ "settings_toastPosition_description": "Poziție implicită Toast",
+ "settings_toastPosition_note": "Modifică doar poziția toastelor create de pluginuri mele",
+ "settings_useChromium_description": "Deschideți linkuri în discordie în loc de browser",
+ "sort_by": "Filtrează după",
+ "status": "Stare",
+ "time": "Timp",
+ "timezone": "Fus orar",
+ "to": "La",
+ "toast_plugin_loaded": "{{var0}} a fost încărcat",
+ "toast_plugin_started": "{{var0}} a început",
+ "toast_plugin_stopped": "{{var0}} s-a oprit",
+ "toast_plugin_translated": "tradus în {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} a fost descărcat",
+ "toast_plugin_update_failed": "Actualizarea pentru {{var0}} nu poate fi descărcată",
+ "toast_plugin_updated": "{{var0}} {{var1}} a fost înlocuit cu {{var2}} {{var3}}",
+ "update_check_complete": "Verificarea actualizării pluginului s-a finalizat",
+ "update_check_complete_outdated": "Verificarea actualizării pluginului s-a finalizat - {{var0}} nu este actualizată!",
+ "update_check_info": "Verificați pluginuri care acceptă verificarea actualizării",
+ "update_notice_click": "Faceți clic pentru a actualiza!",
+ "update_notice_reload": "Reîncărcați pentru a finaliza actualizarea",
+ "update_notice_update": "Următoarele pluginuri trebuie actualizate: ",
+ "updated": "La curent"
+ },
+ "ru": {
+ "add_to": "Добавить в {{var0}}",
+ "ascending": "Возрастанию",
+ "center": "По центру",
+ "changelog_added": "Новые возможности",
+ "changelog_fixed": "Исправления ошибок",
+ "changelog_improved": "Улучшения",
+ "changelog_progress": "Прогресс",
+ "check_for_updates": "Проверить наличие обновлений",
+ "clipboard_success": "Скопировано {{var0}} в буфер обмена",
+ "confirm": "Подтвердить?",
+ "copy": "Копировать {{var0}}",
+ "delete_fail": "Не удалось удалить: {{var0}}",
+ "delete_success": "Успешно удалено: {{var0}}",
+ "descending": "Убыванию",
+ "developer": "Разработчик",
+ "donate_message": "Поддержите меня, чтобы получать дальнейшие обновления!",
+ "download": "Скачать",
+ "download_fail": "Не удалось скачать: {{var0}}",
+ "download_success": "Успешно скачено: {{var0}}",
+ "file_navigator_text": "Посмотреть файл",
+ "first": "Первый",
+ "from": "Из",
+ "gradient": "Градиент",
+ "guildbanner": "Баннер",
+ "guildicon": "Икона",
+ "installed": "Установлено",
+ "last": "Последний",
+ "left": "Слева",
+ "loading": "Загрузка {{var0}}",
+ "location": "Расположение",
+ "order": "Порядок",
+ "outdated": "Устаревшее",
+ "please_wait": "Подождите",
+ "right": "Справа",
+ "save_fail": "Не удалось сохранить: {{var0}}",
+ "save_success": "Успешно сохранено: {{var0}}",
+ "send": "Отправить {{var0}}",
+ "server": "Сервер",
+ "settings_shareData_description": "Синхронизирует конфигурации плагинов между учетными записями Discord.",
+ "settings_showSupportBadges_description": "Показывать маленькие значки у пользователей, которые поддерживают мой Patreon",
+ "settings_showToasts_description": "Показывать всплывающие уведомления запуска и остановки плагинов",
+ "settings_showToasts_note": "Отключите общий параметр BD '{{var0}}' перед отключением этого параметра",
+ "settings_toastPosition_description": "Местоположение всплывающего уведомления по умолчанию",
+ "settings_toastPosition_note": "Изменяет только положение всплывающих уведомлений, созданных моими плагинами",
+ "settings_useChromium_description": "Открывайте ссылки через Discord вместо браузера",
+ "sort_by": "Сортировать по",
+ "status": "Состояние",
+ "time": "Время",
+ "timezone": "Часовой пояс",
+ "to": "В",
+ "toast_plugin_loaded": "{{var0}} загружен",
+ "toast_plugin_started": "{{var0}} запущен",
+ "toast_plugin_stopped": "{{var0}} остановлен",
+ "toast_plugin_translated": "переведён на {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} выгружен",
+ "toast_plugin_update_failed": "Обновление для {{var0}} не может быть загружено",
+ "toast_plugin_updated": "{{var0}} {{var1}} заменён на {{var2}} {{var3}}",
+ "update_check_complete": "Проверка плагинов на обновления завершена",
+ "update_check_complete_outdated": "Проверка плагинов на обновления завершена - {{var0}} устарел!",
+ "update_check_info": "Проверьте поддерживаемые плагины на обновления",
+ "update_notice_click": "Нажмите, чтобы обновить!",
+ "update_notice_reload": "Перезагрузите, чтобы завершить обновление",
+ "update_notice_update": "Необходимо обновить следующие плагины: ",
+ "updated": "Обновлено"
+ },
+ "sv": {
+ "add_to": "Lägg till i {{var0}}",
+ "ascending": "Stigande",
+ "center": "Centrerad",
+ "changelog_added": "Nya egenskaper",
+ "changelog_fixed": "Felsökning",
+ "changelog_improved": "Förbättringar",
+ "changelog_progress": "Framsteg",
+ "check_for_updates": "Sök efter uppdateringar",
+ "clipboard_success": "Kopierade {{var0}} till Urklipp",
+ "confirm": "Är du säker?",
+ "copy": "Kopiera {{var0}}",
+ "delete_fail": "{{var0}} kan inte raderas",
+ "delete_success": "{{var0}} har tagits bort",
+ "descending": "Nedåtgående",
+ "developer": "Utvecklaren",
+ "donate_message": "Stöd mig för fler uppdateringar!",
+ "download": "Ladda ner",
+ "download_fail": "{{var0}} kan inte laddas ner",
+ "download_success": "{{var0}} laddades ner",
+ "file_navigator_text": "Bläddra i filen",
+ "first": "Först",
+ "from": "Från",
+ "gradient": "Lutning",
+ "guildbanner": "Baner",
+ "guildicon": "Ikon",
+ "installed": "Installerat",
+ "last": "Sista",
+ "left": "Vänster",
+ "loading": "Laddar {{var0}}",
+ "location": "Plats",
+ "order": "Sekvens",
+ "outdated": "Föråldrad",
+ "please_wait": "Vänligen vänta",
+ "right": "Höger",
+ "save_fail": "{{var0}} kan inte sparas",
+ "save_success": "{{var0}} har sparats",
+ "send": "Skicka {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synkroniserar plugin-konfigurationerna mellan Discord-konton",
+ "settings_showSupportBadges_description": "Visar små märken för användare som stöder min Patreon",
+ "settings_showToasts_description": "Visar plugin start och stopp toasts",
+ "settings_showToasts_note": "Inaktivera den allmänna inställningen '{{var0}}' för BD-skivor innan du inaktiverar dem",
+ "settings_toastPosition_description": "Standard toastposition",
+ "settings_toastPosition_note": "Ändrar bara positionen för rostat bröd som skapats av mina plugins",
+ "settings_useChromium_description": "Öppna Länkar i Discord istället för din webbläsare",
+ "sort_by": "Sortera efter",
+ "status": "Status",
+ "time": "Tid",
+ "timezone": "Tidszon",
+ "to": "Till",
+ "toast_plugin_loaded": "{{var0}} har laddats",
+ "toast_plugin_started": "{{var0}} har startat",
+ "toast_plugin_stopped": "{{var0}} har slutat",
+ "toast_plugin_translated": "översatt till {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} har lossats",
+ "toast_plugin_update_failed": "Uppdatering för {{var0}} kan inte laddas ner",
+ "toast_plugin_updated": "{{var0}} {{var1}} har ersatts med {{var2}} {{var3}}",
+ "update_check_complete": "Kontrollen av plugin-uppdateringen slutförd",
+ "update_check_complete_outdated": "Kontrollen av plugin-uppdateringen slutförd - {{var0}} inaktuell!",
+ "update_check_info": "Kontrollera plugins som stöder uppdateringskontrollen",
+ "update_notice_click": "Klicka för att uppdatera!",
+ "update_notice_reload": "Ladda om för att slutföra uppdateringen",
+ "update_notice_update": "Följande plugins måste uppdateras: ",
+ "updated": "Uppdaterad"
+ },
+ "th": {
+ "add_to": "เพิ่มใน{{var0}}",
+ "ascending": "จากน้อยไปมาก",
+ "center": "อยู่กึ่งกลาง",
+ "changelog_added": "คุณสมบัติใหม่",
+ "changelog_fixed": "การแก้ไขปัญหา",
+ "changelog_improved": "การปรับปรุง",
+ "changelog_progress": "ความคืบหน้า",
+ "check_for_updates": "ตรวจสอบสำหรับการอัพเดต",
+ "clipboard_success": "คัดลอก {{var0}} ไปยังคลิปบอร์ดแล้ว",
+ "confirm": "คุณแน่ใจไหม?",
+ "copy": "คัดลอก {{var0}}",
+ "delete_fail": "ไม่สามารถลบ{{var0}}ได้",
+ "delete_success": "ลบ{{var0}}เรียบร้อยแล้ว",
+ "descending": "จากมากไปน้อย",
+ "developer": "ผู้พัฒนา",
+ "donate_message": "สนับสนุนฉันสำหรับการอัปเดตเพิ่มเติม!",
+ "download": "ดาวน์โหลด",
+ "download_fail": "ไม่สามารถดาวน์โหลด{{var0}}",
+ "download_success": "ดาวน์โหลด{{var0}}สำเร็จ",
+ "file_navigator_text": "เรียกดูไฟล์",
+ "first": "อันดับแรก",
+ "from": "จาก",
+ "gradient": "ไล่ระดับสี",
+ "guildbanner": "แบนเนอร์",
+ "guildicon": "ไอคอน",
+ "installed": "ติดตั้งแล้ว",
+ "last": "ล่าสุด",
+ "left": "ซ้าย",
+ "loading": "กำลังโหลด{{var0}}",
+ "location": "สถานที่",
+ "order": "ลำดับ",
+ "outdated": "เก่า",
+ "please_wait": "โปรดรอ",
+ "right": "ขวา",
+ "save_fail": "ไม่สามารถบันทึก{{var0}}ได้",
+ "save_success": "บันทึก{{var0}}เรียบร้อยแล้ว",
+ "send": "ส่ง {{var0}}",
+ "server": "เซิร์ฟเวอร์",
+ "settings_shareData_description": "ประสานการกำหนดค่าปลั๊กอินระหว่างบัญชีที่ไม่ลงรอยกัน",
+ "settings_showSupportBadges_description": "แสดงป้ายขนาดเล็กสำหรับผู้ใช้ที่สนับสนุน Patreon ของฉัน",
+ "settings_showToasts_description": "แสดงปลั๊กอินเริ่มและหยุดขนมปังปิ้ง",
+ "settings_showToasts_note": "ปิดการใช้งานการตั้งค่าทั่วไป '{{var0}}' ของ BD ก่อนปิดใช้งาน",
+ "settings_toastPosition_description": "ตำแหน่งขนมปังเริ่มต้น",
+ "settings_toastPosition_note": "เปลี่ยนเฉพาะตำแหน่งของขนมปังที่สร้างโดยปลั๊กอินของฉัน",
+ "settings_useChromium_description": "เปิดลิงค์ใน Discord แทนเบราว์เซอร์ของคุณ",
+ "sort_by": "จัดเรียงตาม",
+ "status": "สถานะ",
+ "time": "เวลา",
+ "timezone": "เขตเวลา",
+ "to": "ถึง",
+ "toast_plugin_loaded": "โหลด {{var0}} แล้ว",
+ "toast_plugin_started": "{{var0}} เริ่มแล้ว",
+ "toast_plugin_stopped": "{{var0}} หยุดทำงาน",
+ "toast_plugin_translated": "แปลเป็น {{var0}}",
+ "toast_plugin_unloaded": "ยกเลิกการโหลด {{var0}} แล้ว",
+ "toast_plugin_update_failed": "ไม่สามารถดาวน์โหลดการอัปเดตสำหรับ {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} ถูกแทนที่ด้วย {{var2}} {{var3}}",
+ "update_check_complete": "การตรวจสอบการอัปเดตปลั๊กอินเสร็จสมบูรณ์",
+ "update_check_complete_outdated": "การตรวจสอบการอัปเดตปลั๊กอินเสร็จสมบูรณ์ - {{var0}} ล้าสมัย!",
+ "update_check_info": "ตรวจสอบปลั๊กอินที่รองรับการตรวจสอบการอัปเดต",
+ "update_notice_click": "คลิกเพื่ออัพเดท!",
+ "update_notice_reload": "โหลดซ้ำเพื่ออัปเดตให้เสร็จสมบูรณ์",
+ "update_notice_update": "จำเป็นต้องอัปเดตปลั๊กอินต่อไปนี้: ",
+ "updated": "อัปเดตแล้ว"
+ },
+ "tr": {
+ "add_to": "{{var0}} ekle",
+ "ascending": "Artan",
+ "center": "Ortalanmış",
+ "changelog_added": "Yeni özellikler",
+ "changelog_fixed": "Sorun giderme",
+ "changelog_improved": "İyileştirmeler",
+ "changelog_progress": "Ilerleme",
+ "check_for_updates": "Güncellemeleri kontrol et",
+ "clipboard_success": "{{var0}} Panoya kopyalandı",
+ "confirm": "Emin misiniz?",
+ "copy": "{{var0}} kopyala",
+ "delete_fail": "{{var0}} silinemez",
+ "delete_success": "{{var0}} başarıyla silindi",
+ "descending": "Azalan",
+ "developer": "Geliştirici",
+ "donate_message": "Daha fazla güncelleme için beni destekleyin!",
+ "download": "İndir",
+ "download_fail": "{{var0}} indirilemez",
+ "download_success": "{{var0}} başarıyla indirildi",
+ "file_navigator_text": "Dosyaya Gözat",
+ "first": "İlk",
+ "from": "Nereden",
+ "gradient": "Gradyan",
+ "guildbanner": "Afiş",
+ "guildicon": "Simge",
+ "installed": "Kurulmuş",
+ "last": "Son",
+ "left": "Ayrıldı",
+ "loading": "Yükleniyor {{var0}}",
+ "location": "Yer",
+ "order": "Sıra",
+ "outdated": "Modası geçmiş",
+ "please_wait": "Lütfen bekle",
+ "right": "Sağ",
+ "save_fail": "{{var0}} kaydedilemez",
+ "save_success": "{{var0}} başarıyla kaydedildi",
+ "send": "{{var0}} gönder",
+ "server": "Sunucu",
+ "settings_shareData_description": "Eklenti Yapılandırmalarını Discord Hesapları arasında senkronize eder",
+ "settings_showSupportBadges_description": "Patreon'umu destekleyen kullanıcılar için küçük rozetler gösterir",
+ "settings_showToasts_description": "Eklenti başlangıç ve bitiş tostlarını gösterir",
+ "settings_showToasts_note": "Devre dışı bırakmadan önce BD'lerin genel ayarını '{{var0}}' devre dışı bırakın",
+ "settings_toastPosition_description": "Varsayılan Tost Konumu",
+ "settings_toastPosition_note": "Yalnızca Eklentileri tarafından oluşturulan Toastların Konumunu değiştirir",
+ "settings_useChromium_description": "Tarayıcınız yerine Discord'da Bağlantıları Açın",
+ "sort_by": "Göre sırala",
+ "status": "Durum",
+ "time": "Zaman",
+ "timezone": "Saat dilimi",
+ "to": "İçin",
+ "toast_plugin_loaded": "{{var0}} yüklendi",
+ "toast_plugin_started": "{{var0}} başladı",
+ "toast_plugin_stopped": "{{var0}} durdu",
+ "toast_plugin_translated": "{{var0}} diline çevrildi",
+ "toast_plugin_unloaded": "{{var0}} kaldırıldı",
+ "toast_plugin_update_failed": "{{var0}} için güncelleme indirilemiyor",
+ "toast_plugin_updated": "{{var0}} {{var1}}, {{var2}} {{var3}} ile değiştirildi",
+ "update_check_complete": "Eklenti güncelleme kontrolü tamamlandı",
+ "update_check_complete_outdated": "Eklenti güncelleme kontrolü tamamlandı - {{var0}} güncel değil!",
+ "update_check_info": "Güncelleme Kontrolünü destekleyen Eklentileri kontrol edin",
+ "update_notice_click": "Güncellemek için tıklayın!",
+ "update_notice_reload": "Güncellemeyi tamamlamak için yeniden yükleyin",
+ "update_notice_update": "Aşağıdaki Eklentileri güncellenmesi gerekiyor: ",
+ "updated": "Güncellenmiş"
+ },
+ "uk": {
+ "add_to": "Додати до {{var0}}",
+ "ascending": "Висхідний",
+ "center": "По центру",
+ "changelog_added": "Нові можливості",
+ "changelog_fixed": "Вирішення проблем",
+ "changelog_improved": "Покращення",
+ "changelog_progress": "Прогрес",
+ "check_for_updates": "Перевірити наявність оновлень",
+ "clipboard_success": "Скопійовано {{var0}} в буфер обміну",
+ "confirm": "Ти впевнений?",
+ "copy": "Копіювати {{var0}}",
+ "delete_fail": "{{var0}} не можна видалити",
+ "delete_success": "{{var0}} успішно видалено",
+ "descending": "За спаданням",
+ "developer": "Розробник",
+ "donate_message": "Підтримайте мене, щоб отримати більше оновлень!",
+ "download": "Завантажити",
+ "download_fail": "{{var0}} не можна завантажити",
+ "download_success": "{{var0}} завантажено успішно",
+ "file_navigator_text": "Переглянути файл",
+ "first": "Спочатку",
+ "from": "Від",
+ "gradient": "Градієнт",
+ "guildbanner": "Банер",
+ "guildicon": "Піктограма",
+ "installed": "Встановлено",
+ "last": "Останній",
+ "left": "Ліворуч",
+ "loading": "Завантаження {{var0}}",
+ "location": "Розташування",
+ "order": "Послідовність",
+ "outdated": "Застарілий",
+ "please_wait": "Задоволення почекайте",
+ "right": "Правильно",
+ "save_fail": "{{var0}} не можна зберегти",
+ "save_success": "{{var0}} успішно збережено",
+ "send": "Надіслати {{var0}}",
+ "server": "Сервер",
+ "settings_shareData_description": "Синхронізує конфігурації плагінів між обліковими записами Discord",
+ "settings_showSupportBadges_description": "Показує невеликі значки для користувачів, які підтримують мій Patreon",
+ "settings_showToasts_description": "Показує тости запуску та зупинки плагіна",
+ "settings_showToasts_note": "Вимкніть загальне налаштування '{{var0}}' BD, перш ніж їх вимикати",
+ "settings_toastPosition_description": "Позиція тостів за замовчуванням",
+ "settings_toastPosition_note": "Змінює лише позицію тостів, створених моїми плагіни",
+ "settings_useChromium_description": "Відкрийте посилання в Discord замість браузера",
+ "sort_by": "Сортувати за",
+ "status": "Статус",
+ "time": "Час",
+ "timezone": "Часовий пояс",
+ "to": "До",
+ "toast_plugin_loaded": "{{var0}} завантажено",
+ "toast_plugin_started": "{{var0}} розпочато",
+ "toast_plugin_stopped": "{{var0}} зупинено",
+ "toast_plugin_translated": "перекладено на {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} вивантажено",
+ "toast_plugin_update_failed": "Не вдається завантажити оновлення для {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} замінено на {{var2}} {{var3}}",
+ "update_check_complete": "Завершено перевірку оновлення плагіна",
+ "update_check_complete_outdated": "Завершено перевірку оновлення плагіна - {{var0}} застаріло!",
+ "update_check_info": "Перевірте плагіни, які підтримують перевірку оновлення",
+ "update_notice_click": "Натисніть, щоб оновити!",
+ "update_notice_reload": "Перезавантажте, щоб завершити оновлення",
+ "update_notice_update": "Потрібно оновити такі плагіни: ",
+ "updated": "Оновлено"
+ },
+ "vi": {
+ "add_to": "Thêm vào {{var0}}",
+ "ascending": "Tăng dần",
+ "center": "Căn giữa",
+ "changelog_added": "Các tính năng mới",
+ "changelog_fixed": "Xử lý sự cố",
+ "changelog_improved": "Cải tiến",
+ "changelog_progress": "Phát triển",
+ "check_for_updates": "Kiểm tra cập nhật",
+ "clipboard_success": "Đã sao chép {{var0}} vào Clipboard",
+ "confirm": "Bạn có chắc không?",
+ "copy": "Sao chép {{var0}}",
+ "delete_fail": "{{var0}} không thể bị xóa",
+ "delete_success": "Đã xóa {{var0}} thành công",
+ "descending": "Giảm dần",
+ "developer": "Người phát triển",
+ "donate_message": "Hỗ trợ tôi để cập nhật thêm!",
+ "download": "Tải xuống",
+ "download_fail": "Không thể tải xuống {{var0}}",
+ "download_success": "Đã tải xuống {{var0}} thành công",
+ "file_navigator_text": "Chọn thư mục",
+ "first": "Đầu tiên",
+ "from": "Từ",
+ "gradient": "Dốc",
+ "guildbanner": "Ảnh bìa",
+ "guildicon": "Biểu tượng",
+ "installed": "Cài đặt",
+ "last": "Cuối cùng",
+ "left": "Trái",
+ "loading": "Đang tải {{var0}}",
+ "location": "Vị trí",
+ "order": "Sự nối tiếp",
+ "outdated": "Lỗi thời",
+ "please_wait": "Hân hạnh chờ đợi",
+ "right": "Đúng",
+ "save_fail": "{{var0}} không thể lưu được",
+ "save_success": "{{var0}} đã được lưu thành công",
+ "send": "Gửi cho {{var0}}",
+ "server": "Người phục vụ",
+ "settings_shareData_description": "Đồng bộ hóa cấu hình plugin giữa các tài khoản Discord",
+ "settings_showSupportBadges_description": "Hiển thị các huy hiệu nhỏ cho những người dùng ủng hộ Patreon của tôi",
+ "settings_showToasts_description": "Hiển thị plugin bắt đầu và dừng nâng cốc",
+ "settings_showToasts_note": "Tắt cài đặt chung '{{var0}}' của BD trước khi tắt chúng",
+ "settings_toastPosition_description": "Vị trí bánh mì nướng mặc định",
+ "settings_toastPosition_note": "Chỉ thay đổi Vị trí của Bánh nướng được tạo bởi plugins của tôi",
+ "settings_useChromium_description": "Mở Liên kết trong Discord thay vì Trình duyệt của bạn",
+ "sort_by": "Sắp xếp theo",
+ "status": "Trạng thái",
+ "time": "Thời gian",
+ "timezone": "Múi giờ",
+ "to": "Đến",
+ "toast_plugin_loaded": "{{var0}} đã được tải",
+ "toast_plugin_started": "{{var0}} đã bắt đầu",
+ "toast_plugin_stopped": "{{var0}} đã dừng",
+ "toast_plugin_translated": "đã dịch sang {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} đã được tải xuống",
+ "toast_plugin_update_failed": "Không thể tải xuống bản cập nhật cho {{var0}}",
+ "toast_plugin_updated": "{{var0}} {{var1}} đã được thay thế bằng {{var2}} {{var3}}",
+ "update_check_complete": "Đã hoàn tất kiểm tra cập nhật plugin",
+ "update_check_complete_outdated": "Đã hoàn tất kiểm tra cập nhật plugin - {{var0}} đã lỗi thời!",
+ "update_check_info": "Kiểm tra các plugins hỗ trợ Kiểm tra cập nhật",
+ "update_notice_click": "Bấm để cập nhật!",
+ "update_notice_reload": "Tải lại để hoàn tất cập nhật",
+ "update_notice_update": "Các plugins sau cần được cập nhật: ",
+ "updated": "Đã cập nhật"
+ },
+ "zh-CN": {
+ "add_to": "添加到 {{var0}}",
+ "ascending": "上升",
+ "center": "居中",
+ "changelog_added": "新的功能",
+ "changelog_fixed": "故障排除",
+ "changelog_improved": "改进之处",
+ "changelog_progress": "进展",
+ "check_for_updates": "检查更新",
+ "clipboard_success": "已将 {{var0}} 复制到剪贴板",
+ "confirm": "你确定吗?",
+ "copy": "复制 {{var0}}",
+ "delete_fail": "{{var0}} 无法删除",
+ "delete_success": "{{var0}} 成功删除",
+ "descending": "降序",
+ "developer": "开发商",
+ "donate_message": "支持我更多更新!",
+ "download": "下载",
+ "download_fail": "{{var0}} 无法下载",
+ "download_success": "{{var0}} 已成功下载",
+ "file_navigator_text": "浏览文件",
+ "first": "第一",
+ "from": "从",
+ "gradient": "梯度",
+ "guildbanner": "旗帜",
+ "guildicon": "图标",
+ "installed": "已安装",
+ "last": "持续",
+ "left": "剩下",
+ "loading": "正在加载 {{var0}}",
+ "location": "地点",
+ "order": "顺序",
+ "outdated": "过时的",
+ "please_wait": "请稍等",
+ "right": "对",
+ "save_fail": "{{var0}} 无法保存",
+ "save_success": "{{var0}} 保存成功",
+ "send": "发送 {{var0}}",
+ "server": "服务器",
+ "settings_shareData_description": "在 Discord 帐户之间同步插件配置",
+ "settings_showSupportBadges_description": "为支持我的 Patreon 的用户显示小徽章",
+ "settings_showToasts_description": "显示插件开始和停止烤面包",
+ "settings_showToasts_note": "禁用 BD 的常规设置 '{{var0}}' 之前将其禁用",
+ "settings_toastPosition_description": "默认吐司位置",
+ "settings_toastPosition_note": "仅更改由我的插件创建的吐司位置",
+ "settings_useChromium_description": "在 Discord (而不是浏览器)中打开链接",
+ "sort_by": "排序方式",
+ "status": "地位",
+ "time": "时间",
+ "timezone": "时区",
+ "to": "至",
+ "toast_plugin_loaded": "{{var0}} 已加载",
+ "toast_plugin_started": "{{var0}} 已开始",
+ "toast_plugin_stopped": "{{var0}} 已停止",
+ "toast_plugin_translated": "转换为 {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} 已卸载",
+ "toast_plugin_update_failed": "无法下载 {{var0}} 的更新",
+ "toast_plugin_updated": "{{var0}} {{var1}} 已替换为 {{var2}} {{var3}}",
+ "update_check_complete": "插件更新检查完成",
+ "update_check_complete_outdated": "插件更新检查完成 - {{var0}} 已过期!",
+ "update_check_info": "检查支持更新检查的插件",
+ "update_notice_click": "点击更新!",
+ "update_notice_reload": "重新加载以完成更新",
+ "update_notice_update": "以下插件需要更新: ",
+ "updated": "更新"
+ },
+ "zh-TW": {
+ "add_to": "添加至 {{var0}}",
+ "ascending": "升序",
+ "center": "置中",
+ "changelog_added": "新的功能",
+ "changelog_fixed": "故障排除",
+ "changelog_improved": "改進之處",
+ "changelog_progress": "進展",
+ "check_for_updates": "檢查更新",
+ "clipboard_success": "已將 {{var0}} 複製到剪貼板",
+ "confirm": "你確定嗎?",
+ "copy": "複製 {{var0}}",
+ "delete_fail": "{{var0}} 無法刪除",
+ "delete_success": "{{var0}} 成功刪除",
+ "descending": "降序",
+ "developer": "開發商",
+ "donate_message": "支持我更多更新!",
+ "download": "下載",
+ "download_fail": "{{var0}} 無法下載",
+ "download_success": "{{var0}} 已成功下載",
+ "file_navigator_text": "瀏覽文件",
+ "first": "第一",
+ "from": "從",
+ "gradient": "梯度",
+ "guildbanner": "橫幅",
+ "guildicon": "圖標",
+ "installed": "已安裝",
+ "last": "最後",
+ "left": "左邊",
+ "loading": "正在加載 {{var0}}",
+ "location": "地點",
+ "order": "舊的",
+ "outdated": "過時的",
+ "please_wait": "請稍等",
+ "right": "右邊",
+ "save_fail": "{{var0}} 無法保存",
+ "save_success": "{{var0}} 保存成功",
+ "send": "發送 {{var0}}",
+ "server": "伺服器",
+ "settings_shareData_description": "在 Discord 帳戶之間同步插件配置",
+ "settings_showSupportBadges_description": "為在 Patreon 支持我的用戶顯示小徽章",
+ "settings_showToasts_description": "顯示插件啟動和停止通知框",
+ "settings_showToasts_note": "在禁用此功能之前先關閉 BD 的 '{{var0}}' 設置",
+ "settings_toastPosition_description": "預設通知框位置",
+ "settings_toastPosition_note": "僅更改由我的插件創建的通知框位置",
+ "settings_useChromium_description": "在 Discord (而不是瀏覽器)中打開連結",
+ "sort_by": "排序方式",
+ "status": "狀態",
+ "time": "時間",
+ "timezone": "時區",
+ "to": "至",
+ "toast_plugin_loaded": "{{var0}} 已加載",
+ "toast_plugin_started": "{{var0}} 已啟動",
+ "toast_plugin_stopped": "{{var0}} 已停止",
+ "toast_plugin_translated": "轉換為 {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} 已被卸載",
+ "toast_plugin_update_failed": "無法下載 {{var0}} 的更新",
+ "toast_plugin_updated": "{{var0}} {{var1}} 已替換為 {{var2}} {{var3}}",
+ "update_check_complete": "插件更新檢查完成",
+ "update_check_complete_outdated": "插件更新檢查完成 - {{var0}} 已過期!",
+ "update_check_info": "檢查支持更新檢查的插件",
+ "update_notice_click": "點擊更新!",
+ "update_notice_reload": "重新加載以完成更新",
+ "update_notice_update": "以下插件需要更新: ",
+ "updated": "更新"
+ },
+ "default": {
+ "add_to": "Add to {{var0}}",
+ "ascending": "Ascending",
+ "center": "Centered",
+ "changelog_added": "New Features",
+ "changelog_fixed": "Bug Fixes",
+ "changelog_improved": "Improvements",
+ "changelog_progress": "Progress",
+ "check_for_updates": "Check for Updates",
+ "clipboard_success": "Copied {{var0}} to Clipboard",
+ "confirm": "Are you sure?",
+ "copy": "Copy {{var0}}",
+ "delete_fail": "{{var0}} cannot be deleted",
+ "delete_success": "{{var0}} deleted successfully",
+ "descending": "Descending",
+ "developer": "Developer",
+ "donate_message": "Support me to receive further Updates!",
+ "download": "Download",
+ "download_fail": "{{var0}} cannot be downloaded",
+ "download_success": "{{var0}} downloaded successfully",
+ "file_navigator_text": "Browse File",
+ "first": "First",
+ "from": "From",
+ "gradient": "Gradient",
+ "guildbanner": "Banner",
+ "guildicon": "Icon",
+ "installed": "Installed",
+ "last": "Last",
+ "left": "Left",
+ "loading": "Loading {{var0}}",
+ "location": "Location",
+ "order": "Order",
+ "outdated": "Outdated",
+ "please_wait": "Please wait",
+ "right": "Right",
+ "save_fail": "{{var0}} cannot be saved",
+ "save_success": "{{var0}} saved successfully",
+ "send": "Send {{var0}}",
+ "server": "Server",
+ "settings_shareData_description": "Synchronizes the Plugin Configs between Discord Accounts",
+ "settings_showSupportBadges_description": "Shows small Badges for Users who support my Patreon",
+ "settings_showToasts_description": "Shows Plugin start and stop Toasts",
+ "settings_showToasts_note": "Disable BDs general '{{var0}}' setting before disabling this",
+ "settings_toastPosition_description": "Default Toast Position",
+ "settings_toastPosition_note": "Only changes Position of Toasts created by my Plugins",
+ "settings_useChromium_description": "Open Links in Discord instead of your Browser",
+ "sort_by": "Sort by",
+ "status": "Status",
+ "time": "Time",
+ "timezone": "Timezone",
+ "to": "To",
+ "toast_plugin_loaded": "{{var0}} has been loaded",
+ "toast_plugin_started": "{{var0}} has been started",
+ "toast_plugin_stopped": "{{var0}} has been stopped",
+ "toast_plugin_translated": "translated to {{var0}}",
+ "toast_plugin_unloaded": "{{var0}} has been unloaded",
+ "toast_plugin_update_failed": "Update for {{var0}} cannot be downloaded",
+ "toast_plugin_updated": "{{var0}} {{var1}} has been replaced by {{var2}} {{var3}}",
+ "update_check_complete": "Plugin Update Check completed",
+ "update_check_complete_outdated": "Plugin Update Check completed - {{var0}} outdated!",
+ "update_check_info": "Check Plugins that support the Update Check",
+ "update_notice_click": "Click to update!",
+ "update_notice_reload": "Reload to complete the Update",
+ "update_notice_update": "The following Plugins need to be updated: ",
+ "updated": "Updated"
+ }
+ },
+ "BDFDB_Patrons": {
+ "1113460780113854525": {"active": true, "tier": "t2", "text": "", "color": "", "id": "pinguwu (hugo)"},
+ "864982372751245313": {"active": true, "tier": "t2", "text": "", "color": "", "id": "windowsuss (fynn)"},
+ "148234730523852800": {"active": true, "tier": "t2", "text": "", "color": "", "id": "inbroso (MaEp)"},
+ "105509397211406336": {"active": true, "tier": "t2", "text": "", "color": "", "id": "samtino (SgJeff)"},
+ "323494393828999168": {"active": true, "tier": "t2", "text": "", "color": "", "id": "polak (SzKu)"},
+ "507464069100601363": {"active": true, "tier": "t2", "text": "", "color": "", "id": "cracky (MiPo)"},
+ "620397524494057513": {"active": true, "tier": "t2", "text": "", "color": "", "id": "FUSL"},
+ "798499176220327966": {"active": true, "tier": "t2", "text": "", "color": "", "id": "void (JaUt)"}
+ },
+ "BDFDB_Patron_Tiers": {
+ "t1": {
+ "text": ""
+ },
+ "t2": {
+ "text": "BDFDB Patron"
+ },
+ "t3": {
+ "text": "BDFDB Patron+"
+ },
+ "t4": {
+ "text": "BDFDB Special Supporter"
+ }
+ }
+}
diff --git a/Configs/BetterDiscord/plugins/0BDFDB.plugin.js b/Configs/BetterDiscord/plugins/0BDFDB.plugin.js
new file mode 100644
index 0000000..70b1076
--- /dev/null
+++ b/Configs/BetterDiscord/plugins/0BDFDB.plugin.js
@@ -0,0 +1,8725 @@
+/**
+ * @name BDFDB
+ * @author DevilBro
+ * @authorId 278543574059057154
+ * @version 3.6.5
+ * @description Required Library for DevilBro's Plugins
+ * @invite Jx3TjNS
+ * @donate https://www.paypal.me/MircoWittrien
+ * @patreon https://www.patreon.com/MircoWittrien
+ * @website https://mwittrien.github.io/
+ * @source https://github.com/mwittrien/BetterDiscordAddons/tree/master/Library/
+ * @updateUrl https://mwittrien.github.io/BetterDiscordAddons/Library/0BDFDB.plugin.js
+ */
+
+module.exports = (_ => {
+ if (window.BDFDB_Global && window.BDFDB_Global.PluginUtils && typeof window.BDFDB_Global.PluginUtils.cleanUp == "function") window.BDFDB_Global.PluginUtils.cleanUp(window.BDFDB_Global);
+
+ const fs = require("fs"), path = require("path");
+
+ var BDFDB, Internal;
+ var LibraryRequires = {};
+ var DiscordObjects = {}, DiscordConstants = {};
+ var LibraryStores = {}, LibraryModules = {};
+ var LibraryComponents = {}, NativeSubComponents = {}, CustomComponents = {};
+ var PluginStores = {};
+
+ BDFDB = {
+ started: true,
+ changeLog: {
+
+ }
+ };
+
+ return class BDFDB_Frame {
+ constructor (meta) {for (let key in meta) {
+ if (!this[key]) this[key] = meta[key];
+ if (!BDFDB[key]) BDFDB[key] = meta[key];
+ }}
+ getName () {return this.name;}
+ getAuthor () {return this.author;}
+ getVersion () {return this.version;}
+ getDescription () {return this.description;}
+
+ load () {
+ const BdApi = window.BdApi;
+
+ const Cache = {data: {}, modules: {}};
+
+ var changeLogs = {};
+
+ Internal = Object.assign({}, BDFDB, {
+ patchPriority: 0,
+ forceSyncData: true,
+ settings: {},
+ defaults: {
+ general: {
+ shareData: {
+ value: true,
+ onChange: _ => Cache.data = {}
+ },
+ showToasts: {
+ value: true,
+ isDisabled: data => data.nativeValue,
+ hasNote: data => data.disabled && data.value
+ },
+ showSupportBadges: {
+ value: false
+ },
+ useChromium: {
+ value: false,
+ isHidden: data => !Internal.LibraryRequires.electron || !Internal.LibraryRequires.electron.remote,
+ getValue: data => !data.disabled
+ }
+ },
+ choices: {
+ toastPosition: {
+ value: "right",
+ items: "ToastPositions"
+ }
+ }
+ },
+ });
+ for (let key in Internal.defaults) Internal.settings[key] = {};
+
+ PluginStores = {
+ loaded: {},
+ delayed: {
+ loads: [],
+ starts: []
+ },
+ updateData: {
+ plugins: {},
+ timeouts: [],
+ downloaded: [],
+ interval: null
+ },
+ modulePatches: {}
+ };
+
+ const Plugin = function (changeLog) {
+ return class Plugin {
+ constructor (meta) {for (let key in meta) if (!this[key]) this[key] = meta[key];}
+ getName () {return this.name;}
+ getAuthor () {return this.author;}
+ getVersion () {return this.version;}
+ getDescription () {return this.description;}
+ load () {
+ this.changeLog = changeLog;
+ this.loaded = true;
+ this.defaults = {};
+ this.labels = {};
+ if (window.BDFDB_Global.loading) {
+ if (!PluginStores.delayed.loads.includes(this)) PluginStores.delayed.loads.push(this);
+ }
+ else BDFDB.TimeUtils.suppress(_ => {
+ PluginStores.loaded[this.name] = this;
+ BDFDB.PluginUtils.load(this);
+ if (typeof this.onLoad == "function") this.onLoad();
+ }, "Failed to load Plugin!", this)();
+ }
+ start () {
+ if (!this.loaded) this.load();
+ if (window.BDFDB_Global.loading) {
+ if (!PluginStores.delayed.starts.includes(this)) PluginStores.delayed.starts.push(this);
+ }
+ else {
+ if (this.started) return;
+ this.started = true;
+ BDFDB.TimeUtils.suppress(_ => {
+ BDFDB.PluginUtils.init(this);
+ if (typeof this.onStart == "function") this.onStart();
+ }, "Failed to start Plugin!", this)();
+ delete this.stopping;
+ }
+ }
+ stop () {
+ if (window.BDFDB_Global.loading) {
+ if (PluginStores.delayed.starts.includes(this)) PluginStores.delayed.starts.splice(PluginStores.delayed.starts.indexOf(this), 1);
+ }
+ else {
+ if (this.stopping) return;
+ this.stopping = true;
+ BDFDB.TimeUtils.timeout(_ => {delete this.stopping;});
+
+ BDFDB.TimeUtils.suppress(_ => {
+ if (typeof this.onStop == "function") this.onStop();
+ BDFDB.PluginUtils.clear(this);
+ }, "Failed to stop Plugin!", this)();
+
+ delete this.started;
+ }
+ }
+ };
+ };
+
+ const requestFunction = function (...args) {
+ let url = typeof args[0] == "string" && args[0];
+ if (!url) return;
+ let callback = typeof args[1] == "function" && args[1] || typeof args[2] == "function" && args[2];
+ if (typeof callback != "function") return;
+ if (url.indexOf("data:") == 0) callback(null, {
+ aborted: false,
+ complete: true,
+ end: undefined,
+ headers: {"content-type": url.slice(5).split(";")[0]},
+ method: null,
+ rawHeaders: [],
+ statusCode: 200,
+ statusMessage: "OK",
+ url: ""
+ }, url);
+ else {
+ let config = args[1] && typeof args[1] == "object" ? args[1] : {};
+ let timeout = 600000;
+ if (!isNaN(parseInt(config.timeout)) && config.timeout > 0) timeout = config.timeout;
+ if (config.form && typeof config.form == "object") {
+ let query = Object.entries(config.form).map(n => n[0] + "=" + n[1]).join("&");
+ if (query) url += `?${query}`;
+ }
+ if (config.method) config.method = config.method.toUpperCase();
+ let killed = false, timeoutObj = BDFDB.TimeUtils.timeout(_ => {
+ killed = true;
+ BDFDB.TimeUtils.clear(timeoutObj);
+ callback(new Error(`Request Timeout after ${timeout}ms`), {
+ aborted: false,
+ complete: true,
+ end: undefined,
+ headers: {},
+ method: null,
+ rawHeaders: [],
+ statusCode: 408,
+ statusMessage: "OK",
+ url: ""
+ }, null);
+ }, timeout);
+ let response = null, isFallback = false;
+ return (config.bdVersion && BdApi && BdApi.Net && BdApi.Net.fetch ? BdApi.Net.fetch : fetch)(url, config).catch(error => {
+ BDFDB.TimeUtils.clear(timeoutObj);
+ if (!config.bdVersion) return requestFunction(url, Object.assign({}, config, {bdVersion: true}), callback);
+ else callback(new Error(error), {
+ aborted: false,
+ complete: true,
+ end: undefined,
+ headers: {},
+ method: null,
+ rawHeaders: [],
+ statusCode: 408,
+ statusMessage: "OK",
+ url: ""
+ }, null);
+ }).then(r => {
+ response = r;
+ if (!response) return;
+ response.statusCode = response.status;
+ if (response.headers) response.headers["content-type"] = response.headers.get("content-type");
+ BDFDB.TimeUtils.clear(timeoutObj);
+ return config.toBase64 ? response.blob() : config.toBuffer ? response.arrayBuffer() : response.text();
+ }).then(result => {
+ if (!killed && response) {
+ if (!config.toBase64 || response.status != 200) callback(response.status != 200 ? new Error(response.statusText || "Fetch Failed") : null, response, result);
+ else {
+ let reader = new FileReader();
+ reader.onload = _ => callback(null, response, reader.result);
+ reader.readAsDataURL(result);
+ }
+ }
+ });
+ }
+ };
+
+ BDFDB.LogUtils = {};
+ Internal.console = function (type, config = {}) {
+ if (!console[type]) return;
+ let name, version;
+ if (typeof config.name == "string" && config.name) {
+ name = config.name;
+ version = typeof config.version == "string" ? config.version : "";
+ }
+ else {
+ name = BDFDB.name;
+ version = BDFDB.version;
+ }
+ console[type](...[[name && `%c[${name}]`, version && `%c(v${version})`].filter(n => n).join(" "), name && "color: #3a71c1; font-weight: 700;", version && "color: #666; font-weight: 600; font-size: 11px;", [config.strings].flat(10).filter(n => n).join(" ").trim()].filter(n => n));
+ };
+ BDFDB.LogUtils.log = function (strings, config = {}) {
+ Internal.console("log", Object.assign({}, config, {name: typeof config == "string" ? config : config.name, strings}));
+ };
+ BDFDB.LogUtils.warn = function (strings, config = {}) {
+ Internal.console("warn", Object.assign({}, config, {name: typeof config == "string" ? config : config.name, strings}));
+ };
+ BDFDB.LogUtils.error = function (strings, config = {}) {
+ Internal.console("error", Object.assign({}, config, {name: typeof config == "string" ? config : config.name, strings: ["Fatal Error:", strings]}));
+ };
+
+ BDFDB.TimeUtils = {};
+ BDFDB.TimeUtils.interval = function (callback, delay, ...args) {
+ if (typeof callback != "function" || typeof delay != "number" || delay < 1) return;
+ else {
+ let count = 0, interval = setInterval(_ => BDFDB.TimeUtils.suppress(callback, "Interval")(...[interval, count++, args].flat()), delay);
+ return interval;
+ }
+ };
+ BDFDB.TimeUtils.timeout = function (callback, delay, ...args) {
+ delay = parseFloat(delay);
+ if (typeof callback != "function") return;
+ if (isNaN(delay) || typeof delay != "number" || delay < 1) {
+ let immediate = setImmediate(_ => BDFDB.TimeUtils.suppress(callback, "Immediate")(...[immediate, args].flat()));
+ return immediate;
+ }
+ else {
+ let start, paused = true, timeout = {
+ pause: _ => {
+ if (paused) return;
+ paused = true;
+ BDFDB.TimeUtils.clear(timeout.timer);
+ delay -= performance.now() - start;
+ },
+ resume: _ => {
+ if (!paused) return;
+ paused = false;
+ start = performance.now();
+ timeout.timer = setTimeout(_ => BDFDB.TimeUtils.suppress(callback, "Timeout")(...[timeout, args].flat()), delay)
+ }
+ };
+ timeout.resume();
+ return timeout;
+ }
+ };
+ BDFDB.TimeUtils.clear = function (...timeObjects) {
+ for (let t of timeObjects.flat(10).filter(n => n)) {
+ t = t.timer != undefined ? t.timer : t;
+ if (typeof t == "number") {
+ clearInterval(t);
+ clearTimeout(t);
+ }
+ else if (typeof t == "object") clearImmediate(t);
+ }
+ };
+ BDFDB.TimeUtils.suppress = function (callback, strings, config) {return function (...args) {
+ try {return callback(...args);}
+ catch (err) {BDFDB.LogUtils.error([strings, err], config);}
+ }};
+
+ BDFDB.LogUtils.log("Loading Library");
+
+ BDFDB.sameProto = function (a, b) {
+ if (a != null && typeof a == "object") return a.constructor && a.constructor.prototype && typeof a.constructor.prototype.isPrototypeOf == "function" && a.constructor.prototype.isPrototypeOf(b);
+ else return typeof a == typeof b;
+ };
+ BDFDB.equals = function (mainA, mainB, sorted) {
+ let i = -1;
+ if (sorted === undefined || typeof sorted !== "boolean") sorted = false;
+ return equal(mainA, mainB);
+ function equal(a, b) {
+ i++;
+ let result = true;
+ if (i > 1000) result = null;
+ else {
+ if (typeof a !== typeof b) result = false;
+ else if (typeof a == "function") result = a.toString() == b.toString();
+ else if (typeof a === "undefined") result = true;
+ else if (typeof a === "symbol") result = true;
+ else if (typeof a === "boolean") result = a == b;
+ else if (typeof a === "string") result = a == b;
+ else if (typeof a === "number") {
+ if (isNaN(a) || isNaN(b)) result = isNaN(a) == isNaN(b);
+ else result = a == b;
+ }
+ else if (!a && !b) result = true;
+ else if (!a || !b) result = false;
+ else if (typeof a === "object") {
+ let keysA = Object.getOwnPropertyNames(a);
+ let keysB = Object.getOwnPropertyNames(b);
+ if (keysA.length !== keysB.length) result = false;
+ else for (let j = 0; result === true && j < keysA.length; j++) {
+ if (sorted) result = equal(a[keysA[j]], b[keysB[j]]);
+ else result = equal(a[keysA[j]], b[keysA[j]]);
+ }
+ }
+ }
+ i--;
+ return result;
+ }
+ };
+
+ BDFDB.ObjectUtils = {};
+ BDFDB.ObjectUtils.is = function (obj) {
+ return obj && !Array.isArray(obj) && !Set.prototype.isPrototypeOf(obj) && (typeof obj == "function" || typeof obj == "object");
+ };
+ BDFDB.ObjectUtils.get = function (nodeOrObj, valuePath) {
+ if (!nodeOrObj || !valuePath) return null;
+ let obj = Node.prototype.isPrototypeOf(nodeOrObj) ? BDFDB.ReactUtils.getInstance(nodeOrObj) : nodeOrObj;
+ if (!BDFDB.ObjectUtils.is(obj)) return null;
+ let found = obj;
+ for (const value of valuePath.split(".").filter(n => n)) {
+ if (!found) return null;
+ found = found[value];
+ }
+ return found;
+ };
+ BDFDB.ObjectUtils.invert = function (obj) {
+ let newObj = {};
+ if (BDFDB.ObjectUtils.is(obj)) for (let entry of Object.entries(obj)) newObj[entry[1]] = entry[0];
+ return newObj;
+ };
+ BDFDB.ObjectUtils.extract = function (obj, ...keys) {
+ let newObj = {};
+ if (BDFDB.ObjectUtils.is(obj)) for (let key of keys.flat(10).filter(n => n)) if (obj[key] != null) newObj[key] = obj[key];
+ return newObj;
+ };
+ BDFDB.ObjectUtils.exclude = function (obj, ...keys) {
+ let newObj = Object.assign({}, obj);
+ BDFDB.ObjectUtils.delete(newObj, ...keys)
+ return newObj;
+ };
+ BDFDB.ObjectUtils.delete = function (obj, ...keys) {
+ if (BDFDB.ObjectUtils.is(obj)) for (let key of keys.flat(10).filter(n => n)) delete obj[key];
+ };
+ BDFDB.ObjectUtils.sort = function (obj, sort, except) {
+ if (!BDFDB.ObjectUtils.is(obj)) return {};
+ let newObj = {};
+ if (sort === undefined || !sort) for (let key of Object.keys(obj).sort()) newObj[key] = obj[key];
+ else {
+ let values = [];
+ for (let key in obj) values.push(obj[key]);
+ values = BDFDB.ArrayUtils.keySort(values, sort, except);
+ for (let value of values) for (let key in obj) if (BDFDB.equals(value, obj[key])) {
+ newObj[key] = value;
+ break;
+ }
+ }
+ return newObj;
+ };
+ BDFDB.ObjectUtils.filter = function (obj, filter, byKey = false) {
+ if (!BDFDB.ObjectUtils.is(obj)) return {};
+ if (typeof filter != "function") return obj;
+ return Object.keys(obj).filter(key => filter(byKey ? key : obj[key])).reduce((newObj, key) => (newObj[key] = obj[key], newObj), {});
+ };
+ BDFDB.ObjectUtils.map = function (obj, mapFunc) {
+ if (!BDFDB.ObjectUtils.is(obj)) return {};
+ if (typeof mapFunc != "string" && typeof mapFunc != "function") return obj;
+ let newObj = {};
+ for (let key in obj) if (BDFDB.ObjectUtils.is(obj[key])) newObj[key] = typeof mapFunc == "string" ? obj[key][mapFunc] : mapFunc(obj[key], key);
+ return newObj;
+ };
+ BDFDB.ObjectUtils.toArray = function (obj) {
+ if (!BDFDB.ObjectUtils.is(obj)) return [];
+ return Object.entries(obj).map(n => n[1]);
+ };
+ BDFDB.ObjectUtils.deepAssign = function (obj, ...objs) {
+ if (!objs.length) return obj;
+ let nextObj = objs.shift();
+ if (BDFDB.ObjectUtils.is(obj) && BDFDB.ObjectUtils.is(nextObj)) {
+ for (let key in nextObj) {
+ if (BDFDB.ObjectUtils.is(nextObj[key])) {
+ if (!obj[key]) Object.assign(obj, {[key]:{}});
+ BDFDB.ObjectUtils.deepAssign(obj[key], nextObj[key]);
+ }
+ else Object.assign(obj, {[key]:nextObj[key]});
+ }
+ }
+ return BDFDB.ObjectUtils.deepAssign(obj, ...objs);
+ };
+ BDFDB.ObjectUtils.isEmpty = function (obj) {
+ return !BDFDB.ObjectUtils.is(obj) || Object.getOwnPropertyNames(obj).length == 0;
+ };
+ BDFDB.ObjectUtils.copy = function (obj) {
+ if (!BDFDB.ObjectUtils.is(obj)) return obj;
+ let copy = {};
+ for (let key in obj) copy[key] = obj[key];
+ for (let key of Reflect.ownKeys(obj.constructor.prototype)) if (!copy[key] && obj[key] !== undefined) copy[key] = obj[key];
+ return copy;
+ };
+
+ BDFDB.ArrayUtils = {};
+ BDFDB.ArrayUtils.is = function (array) {
+ return array && Array.isArray(array);
+ };
+ BDFDB.ArrayUtils.sum = function (array) {
+ return Array.isArray(array) ? array.reduce((total, num) => total + Math.round(num), 0) : 0;
+ };
+ BDFDB.ArrayUtils.keySort = function (array, key, except) {
+ if (!BDFDB.ArrayUtils.is(array)) return [];
+ if (key == null) return array;
+ if (except === undefined) except = null;
+ return array.sort((x, y) => {
+ let xValue = x[key], yValue = y[key];
+ if (xValue !== except) return xValue < yValue ? -1 : xValue > yValue ? 1 : 0;
+ });
+ };
+ BDFDB.ArrayUtils.numSort = function (array) {
+ return array.sort((x, y) => (x < y ? -1 : x > y ? 1 : 0));
+ };
+ BDFDB.ArrayUtils.includes = function (array, ...values) {
+ if (!BDFDB.ArrayUtils.is(array)) return null;
+ if (!array.length) return false;
+ let all = values.pop();
+ if (typeof all != "boolean") {
+ values.push(all);
+ all = true;
+ }
+ if (!values.length) return false;
+ let contained = undefined;
+ for (let v of values) {
+ if (contained === undefined) contained = all;
+ if (all && !array.includes(v)) contained = false;
+ if (!all && array.includes(v)) contained = true;
+ }
+ return contained;
+ };
+ BDFDB.ArrayUtils.remove = function (array, value, all = false) {
+ if (!BDFDB.ArrayUtils.is(array)) return [];
+ if (!array.includes(value)) return array;
+ if (!all) array.splice(array.indexOf(value), 1);
+ else while (array.indexOf(value) > -1) array.splice(array.indexOf(value), 1);
+ return array;
+ };
+ BDFDB.ArrayUtils.removeCopies = function (array) {
+ if (!BDFDB.ArrayUtils.is(array)) return [];
+ return [...new Set(array)];
+ };
+ BDFDB.ArrayUtils.getAllIndexes = function (array, value) {
+ if (!BDFDB.ArrayUtils.is(array) && typeof array != "string") return [];
+ var indexes = [], index = -1;
+ while ((index = array.indexOf(value, index + 1)) !== -1) indexes.push(index);
+ return indexes;
+ };
+
+ BDFDB.BDUtils = {};
+ BDFDB.BDUtils.getPluginsFolder = function () {
+ if (BdApi && BdApi.Plugins && BdApi.Plugins.folder && typeof BdApi.Plugins.folder == "string") return BdApi.Plugins.folder;
+ else if (Internal.LibraryRequires.process.env.BETTERDISCORD_DATA_PATH) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.BETTERDISCORD_DATA_PATH, "plugins/");
+ else if (Internal.LibraryRequires.process.env.injDir) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.injDir, "plugins/");
+ else switch (Internal.LibraryRequires.process.platform) {
+ case "win32":
+ return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.appdata, "BetterDiscord/plugins/");
+ case "darwin":
+ return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.HOME, "Library/Preferences/BetterDiscord/plugins/");
+ default:
+ if (Internal.LibraryRequires.process.env.XDG_CONFIG_HOME) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.XDG_CONFIG_HOME, "BetterDiscord/plugins/");
+ else if (Internal.LibraryRequires.process.env.HOME) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.HOME, ".config/BetterDiscord/plugins/");
+ else return "";
+ }
+ };
+ BDFDB.BDUtils.getThemesFolder = function () {
+ if (BdApi && BdApi.Themes && BdApi.Themes.folder && typeof BdApi.Themes.folder == "string") return BdApi.Themes.folder;
+ else if (Internal.LibraryRequires.process.env.BETTERDISCORD_DATA_PATH) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.BETTERDISCORD_DATA_PATH, "themes/");
+ else if (Internal.LibraryRequires.process.env.injDir) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.injDir, "plugins/");
+ else switch (Internal.LibraryRequires.process.platform) {
+ case "win32":
+ return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.appdata, "BetterDiscord/themes/");
+ case "darwin":
+ return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.HOME, "Library/Preferences/BetterDiscord/themes/");
+ default:
+ if (Internal.LibraryRequires.process.env.XDG_CONFIG_HOME) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.XDG_CONFIG_HOME, "BetterDiscord/themes/");
+ else if (Internal.LibraryRequires.process.env.HOME) return Internal.LibraryRequires.path.resolve(Internal.LibraryRequires.process.env.HOME, ".config/BetterDiscord/themes/");
+ else return "";
+ }
+ };
+ BDFDB.BDUtils.isPluginEnabled = function (pluginName) {
+ if (BdApi && BdApi.Plugins && typeof BdApi.Plugins.isEnabled == "function") return BdApi.Plugins.isEnabled(pluginName);
+ };
+ BDFDB.BDUtils.reloadPlugin = function (pluginName) {
+ if (BdApi && BdApi.Plugins && typeof BdApi.Plugins.reload == "function") BdApi.Plugins.reload(pluginName);
+ };
+ BDFDB.BDUtils.enablePlugin = function (pluginName) {
+ if (BdApi && BdApi.Plugins && typeof BdApi.Plugins.enable == "function") BdApi.Plugins.enable(pluginName);
+ };
+ BDFDB.BDUtils.disablePlugin = function (pluginName) {
+ if (BdApi && BdApi.Plugins && typeof BdApi.Plugins.disable == "function") BdApi.Plugins.disable(pluginName);
+ };
+ BDFDB.BDUtils.getPlugin = function (pluginName, hasToBeEnabled = false, overHead = false) {
+ if (BdApi && !hasToBeEnabled || BDFDB.BDUtils.isPluginEnabled(pluginName) && BdApi.Plugins && typeof BdApi.Plugins.get == "function") {
+ let plugin = BdApi.Plugins.get(pluginName);
+ if (!plugin) return null;
+ if (overHead) return plugin.filename && plugin.exports && plugin.instance ? plugin : {filename: Internal.LibraryRequires.fs.existsSync(Internal.LibraryRequires.path.join(BDFDB.BDUtils.getPluginsFolder(), `${pluginName}.plugin.js`)) ? `${pluginName}.plugin.js` : null, id: pluginName, name: pluginName, plugin: plugin};
+ else return plugin.filename && plugin.exports && plugin.instance ? plugin.instance : plugin;
+ }
+ return null;
+ };
+ BDFDB.BDUtils.isThemeEnabled = function (themeName) {
+ if (BdApi && BdApi.Themes && typeof BdApi.Themes.isEnabled == "function") return BdApi.Themes.isEnabled(themeName);
+ };
+ BDFDB.BDUtils.enableTheme = function (themeName) {
+ if (BdApi && BdApi.Themes && typeof BdApi.Themes.enable == "function") BdApi.Themes.enable(themeName);
+ };
+ BDFDB.BDUtils.disableTheme = function (themeName) {
+ if (BdApi && BdApi.Themes && typeof BdApi.Themes.disable == "function") BdApi.Themes.disable(themeName);
+ };
+ BDFDB.BDUtils.getTheme = function (themeName, hasToBeEnabled = false) {
+ if (BdApi && !hasToBeEnabled || BDFDB.BDUtils.isThemeEnabled(themeName) && BdApi.Themes && typeof BdApi.Themes.get == "function") return BdApi.Themes.get(themeName);
+ return null;
+ };
+ BDFDB.BDUtils.settingsIds = {
+ automaticLoading: "settings.addons.autoReload",
+ coloredText: "settings.appearance.coloredText",
+ normalizedClasses: "settings.general.classNormalizer",
+ showToasts: "settings.general.showToasts"
+ };
+ BDFDB.BDUtils.toggleSettings = function (key, state) {
+ if (BdApi && typeof key == "string") {
+ let path = key.split(".");
+ let currentState = BDFDB.BDUtils.getSettings(key);
+ if (state === true) {
+ if (currentState === false && typeof BdApi.enableSetting == "function") BdApi.enableSetting(...path);
+ }
+ else if (state === false) {
+ if (currentState === true && typeof BdApi.disableSetting == "function") BdApi.disableSetting(...path);
+ }
+ else if (currentState === true || currentState === false) BDFDB.BDUtils.toggleSettings(key, !currentState);
+ }
+ };
+ BDFDB.BDUtils.getSettings = function (key) {
+ if (!BdApi) return {};
+ if (typeof key == "string") return typeof BdApi.isSettingEnabled == "function" && BdApi.isSettingEnabled(...key.split("."));
+ else return BDFDB.ArrayUtils.is(BdApi.settings) ? BdApi.settings.map(n => n.settings.map(m => m.settings.map(l => ({id: [n.id, m.id, l.id].join("."), value: l.value})))).flat(10).reduce((newObj, setting) => (newObj[setting.id] = setting.value, newObj), {}) : {};
+ };
+ BDFDB.BDUtils.getSettingsProperty = function (property, key) {
+ if (!BdApi || !BDFDB.ArrayUtils.is(BdApi.settings)) return key ? "" : {};
+ else {
+ let settingsMap = BdApi.settings.map(n => n.settings.map(m => m.settings.map(l => ({id: [n.id, m.id, l.id].join("."), value: l[property]})))).flat(10).reduce((newObj, setting) => (newObj[setting.id] = setting.value, newObj), {});
+ return key ? (settingsMap[key] != null ? settingsMap[key] : "") : "";
+ }
+ };
+
+ const cssFileName = "0BDFDB.raw.css", dataFileName = "0BDFDB.data.json";
+ const cssFilePath = path.join(BDFDB.BDUtils.getPluginsFolder(), cssFileName), dataFilePath = path.join(BDFDB.BDUtils.getPluginsFolder(), dataFileName);
+ BDFDB.PluginUtils = {};
+ BDFDB.PluginUtils.buildPlugin = function (changeLog) {
+ return [Plugin(changeLog), BDFDB];
+ };
+ BDFDB.PluginUtils.load = function (plugin) {
+ if (!PluginStores.updateData.timeouts.includes(plugin.name)) {
+ PluginStores.updateData.timeouts.push(plugin.name);
+ const url = Internal.getPluginURL(plugin);
+
+ PluginStores.updateData.plugins[url] = {name: plugin.name, raw: url, version: plugin.version};
+
+ BDFDB.PluginUtils.checkUpdate(plugin.name, url);
+
+ if (plugin.changeLog && !BDFDB.ObjectUtils.isEmpty(plugin.changeLog) && typeof plugin.getSettingsPanel != "function") plugin.getSettingsPanel = _ => BDFDB.PluginUtils.createSettingsPanel(plugin, {
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.MessagesPopoutComponents.EmptyState, {
+ msg: "No Settings available for this Plugin",
+ image: BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themelight ? "/assets/9b0d90147f7fab54f00dd193fe7f85cd.svg" : "/assets/308e587f3a68412f137f7317206e92c2.svg"
+ })
+ });
+
+ if (!PluginStores.updateData.interval) PluginStores.updateData.interval = BDFDB.TimeUtils.interval(_ => {
+ BDFDB.PluginUtils.checkAllUpdates();
+ }, 1000*60*60*4);
+
+ BDFDB.TimeUtils.timeout(_ => BDFDB.ArrayUtils.remove(PluginStores.updateData.timeouts, plugin.name, true), 30000);
+ }
+ };
+ BDFDB.PluginUtils.init = function (plugin) {
+ BDFDB.PluginUtils.load(plugin);
+
+ plugin.settings = BDFDB.DataUtils.get(plugin);
+
+ BDFDB.LogUtils.log(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_started", ""), plugin);
+ if (Internal.settings.general.showToasts && !BDFDB.BDUtils.getSettings(BDFDB.BDUtils.settingsIds.showToasts)) BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_started", `${plugin.name} v${plugin.version}`), {
+ disableInteractions: true,
+ barColor: BDFDB.DiscordConstants.ColorsCSS.STATUS_POSITIVE
+ });
+
+ if (plugin.css) BDFDB.DOMUtils.appendLocalStyle(plugin.name, plugin.css);
+
+ BDFDB.PatchUtils.unpatch(plugin);
+ Internal.addModulePatches(plugin);
+ Internal.addContextPatches(plugin);
+
+ BDFDB.PluginUtils.translate(plugin);
+
+ BDFDB.PluginUtils.checkChangeLog(plugin);
+ };
+ BDFDB.PluginUtils.clear = function (plugin) {
+ BDFDB.LogUtils.log(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_stopped", ""), plugin);
+ if (Internal.settings.general.showToasts && !BDFDB.BDUtils.getSettings(BDFDB.BDUtils.settingsIds.showToasts)) BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_stopped", `${plugin.name} v${plugin.version}`), {
+ disableInteractions: true,
+ barColor: BDFDB.DiscordConstants.ColorsCSS.STATUS_DANGER
+ });
+
+ const url = Internal.getPluginURL(plugin);
+
+ BDFDB.PluginUtils.cleanUp(plugin);
+
+ for (const modal of document.querySelectorAll(`.${plugin.name}-modal, .${plugin.name.toLowerCase()}-modal, .${plugin.name}-settingsmodal, .${plugin.name.toLowerCase()}-settingsmodal`)) {
+ const closeButton = modal.querySelector(BDFDB.dotCN.modalclose);
+ if (closeButton) closeButton.click();
+ }
+
+ delete Cache.data[plugin.name]
+ delete PluginStores.updateData.plugins[url];
+ };
+ BDFDB.PluginUtils.translate = function (plugin) {
+ if (typeof plugin.setLabelsByLanguage == "function" || typeof plugin.changeLanguageStrings == "function") {
+ const translate = _ => {
+ if (typeof plugin.setLabelsByLanguage == "function") plugin.labels = plugin.setLabelsByLanguage();
+ if (typeof plugin.changeLanguageStrings == "function") plugin.changeLanguageStrings();
+ };
+ if (BDFDB.DiscordUtils.getLanguage()) translate();
+ else BDFDB.TimeUtils.interval(interval => {
+ if (BDFDB.DiscordUtils.getLanguage()) {
+ BDFDB.TimeUtils.clear(interval);
+ translate();
+ }
+ }, 100);
+ }
+ };
+ BDFDB.PluginUtils.cleanUp = function (plugin) {
+ BDFDB.TimeUtils.suppress(_ => {
+ if (!BDFDB.ObjectUtils.is(plugin)) return;
+ if (plugin == window.BDFDB_Global) {
+ plugin = BDFDB;
+ let updateNotice = BDFDB.dotCN && document.querySelector(BDFDB.dotCN.noticeupdate);
+ if (updateNotice) updateNotice.close();
+ BDFDB.TimeUtils.clear(PluginStores && PluginStores.updateData && PluginStores.updateData.interval);
+ delete window.BDFDB_Global.loaded;
+ if (PluginStores) BDFDB.TimeUtils.interval((interval, count) => {
+ if (count > 60 || window.BDFDB_Global.loaded) BDFDB.TimeUtils.clear(interval);
+ if (window.BDFDB_Global.loaded) for (let pluginName in BDFDB.ObjectUtils.sort(PluginStores.loaded)) BDFDB.TimeUtils.timeout(_ => {
+ if (PluginStores.loaded[pluginName].started) BDFDB.BDUtils.reloadPlugin(pluginName);
+ });
+ }, 1000);
+ }
+ if (BDFDB.DOMUtils && BDFDB.DOMUtils.removeLocalStyle) BDFDB.DOMUtils.removeLocalStyle(plugin.name);
+ if (BDFDB.ListenerUtils && BDFDB.ListenerUtils.remove) BDFDB.ListenerUtils.remove(plugin);
+ if (BDFDB.ListenerUtils && BDFDB.ListenerUtils.removeGlobal) BDFDB.ListenerUtils.removeGlobal(plugin);
+ if (BDFDB.StoreChangeUtils && BDFDB.StoreChangeUtils.remove) BDFDB.StoreChangeUtils.remove(plugin);
+ if (BDFDB.PatchUtils && BDFDB.PatchUtils.unpatch) BDFDB.PatchUtils.unpatch(plugin);
+
+ for (const patchType in PluginStores.modulePatches) {
+ for (const type in PluginStores.modulePatches[patchType]) {
+ for (const priority in PluginStores.modulePatches[patchType][type]) BDFDB.ArrayUtils.remove(PluginStores.modulePatches[patchType][type][priority], plugin, true);
+ if (!PluginStores.modulePatches[patchType][type].flat(10).length) delete PluginStores.modulePatches[patchType][type];
+ }
+ if (BDFDB.ObjectUtils.isEmpty(PluginStores.modulePatches[patchType])) delete PluginStores.modulePatches[patchType];
+ }
+ }, "Failed to clean up Plugin!", plugin)();
+ };
+ BDFDB.PluginUtils.checkUpdate = function (pluginName, url) {
+ if (pluginName && url && PluginStores.updateData.plugins[url]) return new Promise(callback => {
+ requestFunction(url, {timeout: 60000}, (error, response, body) => {
+ if (error || !PluginStores.updateData.plugins[url]) return callback(null);
+ let newName = (body.match(/"name"\s*:\s*"([^"]+)"/) || [])[1] || pluginName;
+ let newVersion = (body.match(/@version ([0-9]+\.[0-9]+\.[0-9]+)|['"]([0-9]+\.[0-9]+\.[0-9]+)['"]/i) || []).filter(n => n)[1];
+ if (!newVersion) return callback(null);
+ if (BDFDB.NumberUtils.compareVersions(newVersion, PluginStores.updateData.plugins[url].version)) {
+ if (PluginStores.updateData.plugins[url]) PluginStores.updateData.plugins[url].outdated = true;
+ BDFDB.PluginUtils.showUpdateNotice(pluginName, url);
+ return callback(1);
+ }
+ else {
+ BDFDB.PluginUtils.removeUpdateNotice(pluginName);
+ return callback(0);
+ }
+ });
+ });
+ return new Promise(callback => callback(null));
+ };
+ BDFDB.PluginUtils.checkAllUpdates = function () {
+ return new Promise(callback => {
+ let finished = 0, amount = 0;
+ for (let url in PluginStores.updateData.plugins) {
+ let plugin = PluginStores.updateData.plugins[url];
+ if (plugin) BDFDB.PluginUtils.checkUpdate(plugin.name, plugin.raw).then(state => {
+ finished++;
+ if (state == 1) amount++;
+ if (finished >= Object.keys(PluginStores.updateData.plugins).length) callback(amount);
+ });
+ }
+ });
+ };
+ BDFDB.PluginUtils.hasUpdateCheck = function (url) {
+ if (!url || typeof url != "string") return false;
+ let updateStore = Object.assign({}, window.PluginUpdates && window.PluginUpdates.plugins, PluginStores.updateData.plugins);
+ if (updateStore[url]) return true;
+ else {
+ let temp = url.replace("//raw.githubusercontent.com", "//").split("/");
+ let gitName = temp.splice(3, 1);
+ temp.splice(4, 1);
+ temp.splice(2, 1, gitName + ".github.io");
+ let pagesUrl = temp.join("/");
+ return !!updateStore[pagesUrl];
+ }
+ };
+ BDFDB.PluginUtils.showUpdateNotice = function (pluginName, url) {
+ if (!pluginName || !url) return;
+ let updateNotice = document.querySelector(BDFDB.dotCN.noticeupdate);
+ if (!updateNotice) {
+ let vanishObserver = new MutationObserver(changes => {
+ if (!document.contains(updateNotice)) {
+ if (updateNotice.querySelector(BDFDB.dotCN.noticeupdateentry)) {
+ let layers = document.querySelector(BDFDB.dotCN.layers) || document.querySelector(BDFDB.dotCN.appmount);
+ if (layers) layers.parentElement.insertBefore(updateNotice, layers);
+ }
+ else vanishObserver.disconnect();
+ }
+ else if (document.contains(updateNotice) && !updateNotice.querySelector(BDFDB.dotCNC.noticeupdateentry + BDFDB.dotCN.noticebutton)) vanishObserver.disconnect();
+ });
+ vanishObserver.observe(document.body, {childList: true, subtree: true});
+ updateNotice = BDFDB.NotificationUtils.notice(`${BDFDB.LanguageUtils.LibraryStrings.update_notice_update}
`, {
+ type: "info",
+ className: BDFDB.disCN.noticeupdate,
+ html: true,
+ customIcon: ``,
+ buttons: [{
+ className: BDFDB.disCN.noticeupdatebuttonall,
+ contents: BDFDB.LanguageUtils.LanguageStrings.FORM_LABEL_ALL,
+ onClick: _ => {for (let notice of updateNotice.querySelectorAll(BDFDB.dotCN.noticeupdateentry)) notice.click();}
+ }],
+ onClose: _ => vanishObserver.disconnect()
+ });
+ updateNotice.style.setProperty("position", "relative", "important");
+ updateNotice.style.setProperty("visibility", "visible", "important");
+ updateNotice.style.setProperty("opacity", "1", "important");
+ updateNotice.style.setProperty("z-index", "100000", "important");
+ let reloadButton = updateNotice.querySelector(BDFDB.dotCN.noticeupdatebuttonreload);
+ if (reloadButton) BDFDB.DOMUtils.hide(reloadButton);
+ }
+ if (updateNotice) {
+ let updateNoticeList = updateNotice.querySelector(BDFDB.dotCN.noticeupdateentries);
+ if (updateNoticeList && !updateNoticeList.querySelector(`#${pluginName}-notice`)) {
+ if (updateNoticeList.childElementCount) updateNoticeList.appendChild(BDFDB.DOMUtils.create(`,
`));
+ let updateEntry = BDFDB.DOMUtils.create(`${pluginName}
`);
+ updateEntry.addEventListener("click", _ => {
+ if (!updateEntry.wasClicked) {
+ updateEntry.wasClicked = true;
+ BDFDB.PluginUtils.downloadUpdate(pluginName, url);
+ }
+ });
+ updateNoticeList.appendChild(updateEntry);
+ if (!updateNoticeList.hasTooltip) {
+ updateNoticeList.hasTooltip = true;
+ updateNotice.tooltip = BDFDB.TooltipUtils.create(updateNoticeList, BDFDB.LanguageUtils.LibraryStrings.update_notice_click, {
+ type: "bottom",
+ zIndex: 100001,
+ delay: 500,
+ onHide: _ => {updateNoticeList.hasTooltip = false;}
+ });
+ }
+ }
+ }
+ };
+ BDFDB.PluginUtils.removeUpdateNotice = function (pluginName, updateNotice = document.querySelector(BDFDB.dotCN.noticeupdate)) {
+ if (!pluginName || !updateNotice) return;
+ let updateNoticeList = updateNotice.querySelector(BDFDB.dotCN.noticeupdateentries);
+ if (updateNoticeList) {
+ let noticeEntry = updateNoticeList.querySelector(`#${pluginName}-notice`);
+ if (noticeEntry) {
+ let nextSibling = noticeEntry.nextSibling;
+ let prevSibling = noticeEntry.prevSibling;
+ if (nextSibling && BDFDB.DOMUtils.containsClass(nextSibling, BDFDB.disCN.noticeupdateseparator)) nextSibling.remove();
+ else if (prevSibling && BDFDB.DOMUtils.containsClass(prevSibling, BDFDB.disCN.noticeupdateseparator)) prevSibling.remove();
+ noticeEntry.remove();
+ }
+ if (!updateNoticeList.childElementCount) {
+ let reloadButton = updateNotice.querySelector(BDFDB.dotCN.noticeupdatebuttonreload);
+ if (reloadButton) {
+ updateNotice.querySelector(BDFDB.dotCN.noticetext).innerText = BDFDB.LanguageUtils.LibraryStrings.update_notice_reload;
+ BDFDB.DOMUtils.show(reloadButton);
+ }
+ else updateNotice.querySelector(BDFDB.dotCN.noticedismiss).click();
+ }
+ }
+ };
+ BDFDB.PluginUtils.downloadUpdate = function (pluginName, url) {
+ if (pluginName && url) requestFunction(url, {timeout: 60000}, (error, response, body) => {
+ if (error) {
+ BDFDB.PluginUtils.removeUpdateNotice(pluginName);
+ BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_update_failed", pluginName), {
+ type: "danger",
+ disableInteractions: true
+ });
+ }
+ else {
+ let wasEnabled = BDFDB.BDUtils.isPluginEnabled(pluginName);
+ let newName = (body.match(/@name ([^"^\n^\t^\t]+)|['"]([^"^\n^\t^\t]+)['"]/i) || []).filter(n => n)[1] || pluginName;
+ let newVersion = (body.match(/@version ([0-9]+\.[0-9]+\.[0-9]+)|['"]([0-9]+\.[0-9]+\.[0-9]+)['"]/i) || []).filter(n => n)[1];
+ let oldVersion = PluginStores.updateData.plugins[url].version;
+ let fileName = pluginName == "BDFDB" ? "0BDFDB" : pluginName;
+ let newFileName = newName == "BDFDB" ? "0BDFDB" : newName;
+ Internal.LibraryRequires.fs.writeFile(Internal.LibraryRequires.path.join(BDFDB.BDUtils.getPluginsFolder(), newFileName + ".plugin.js"), body, _ => {
+ if (PluginStores.updateData.plugins[url]) PluginStores.updateData.plugins[url].version = newVersion;
+ if (fileName != newFileName) {
+ Internal.LibraryRequires.fs.unlink(Internal.LibraryRequires.path.join(BDFDB.BDUtils.getPluginsFolder(), fileName + ".plugin.js"), _ => {});
+ let configPath = Internal.LibraryRequires.path.join(BDFDB.BDUtils.getPluginsFolder(), fileName + ".config.json");
+ Internal.LibraryRequires.fs.exists(configPath, exists => {
+ if (exists) Internal.LibraryRequires.fs.rename(configPath, Internal.LibraryRequires.path.join(BDFDB.BDUtils.getPluginsFolder(), newFileName + ".config.json"), _ => {});
+ });
+ BDFDB.TimeUtils.timeout(_ => {if (wasEnabled && !BDFDB.BDUtils.isPluginEnabled(newName)) BDFDB.BDUtils.enablePlugin(newName);}, 3000);
+ }
+ BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("toast_plugin_updated", pluginName, "v" + oldVersion, newName, "v" + newVersion), {
+ disableInteractions: true
+ });
+ let updateNotice = document.querySelector(BDFDB.dotCN.noticeupdate);
+ if (updateNotice) {
+ if (updateNotice.querySelector(BDFDB.dotCN.noticebutton) && !PluginStores.updateData.downloaded.includes(pluginName)) {
+ PluginStores.updateData.downloaded.push(pluginName);
+ }
+ BDFDB.PluginUtils.removeUpdateNotice(pluginName, updateNotice);
+ }
+ });
+ }
+ });
+ };
+ BDFDB.PluginUtils.checkChangeLog = function (plugin) {
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ObjectUtils.is(plugin.changeLog) || plugin.changeLog.info) return;
+ if (!changeLogs[plugin.name] || BDFDB.NumberUtils.compareVersions(plugin.version, changeLogs[plugin.name])) {
+ changeLogs[plugin.name] = plugin.version;
+ BDFDB.DataUtils.save(changeLogs, BDFDB, "changeLogs");
+ BDFDB.PluginUtils.openChangeLog(plugin);
+ }
+ };
+ BDFDB.PluginUtils.openChangeLog = function (plugin) {
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ObjectUtils.is(plugin.changeLog)) return;
+ let changeLogEntries = [], headers = {
+ added: "New Features",
+ fixed: "Bug Fixes",
+ improved: "Improvements",
+ progress: "Progress"
+ };
+ for (let type in plugin.changeLog) {
+ type = type.toLowerCase();
+ if (InternalData.DiscordClasses["changelog" + type]) changeLogEntries.push([
+ BDFDB.ReactUtils.createElement("h1", {
+ className: BDFDB.disCNS["changelog" + type] + BDFDB.disCN.margintop20,
+ style: {"margin-top": !changeLogEntries.length ? 0 : null},
+ children: BDFDB.LanguageUtils && BDFDB.LanguageUtils.LibraryStrings && BDFDB.LanguageUtils.LibraryStrings["changelog_" + type] || headers[type]
+ }),
+ BDFDB.ReactUtils.createElement("ul", {
+ children: Object.keys(plugin.changeLog[type]).map(key => BDFDB.ReactUtils.createElement("li", {
+ children: [
+ BDFDB.ReactUtils.createElement("strong", {children: key}),
+ plugin.changeLog[type][key] ? `: ${plugin.changeLog[type][key]}.` : ""
+ ]
+ }))
+ })
+ ]);
+ }
+ if (changeLogEntries.length) BDFDB.ModalUtils.open(plugin, {
+ header: `${plugin.name} ${BDFDB.LanguageUtils.LanguageStrings.CHANGE_LOG}`,
+ subHeader: `Version ${plugin.version}`,
+ className: BDFDB.disCN.modalchangelogmodal,
+ contentClassName: BDFDB.disCNS.changelogcontainer + BDFDB.disCN.modalminicontent,
+ footerDirection: Internal.LibraryComponents.Flex.Direction.HORIZONTAL,
+ children: changeLogEntries.flat(10).filter(n => n),
+ footerChildren: (plugin == BDFDB || plugin == this || PluginStores.loaded[plugin.name] && PluginStores.loaded[plugin.name] == plugin && plugin.author == "DevilBro") && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.changelogfooter,
+ children: [{
+ href: "https://www.paypal.me/MircoWittrien",
+ name: "PayPal",
+ icon: "PAYPAL"
+ }, {
+ href: "https://www.patreon.com/MircoWittrien",
+ name: "Patreon",
+ icon: "PATREON"
+ }, {
+ name: BDFDB.LanguageUtils.LibraryStringsFormat("send", "Solana"),
+ icon: "PHANTOM",
+ onClick: _ => {
+ BDFDB.LibraryModules.WindowUtils.copy(InternalData.mySolana);
+ BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("clipboard_success", "Phantom Wallet Key"), {
+ type: "success"
+ });
+ }
+ }, {
+ name: BDFDB.LanguageUtils.LibraryStringsFormat("send", "Ethereum"),
+ icon: "METAMASK",
+ onClick: _ => {
+ BDFDB.LibraryModules.WindowUtils.copy(InternalData.myEthereum);
+ BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("clipboard_success", "MetaMask Wallet Key"), {
+ type: "success"
+ });
+ }
+ }].map(data => BDFDB.ReactUtils.createElement(data.href ? Internal.LibraryComponents.Anchor : Internal.LibraryComponents.Clickable, {
+ className: BDFDB.disCN.changelogsociallink,
+ href: data.href || "",
+ onClick: !data.onClick ? (_ => {}) : data.onClick,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: data.name,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names[data.icon],
+ width: 16,
+ height: 16
+ })
+ })
+ })).concat(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ size: Internal.LibraryComponents.TextElement.Sizes.SIZE_12,
+ children: BDFDB.LanguageUtils.LibraryStrings.donate_message
+ }))
+ })
+ });
+ };
+ BDFDB.PluginUtils.addLoadingIcon = function (icon) {
+ if (!Node.prototype.isPrototypeOf(icon)) return;
+ let app = document.querySelector(BDFDB.dotCN.app);
+ if (!app) return;
+ BDFDB.DOMUtils.addClass(icon, BDFDB.disCN.loadingicon);
+ let loadingIconWrapper = document.querySelector(BDFDB.dotCN.app + ">" + BDFDB.dotCN.loadingiconwrapper);
+ if (!loadingIconWrapper) {
+ loadingIconWrapper = BDFDB.DOMUtils.create(``);
+ app.appendChild(loadingIconWrapper);
+ let killObserver = new MutationObserver(changes => {
+ if (!loadingIconWrapper.firstElementChild) {
+ killObserver.disconnect();
+ BDFDB.DOMUtils.remove(loadingIconWrapper);
+ }
+ });
+ killObserver.observe(loadingIconWrapper, {childList: true});
+ }
+ loadingIconWrapper.appendChild(icon);
+ };
+ BDFDB.PluginUtils.createSettingsPanel = function (addon, props) {
+ if (!window.BDFDB_Global.loaded) return BdApi.React.createElement("div", {
+ style: {"color": BDFDB.DiscordConstants.ColorsCSS.HEADER_SECONDARY, "white-space": "pre-wrap"},
+ children: [
+ "Could not initiate BDFDB Library Plugin! Can not create Settings Panel!\n\nTry deleting the ",
+ BdApi.React.createElement("strong", {children: dataFileName}),
+ " File in your ",
+ BdApi.React.createElement("strong", {children: BDFDB.BDUtils.getPluginsFolder()}),
+ "\nDirectory and reload Discord afterwards!"
+ ]
+ });
+ addon = addon == BDFDB && Internal || addon;
+ if (!BDFDB.ObjectUtils.is(addon)) return;
+ let settingsProps = props;
+ if (settingsProps && !BDFDB.ObjectUtils.is(settingsProps) && (BDFDB.ReactUtils.isValidElement(settingsProps) || BDFDB.ArrayUtils.is(settingsProps))) settingsProps = {
+ children: settingsProps
+ };
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsPanel, Object.assign({
+ addon: addon,
+ collapseStates: settingsProps && settingsProps.collapseStates
+ }, settingsProps));
+ };
+ BDFDB.PluginUtils.refreshSettingsPanel = function (plugin, settingsPanel, ...args) {
+ if (BDFDB.ObjectUtils.is(plugin)) {
+ if (settingsPanel && settingsPanel.props && BDFDB.ObjectUtils.is(settingsPanel.props._instance)) {
+ settingsPanel.props._instance.props = Object.assign({}, settingsPanel.props._instance.props, ...args);
+ BDFDB.ReactUtils.forceUpdate(settingsPanel.props._instance);
+ }
+ else if (typeof plugin.getSettingsPanel == "function" && Node.prototype.isPrototypeOf(settingsPanel) && settingsPanel.parentElement) {
+ settingsPanel.parentElement.appendChild(plugin.getSettingsPanel(...args));
+ settingsPanel.remove();
+ }
+ }
+ };
+
+ window.BDFDB_Global = Object.assign({
+ started: true,
+ loading: true,
+ PluginUtils: {
+ buildPlugin: BDFDB.PluginUtils.buildPlugin,
+ cleanUp: BDFDB.PluginUtils.cleanUp
+ }
+ }, window.BDFDB_Global);
+
+ Internal.writeConfig = function (plugin, path, config) {
+ let allData = {};
+ try {allData = JSON.parse(fs.readFileSync(path));}
+ catch (err) {allData = {};}
+ try {fs.writeFileSync(path, JSON.stringify(Object.assign({}, allData, {[Internal.shouldSyncConfig(plugin) ? "all" : BDFDB.UserUtils.me.id]: config}), null, " "));}
+ catch (err) {}
+ };
+ Internal.readConfig = function (plugin, path) {
+ let sync = Internal.shouldSyncConfig(plugin);
+ try {
+ let config = JSON.parse(fs.readFileSync(path));
+ if (config && Object.keys(config).some(n => !(n == "all" || parseInt(n)))) {
+ config = {[Internal.shouldSyncConfig(plugin) ? "all" : BDFDB.UserUtils.me.id]: config};
+ try {fs.writeFileSync(path, JSON.stringify(config, null, " "));}
+ catch (err) {}
+ }
+ return config && config[sync ? "all" : BDFDB.UserUtils.me.id] || {};
+ }
+ catch (err) {return {};}
+ };
+ Internal.shouldSyncConfig = function (plugin) {
+ return plugin.neverSyncData !== undefined ? !plugin.neverSyncData : (plugin.forceSyncData || Internal.settings.general.shareData);
+ };
+
+ BDFDB.DataUtils = {};
+ BDFDB.DataUtils.save = function (data, plugin, key, id) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ let pluginName = typeof plugin === "string" ? plugin : plugin.name;
+ let fileName = pluginName == "BDFDB" ? "0BDFDB" : pluginName;
+ let configPath = path.join(BDFDB.BDUtils.getPluginsFolder(), fileName + ".config.json");
+
+ let config = Cache.data[pluginName] !== undefined ? Cache.data[pluginName] : (Internal.readConfig(plugin, configPath) || {});
+
+ if (key === undefined) config = BDFDB.ObjectUtils.is(data) ? BDFDB.ObjectUtils.sort(data) : data;
+ else {
+ if (id === undefined) config[key] = BDFDB.ObjectUtils.is(data) ? BDFDB.ObjectUtils.sort(data) : data;
+ else {
+ if (!BDFDB.ObjectUtils.is(config[key])) config[key] = {};
+ config[key][id] = BDFDB.ObjectUtils.is(data) ? BDFDB.ObjectUtils.sort(data) : data;
+ }
+ }
+
+ let configIsObject = BDFDB.ObjectUtils.is(config);
+ if (key !== undefined && configIsObject && BDFDB.ObjectUtils.is(config[key]) && BDFDB.ObjectUtils.isEmpty(config[key])) delete config[key];
+ if (BDFDB.ObjectUtils.isEmpty(config)) {
+ delete Cache.data[pluginName];
+ if (fs.existsSync(configPath)) fs.unlinkSync(configPath);
+ }
+ else {
+ if (configIsObject) config = BDFDB.ObjectUtils.sort(config);
+ Cache.data[pluginName] = configIsObject ? BDFDB.ObjectUtils.deepAssign({}, config) : config;
+ Internal.writeConfig(plugin, configPath, config);
+ }
+ };
+
+ BDFDB.DataUtils.load = function (plugin, key, id) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ let pluginName = typeof plugin === "string" ? plugin : plugin.name;
+ let fileName = pluginName == "BDFDB" ? "0BDFDB" : pluginName;
+ let configPath = path.join(BDFDB.BDUtils.getPluginsFolder(), fileName + ".config.json");
+
+ let config = Cache.data[pluginName] !== undefined ? Cache.data[pluginName] : (Internal.readConfig(plugin, configPath) || {});
+ let configIsObject = BDFDB.ObjectUtils.is(config);
+ Cache.data[pluginName] = configIsObject ? BDFDB.ObjectUtils.deepAssign({}, config) : config;
+
+ if (key === undefined) return config;
+ else {
+ let keyData = configIsObject ? (BDFDB.ObjectUtils.is(config[key]) || config[key] === undefined ? BDFDB.ObjectUtils.deepAssign({}, config[key]) : config[key]) : null;
+ if (id === undefined) return keyData;
+ else return !BDFDB.ObjectUtils.is(keyData) || keyData[id] === undefined ? null : keyData[id];
+ }
+ };
+ BDFDB.DataUtils.remove = function (plugin, key, id) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ let pluginName = typeof plugin === "string" ? plugin : plugin.name;
+ let fileName = pluginName == "BDFDB" ? "0BDFDB" : pluginName;
+ let configPath = path.join(BDFDB.BDUtils.getPluginsFolder(), fileName + ".config.json");
+
+ let config = Cache.data[pluginName] !== undefined ? Cache.data[pluginName] : (Internal.readConfig(plugin, configPath) || {});
+ let configIsObject = BDFDB.ObjectUtils.is(config);
+
+ if (key === undefined || !configIsObject) config = {};
+ else {
+ if (id === undefined) delete config[key];
+ else if (BDFDB.ObjectUtils.is(config[key])) delete config[key][id];
+ }
+
+ if (BDFDB.ObjectUtils.is(config[key]) && BDFDB.ObjectUtils.isEmpty(config[key])) delete config[key];
+ if (BDFDB.ObjectUtils.isEmpty(config)) {
+ delete Cache.data[pluginName];
+ if (fs.existsSync(configPath)) fs.unlinkSync(configPath);
+ }
+ else {
+ if (configIsObject) config = BDFDB.ObjectUtils.sort(config);
+ Cache.data[pluginName] = configIsObject ? BDFDB.ObjectUtils.deepAssign({}, config) : config;
+ Internal.writeConfig(plugin, configPath, config);
+ }
+ };
+ BDFDB.DataUtils.get = function (plugin, key, id) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ plugin = typeof plugin == "string" ? BDFDB.BDUtils.getPlugin(plugin) : plugin;
+ const defaults = plugin && plugin.defaults;
+ if (!BDFDB.ObjectUtils.is(defaults) || key && !BDFDB.ObjectUtils.is(defaults[key])) return id === undefined ? {} : null;
+ let oldC = BDFDB.DataUtils.load(plugin), newC = {}, update = false;
+ const checkLayer = (i, j) => {
+ let isObj = BDFDB.ObjectUtils.is(defaults[i][j].value);
+ if (!newC[i]) newC[i] = {};
+ if (oldC[i] == null || oldC[i][j] == null || isObj && (!BDFDB.ObjectUtils.is(oldC[i][j]) || Object.keys(defaults[i][j].value).some(n => defaults[i][j].value[n] != null && !BDFDB.sameProto(defaults[i][j].value[n], oldC[i][j][n])))) {
+ newC[i][j] = isObj ? BDFDB.ObjectUtils.deepAssign({}, defaults[i][j].value) : defaults[i][j].value;
+ update = true;
+ }
+ else newC[i][j] = oldC[i][j];
+ };
+ if (key) {for (let j in defaults[key]) checkLayer(key, j);}
+ else {for (let i in defaults) if (BDFDB.ObjectUtils.is(defaults[i])) for (let j in defaults[i]) checkLayer(i, j);}
+ if (update) BDFDB.DataUtils.save(Object.assign({}, oldC, newC), plugin);
+
+ if (key === undefined) return newC;
+ else if (id === undefined) return newC[key] === undefined ? {} : newC[key];
+ else return newC[key] === undefined || newC[key][id] === undefined ? null : newC[key][id];
+ };
+ let InternalData, libHashes = {}, oldLibHashes = BDFDB.DataUtils.load(BDFDB, "hashes"), libraryCSS;
+
+ const getBackup = (fileName, path) => {
+ return {backup: fs.existsSync(path) && (fs.readFileSync(path) || "").toString(), hashIsSame: libHashes[fileName] && oldLibHashes[fileName] && libHashes[fileName] == oldLibHashes[fileName]};
+ };
+ const requestLibraryHashes = tryAgain => {
+ requestFunction("https://api.github.com/repos/mwittrien/BetterDiscordAddons/contents/Library/_res/", {timeout: 60000}, (e, r, b) => {
+ if ((e || !b || r.statusCode != 200) && tryAgain) return BDFDB.TimeUtils.timeout(_ => requestLibraryHashes(), 10000);
+ else {
+ try {
+ b = JSON.parse(b);
+ libHashes[cssFileName] = (b.find(n => n && n.name == cssFileName) || {}).sha;
+ libHashes[dataFileName] = (b.find(n => n && n.name == dataFileName) || {}).sha;
+ BDFDB.DataUtils.save(libHashes, BDFDB, "hashes");
+ }
+ catch (err) {}
+ requestLibraryData(true);
+ }
+ });
+ };
+ const requestLibraryData = tryAgain => {
+ const parseCSS = css => {
+ libraryCSS = css;
+
+ const backupObj = getBackup(dataFileName, dataFilePath);
+ const UserStore = BdApi.Webpack.getModule(BdApi.Webpack.Filters.byProps("getCurrentUser"));
+ if (backupObj.backup && backupObj.hashIsSame || UserStore && UserStore.getCurrentUser().id == "278543574059057154") parseData(backupObj.backup);
+ else requestFunction(`https://mwittrien.github.io/BetterDiscordAddons/Library/_res/${dataFileName}`, {timeout: 60000}, (e, r, b) => {
+ if ((e || !b || r.statusCode != 200) && tryAgain) return BDFDB.TimeUtils.timeout(_ => requestLibraryData(), 10000);
+ if (!e && b && r.statusCode == 200) {
+ if (backupObj.backup && backupObj.backup.replace(/\s/g, "") == b.replace(/\s/g, "")) {
+ libHashes[dataFileName] = oldLibHashes[dataFileName];
+ BDFDB.DataUtils.save(libHashes, BDFDB, "hashes");
+ }
+ parseData(b, true);
+ }
+ else parseData(fs.existsSync(dataFilePath) && (fs.readFileSync(dataFilePath) || "").toString());
+ });
+ };
+ const parseData = (dataString, fetched) => {
+ try {InternalData = JSON.parse(dataString);}
+ catch (err) {
+ if (fetched) {
+ try {
+ dataString = fs.existsSync(dataFilePath) && (fs.readFileSync(dataFilePath) || "").toString();
+ InternalData = JSON.parse(dataString);
+ }
+ catch (err2) {BDFDB.LogUtils.error(["Failed to initiate Library!", "Failed Fetch!", dataString ? "Corrupt Backup." : "No Backup.", , err2]);}
+ }
+ else BDFDB.LogUtils.error(["Failed to initiate Library!", dataString ? "Corrupt Backup." : "No Backup.", err]);
+ }
+ if (fetched && dataString) fs.writeFile(dataFilePath, dataString, _ => {});
+
+ Internal.getWebModuleReq = function () {
+ if (!Internal.getWebModuleReq.req) {
+ const id = "BDFDB-WebModules_" + Math.floor(Math.random() * 10000000000000000);
+ let req;
+ webpackChunkdiscord_app.push([[id], {}, r => {if (r.c) req = r;}]);
+ delete req.m[id];
+ delete req.c[id];
+ Internal.getWebModuleReq.req = req;
+ }
+ return Internal.getWebModuleReq.req;
+ };
+
+ if (InternalData) loadLibrary();
+ else BdApi.alert("Error", "Could not initiate BDFDB Library Plugin. Check your Internet Connection and make sure GitHub isn't blocked by your Network or try disabling your VPN/Proxy.");
+ };
+
+ const backupObj = getBackup(cssFileName, cssFilePath);
+ if (backupObj.backup && backupObj.hashIsSame) parseCSS(backupObj.backup);
+ else requestFunction(`https://mwittrien.github.io/BetterDiscordAddons/Library/_res/${cssFileName}`, {timeout: 60000}, (e, r, b) => {
+ if ((e || !b || r.statusCode != 200) && tryAgain) return BDFDB.TimeUtils.timeout(_ => requestLibraryData(), 10000);
+ if (!e && b && r.statusCode == 200) {
+ if (backupObj.backup && backupObj.backup.replace(/\s/g, "") == b.replace(/\s/g, "")) {
+ libHashes[cssFileName] = oldLibHashes[cssFileName];
+ BDFDB.DataUtils.save(libHashes, BDFDB, "hashes");
+ }
+ fs.writeFile(cssFilePath, b, _ => {});
+ parseCSS(b);
+ }
+ else parseCSS(fs.existsSync(cssFilePath) && (fs.readFileSync(cssFilePath) || "").toString());
+ });
+ };
+ const loadLibrary = _ => {
+ Internal.getPluginURL = function (plugin) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (BDFDB.ObjectUtils.is(plugin)) {
+ if (InternalData.PluginUrlMap && InternalData.PluginUrlMap[plugin.name]) return InternalData.PluginUrlMap[plugin.name];
+ else if (plugin.updateUrl) return plugin.updateUrl;
+ else {
+ let name = InternalData.PluginNameMap && InternalData.PluginNameMap[plugin.name] || plugin.name;
+ return `https://mwittrien.github.io/BetterDiscordAddons/Plugins/${name}/${name}.plugin.js`;
+ }
+ }
+ else return "";
+ };
+
+ Internal.findModule = function (type, cacheString, filter, config = {}) {
+ if (!BDFDB.ObjectUtils.is(Cache.modules[type])) Cache.modules[type] = {module: {}, export: {}};
+ let defaultExport = typeof config.defaultExport != "boolean" ? true : config.defaultExport;
+ if (!config.all && defaultExport && Cache.modules[type].export[cacheString]) return Cache.modules[type].export[cacheString];
+ else if (!config.all && !defaultExport && Cache.modules[type].module[cacheString]) return Cache.modules[type].module[cacheString];
+ else {
+ let m = BDFDB.ModuleUtils.find(filter, config);
+ if (m) {
+ if (!config.all) {
+ if (defaultExport) Cache.modules[type].export[cacheString] = m;
+ else Cache.modules[type].module[cacheString] = m;
+ }
+ return m;
+ }
+ else if (!config.noWarnings) BDFDB.LogUtils.warn(`${cacheString} [${type}] not found in WebModules`);
+ }
+ };
+ Internal.checkModuleStrings = function (module, strings, config = {}) {
+ const check = (s1, s2) => {
+ s1 = config.ignoreCase ? s1.toString().toLowerCase() : s1.toString();
+ return config.hasNot ? s1.indexOf(s2) == -1 : s1.indexOf(s2) > -1;
+ };
+ return [strings].flat(10).filter(n => typeof n == "string").map(config.ignoreCase ? (n => n.toLowerCase()) : (n => n)).every(string => module && ((typeof module == "function" || typeof module == "string") && (check(module, string) || typeof module.__originalFunction == "function" && check(module.__originalFunction, string)) || typeof module.type == "function" && check(module.type, string) || (typeof module == "function" || typeof module == "object") && module.prototype && Object.keys(module.prototype).filter(n => n.indexOf("render") == 0).some(n => check(module.prototype[n], string))));
+ };
+ Internal.checkModuleProps = function (module, properties, config = {}) {
+ return [properties].flat(10).filter(n => typeof n == "string").every(prop => {
+ const value = module[prop];
+ return config.hasNot ? value === undefined : (value !== undefined && !(typeof value == "string" && !value));
+ });
+ };
+ Internal.checkModuleProtos = function (module, protoProps, config = {}) {
+ return module.prototype && [protoProps].flat(10).filter(n => typeof n == "string").every(prop => {
+ const value = module.prototype[prop];
+ return config.hasNot ? value === undefined : (value !== undefined && !(typeof value == "string" && !value));
+ });
+ };
+ Internal.getModuleString = function (module) {
+ const id = (BDFDB.ModuleUtils.find(m => m == module && m, {defaultExport: false}) || {}).id;
+ if (!id) return "";
+ const req = Internal.getWebModuleReq();
+ return (req.m[id] || "").toString();
+ };
+
+ Internal.lazyLoadModuleImports = function (moduleString) {
+ return new Promise(callback => {
+ if (typeof moduleString !== "string") moduleString = Internal.getModuleString(moduleString);
+ if (!moduleString || typeof moduleString !== "string") {
+ BDFDB.LogUtils.error("Trying to lazy load Imports but Module is not a String");
+ return callback(null);
+ }
+ let run = true, imports = [], menuIndexes = [];
+ while (run) {
+ const [matchString, promiseMatch, menuRequest] = moduleString.match(/return .*?(Promise\.all\(.+?\))\.then\((.+?)\)\)/) ?? [];
+ if (!promiseMatch) run = false;
+ else {
+ imports = imports.concat(promiseMatch.match(/\d+/g)?.map(e => Number(e)));
+ menuIndexes.push(menuRequest.match(/\d+/)?.[0]);
+ moduleString = moduleString.replace(matchString, "");
+ }
+ }
+ if (!imports.length || !menuIndexes.length) {
+ BDFDB.LogUtils.error("Trying to lazy load Imports but could not find Indexes");
+ return callback(null);
+ }
+ const req = Internal.getWebModuleReq();
+ Promise.all(BDFDB.ArrayUtils.removeCopies(imports).map(i => req.e(i))).then(_ => Promise.all(BDFDB.ArrayUtils.removeCopies(menuIndexes).map(i => req(i)))).then(callback);
+ });
+ };
+
+ BDFDB.ModuleUtils = {};
+ BDFDB.ModuleUtils.find = function (filter, config = {}) {
+ let defaultExport = typeof config.defaultExport != "boolean" ? true : config.defaultExport;
+ let onlySearchUnloaded = typeof config.onlySearchUnloaded != "boolean" ? false : config.onlySearchUnloaded;
+ let all = typeof config.all != "boolean" ? false : config.all;
+ const req = Internal.getWebModuleReq();
+ const found = [];
+ if (!onlySearchUnloaded) for (let i in req.c) if (req.c.hasOwnProperty(i) && req.c[i].exports != window) {
+ let m = req.c[i].exports, r = null;
+ if (m && (typeof m == "object" || typeof m == "function")) {
+ if (!!(r = filter(m))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ else if (Object.keys(m).length < 400) for (let key of Object.keys(m)) try {
+ if (m[key] && !!(r = filter(m[key]))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ } catch (err) {}
+ }
+ if (config.moduleName && m && m[config.moduleName] && (typeof m[config.moduleName] == "object" || typeof m[config.moduleName] == "function")) {
+ if (!!(r = filter(m[config.moduleName]))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ else if (m[config.moduleName].type && (typeof m[config.moduleName].type == "object" || typeof m[config.moduleName].type == "function") && !!(r = filter(m[config.moduleName].type))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ }
+ if (m && m.__esModule && m.default && (typeof m.default == "object" || typeof m.default == "function")) {
+ if (!!(r = filter(m.default))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ else if (m.default.type && (typeof m.default.type == "object" || typeof m.default.type == "function") && !!(r = filter(m.default.type))) {
+ if (all) found.push(defaultExport ? r : req.c[i]);
+ else return defaultExport ? r : req.c[i];
+ }
+ }
+ }
+ for (let i in req.m) if (req.m.hasOwnProperty(i)) {
+ let m = req.m[i];
+ if (m && typeof m == "function") {
+ if (req.c[i] && !onlySearchUnloaded && filter(m)) {
+ if (all) found.push(defaultExport ? req.c[i].exports : req.c[i]);
+ else return defaultExport ? req.c[i].exports : req.c[i];
+ }
+ if (!req.c[i] && onlySearchUnloaded && filter(m)) {
+ const resolved = {}, resolved2 = {};
+ m(resolved, resolved2, req);
+ const trueResolved = resolved2 && BDFDB.ObjectUtils.isEmpty(resolved2) ? resolved : resolved2;
+ if (all) found.push(defaultExport ? trueResolved.exports : trueResolved);
+ else return defaultExport ? trueResolved.exports : trueResolved;
+ }
+ }
+ }
+ if (all) return found;
+ };
+ BDFDB.ModuleUtils.findByProperties = function (...properties) {
+ properties = properties.flat(10);
+ let config = properties.pop();
+ if (typeof config == "string") {
+ properties.push(config);
+ config = {};
+ }
+ return Internal.findModule("props", JSON.stringify(properties), m => Internal.checkModuleProps(m, properties) && m, config);
+ };
+ BDFDB.ModuleUtils.findByName = function (name, config = {}) {
+ return Internal.findModule("name", JSON.stringify(name), m => m.displayName === name && m || m.render && m.render.displayName === name && m || m.constructor && m.constructor.displayName === name && m || m[name] && m[name].displayName === name && m[name] || typeof m.getName == "function" && m.getName() == name && m, config);
+ };
+ BDFDB.ModuleUtils.findByString = function (...strings) {
+ strings = strings.flat(10);
+ let config = strings.pop();
+ if (typeof config == "string") {
+ strings.push(config);
+ config = {};
+ }
+ return Internal.findModule("string", JSON.stringify(strings), m => Internal.checkModuleStrings(m, strings) && m, config);
+ };
+ BDFDB.ModuleUtils.findByPrototypes = function (...protoProps) {
+ protoProps = protoProps.flat(10);
+ let config = protoProps.pop();
+ if (typeof config == "string") {
+ protoProps.push(config);
+ config = {};
+ }
+ return Internal.findModule("proto", JSON.stringify(protoProps), m => Internal.checkModuleProtos(m, protoProps) && m, config);
+ };
+ BDFDB.ModuleUtils.findStringObject = function (props, config = {}) {
+ let firstReturn = BDFDB.ModuleUtils.find(m => {
+ let amount = Object.keys(m).length;
+ return (!config.length || (config.smaller ? amount < config.length : amount == config.length)) && [props].flat(10).every(prop => typeof m[prop] == "string") && m;
+ }, {all: config.all, defaultExport: config.defaultExport});
+ if (!config.all && firstReturn) return firstReturn;
+ let secondReturn = BDFDB.ModuleUtils.find(m => {
+ if (typeof m != "function") return false;
+ let stringified = m.toString().replace(/\s/g, "");
+ if (stringified.indexOf(".exports={") == -1 || !(/function\([A-z],[A-z],[A-z]\)\{"usestrict";[A-z]\.exports=\{/.test(stringified) || /function\([A-z]\)\{"usestrict";[A-z]\.exports=\{/.test(stringified))) return false;
+ let amount = stringified.split(":\"").length - 1;
+ return (!config.length || (config.smaller ? amount < config.length : amount == config.length)) && [props].flat(10).every(string => stringified.indexOf(`${string}:`) > -1) && m;
+ }, {onlySearchUnloaded: true, all: config.all, defaultExport: config.defaultExport});
+ if (!config.all) return secondReturn;
+ return BDFDB.ArrayUtils.removeCopies([firstReturn].concat(secondReturn).flat(10));
+ };
+
+ const DiscordConstantsObject = BDFDB.ModuleUtils.findByProperties("AnalyticsSections", "ChannelTypes", "MessageTypes");
+ if (InternalData.CustomDiscordConstants) DiscordConstants = Object.assign(DiscordConstants, InternalData.CustomDiscordConstants);
+ if (DiscordConstantsObject) DiscordConstants = Object.assign(DiscordConstants, DiscordConstantsObject);
+ Internal.DiscordConstants = new Proxy(DiscordConstants, {
+ get: function (_, item) {
+ if (DiscordConstants[item]) return DiscordConstants[item];
+ if (!InternalData.DiscordConstants[item]) {
+ BDFDB.LogUtils.warn([item, "Object not found in DiscordConstants"]);
+ return {};
+ }
+ if (InternalData.DiscordConstants[item].strings) DiscordConstants[item] = BDFDB.ModuleUtils.findByString(InternalData.DiscordConstants[item].strings);
+ else DiscordConstants[item] = BDFDB.ModuleUtils.findByProperties(InternalData.DiscordConstants[item]);
+ if (InternalData.DiscordConstants[item].value) DiscordConstants[item] = DiscordConstants[item][InternalData.DiscordConstants[item].value] || DiscordConstants[item];
+ return DiscordConstants[item] ? DiscordConstants[item] : {};
+ }
+ });
+ BDFDB.DiscordConstants = Internal.DiscordConstants;
+
+ Internal.DiscordObjects = new Proxy(DiscordObjects, {
+ get: function (_, item) {
+ if (DiscordObjects[item]) return DiscordObjects[item];
+ if (!InternalData.DiscordObjects[item]) return (function () {});
+ let defaultExport = InternalData.DiscordObjects[item].exported == undefined ? true : InternalData.DiscordObjects[item].exported;
+ if (InternalData.DiscordObjects[item].props) DiscordObjects[item] = BDFDB.ModuleUtils.findByPrototypes(InternalData.DiscordObjects[item].props, {defaultExport});
+ else if (InternalData.DiscordObjects[item].strings) DiscordObjects[item] = BDFDB.ModuleUtils.findByString(InternalData.DiscordObjects[item].strings, {defaultExport});
+ return DiscordObjects[item] ? DiscordObjects[item] : (function () {});
+ }
+ });
+ BDFDB.DiscordObjects = Internal.DiscordObjects;
+
+ Internal.LibraryRequires = new Proxy(LibraryRequires, {
+ get: function (_, item) {
+ if (item == "request") return requestFunction;
+ if (LibraryRequires[item]) return LibraryRequires[item];
+ if (InternalData.LibraryRequires.indexOf(item) == -1) return (function () {});
+ try {LibraryRequires[item] = require(item);}
+ catch (err) {}
+ return LibraryRequires[item] ? LibraryRequires[item] : (function () {});
+ }
+ });
+ BDFDB.LibraryRequires = Internal.LibraryRequires;
+
+ Internal.LibraryStores = new Proxy(LibraryStores, {
+ get: function (_, item) {
+ if (LibraryStores[item]) return LibraryStores[item];
+ LibraryStores[item] = BDFDB.ModuleUtils.find(m => m && m.constructor && typeof m.constructor.displayName == "string" && m.constructor.displayName == item && m);
+ if (!LibraryStores[item]) BDFDB.LogUtils.warn([item, "could not be found in Webmodule Stores"]);
+ return LibraryStores[item] ? LibraryStores[item] : null;
+ }
+ });
+ BDFDB.LibraryStores = Internal.LibraryStores;
+
+ BDFDB.StoreChangeUtils = {};
+ BDFDB.StoreChangeUtils.add = function (plugin, store, callback) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ObjectUtils.is(store) || typeof store.addChangeListener != "function" || typeof callback != "function") return;
+ BDFDB.StoreChangeUtils.remove(plugin, store, callback);
+ if (!BDFDB.ArrayUtils.is(plugin.changeListeners)) plugin.changeListeners = [];
+ plugin.changeListeners.push({store, callback});
+ store.addChangeListener(callback);
+ };
+ BDFDB.StoreChangeUtils.remove = function (plugin, store, callback) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ArrayUtils.is(plugin.changeListeners)) return;
+ if (!store) {
+ while (plugin.changeListeners.length) {
+ let listener = plugin.changeListeners.pop();
+ listener.store.removeChangeListener(listener.callback);
+ }
+ }
+ else if (BDFDB.ObjectUtils.is(store) && typeof store.addChangeListener == "function") {
+ if (!callback) {
+ for (let listener of plugin.changeListeners) {
+ let removedListeners = [];
+ if (listener.store == store) {
+ listener.store.removeChangeListener(listener.callback);
+ removedListeners.push(listener);
+ }
+ if (removedListeners.length) plugin.changeListeners = plugin.changeListeners.filter(listener => !removedListeners.includes(listener));
+ }
+ }
+ else if (typeof callback == "function") {
+ store.removeChangeListener(callback);
+ plugin.changeListeners = plugin.changeListeners.filter(listener => listener.store == store && listener.callback == callback);
+ }
+ }
+ };
+
+ var pressedKeys = [], mousePosition;
+ BDFDB.ListenerUtils = {};
+ BDFDB.ListenerUtils.isPressed = function (key) {
+ return pressedKeys.includes(key);
+ };
+ BDFDB.ListenerUtils.getPosition = function (key) {
+ return mousePosition;
+ };
+ BDFDB.ListenerUtils.add = function (plugin, ele, actions, selectorOrCallback, callbackOrNothing) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!BDFDB.ObjectUtils.is(plugin) || (!Node.prototype.isPrototypeOf(ele) && ele !== window) || !actions) return;
+ let callbackIs4th = typeof selectorOrCallback == "function";
+ let selector = callbackIs4th ? undefined : selectorOrCallback;
+ let callback = callbackIs4th ? selectorOrCallback : callbackOrNothing;
+ if (typeof callback != "function") return;
+ BDFDB.ListenerUtils.remove(plugin, ele, actions, selector);
+ for (let action of actions.split(" ")) {
+ action = action.split(".");
+ let eventName = action.shift().toLowerCase();
+ if (!eventName) return;
+ let origEventName = eventName;
+ eventName = eventName == "mouseenter" || eventName == "mouseleave" ? "mouseover" : eventName;
+ let namespace = (action.join(".") || "") + plugin.name;
+ if (!BDFDB.ArrayUtils.is(plugin.eventListeners)) plugin.eventListeners = [];
+ let eventCallback = null;
+ if (selector) {
+ if (origEventName == "mouseenter" || origEventName == "mouseleave") eventCallback = e => {
+ if (e.composedPath) for (let child of e.composedPath()) if (typeof child.matches == "function" && child.matches(selector) && !child[namespace + "BDFDB" + origEventName]) {
+ child[namespace + "BDFDB" + origEventName] = true;
+ if (origEventName == "mouseenter") callback(BDFDB.ListenerUtils.copyEvent(e, child));
+ let mouseOut = e2 => {
+ if (e2.target.contains(child) || e2.target == child || !child.contains(e2.target)) {
+ if (origEventName == "mouseleave") callback(BDFDB.ListenerUtils.copyEvent(e, child));
+ delete child[namespace + "BDFDB" + origEventName];
+ document.removeEventListener("mouseout", mouseOut);
+ }
+ };
+ document.addEventListener("mouseout", mouseOut);
+ break;
+ }
+ };
+ else eventCallback = e => {
+ if (e.composedPath) for (let child of e.composedPath()) if (typeof child.matches == "function" && child.matches(selector)) {
+ callback(BDFDB.ListenerUtils.copyEvent(e, child));
+ break;
+ }
+ };
+ }
+ else eventCallback = e => callback(BDFDB.ListenerUtils.copyEvent(e, ele));
+
+ let observer;
+ if (Node.prototype.isPrototypeOf(ele)) {
+ observer = new MutationObserver(changes => changes.forEach(change => {
+ const nodes = Array.from(change.removedNodes);
+ if (nodes.indexOf(ele) > -1 || nodes.some(n => n.contains(ele))) BDFDB.ListenerUtils.remove(plugin, ele, actions, selector);
+ }));
+ observer.observe(document.body, {subtree: true, childList: true});
+ }
+
+ plugin.eventListeners.push({ele, eventName, origEventName, namespace, selector, eventCallback, observer});
+ ele.addEventListener(eventName, eventCallback, true);
+ }
+ };
+ BDFDB.ListenerUtils.remove = function (plugin, ele, actions = "", selector) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ArrayUtils.is(plugin.eventListeners)) return;
+ if (!ele) {
+ while (plugin.eventListeners.length) {
+ let listener = plugin.eventListeners.pop();
+ listener.ele.removeEventListener(listener.eventName, listener.eventCallback, true);
+ if (listener.observer) listener.observer.disconnect();
+ }
+ }
+ else if (Node.prototype.isPrototypeOf(ele) || ele === window) {
+ for (let action of actions.split(" ")) {
+ action = action.split(".");
+ let eventName = action.shift().toLowerCase();
+ let namespace = (action.join(".") || "") + plugin.name;
+ for (let listener of plugin.eventListeners) {
+ let removedListeners = [];
+ if (listener.ele == ele && (!eventName || listener.origEventName == eventName) && listener.namespace == namespace && (selector === undefined || listener.selector == selector)) {
+ listener.ele.removeEventListener(listener.eventName, listener.eventCallback, true);
+ if (listener.observer) listener.observer.disconnect();
+ removedListeners.push(listener);
+ }
+ if (removedListeners.length) plugin.eventListeners = plugin.eventListeners.filter(listener => !removedListeners.includes(listener));
+ }
+ }
+ }
+ };
+ const leftSideMap = {
+ 16: 160,
+ 17: 170,
+ 18: 164
+ };
+ BDFDB.ListenerUtils.addGlobal = function (plugin, id, keybind, action) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!BDFDB.ObjectUtils.is(plugin) || !id || !BDFDB.ArrayUtils.is(keybind) || typeof action != "function") return;
+ if (!BDFDB.ObjectUtils.is(plugin.globalKeybinds)) plugin.globalKeybinds = {};
+ BDFDB.ListenerUtils.removeGlobal(plugin, id);
+ plugin.globalKeybinds[id] = BDFDB.NumberUtils.generateId(Object.entries(plugin.globalKeybinds).map(n => n[1]));
+ BDFDB.LibraryModules.WindowUtils.inputEventRegister(plugin.globalKeybinds[id], keybind.map(n => [0, n]), action, {blurred: true, focused: true, keydown: false, keyup: true});
+ if (Object.keys(leftSideMap).some(key => keybind.indexOf(parseInt(key)) > -1)) {
+ const alternativeId = id + "___ALTERNATIVE";
+ plugin.globalKeybinds[alternativeId] = BDFDB.NumberUtils.generateId(Object.entries(plugin.globalKeybinds).map(n => n[1]));
+ BDFDB.LibraryModules.WindowUtils.inputEventRegister(plugin.globalKeybinds[alternativeId], keybind.map(n => [0, leftSideMap[n] ?? n]), action, {blurred: true, focused: true, keydown: false, keyup: true});
+ }
+ return (_ => BDFDB.ListenerUtils.removeGlobal(plugin, id));
+ };
+ BDFDB.ListenerUtils.removeGlobal = function (plugin, id) {
+ if (!BDFDB.ObjectUtils.is(plugin) || !plugin.globalKeybinds) return;
+ if (!id) {
+ for (let cachedId in plugin.globalKeybinds) BDFDB.LibraryModules.WindowUtils.inputEventUnregister(plugin.globalKeybinds[cachedId]);
+ plugin.globalKeybinds = {};
+ }
+ else {
+ BDFDB.LibraryModules.WindowUtils.inputEventUnregister(plugin.globalKeybinds[id]);
+ delete plugin.globalKeybinds[id];
+ const alternativeId = id + "___ALTERNATIVE";
+ BDFDB.LibraryModules.WindowUtils.inputEventUnregister(plugin.globalKeybinds[alternativeId]);
+ delete plugin.globalKeybinds[alternativeId];
+ }
+ };
+ BDFDB.ListenerUtils.multiAdd = function (node, actions, callback) {
+ if (!Node.prototype.isPrototypeOf(node) || !actions || typeof callback != "function") return;
+ for (let action of actions.trim().split(" ").filter(n => n)) node.addEventListener(action, callback, true);
+ };
+ BDFDB.ListenerUtils.multiRemove = function (node, actions, callback) {
+ if (!Node.prototype.isPrototypeOf(node) || !actions || typeof callback != "function") return;
+ for (let action of actions.trim().split(" ").filter(n => n)) node.removeEventListener(action, callback, true);
+ };
+ BDFDB.ListenerUtils.addToChildren = function (node, actions, selector, callback) {
+ if (!Node.prototype.isPrototypeOf(node) || !actions || !selector || !selector.trim() || typeof callback != "function") return;
+ for (let action of actions.trim().split(" ").filter(n => n)) {
+ let eventCallback = callback;
+ if (action == "mouseenter" || action == "mouseleave") eventCallback = e => {if (e.target.matches(selector)) callback(e);};
+ node.querySelectorAll(selector.trim()).forEach(child => child.addEventListener(action, eventCallback, true));
+ }
+ };
+ BDFDB.ListenerUtils.copyEvent = function (e, ele) {
+ if (!e || !e.constructor || !e.type) return e;
+ let eCopy = new e.constructor(e.type, e);
+ Object.defineProperty(eCopy, "originalEvent", {value: e});
+ Object.defineProperty(eCopy, "composedPath", {value: e.composedPath});
+ Object.defineProperty(eCopy, "which", {value: e.which});
+ Object.defineProperty(eCopy, "keyCode", {value: e.keyCode});
+ Object.defineProperty(eCopy, "relatedTarget", {value: e.relatedTarget});
+ Object.defineProperty(eCopy, "srcElement", {value: e.srcElement});
+ Object.defineProperty(eCopy, "target", {value: e.target});
+ Object.defineProperty(eCopy, "toElement", {value: e.toElement});
+ if (ele) Object.defineProperty(eCopy, "currentTarget", {value: ele});
+ return eCopy;
+ };
+ BDFDB.ListenerUtils.stopEvent = function (e) {
+ if (BDFDB.ObjectUtils.is(e)) {
+ if (typeof e.preventDefault == "function") e.preventDefault();
+ if (typeof e.stopPropagation == "function") e.stopPropagation();
+ if (typeof e.stopImmediatePropagation == "function") e.stopImmediatePropagation();
+ if (BDFDB.ObjectUtils.is(e.originalEvent)) {
+ if (typeof e.originalEvent.preventDefault == "function") e.originalEvent.preventDefault();
+ if (typeof e.originalEvent.stopPropagation == "function") e.originalEvent.stopPropagation();
+ if (typeof e.originalEvent.stopImmediatePropagation == "function") e.originalEvent.stopImmediatePropagation();
+ }
+ }
+ };
+
+ var Toasts = [], NotificationBars = [];
+ var ToastQueues = {}, DesktopNotificationQueue = {queue: [], running: false};
+ for (let key in Internal.DiscordConstants.ToastPositions) ToastQueues[Internal.DiscordConstants.ToastPositions[key]] = {queue: [], full: false};
+
+ BDFDB.NotificationUtils = {};
+ BDFDB.NotificationUtils.toast = function (children, config = {}) {
+ if (!children) return;
+ let app = document.querySelector(BDFDB.dotCN.appmount) || document.body;
+ if (!app) return;
+ let position = config.position && Internal.DiscordConstants.ToastPositions[config.position] || Internal.settings.choices.toastPosition && Internal.DiscordConstants.ToastPositions[Internal.settings.choices.toastPosition] || Internal.DiscordConstants.ToastPositions.right;
+ let queue = ToastQueues[position] || {};
+
+ const runQueue = _ => {
+ if (queue.full) return;
+ let data = queue.queue.shift();
+ if (!data) return;
+
+ let id = BDFDB.NumberUtils.generateId(Toasts);
+ let toasts = document.querySelector(BDFDB.dotCN.toasts + BDFDB.dotCN[position]);
+ if (!toasts) {
+ toasts = BDFDB.DOMUtils.create(``);
+ app.appendChild(toasts);
+ }
+
+ if (data.config.id) data.toast.id = data.config.id.split(" ").join("");
+ if (data.config.className) BDFDB.DOMUtils.addClass(data.toast, data.config.className);
+ if (data.config.css) BDFDB.DOMUtils.appendLocalStyle("BDFDBcustomToast" + id, data.config.css);
+ if (data.config.style) data.toast.style = Object.assign({}, data.toast.style, data.config.style);
+
+ let backgroundColor, fontColor, barColor;
+
+ let type = data.config.type && BDFDB.disCN["toast" + data.config.type];
+ if (!type) {
+ barColor = BDFDB.ColorUtils.getType(data.config.barColor) ? BDFDB.ColorUtils.convert(data.config.barColor, "HEX") : data.config.barColor;
+ let comp = BDFDB.ColorUtils.convert(data.config.color, "RGBCOMP");
+ if (comp) {
+ backgroundColor = BDFDB.ColorUtils.convert(comp, "HEX");
+ fontColor = comp[0] > 180 && comp[1] > 180 && comp[2] > 180 ? "#000" : "#FFF";
+ BDFDB.DOMUtils.addClass(data.toast, BDFDB.disCN.toastcustom);
+ }
+ else BDFDB.DOMUtils.addClass(data.toast, BDFDB.disCN.toastdefault);
+ }
+ else BDFDB.DOMUtils.addClass(data.toast, type);
+
+ let loadingInterval;
+ let disableInteractions = data.config.disableInteractions && typeof data.config.onClick != "function";
+ let timeout = typeof data.config.timeout == "number" && !disableInteractions ? data.config.timeout : 3000;
+ timeout = (timeout > 0 ? timeout : 600000) + 300;
+ if (data.config.ellipsis && typeof data.children == "string") loadingInterval = BDFDB.TimeUtils.interval(_ => data.toast.update(data.children.endsWith(".....") ? data.children.slice(0, -5) : data.children + "."), 500);
+
+ let closeTimeout = BDFDB.TimeUtils.timeout(_ => data.toast.close(), timeout);
+ data.toast.close = _ => {
+ BDFDB.TimeUtils.clear(closeTimeout);
+ if (document.contains(data.toast)) {
+ BDFDB.DOMUtils.addClass(data.toast, BDFDB.disCN.toastclosing);
+ data.toast.style.setProperty("pointer-events", "none", "important");
+ BDFDB.TimeUtils.timeout(_ => {
+ if (typeof data.config.onClose == "function") data.config.onClose();
+ BDFDB.TimeUtils.clear(loadingInterval);
+ BDFDB.ArrayUtils.remove(Toasts, id);
+ BDFDB.DOMUtils.removeLocalStyle("BDFDBcustomToast" + id);
+ data.toast.remove();
+ if (!toasts.querySelectorAll(BDFDB.dotCN.toast).length) toasts.remove();
+ }, 300);
+ }
+ queue.full = false;
+ runQueue();
+ };
+
+ if (disableInteractions) data.toast.style.setProperty("pointer-events", "none", "important");
+ else {
+ BDFDB.DOMUtils.addClass(data.toast, BDFDB.disCN.toastclosable);
+ data.toast.addEventListener("click", event => {
+ if (typeof data.config.onClick == "function" && !BDFDB.DOMUtils.getParent(BDFDB.dotCN.toastcloseicon, event.target)) data.config.onClick();
+ data.toast.close();
+ });
+ if (typeof closeTimeout.pause == "function") {
+ let paused = false;
+ data.toast.addEventListener("mouseenter", _ => {
+ if (paused) return;
+ paused = true;
+ closeTimeout.pause();
+ });
+ data.toast.addEventListener("mouseleave", _ => {
+ if (!paused) return;
+ paused = false;
+ closeTimeout.resume();
+ });
+ }
+ }
+
+ toasts.appendChild(data.toast);
+ BDFDB.TimeUtils.timeout(_ => BDFDB.DOMUtils.removeClass(data.toast, BDFDB.disCN.toastopening));
+
+ let icon = data.config.avatar ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Avatars.Avatar, {
+ src: data.config.avatar,
+ size: Internal.LibraryComponents.AvatarConstants.AvatarSizes.SIZE_24
+ }) : ((data.config.icon || data.config.type && Internal.DiscordConstants.ToastIcons[data.config.type]) ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: data.config.type && Internal.DiscordConstants.ToastIcons[data.config.type] && Internal.LibraryComponents.SvgIcon.Names[Internal.DiscordConstants.ToastIcons[data.config.type]],
+ iconSVG: data.config.icon,
+ width: 18,
+ height: 18,
+ nativeClass: true
+ }) : null);
+
+ BDFDB.ReactUtils.render(BDFDB.ReactUtils.createElement(class BDFDB_Toast extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ data.toast.update = newChildren => {
+ if (!newChildren) return;
+ data.children = newChildren;
+ BDFDB.ReactUtils.forceUpdate(this);
+ };
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.toastbg,
+ style: {backgroundColor: backgroundColor}
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.toastinner,
+ style: {color: fontColor},
+ children: [
+ icon && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(data.config.avatar && BDFDB.disCN.toastavatar, BDFDB.disCN.toasticon, data.config.iconClassName),
+ children: icon
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.toasttext, data.config.textClassName),
+ children: data.children
+ }),
+ !disableInteractions && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.toastcloseicon,
+ name: Internal.LibraryComponents.SvgIcon.Names.CLOSE,
+ width: 16,
+ height: 16
+ })
+ ].filter(n => n)
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.toastbar, barColor && BDFDB.disCN.toastcustombar),
+ style: {
+ backgroundColor: barColor,
+ animation: `toast-bar ${timeout}ms normal linear`
+ }
+ })
+ ]
+ });
+ }
+ }, {}), data.toast);
+
+ queue.full = (BDFDB.ArrayUtils.sum(Array.from(toasts.childNodes).map(c => {
+ let height = BDFDB.DOMUtils.getRects(c).height;
+ return height > 50 ? height : 50;
+ })) - 100) > BDFDB.DOMUtils.getRects(app).height;
+
+ if (typeof data.config.onShow == "function") data.config.onShow();
+ };
+
+ let toast = BDFDB.DOMUtils.create(``);
+ toast.update = _ => {};
+ queue.queue.push({children, config, toast});
+ runQueue();
+ return toast;
+ };
+ BDFDB.NotificationUtils.desktop = function (content, config = {}) {
+ if (!content) return;
+
+ const queue = _ => {
+ DesktopNotificationQueue.queue.push({content, config});
+ runQueue();
+ };
+ const runQueue = _ => {
+ if (DesktopNotificationQueue.running) return;
+ let data = DesktopNotificationQueue.queue.shift();
+ if (!data) return;
+
+ DesktopNotificationQueue.running = true;
+ let muted = data.config.silent;
+ data.config.silent = data.config.silent || data.config.sound ? true : false;
+ let audio = new Audio();
+ if (!muted && data.config.sound) {
+ audio.src = data.config.sound;
+ audio.play();
+ }
+ let notification = new Notification(data.content, data.config);
+
+ let disableInteractions = data.config.disableInteractions && typeof data.config.onClick != "function";
+ if (disableInteractions) notification.onclick = _ => {};
+ else notification.onclick = _ => {
+ if (typeof data.config.onClick == "function") data.config.onClick();
+ notification.close();
+ };
+
+ notification.onclose = _ => {
+ audio.pause();
+ DesktopNotificationQueue.running = false;
+ BDFDB.TimeUtils.timeout(runQueue, 1000);
+ }
+ };
+
+ if (!("Notification" in window)) {}
+ else if (Notification.permission === "granted") queue();
+ else if (Notification.permission !== "denied") Notification.requestPermission(function (response) {if (response === "granted") queue();});
+ };
+ BDFDB.NotificationUtils.notice = function (text, config = {}) {
+ if (!text) return;
+ let layers = document.querySelector(BDFDB.dotCN.layers) || document.querySelector(BDFDB.dotCN.appmount);
+ if (!layers) return;
+ let id = BDFDB.NumberUtils.generateId(NotificationBars);
+ let notice = BDFDB.DOMUtils.create(``);
+ layers.parentElement.insertBefore(notice, layers);
+ let noticeText = notice.querySelector(BDFDB.dotCN.noticetext);
+ if (config.platform) for (let platform of config.platform.split(" ")) if (InternalData.DiscordClasses["noticeicon" + platform]) {
+ let icon = BDFDB.DOMUtils.create(``);
+ BDFDB.DOMUtils.addClass(icon, BDFDB.disCN.noticeplatformicon);
+ BDFDB.DOMUtils.removeClass(icon, BDFDB.disCN.noticeicon);
+ notice.insertBefore(icon, noticeText);
+ }
+ if (config.customIcon) {
+ let icon = document.createElement("i"), iconInner = BDFDB.DOMUtils.create(config.customIcon);
+ if (iconInner.nodeType == Node.TEXT_NODE) icon.style.setProperty("background", `url(${config.customIcon}) center/cover no-repeat`);
+ else {
+ icon = iconInner;
+ if ((icon.tagName || "").toUpperCase() == "SVG") {
+ icon.removeAttribute("width");
+ icon.setAttribute("height", "100%");
+ }
+ }
+ BDFDB.DOMUtils.addClass(icon, BDFDB.disCN.noticeplatformicon);
+ BDFDB.DOMUtils.removeClass(icon, BDFDB.disCN.noticeicon);
+ notice.insertBefore(icon, noticeText);
+ }
+ if (BDFDB.ArrayUtils.is(config.buttons)) for (let data of config.buttons) {
+ let contents = typeof data.contents == "string" && data.contents;
+ if (contents) {
+ let button = BDFDB.DOMUtils.create(``);
+ button.addEventListener("click", event => {
+ if (data.close) notice.close();
+ if (typeof data.onClick == "function") data.onClick(event, notice);
+ });
+ if (typeof data.onMouseEnter == "function") button.addEventListener("mouseenter", event => data.onMouseEnter(event, notice));
+ if (typeof data.onMouseLeave == "function") button.addEventListener("mouseleave", event => data.onMouseLeave(event, notice));
+ notice.appendChild(button);
+ }
+ }
+ if (config.id) notice.id = config.id.split(" ").join("");
+ if (config.className) BDFDB.DOMUtils.addClass(notice, config.className);
+ if (config.textClassName) BDFDB.DOMUtils.addClass(noticeText, config.textClassName);
+ if (config.css) BDFDB.DOMUtils.appendLocalStyle("BDFDBcustomNotificationBar" + id, config.css);
+ if (config.style) notice.style = config.style;
+ if (config.html) noticeText.innerHTML = text;
+ else {
+ let link = document.createElement("a");
+ let newText = [];
+ for (let word of text.split(" ")) {
+ let encodedWord = BDFDB.StringUtils.htmlEscape(word);
+ link.href = word;
+ newText.push(link.host && link.host !== window.location.host ? `` : encodedWord);
+ }
+ noticeText.innerHTML = newText.join(" ");
+ }
+ let type = null;
+ if (config.type && !document.querySelector(BDFDB.dotCNS.chatbase + BDFDB.dotCN.noticestreamer)) {
+ if (type = BDFDB.disCN["notice" + config.type]) BDFDB.DOMUtils.addClass(notice, type);
+ if (config.type == "premium") {
+ let noticeButton = notice.querySelector(BDFDB.dotCN.noticebutton);
+ if (noticeButton) BDFDB.DOMUtils.addClass(noticeButton, BDFDB.disCN.noticepremiumaction);
+ BDFDB.DOMUtils.addClass(noticeText, BDFDB.disCN.noticepremiumtext);
+ notice.insertBefore(BDFDB.DOMUtils.create(``), noticeText);
+ }
+ }
+ if (!type) {
+ let comp = BDFDB.ColorUtils.convert(config.color, "RGBCOMP");
+ if (comp) {
+ let fontColor = comp[0] > 180 && comp[1] > 180 && comp[2] > 180 ? "#000" : "#FFF";
+ let backgroundColor = BDFDB.ColorUtils.convert(comp, "HEX");
+ BDFDB.DOMUtils.appendLocalStyle("BDFDBcustomNotificationBarColorCorrection" + id, `${BDFDB.dotCN.noticewrapper}[notice-id="${id}"]{background-color: ${backgroundColor} !important;}${BDFDB.dotCN.noticewrapper}[notice-id="${id}"] ${BDFDB.dotCN.noticetext} {color: ${fontColor} !important;}${BDFDB.dotCN.noticewrapper}[notice-id="${id}"] ${BDFDB.dotCN.noticebutton} {color: ${fontColor} !important;border-color: ${BDFDB.ColorUtils.setAlpha(fontColor, 0.25, "RGBA")} !important;}${BDFDB.dotCN.noticewrapper}[notice-id="${id}"] ${BDFDB.dotCN.noticebutton}:hover {color: ${backgroundColor} !important;background-color: ${fontColor} !important;}${BDFDB.dotCN.noticewrapper}[notice-id="${id}"] ${BDFDB.dotCN.noticedismissicon} path {fill: ${fontColor} !important;}`);
+ BDFDB.DOMUtils.addClass(notice, BDFDB.disCN.noticecustom);
+ }
+ else BDFDB.DOMUtils.addClass(notice, BDFDB.disCN.noticedefault);
+ }
+ notice.close = _ => {
+ BDFDB.DOMUtils.addClass(notice, BDFDB.disCN.noticeclosing);
+ if (notice.tooltip && typeof notice.tooltip.removeTooltip == "function") notice.tooltip.removeTooltip();
+ BDFDB.TimeUtils.timeout(_ => {
+ if (typeof config.onClose == "function") config.onClose();
+ BDFDB.ArrayUtils.remove(NotificationBars, id);
+ BDFDB.DOMUtils.removeLocalStyle("BDFDBcustomNotificationBar" + id);
+ BDFDB.DOMUtils.removeLocalStyle("BDFDBcustomNotificationBarColorCorrection" + id);
+ BDFDB.DOMUtils.remove(notice);
+ }, 500);
+ };
+ notice.querySelector(BDFDB.dotCN.noticedismiss).addEventListener("click", notice.close);
+ return notice;
+ };
+ BDFDB.NotificationUtils.alert = function (header, body) {
+ if (typeof header == "string" && typeof header == "string" && BdApi && typeof BdApi.alert == "function") BdApi.alert(header, body);
+ };
+
+ var Tooltips = [];
+ BDFDB.TooltipUtils = {};
+ BDFDB.TooltipUtils.create = function (anker, text, config = {}) {
+ if (!text && !config.guild) return null;
+ const itemLayerContainer = document.querySelector(BDFDB.dotCN.app + " ~ " + BDFDB.dotCN.itemlayercontainer) || document.querySelector(BDFDB.dotCN.itemlayercontainer);
+ if (!itemLayerContainer || !Node.prototype.isPrototypeOf(anker) || !document.contains(anker)) return null;
+ const id = BDFDB.NumberUtils.generateId(Tooltips);
+ const itemLayer = BDFDB.DOMUtils.create(``);
+ itemLayerContainer.appendChild(itemLayer);
+
+ const tooltip = itemLayer.firstElementChild;
+ const tooltipContent = itemLayer.querySelector(BDFDB.dotCN.tooltipcontent);
+ const tooltipPointer = itemLayer.querySelector(BDFDB.dotCN.tooltippointer);
+
+ if (config.id) tooltip.id = config.id.split(" ").join("");
+
+ if (typeof config.type != "string" || !BDFDB.disCN["tooltip" + config.type.toLowerCase()]) config.type = "top";
+ let type = config.type.toLowerCase();
+ BDFDB.DOMUtils.addClass(tooltip, BDFDB.disCN["tooltip" + type], config.className);
+
+ let fontColorIsGradient = false, customBackgroundColor = false, style = "";
+ if (config.style) style += config.style;
+ if (config.fontColor) {
+ fontColorIsGradient = BDFDB.ObjectUtils.is(config.fontColor);
+ if (!fontColorIsGradient) style = (style ? (style + " ") : "") + `color: ${BDFDB.ColorUtils.convert(config.fontColor, "RGBA")} !important;`
+ }
+ if (config.backgroundColor) {
+ customBackgroundColor = true;
+ let backgroundColorIsGradient = BDFDB.ObjectUtils.is(config.backgroundColor);
+ let backgroundColor = !backgroundColorIsGradient ? BDFDB.ColorUtils.convert(config.backgroundColor, "RGBA") : BDFDB.ColorUtils.createGradient(config.backgroundColor);
+ style = (style ? (style + " ") : "") + `background: ${backgroundColor} !important; border-color: ${backgroundColorIsGradient ? BDFDB.ColorUtils.convert(config.backgroundColor[type == "left" ? 100 : 0], "RGBA") : backgroundColor} !important;`;
+ }
+ if (style) tooltip.style = style;
+ const zIndexed = config.zIndex && typeof config.zIndex == "number";
+ if (zIndexed) {
+ itemLayer.style.setProperty("z-index", config.zIndex, "important");
+ tooltip.style.setProperty("z-index", config.zIndex, "important");
+ tooltipContent.style.setProperty("z-index", config.zIndex, "important");
+ BDFDB.DOMUtils.addClass(itemLayerContainer, BDFDB.disCN.itemlayercontainerzindexdisabled);
+ }
+ if (typeof config.width == "number" && config.width > 196) {
+ tooltip.style.setProperty("width", `${config.width}px`, "important");
+ tooltip.style.setProperty("max-width", `${config.width}px`, "important");
+ }
+ if (typeof config.maxWidth == "number" && config.maxWidth > 196) {
+ tooltip.style.setProperty("max-width", `${config.maxWidth}px`, "important");
+ }
+ if (customBackgroundColor) BDFDB.DOMUtils.addClass(tooltip, BDFDB.disCN.tooltipcustom);
+ else if (config.color && BDFDB.disCN["tooltip" + config.color.toLowerCase()]) BDFDB.DOMUtils.addClass(tooltip, BDFDB.disCN["tooltip" + config.color.toLowerCase()]);
+ else BDFDB.DOMUtils.addClass(tooltip, BDFDB.disCN.tooltipprimary);
+
+ if (config.list || BDFDB.ObjectUtils.is(config.guild)) BDFDB.DOMUtils.addClass(tooltip, BDFDB.disCN.tooltiplistitem);
+
+ const removeTooltip = _ => {
+ document.removeEventListener("wheel", wheel);
+ document.removeEventListener("mousemove", mouseMove);
+ document.removeEventListener("mouseleave", mouseLeave);
+ BDFDB.DOMUtils.remove(itemLayer);
+ BDFDB.ArrayUtils.remove(Tooltips, id);
+ observer.disconnect();
+ if (zIndexed) BDFDB.DOMUtils.removeClass(itemLayerContainer, BDFDB.disCN.itemlayercontainerzindexdisabled);
+ if (typeof config.onHide == "function") config.onHide(itemLayer, anker);
+ };
+ const setText = newText => {
+ if (BDFDB.ObjectUtils.is(config.guild)) {
+ let isMuted = Internal.LibraryStores.UserGuildSettingsStore.isMuted(config.guild.id);
+ let muteConfig = Internal.LibraryStores.UserGuildSettingsStore.getMuteConfig(config.guild.id);
+
+ let children = [typeof newText == "function" ? newText() : newText].flat(10).filter(n => typeof n == "string" || BDFDB.ReactUtils.isValidElement(n));
+ BDFDB.ReactUtils.render(BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltiprow, BDFDB.disCN.tooltiprowguildname),
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.GuildBadge, {
+ guild: config.guild,
+ size: 16,
+ className: BDFDB.disCN.tooltiprowiconv2
+ }),
+ BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltipguildnametext),
+ children: fontColorIsGradient ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextGradientElement, {
+ gradient: BDFDB.ColorUtils.createGradient(config.fontColor),
+ children: config.guild.toString()
+ }) : config.guild.toString()
+ }),
+ ]
+ }),
+ children.length && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltiprow, BDFDB.disCN.tooltiprowextra),
+ children: children
+ }),
+ config.note && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltiprow, BDFDB.disCN.tooltiprowextra, BDFDB.disCN.tooltipnote),
+ children: config.note
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.GuildVoiceList, {guild: config.guild}),
+ isMuted && muteConfig && (muteConfig.end_time == null ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltipmutetext),
+ size: Internal.LibraryComponents.TextElement.Sizes.SIZE_12,
+ color: Internal.LibraryComponents.TextElement.Colors.MUTED,
+ children: BDFDB.LanguageUtils.LanguageStrings.VOICE_CHANNEL_MUTED
+ }) : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.GuildTooltipMutedText, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltipmutetext),
+ muteConfig: muteConfig
+ }))
+ ].filter(n => n)
+ }), tooltipContent);
+ }
+ else {
+ let children = [typeof newText == "function" ? newText() : newText].flat(10).filter(n => typeof n == "string" || BDFDB.ReactUtils.isValidElement(n));
+ children.length && BDFDB.ReactUtils.render(BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ children: [
+ fontColorIsGradient ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextGradientElement, {
+ gradient: BDFDB.ColorUtils.createGradient(config.fontColor),
+ children: children
+ }) : children,
+ config.note && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tooltiprow, BDFDB.disCN.tooltiprowextra, BDFDB.disCN.tooltipnote),
+ children: config.note
+ })
+ ]
+ }), tooltipContent);
+ }
+ };
+ const update = newText => {
+ if (newText) setText(newText);
+ let left, top;
+ const tRects = BDFDB.DOMUtils.getRects(anker);
+ const iRects = BDFDB.DOMUtils.getRects(itemLayer);
+ const aRects = BDFDB.DOMUtils.getRects(document.querySelector(BDFDB.dotCN.appmount));
+ const positionOffsets = {height: 10, width: 10};
+ const offset = typeof config.offset == "number" ? config.offset : 0;
+ switch (type) {
+ case "top":
+ top = tRects.top - iRects.height - positionOffsets.height + 2 - offset;
+ left = tRects.left + (tRects.width - iRects.width) / 2;
+ break;
+ case "bottom":
+ top = tRects.top + tRects.height + positionOffsets.height - 2 + offset;
+ left = tRects.left + (tRects.width - iRects.width) / 2;
+ break;
+ case "left":
+ top = tRects.top + (tRects.height - iRects.height) / 2;
+ left = tRects.left - iRects.width - positionOffsets.width + 2 - offset;
+ break;
+ case "right":
+ top = tRects.top + (tRects.height - iRects.height) / 2;
+ left = tRects.left + tRects.width + positionOffsets.width - 2 + offset;
+ break;
+ }
+
+ itemLayer.style.setProperty("top", `${top}px`, "important");
+ itemLayer.style.setProperty("left", `${left}px`, "important");
+
+ tooltipPointer.style.removeProperty("margin-left");
+ tooltipPointer.style.removeProperty("margin-top");
+ if (type == "top" || type == "bottom") {
+ if (left < 0) {
+ itemLayer.style.setProperty("left", "5px", "important");
+ tooltipPointer.style.setProperty("margin-left", `${left - 10}px`, "important");
+ }
+ else {
+ const rightMargin = aRects.width - (left + iRects.width);
+ if (rightMargin < 0) {
+ itemLayer.style.setProperty("left", `${aRects.width - iRects.width - 5}px`, "important");
+ tooltipPointer.style.setProperty("margin-left", `${-1*rightMargin}px`, "important");
+ }
+ }
+ }
+ else if (type == "left" || type == "right") {
+ if (top < 0) {
+ const bRects = BDFDB.DOMUtils.getRects(document.querySelector(BDFDB.dotCN.titlebar));
+ const barCorrection = (bRects.width || 0) >= Math.round(75 * window.outerWidth / aRects.width) ? (bRects.height + 5) : 0;
+ itemLayer.style.setProperty("top", `${5 + barCorrection}px`, "important");
+ tooltipPointer.style.setProperty("margin-top", `${top - 10 - barCorrection}px`, "important");
+ }
+ else {
+ const bottomMargin = aRects.height - (top + iRects.height);
+ if (bottomMargin < 0) {
+ itemLayer.style.setProperty("top", `${aRects.height - iRects.height - 5}px`, "important");
+ tooltipPointer.style.setProperty("margin-top", `${-1*bottomMargin}px`, "important");
+ }
+ }
+ }
+ };
+
+ const wheel = e => {
+ const tRects1 = BDFDB.DOMUtils.getRects(anker);
+ BDFDB.TimeUtils.clear(wheel.timeout);
+ wheel.timeout = BDFDB.TimeUtils.timeout(_ => {
+ const tRects2 = BDFDB.DOMUtils.getRects(anker);
+ if (tRects1.x != tRects2.x || tRects1.y != tRects2.y) removeTooltip();
+ }, 500);
+ };
+ const mouseMove = e => {
+ const parent = e.target.parentElement.querySelector(":hover");
+ if (parent && anker != parent && !anker.contains(parent)) removeTooltip();
+ };
+ const mouseLeave = e => removeTooltip();
+ if (!config.perssist) {
+ document.addEventListener("wheel", wheel);
+ document.addEventListener("mousemove", mouseMove);
+ document.addEventListener("mouseleave", mouseLeave);
+ }
+
+ const observer = new MutationObserver(changes => changes.forEach(change => {
+ const nodes = Array.from(change.removedNodes);
+ if (nodes.indexOf(itemLayer) > -1 || nodes.indexOf(anker) > -1 || nodes.some(n => n.contains(anker))) removeTooltip();
+ }));
+ observer.observe(document.body, {subtree: true, childList: true});
+
+ tooltip.removeTooltip = itemLayer.removeTooltip = removeTooltip;
+ tooltip.setText = itemLayer.setText = setText;
+ tooltip.update = itemLayer.update = update;
+ setText(text);
+ update();
+
+ if (config.delay) {
+ BDFDB.DOMUtils.toggle(itemLayer);
+ BDFDB.TimeUtils.timeout(_ => {
+ BDFDB.DOMUtils.toggle(itemLayer);
+ if (typeof config.onShow == "function") config.onShow(itemLayer, anker);
+ }, config.delay);
+ }
+ else {
+ if (typeof config.onShow == "function") config.onShow(itemLayer, anker);
+ }
+ return itemLayer;
+ };
+
+ Internal.addModulePatches = function (plugin) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!plugin || !plugin.modulePatches) return;
+ let patchPriority = !isNaN(plugin.patchPriority) ? plugin.patchPriority : 5;
+ patchPriority = patchPriority < 1 ? (plugin == Internal ? 0 : 1) : (patchPriority > 9 ? (plugin == Internal ? 10 : 9) : Math.round(patchPriority));
+ for (let patchType in plugin.modulePatches) {
+ if (!PluginStores.modulePatches[patchType]) PluginStores.modulePatches[patchType] = {};
+ for (let type of plugin.modulePatches[patchType]) {
+ if (InternalData.PatchModules[type]) {
+ let found = false;
+ if (!InternalData.PatchModules[type].noSearch && (patchType == "before" || patchType == "after")) {
+ let exports = (BDFDB.ModuleUtils.find(m => Internal.isCorrectModule(m, type) && m, {defaultExport: false, moduleName: type}) || {}).exports;
+ if (exports && !exports.default) for (let key of Object.keys(exports)) if (typeof exports[key] == "function" && !(exports[key].prototype && exports[key].prototype.render) && Internal.isCorrectModule(exports[key], type, false) && exports[key].toString().length < 50000) {
+ found = true;
+ BDFDB.PatchUtils.patch(plugin, exports, key, {[patchType]: e => Internal.initiatePatch(plugin, type, {
+ arguments: e.methodArguments,
+ instance: e.instance,
+ returnvalue: e.returnValue,
+ component: exports[key],
+ name: type,
+ methodname: "render",
+ patchtypes: [patchType]
+ })}, {name: type});
+ break;
+ }
+ }
+ if (!found) {
+ if (!PluginStores.modulePatches[patchType][type]) PluginStores.modulePatches[patchType][type] = [];
+ if (!PluginStores.modulePatches[patchType][type][patchPriority]) PluginStores.modulePatches[patchType][type][patchPriority] = [];
+ PluginStores.modulePatches[patchType][type][patchPriority].push(plugin);
+ if (PluginStores.modulePatches[patchType][type][patchPriority].length > 1) PluginStores.modulePatches[patchType][type][patchPriority] = BDFDB.ArrayUtils.keySort(PluginStores.modulePatches[patchType][type][patchPriority], "name");
+ }
+ }
+ else BDFDB.LogUtils.warn(`[${type}] not found in PatchModules InternalData`, plugin);
+ }
+ }
+ };
+ Internal.addContextPatches = function (plugin) {
+ if (!InternalData.ContextMenuTypes || !BdApi || !BdApi.ContextMenu || typeof BdApi.ContextMenu.patch != "function") return;
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!plugin) return;
+ for (let type in InternalData.ContextMenuTypes) if (typeof plugin[`on${type}`] == "function") {
+ if (!BDFDB.ArrayUtils.is(plugin.patchCancels)) plugin.patchCancels = [];
+ plugin.patchCancels.push(BdApi.ContextMenu.patch(InternalData.ContextMenuTypes[type], (returnValue, props) => typeof plugin[`on${type}`] == "function" && plugin[`on${type}`]({returnvalue: returnValue, instance: {props}})));
+ }
+ };
+ Internal.initiatePatch = function (plugin, type, e) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (BDFDB.ObjectUtils.is(plugin) && !plugin.stopping && e.instance) {
+ type = BDFDB.StringUtils.upperCaseFirstChar(type).replace(/[^A-z0-9]|_/g, "");
+ if (typeof plugin[`process${type}`] == "function") {
+ if (typeof e.methodname == "string" && ["componentDidMount", "componentDidUpdate", "componentWillUnmount"].indexOf(e.methodname) > -1) {
+ e.node = BDFDB.ReactUtils.findDOMNode(e.instance);
+ if (e.node) {
+ let tempReturn = plugin[`process${type}`](e);
+ return tempReturn !== undefined ? tempReturn : e.returnvalue;
+ }
+ else BDFDB.TimeUtils.timeout(_ => {
+ e.node = BDFDB.ReactUtils.findDOMNode(e.instance);
+ if (e.node) plugin[`process${type}`](e);
+ });
+ }
+ else if (e.returnvalue !== undefined || e.patchtypes.includes("before")) {
+ let tempReturn = plugin[`process${type}`](e);
+ return tempReturn !== undefined ? tempReturn : e.returnvalue;
+ }
+ }
+ }
+ };
+
+ const PatchTypes = ["before", "instead", "after"];
+ BDFDB.PatchUtils = {};
+ BDFDB.PatchUtils.isPatched = function (plugin, module, methodName) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!plugin || !methodName || (!BDFDB.ObjectUtils.is(module) && !BDFDB.ArrayUtils.is(module)) || !module[methodName] || !module[methodName].BDFDB_Patches) return false;
+ const pluginId = (typeof plugin === "string" ? plugin : plugin.name).toLowerCase();
+ return pluginId && BDFDB.ObjectUtils.toArray(module[methodName].BDFDB_Patches).some(patchObj => BDFDB.ObjectUtils.toArray(patchObj.plugins).some(priorityObj => Object.keys(priorityObj).includes(pluginId)));
+ };
+ BDFDB.PatchUtils.patch = function (plugin, module, methodNames, patchMethods, config = {}) {
+ if (!BdApi || !BdApi.Patcher) return;
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!plugin || (!BDFDB.ObjectUtils.is(module) && !BDFDB.ArrayUtils.is(module)) || !methodNames || !BDFDB.ObjectUtils.is(patchMethods)) return null;
+ patchMethods = BDFDB.ObjectUtils.filter(patchMethods, type => PatchTypes.includes(type) && typeof BdApi.Patcher[type] == "function" && typeof patchMethods[type] == "function", true);
+ if (BDFDB.ObjectUtils.isEmpty(patchMethods)) return null;
+
+ const pluginName = (typeof plugin === "string" ? plugin : plugin.name) || "";
+ const pluginVersion = typeof plugin === "string" ? "" : plugin.version;
+ const pluginId = pluginName.toLowerCase();
+
+ let patchPriority = !isNaN(config.priority) ? config.priority : (BDFDB.ObjectUtils.is(plugin) && !isNaN(plugin.patchPriority) ? plugin.patchPriority : 5);
+ patchPriority = patchPriority < 1 ? (plugin == Internal ? 0 : 1) : (patchPriority > 9 ? (plugin == Internal ? 10 : 9) : Math.round(patchPriority));
+
+ methodNames = [methodNames].flat(10).filter(n => n);
+ let cancel = _ => BDFDB.PatchUtils.unpatch(plugin, module, methodNames);
+
+ for (let methodName of methodNames) if (module[methodName] == null || typeof module[methodName] == "function") {
+ if (!module[methodName]) module[methodName] = _ => {return null};
+ let patches = module[methodName].BDFDB_Patches || {};
+ for (let type in patchMethods) {
+ const internalData = (Object.entries(InternalData.LibraryModules).find(n => n && n[0] && LibraryModules[n[0]] == module && n[1] && n[1]._originalModule && n[1]._mappedItems[methodName]) || [])[1];
+ const name = internalData && internalData[0] || config.name || (module.constructor ? (module.constructor.displayName || module.constructor.name) : "module");
+ try {
+ if (!patches[type]) {
+ const originalMethod = module[methodName].__originalFunction || module[methodName];
+ const mainCancel = BdApi.Patcher[type](Internal.name, internalData && internalData._originalModule || module, internalData && internalData._mappedItems[methodName] || methodName, function(...args) {
+ let callInsteadAfterwards = false, stopInsteadCall = false;
+ const data = {
+ component: module,
+ methodArguments: args[1],
+ returnValue: args[2],
+ originalMethod: originalMethod,
+ originalMethodName: methodName
+ };
+ if (type == "instead") {
+ data.callOriginalMethod = _ => data.returnValue = data.originalMethod.apply(this && this !== window ? this : {}, data.methodArguments);
+ data.callOriginalMethodAfterwards = _ => (callInsteadAfterwards = true, data.returnValue);
+ data.stopOriginalMethodCall = _ => stopInsteadCall = true;
+ }
+ if (args[0] != module) data.instance = args[0] || {props: args[1][0]};
+ for (let priority in patches[type].plugins) for (let id in BDFDB.ObjectUtils.sort(patches[type].plugins[priority])) {
+ let tempReturn = BDFDB.TimeUtils.suppress(patches[type].plugins[priority][id], `"${type}" callback of ${methodName} in ${name}`, {name: patches[type].plugins[priority][id].pluginName, version: patches[type].plugins[priority][id].pluginVersion})(data);
+ if (type != "before" && tempReturn !== undefined) data.returnValue = tempReturn;
+ }
+ if (type == "instead" && callInsteadAfterwards && !stopInsteadCall) BDFDB.TimeUtils.suppress(data.callOriginalMethod, `originalMethod of ${methodName} in ${name}`, {name: "Discord"})();
+
+ if (type != "before") return (methodName == "render" || methodName == "type") && data.returnValue === undefined ? null : data.returnValue;
+ });
+ module[methodName].BDFDB_Patches = patches;
+ patches[type] = {plugins: {}, cancel: _ => {
+ if (!config.noCache) BDFDB.ArrayUtils.remove(Internal.patchCancels, patches[type].cancel, true);
+ delete patches[type];
+ if (!config.noCache && BDFDB.ObjectUtils.isEmpty(patches)) delete module[methodName].BDFDB_Patches;
+ mainCancel();
+ }};
+ if (!config.noCache) {
+ if (!BDFDB.ArrayUtils.is(Internal.patchCancels)) Internal.patchCancels = [];
+ Internal.patchCancels.push(patches[type].cancel);
+ }
+ }
+ if (!patches[type].plugins[patchPriority]) patches[type].plugins[patchPriority] = {};
+ patches[type].plugins[patchPriority][pluginId] = (...args) => {
+ if (config.once || !plugin.started) cancel();
+ return patchMethods[type](...args);
+ };
+ patches[type].plugins[patchPriority][pluginId].pluginName = pluginName;
+ patches[type].plugins[patchPriority][pluginId].pluginVersion = pluginVersion;
+ } catch (err) {BDFDB.LogUtils.error(["Could not patch Component!", `"${type}" Patch of ${methodName} in ${name}`, err], plugin);}
+ }
+ }
+ if (BDFDB.ObjectUtils.is(plugin) && !config.once && !config.noCache) {
+ if (!BDFDB.ArrayUtils.is(plugin.patchCancels)) plugin.patchCancels = [];
+ plugin.patchCancels.push(cancel);
+ }
+ return cancel;
+ };
+ BDFDB.PatchUtils.unpatch = function (plugin, module, methodNames) {
+ plugin = plugin == BDFDB && Internal || plugin;
+ if (!module || !methodNames) {
+ if (BDFDB.ObjectUtils.is(plugin) && BDFDB.ArrayUtils.is(plugin.patchCancels)) while (plugin.patchCancels.length) (plugin.patchCancels.pop())();
+ }
+ else {
+ const pluginId = !plugin ? null : (typeof plugin === "string" ? plugin : plugin.name).toLowerCase();
+ for (let methodName of [methodNames].flat(10).filter(n => n)) if (module[methodName] && module[methodName].BDFDB_Patches) {
+ let patches = module[methodName].BDFDB_Patches;
+ for (let type in patches) {
+ if (pluginId) for (let priority in patches[type].plugins) {
+ delete patches[type].plugins[priority][pluginId];
+ if (BDFDB.ObjectUtils.isEmpty(patches[type].plugins[priority])) delete patches[type].plugins[priority];
+ }
+ else patches[type].plugins = {};
+ if (BDFDB.ObjectUtils.isEmpty(patches[type].plugins)) patches[type].cancel();
+ }
+ }
+ }
+ };
+ Internal.forceUpdate = function (pluginDataObjs, instance, type) {
+ pluginDataObjs = [pluginDataObjs].flat(10).filter(n => n);
+ if (pluginDataObjs.length && instance && type) {
+ let forceRender = false;
+ for (let pluginData of pluginDataObjs) {
+ let plugin = pluginData.plugin == BDFDB && Internal || pluginData.plugin, methodNames = [];
+ for (let patchType in plugin.modulePatches) {
+ if (plugin.modulePatches[patchType].indexOf(type) > -1) methodNames.push(patchType);
+ }
+ methodNames = BDFDB.ArrayUtils.removeCopies(methodNames).flat(10).filter(n => n);
+ if (methodNames.indexOf("componentDidMount") > -1) Internal.initiatePatch(plugin, type, {
+ arguments: [],
+ instance: instance,
+ returnvalue: undefined,
+ component: undefined,
+ methodname: "componentDidMount",
+ patchtypes: pluginData.patchTypes[type]
+ });
+ if (methodNames.indexOf("before") > -1 || methodNames.indexOf("after") > -1) forceRender = true;
+ else if (!forceRender && methodNames.includes("componentDidUpdate") > -1) Internal.initiatePatch(plugin, type, {
+ arguments: [],
+ instance: instance,
+ returnvalue: undefined,
+ component: undefined,
+ methodname: "componentDidUpdate",
+ patchtypes: pluginData.patchTypes[type]
+ });
+ }
+ if (forceRender) BDFDB.ReactUtils.forceUpdate(instance);
+ }
+ };
+ BDFDB.PatchUtils.forceAllUpdates = function (plugins, selectedTypes) {
+ plugins = [plugins].flat(10).map(n => n == BDFDB && Internal || n).filter(n => BDFDB.ObjectUtils.is(n.modulePatches));
+ if (!plugins.length) return;
+ const app = document.querySelector(BDFDB.dotCN.app);
+ if (!app) return;
+ selectedTypes = [selectedTypes].flat(10).filter(n => n);
+ let toBeUpdatedModulesObj = {};
+ let patchTypes = {};
+ for (let plugin of plugins) {
+ toBeUpdatedModulesObj[plugin.name] = [];
+ patchTypes[plugin.name] = {};
+ for (let patchType in plugin.modulePatches) for (let type of plugin.modulePatches[patchType]) if (!selectedTypes.length || selectedTypes.includes(type)) {
+ toBeUpdatedModulesObj[plugin.name].push(type);
+ if (!patchTypes[plugin.name][type]) patchTypes[plugin.name][type] = [];
+ patchTypes[plugin.name][type].push(patchType);
+ }
+ }
+ let toBeUpdatedModules = BDFDB.ArrayUtils.removeCopies(BDFDB.ObjectUtils.toArray(toBeUpdatedModulesObj).flat(10));
+ if (!BDFDB.ArrayUtils.sum(toBeUpdatedModules.map(n => n.length))) return;
+ try {
+ const appInsDown = BDFDB.ReactUtils.findOwner(app, {name: toBeUpdatedModules, all: true, unlimited: true, group: true});
+ const appInsUp = BDFDB.ReactUtils.findOwner(app, {name: toBeUpdatedModules, all: true, unlimited: true, group: true, up: true});
+ for (let type in appInsDown) {
+ let filteredPlugins = plugins.filter(n => toBeUpdatedModulesObj[n.name].includes(type)).map(n => ({plugin: n, patchTypes: patchTypes[n.name]}));
+ for (let ins of appInsDown[type]) Internal.forceUpdate(filteredPlugins, ins, type);
+ }
+ for (let type in appInsUp) {
+ let filteredPlugins = plugins.filter(n => toBeUpdatedModulesObj[n.name].includes(type)).map(n => ({plugin: n, patchTypes: patchTypes[n.name]}));
+ for (let ins of appInsUp[type]) Internal.forceUpdate(filteredPlugins, ins, type);
+ }
+ }
+ catch (err) {for (let plugin of plugins) BDFDB.LogUtils.error(["Could not force update Components!", err], plugin);}
+ };
+
+ Internal.isCorrectModule = function (module, type, useCache = false) {
+ if (!InternalData.PatchModules || !InternalData.PatchModules[type]) return false;
+ else if (useCache && Cache && Cache.modules && Cache.modules.patch && Cache.modules.patch[type] == module) return true;
+ else {
+ let foundModule = null;
+ if (InternalData.PatchModules[type].strings) foundModule = Internal.checkModuleStrings(module._originalFunction || module, InternalData.PatchModules[type].strings) ? module : null;
+ if (InternalData.PatchModules[type].props) foundModule = Internal.checkModuleProps(module, InternalData.PatchModules[type].props) ? module : null;
+ if (InternalData.PatchModules[type].protos) foundModule = Internal.checkModuleProtos(module, InternalData.PatchModules[type].protos) ? module : null;
+ if (foundModule) {
+ if (InternalData.PatchModules[type].nonStrings) foundModule = Internal.checkModuleStrings(module._originalFunction || module, InternalData.PatchModules[type].nonStrings, {hasNot: true}) ? module : null;
+ if (InternalData.PatchModules[type].nonProps) foundModule = Internal.checkModuleProps(module, InternalData.PatchModules[type].nonProps, {hasNot: true}) ? module : null;
+ if (InternalData.PatchModules[type].nonProtos) foundModule = Internal.checkModuleProtos(module, InternalData.PatchModules[type].nonProtos, {hasNot: true}) ? module : null;
+ }
+ if (foundModule) {
+ if (useCache) {
+ if (!Cache.modules.patch) Cache.modules.patch = {};
+ Cache.modules.patch[type] = foundModule;
+ }
+ return true;
+ }
+ }
+ return false;
+ };
+ Internal.isCorrectModuleButDontPatch = function (type) {
+ if (type == "MessageToolbar" && document.querySelector(BDFDB.dotCN.emojipicker)) return true;
+ return false;
+ };
+ Internal.findModuleViaData = (moduleStorage, dataStorage, item) => {
+ if (!dataStorage[item]) return;
+ let defaultExport = typeof dataStorage[item].exported != "boolean" ? true : dataStorage[item].exported;
+ if (dataStorage[item].props) moduleStorage[item] = BDFDB.ModuleUtils.findByProperties(dataStorage[item].props, {defaultExport: defaultExport, moduleName: item});
+ else if (dataStorage[item].protos) moduleStorage[item] = BDFDB.ModuleUtils.findByPrototypes(dataStorage[item].protos, {defaultExport: defaultExport, moduleName: item});
+ else if (dataStorage[item].name) moduleStorage[item] = BDFDB.ModuleUtils.findByName(dataStorage[item].name, {defaultExport: defaultExport, moduleName: item});
+ else if (dataStorage[item].strings) {
+ if (dataStorage[item].nonStrings) {
+ moduleStorage[item] = Internal.findModule("strings + nonStrings", JSON.stringify([dataStorage[item].strings, dataStorage[item].nonStrings].flat(10)), m => Internal.checkModuleStrings(m, dataStorage[item].strings) && Internal.checkModuleStrings(m, dataStorage[item].nonStrings, {hasNot: true}) && m, {defaultExport: defaultExport, moduleName: item});
+ }
+ else moduleStorage[item] = BDFDB.ModuleUtils.findByString(dataStorage[item].strings, {defaultExport: defaultExport, moduleName: item});
+ }
+ if (dataStorage[item].value) moduleStorage[item] = (moduleStorage[item] || {})[dataStorage[item].value];
+ if (dataStorage[item].assign) moduleStorage[item] = Object.assign({}, moduleStorage[item]);
+ if (!moduleStorage[item]) return;
+ if (moduleStorage[item][item]) moduleStorage[item] = moduleStorage[item][item];
+ if (dataStorage[item].funcStrings) moduleStorage[item] = (Object.entries(moduleStorage[item]).find(n => {
+ if (!n || !n[1]) return;
+ let funcString = typeof n[1] == "function" ? n[1].toString() : (_ => {try {return JSON.stringify(n[1])}catch(err){return n[1].toString()}})();
+ let renderFuncString = typeof n[1].render == "function" && n[1].render.toString() || "";
+ return (funcString || renderFuncString) && [dataStorage[item].funcStrings].flat(10).filter(s => s && typeof s == "string").every(string => funcString && funcString.indexOf(string) > -1 || renderFuncString && renderFuncString.indexOf(string) > -1);
+ }) || [])[1];
+ if (dataStorage[item].map) {
+ dataStorage[item]._originalModule = moduleStorage[item];
+ dataStorage[item]._mappedItems = {};
+ moduleStorage[item] = new Proxy(Object.assign({}, dataStorage[item]._originalModule, dataStorage[item].map), {
+ get: function (_, item2) {
+ if (dataStorage[item]._originalModule[item2]) return dataStorage[item]._originalModule[item2];
+ if (dataStorage[item]._mappedItems[item2]) return dataStorage[item]._originalModule[dataStorage[item]._mappedItems[item2]];
+ if (!dataStorage[item].map[item2]) return dataStorage[item]._originalModule[item2];
+ let foundFunc = dataStorage[item].map[item2] && dataStorage[item].map[item2].length == 1 && dataStorage[item]._originalModule[dataStorage[item].map[item2][0]] ? [dataStorage[item].map[item2][0], dataStorage[item]._originalModule[dataStorage[item].map[item2][0]]] : Object.entries(dataStorage[item]._originalModule).find(n => {
+ if (!n || !n[1]) return;
+ let funcString = typeof n[1] == "function" ? n[1].toString() : (_ => {try {return JSON.stringify(n[1])}catch(err){return n[1].toString()}})();
+ let renderFuncString = typeof n[1].render == "function" && n[1].render.toString() || "";
+ return [dataStorage[item].map[item2]].flat(10).filter(s => s && typeof s == "string").every(string => funcString && funcString.replace(/[\n\t\r]/g, "").indexOf(string) > -1 || renderFuncString && renderFuncString.replace(/[\n\t\r]/g, "").indexOf(string) > -1);
+ });
+ if (foundFunc) {
+ dataStorage[item]._mappedItems[item2] = foundFunc[0];
+ return foundFunc[1];
+ }
+ return "div";
+ }
+ });
+ }
+ };
+
+ LibraryModules.LanguageStore = BDFDB.ModuleUtils.find(m => m.Messages && m.Messages.IMAGE && m);
+ LibraryModules.React = BDFDB.ModuleUtils.findByProperties("createElement", "cloneElement");
+ LibraryModules.ReactDOM = BDFDB.ModuleUtils.findByProperties("render", "findDOMNode");
+ Internal.LibraryModules = new Proxy(LibraryModules, {
+ get: function (_, item) {
+ if (LibraryModules[item]) return LibraryModules[item];
+ if (!InternalData.LibraryModules[item]) return null;
+
+ Internal.findModuleViaData(LibraryModules, InternalData.LibraryModules, item);
+
+ return LibraryModules[item] ? LibraryModules[item] : null;
+ }
+ });
+ BDFDB.LibraryModules = Internal.LibraryModules;
+
+ if (Internal.LibraryModules.KeyCodeUtils) {
+ let originalModule = LibraryModules.KeyCodeUtils;
+ LibraryModules.KeyCodeUtils = new Proxy(originalModule, {
+ get: function (_, item) {
+ if (item == "getString") return getString;
+ else if (item == "_originalModule") return originalModule;
+ else if (originalModule[item]) return originalModule[item];
+ else return null;
+ }
+ });
+
+ let codeMap = BDFDB.ObjectUtils.invert(Internal.LibraryModules.PlatformUtils.isLinux() ? Internal.DiscordConstants.LinuxKeyToCode : Internal.LibraryModules.PlatformUtils.isMac() ? Internal.DiscordConstants.MacosKeyToCode : Internal.LibraryModules.PlatformUtils.isWindows() ? Internal.DiscordConstants.WindowsKeyToCode : {});
+ let keyMap = [["META", "⌘"], ["RIGHT META", "RIGHT ⌘"], ["SHIFT", "⇧"], ["RIGHT SHIFT", "RIGHT ⇧"], ["ALT", "⌥"], ["RIGHT ALT", "RIGHT ⌥"], ["CTRL", "⌃"], ["RIGHT CTRL", "RIGHT ⌃"], ["ENTER", "↵"], ["BACKSPACE", "⌫"], ["DEL", "⌦"], ["ESC", "⎋"], ["PAGEUP", "⇞"], ["PAGEDOWN", "⇟"], ["UP", "↑"], ["DOWN", "↓"], ["LEFT", "←"], ["RIGHT", "→"], ["HOME", "↖"], ["END", "↘"], ["TAB", "⇥"], ["SPACE", "␣"]];
+ let mapKeys = key => {
+ let upperCaseKey = key.toUpperCase();
+ for (let [name, mappedKey] of mapKeys) if (name === upperCaseKey) return mappedKey;
+ return key;
+ };
+ const getString = function (keyArray, upperCase = true) {
+ let strings = [keyArray].flat(10).filter(n => n).map(keyCode => {
+ let code = Internal.LibraryModules.KeyCodeUtils.keyToCode((Object.entries(Internal.LibraryModules.KeyEvents.codes).find(n => n[1] == keyCode && Internal.LibraryModules.KeyCodeUtils.keyToCode(n[0], null)) || [])[0], null) || keyCode;
+ return codeMap[code] || "UNK".concat(code)
+ }).filter(n => n != null);
+ if (!upperCase) return strings.join("+");
+ else {
+ strings = window.navigator.appVersion.indexOf("Mac OS X") != -1 ? strings.map(mapKeys) : strings;
+ return strings.join(" + ").toUpperCase();
+ }
+ };
+ }
+
+ const MyReact = {};
+ MyReact.childrenToArray = function (parent) {
+ if (parent && parent.props && parent.props.children && !BDFDB.ArrayUtils.is(parent.props.children)) {
+ const child = parent.props.children;
+ parent.props.children = [];
+ parent.props.children.push(child);
+ }
+ return parent.props.children;
+ }
+ MyReact.createElement = function (component, props = {}, errorWrap = false, ignoreErrors = false) {
+ if (component && component.defaultProps) for (let key in component.defaultProps) if (props[key] == null) props[key] = component.defaultProps[key];
+ try {
+ let child = Internal.LibraryModules.React.createElement(component || "div", props) || null;
+ if (errorWrap) return Internal.LibraryModules.React.createElement(Internal.ErrorBoundary, {key: child && child.key || ""}, child) || null;
+ else return child;
+ }
+ catch (err) {!ignoreErrors && BDFDB.LogUtils.error(["Could not create React Element!", err]);}
+ return null;
+ };
+ MyReact.objectToReact = function (obj) {
+ if (!obj) return null;
+ else if (typeof obj == "string") return obj;
+ else if (BDFDB.ObjectUtils.is(obj)) return BDFDB.ReactUtils.createElement(obj.type && typeof obj.type == "function" || typeof obj.type == "string" ? obj.type : (obj.props && obj.props.href && "a" || "div"), !obj.props ? {} : Object.assign({}, obj.props, {
+ children: obj.props.children ? MyReact.objectToReact(obj.props.children) : null
+ }));
+ else if (BDFDB.ArrayUtils.is(obj)) return obj.map(n => MyReact.objectToReact(n));
+ else return null;
+ };
+ MyReact.markdownParse = function (str) {
+ if (!Internal.LibraryModules.SimpleMarkdownParser) return null;
+ if (!MyReact.markdownParse.parser || !MyReact.markdownParse.render) {
+ MyReact.markdownParse.parser = Internal.LibraryModules.SimpleMarkdownParser.parserFor(Internal.LibraryModules.SimpleMarkdownParser.defaultRules);
+ MyReact.markdownParse.render = Internal.LibraryModules.SimpleMarkdownParser.reactFor(Internal.LibraryModules.SimpleMarkdownParser.ruleOutput(Internal.LibraryModules.SimpleMarkdownParser.defaultRules, "react"));
+ }
+ return MyReact.render && MyReact.parser ? MyReact.render(MyReact.parser(str, {inline: true})) : null;
+ };
+ MyReact.elementToReact = function (node, ref) {
+ if (BDFDB.ReactUtils.isValidElement(node)) return node;
+ else if (!Node.prototype.isPrototypeOf(node)) return null;
+ else if (node.nodeType == Node.TEXT_NODE) return node.nodeValue;
+ let attributes = {}, importantStyles = [];
+ if (typeof ref == "function") attributes.ref = ref;
+ if (node.attributes) {
+ for (let attr of node.attributes) attributes[attr.name] = attr.value;
+ if (node.attributes.style) attributes.style = BDFDB.ObjectUtils.filter(node.style, n => node.style[n] && isNaN(parseInt(n)), true);
+ }
+ attributes.children = [];
+ if (node.style && node.style.cssText) for (let propStr of node.style.cssText.split(";")) if (propStr.endsWith("!important")) {
+ let key = propStr.split(":")[0];
+ let camelprop = key.replace(/-([a-z]?)/g, (m, g) => g.toUpperCase());
+ if (attributes.style[camelprop] != null) importantStyles.push(key);
+ }
+ for (let child of node.childNodes) attributes.children.push(MyReact.elementToReact(child));
+ attributes.className = BDFDB.DOMUtils.formatClassName(attributes.className, attributes.class);
+ delete attributes.class;
+ return BDFDB.ReactUtils.forceStyle(BDFDB.ReactUtils.createElement(node.tagName, attributes), importantStyles);
+ };
+ MyReact.forceStyle = function (reactEle, styles) {
+ if (!BDFDB.ReactUtils.isValidElement(reactEle)) return null;
+ if (!BDFDB.ObjectUtils.is(reactEle.props.style) || !BDFDB.ArrayUtils.is(styles) || !styles.length) return reactEle;
+ let ref = reactEle.ref;
+ reactEle.ref = instance => {
+ if (typeof ref == "function") ref(instance);
+ let node = BDFDB.ReactUtils.findDOMNode(instance);
+ if (Node.prototype.isPrototypeOf(node)) for (let key of styles) {
+ let propValue = reactEle.props.style[key.replace(/-([a-z]?)/g, (m, g) => g.toUpperCase())];
+ if (propValue != null) node.style.setProperty(key, propValue, "important");
+ }
+ };
+ return reactEle;
+ };
+ MyReact.findDOMNode = function (instance) {
+ if (Node.prototype.isPrototypeOf(instance)) return instance;
+ if (!instance || !instance.updater || typeof instance.updater.isMounted !== "function" || !instance.updater.isMounted(instance)) return null;
+ let node = Internal.LibraryModules.ReactDOM.findDOMNode(instance) || BDFDB.ObjectUtils.get(instance, "child.stateNode");
+ return Node.prototype.isPrototypeOf(node) ? node : null;
+ };
+ MyReact.findParent = function (nodeOrInstance, config) {
+ if (!nodeOrInstance || !BDFDB.ObjectUtils.is(config) || !config.name && !config.type && !config.key && !config.props && !config.filter) return [null, -1];
+ let instance = Node.prototype.isPrototypeOf(nodeOrInstance) ? BDFDB.ReactUtils.getInstance(nodeOrInstance) : nodeOrInstance;
+ if (!BDFDB.ObjectUtils.is(instance) && !BDFDB.ArrayUtils.is(instance) || instance.props && typeof instance.props.children == "function") return [null, -1];
+
+ config.name = config.name && [config.name].flat().filter(n => n);
+ config.type = config.type && [config.type].flat().filter(n => n);
+ config.key = config.key && [config.key].flat().filter(n => n);
+ config.props = config.props && [config.props].flat().filter(n => n);
+ config.filter = typeof config.filter == "function" && config.filter;
+
+ let parent, firstArray;
+ parent = firstArray = instance;
+ while (!BDFDB.ArrayUtils.is(firstArray) && firstArray.props && firstArray.props.children) firstArray = firstArray.props.children;
+ if (!BDFDB.ArrayUtils.is(firstArray)) {
+ if (parent && parent.props) {
+ parent.props.children = [parent.props.children];
+ firstArray = parent.props.children;
+ }
+ else firstArray = [];
+ }
+ return getParent(instance);
+
+ function getParent (children) {
+ let result = [firstArray, -1];
+ if (!children) return result;
+ if (!BDFDB.ArrayUtils.is(children)) {
+ if (check(children)) result = found(children);
+ else {
+ if (children.props && children.props.children) {
+ parent = children;
+ result = getParent(children.props.children);
+ }
+ if (!(result && result[1] > -1) && children.props && children.props.child) {
+ parent = children;
+ result = getParent(children.props.child);
+ }
+ }
+ }
+ else {
+ for (let i = 0; result[1] == -1 && i < children.length; i++) if (children[i]) {
+ if (BDFDB.ArrayUtils.is(children[i])) {
+ parent = children;
+ result = getParent(children[i]);
+ }
+ else if (check(children[i])) {
+ parent = children;
+ result = found(children[i]);
+ }
+ else {
+ if (children[i].props && children[i].props.children) {
+ parent = children[i];
+ result = getParent(children[i].props.children);
+ }
+ if (!(result && result[1] > -1) && children[i].props && children[i].props.child) {
+ parent = children[i];
+ result = getParent(children[i].props.child);
+ }
+ }
+ }
+ }
+ return result;
+ }
+ function found (child) {
+ if (BDFDB.ArrayUtils.is(parent)) return [parent, parent.indexOf(child)];
+ else {
+ parent.props.children = [];
+ parent.props.children.push(child);
+ return [parent.props.children, 0];
+ }
+ }
+ function check (instance) {
+ if (!instance || instance == parent) return false;
+ let props = instance.stateNode ? instance.stateNode.props : instance.props;
+ if (config.name && instance.type && config.name.some(name => instance.type.displayName == name || instance.type.name == name || Internal.isCorrectModule(instance.type.render || instance.type.type || instance.type, name))) return true;
+ if (config.type && config.type.some(type => instance.type == type)) return true;
+ if (config.key && config.key.some(key => instance.key == key)) return true;
+ if (config.props && props && config.props[config.someProps ? "some" : "every"](prop => BDFDB.ArrayUtils.is(prop) ? (BDFDB.ArrayUtils.is(prop[1]) ? prop[1].some(checkValue => propCheck(props, prop[0], checkValue)) : propCheck(props, prop[0], prop[1])) : props[prop] !== undefined)) return true;
+ if (config.filter && config.filter(instance)) return true;
+ return false;
+ }
+ function propCheck (props, key, value) {
+ return key != null && props[key] != null && value != null && (key == "className" ? (" " + props[key] + " ").indexOf(" " + value + " ") > -1 : BDFDB.equals(props[key], value));
+ }
+ };
+ MyReact.findChild = function (nodeOrInstance, config) {
+ if (!nodeOrInstance || !BDFDB.ObjectUtils.is(config) || !config.name && !config.type && !config.key && !config.props && !config.filter) return config.all ? [] : null;
+ let instance = Node.prototype.isPrototypeOf(nodeOrInstance) ? BDFDB.ReactUtils.getInstance(nodeOrInstance) : nodeOrInstance;
+ if (!BDFDB.ObjectUtils.is(instance) && !BDFDB.ArrayUtils.is(instance)) return null;
+
+ config.name = config.name && [config.name].flat().filter(n => n);
+ config.type = config.type && [config.type].flat().filter(n => n);
+ config.key = config.key && [config.key].flat().filter(n => n);
+ config.props = config.props && [config.props].flat().filter(n => n);
+ config.filter = typeof config.filter == "function" && config.filter;
+
+ let depth = -1;
+ let start = performance.now();
+ let maxDepth = config.unlimited ? 999999999 : (config.depth === undefined ? 30 : config.depth);
+ let maxTime = config.unlimited ? 999999999 : (config.time === undefined ? 150 : config.time);
+
+ let foundChildren = [];
+ let singleChild = getChild(instance);
+ if (config.all) {
+ for (let i in foundChildren) delete foundChildren[i].BDFDBreactSearch;
+ return foundChildren;
+ }
+ else return singleChild;
+
+ function getChild (children) {
+ let result = null;
+ if (!children || depth >= maxDepth || performance.now() - start >= maxTime) return result;
+ if (!BDFDB.ArrayUtils.is(children)) {
+ if (check(children)) {
+ if (config.all === undefined || !config.all) result = children;
+ else if (config.all) {
+ if (!children.BDFDBreactSearch) {
+ children.BDFDBreactSearch = true;
+ foundChildren.push(children);
+ }
+ }
+ }
+ else {
+ if (children.props && children.props.children) {
+ depth++;
+ result = getChild(children.props.children);
+ depth--;
+ }
+ if (!result && children.props && children.props.child) {
+ depth++;
+ result = getChild(children.props.child);
+ depth--;
+ }
+ }
+ }
+ else {
+ for (let child of children) if (child) {
+ if (BDFDB.ArrayUtils.is(child)) result = getChild(child);
+ else if (check(child)) {
+ if (config.all === undefined || !config.all) result = child;
+ else if (config.all) {
+ if (!child.BDFDBreactSearch) {
+ child.BDFDBreactSearch = true;
+ foundChildren.push(child);
+ }
+ }
+ }
+ else {
+ if (child.props && child.props.children) {
+ depth++;
+ result = getChild(child.props.children);
+ depth--;
+ }
+ if (!result && child.props && child.props.child) {
+ depth++;
+ result = getChild(child.props.child);
+ depth--;
+ }
+ }
+ if (result) break;
+ }
+ }
+ return result;
+ }
+ function check (instance) {
+ if (!instance || instance == parent) return false;
+ let props = instance.stateNode ? instance.stateNode.props : instance.props;
+ if (config.name && instance.type && config.name.some(name => instance.type.displayName == name || instance.type.name == name || Internal.isCorrectModule(instance.type.render || instance.type.type || instance.type, name))) return true;
+ if (config.type && config.type.some(type => instance.type == type)) return true;
+ if (config.key && config.key.some(key => instance.key == key)) return true;
+ if (config.props && props && config.props[config.someProps ? "some" : "every"](prop => BDFDB.ArrayUtils.is(prop) ? (BDFDB.ArrayUtils.is(prop[1]) ? prop[1].some(checkValue => propCheck(props, prop[0], checkValue)) : propCheck(props, prop[0], prop[1])) : props[prop] !== undefined)) return true;
+ if (config.filter && config.filter(instance)) return true;
+ return false;
+ }
+ function propCheck (props, key, value) {
+ return key != null && props[key] != null && value != null && (key == "className" ? (" " + props[key] + " ").indexOf(" " + value + " ") > -1 : BDFDB.equals(props[key], value));
+ }
+ };
+ MyReact.findOwner = function (nodeOrInstance, config) {
+ if (!BDFDB.ObjectUtils.is(config)) return null;
+ if (!nodeOrInstance || !config.name && !config.type && !config.key && !config.props && !config.filter) return config.all ? (config.group ? {} : []) : null;
+ let instance = Node.prototype.isPrototypeOf(nodeOrInstance) ? BDFDB.ReactUtils.getInstance(nodeOrInstance) : nodeOrInstance;
+ if (!BDFDB.ObjectUtils.is(instance)) return config.all ? (config.group ? {} : []) : null;
+
+ config.name = config.name && [config.name].flat().filter(n => n);
+ config.type = config.type && [config.type].flat().filter(n => n);
+ config.key = config.key && [config.key].flat().filter(n => n);
+ config.props = config.props && [config.props].flat().filter(n => n);
+ config.filter = typeof config.filter == "function" && config.filter;
+
+ let depth = -1;
+ let start = performance.now();
+ let maxDepth = config.unlimited ? 999999999 : (config.depth === undefined ? 30 : config.depth);
+ let maxTime = config.unlimited ? 999999999 : (config.time === undefined ? 150 : config.time);
+ let whitelist = config.up ? {
+ return: true,
+ sibling: true,
+ default: true
+ } : {
+ child: true,
+ sibling: true,
+ default: true
+ };
+ whitelist[BDFDB.ReactUtils.instanceKey] = true;
+
+ let foundInstances = config.group ? {} : [];
+ let singleInstance = getOwner(instance);
+ if (config.all) {
+ for (let i in foundInstances) {
+ if (config.group) for (let j in foundInstances[i]) delete foundInstances[i][j].BDFDBreactSearch;
+ else delete foundInstances[i].BDFDBreactSearch;
+ }
+ return foundInstances;
+ }
+ else return singleInstance;
+
+ function getOwner (instance) {
+ depth++;
+ let result = undefined;
+ if (instance && !Node.prototype.isPrototypeOf(instance) && !BDFDB.ReactUtils.getInstance(instance) && depth < maxDepth && performance.now() - start < maxTime) {
+ let props = instance.stateNode ? instance.stateNode.props : instance.props;
+ let foundName = "";
+ if (instance.stateNode && !Node.prototype.isPrototypeOf(instance.stateNode) && (
+ config.name && instance.type && config.name.some(name => {if (instance.type.displayName == name || instance.type.name == name || Internal.isCorrectModule(instance.type.render || instance.type.type || instance.type, name)) {
+ foundName = name; return true;
+ }}) ||
+ config.type && instance.type && config.type.some(type => instance.type == type) ||
+ config.key && instance.key && config.key.some(key => instance.key == key) ||
+ config.props && props && config.props.every(prop => BDFDB.ArrayUtils.is(prop) ? (BDFDB.ArrayUtils.is(prop[1]) ? prop[1].some(checkValue => BDFDB.equals(props[prop[0]], checkValue)) : BDFDB.equals(props[prop[0]], prop[1])) : props[prop] !== undefined) ||
+ config.filter && config.filter(instance)
+ )) {
+ if (config.all === undefined || !config.all) result = instance.stateNode;
+ else if (config.all) {
+ if (!instance.stateNode.BDFDBreactSearch) {
+ instance.stateNode.BDFDBreactSearch = true;
+ if (config.group) {
+ if (foundName) {
+ if (!BDFDB.ArrayUtils.is(foundInstances[foundName])) foundInstances[foundName] = [];
+ foundInstances[foundName].push(instance.stateNode);
+ }
+ }
+ else foundInstances.push(instance.stateNode);
+ }
+ }
+ }
+ if (result === undefined) {
+ let keys = Object.getOwnPropertyNames(instance);
+ for (let i = 0; result === undefined && i < keys.length; i++) {
+ let key = keys[i];
+ if (key && whitelist[key] && (typeof instance[key] === "object" || typeof instance[key] == "function")) result = getOwner(instance[key]);
+ }
+ }
+ }
+ depth--;
+ return result;
+ }
+ };
+ MyReact.findValue = function (nodeOrInstance, searchKey, config = {}) {
+ if (!BDFDB.ObjectUtils.is(config)) return null;
+ if (!nodeOrInstance || typeof searchKey != "string") return config.all ? [] : null;
+ let instance = Node.prototype.isPrototypeOf(nodeOrInstance) ? BDFDB.ReactUtils.getInstance(nodeOrInstance) : nodeOrInstance;
+ if (!BDFDB.ObjectUtils.is(instance)) return config.all ? [] : null;
+ instance = instance[BDFDB.ReactUtils.instanceKey] || instance;
+
+ let depth = -1;
+ let start = performance.now();
+ let maxDepth = config.unlimited ? 999999999 : (config.depth === undefined ? 30 : config.depth);
+ let maxTime = config.unlimited ? 999999999 : (config.time === undefined ? 150 : config.time);
+ let whitelist = {
+ props: true,
+ state: true,
+ stateNode: true,
+ updater: true,
+ prototype: true,
+ type: true,
+ children: config.up ? false : true,
+ memoizedProps: true,
+ memoizedState: true,
+ child: config.up ? false : true,
+ return: config.up ? true : false,
+ sibling: config.up ? false : true
+ };
+ let whitelistKeys = Object.keys(whitelist);
+ let blacklist = {
+ contextSection: true
+ };
+ if (BDFDB.ObjectUtils.is(config.whitelist)) Object.assign(whitelist, config.whiteList);
+ if (BDFDB.ObjectUtils.is(config.blacklist)) Object.assign(blacklist, config.blacklist);
+ return getKey(instance);
+
+ function getKey(instance) {
+ depth++;
+ let result = undefined;
+ if (instance && !Node.prototype.isPrototypeOf(instance) && !BDFDB.ReactUtils.getInstance(instance) && depth < maxDepth && performance.now() - start < maxTime) {
+ let keys = Object.keys(instance).sort((x, y) => whitelistKeys.indexOf(x) < whitelistKeys.indexOf(y) ? -1 : 1);
+ for (let i = 0; result === undefined && i < keys.length; i++) {
+ let key = keys[i];
+ if (key && !blacklist[key]) {
+ let value = instance[key];
+ if (searchKey === key && (config.value === undefined || BDFDB.equals(config.value, value))) result = value;
+ else if ((typeof value === "object" || typeof value == "function") && (whitelist[key] || key[0] == "." || !isNaN(key[0]))) result = getKey(value);
+ }
+ }
+ }
+ depth--;
+ return result;
+ }
+ };
+ MyReact.forceUpdate = function (...instances) {
+ for (let ins of instances.flat(10).filter(n => n)) if (ins.updater && typeof ins.updater.isMounted == "function" && ins.updater.isMounted(ins)) ins.forceUpdate();
+ };
+ MyReact.getInstance = function (node) {
+ if (!BDFDB.ObjectUtils.is(node)) return null;
+ return node[Object.keys(node).find(key => key.startsWith("__reactInternalInstance") || key.startsWith("__reactFiber"))];
+ };
+ MyReact.render = function (component, node, ignoreErrors = false) {
+ if (!BDFDB.ReactUtils.isValidElement(component) || !Node.prototype.isPrototypeOf(node)) return;
+ try {
+ Internal.LibraryModules.ReactDOM.render(component, node);
+ let observer = new MutationObserver(changes => changes.forEach(change => {
+ let nodes = Array.from(change.removedNodes);
+ if (nodes.indexOf(node) > -1 || nodes.some(n => n.contains(node))) {
+ observer.disconnect();
+ BDFDB.ReactUtils.unmountComponentAtNode(node);
+ }
+ }));
+ observer.observe(document.body, {subtree: true, childList: true});
+ }
+ catch (err) {!ignoreErrors && BDFDB.LogUtils.error(["Could not render React Element!", err]);}
+ };
+ MyReact.hookCall = function (callback, args, ignoreErrors = false) {
+ if (typeof callback != "function") return null;
+ let returnValue = null, tempNode = document.createElement("div");
+ BDFDB.ReactUtils.render(BDFDB.ReactUtils.createElement(_ => {
+ returnValue = callback(args);
+ return null;
+ }, {}, false, ignoreErrors), tempNode, ignoreErrors);
+ BDFDB.ReactUtils.unmountComponentAtNode(tempNode);
+ return returnValue;
+ };
+ BDFDB.ReactUtils = new Proxy({}, {
+ get: function (_, item) {
+ if (MyReact[item]) return MyReact[item];
+ else if (LibraryModules.React[item]) return LibraryModules.React[item];
+ else if (LibraryModules.ReactDOM[item]) return LibraryModules.ReactDOM[item];
+ else return null;
+ }
+ });
+
+ BDFDB.MessageUtils = {};
+ BDFDB.MessageUtils.isSystemMessage = function (message) {
+ return message && !Internal.DiscordConstants.MessageTypeGroups.USER_MESSAGE.has(message.type) && (message.type !== Internal.DiscordConstants.MessageTypes.CHAT_INPUT_COMMAND || message.interaction == null);
+ };
+ BDFDB.MessageUtils.rerenderAll = function (instant) {
+ BDFDB.TimeUtils.clear(BDFDB.MessageUtils.rerenderAll.timeout);
+ BDFDB.MessageUtils.rerenderAll.timeout = BDFDB.TimeUtils.timeout(_ => {
+ let channelId = Internal.LibraryStores.SelectedChannelStore.getChannelId();
+ if (channelId) {
+ if (BDFDB.DMUtils.isDMChannel(channelId)) BDFDB.DMUtils.markAsRead(channelId);
+ else BDFDB.ChannelUtils.markAsRead(channelId);
+ }
+ let LayerProviderIns = BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.chatcontent), {name: "LayerProvider", unlimited: true, up: true});
+ let LayerProviderPrototype = BDFDB.ObjectUtils.get(LayerProviderIns, `${BDFDB.ReactUtils.instanceKey}.type.prototype`);
+ if (LayerProviderIns && LayerProviderPrototype) {
+ BDFDB.PatchUtils.patch({name: "BDFDB MessageUtils"}, LayerProviderPrototype, "render", {after: e => {
+ e.returnValue.props.children = typeof e.returnValue.props.children == "function" ? (_ => {return null;}) : [];
+ BDFDB.ReactUtils.forceUpdate(LayerProviderIns);
+ }}, {once: true});
+ BDFDB.ReactUtils.forceUpdate(LayerProviderIns);
+ }
+ }, instant ? 0 : 1000);
+ };
+ BDFDB.MessageUtils.openMenu = function (message, e = mousePosition, slim = false) {
+ if (!message) return;
+ let channel = Internal.LibraryStores.ChannelStore.getChannel(message.channel_id);
+ if (!channel) return;
+ e = BDFDB.ListenerUtils.copyEvent(e.nativeEvent || e, (e.nativeEvent || e).currentTarget);
+ let type = slim ? "MessageSearchResultContextMenu" : "MessageContextMenu";
+ let moduleFindData = InternalData.PatchModules[type] && InternalData.PatchModules[type].strings;
+ if (!moduleFindData) return;
+ let menu = BDFDB.ModuleUtils.findByString(moduleFindData, {noWarnings: true});
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {message, channel})));
+ else Internal.lazyLoadModuleImports(BDFDB.ModuleUtils.findByString(slim ? InternalData.PatchModules.SearchResult && InternalData.PatchModules.SearchResult.strings : InternalData.LibraryModules.MessageComponentUtils && InternalData.LibraryModules.MessageComponentUtils.strings)).then(_ => {
+ menu = BDFDB.ModuleUtils.findByString(moduleFindData);
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {message, channel})));
+ });
+ };
+
+ BDFDB.UserUtils = {};
+ BDFDB.UserUtils.is = function (user) {
+ return user && user instanceof Internal.DiscordObjects.User;
+ };
+ const myDataUser = Internal.LibraryStores.UserStore && Internal.LibraryStores.UserStore.getCurrentUser && Internal.LibraryStores.UserStore.getCurrentUser();
+ if (myDataUser && BDFDB.UserUtils._id != myDataUser.id) BDFDB.UserUtils._id = myDataUser.id;
+ BDFDB.UserUtils.me = new Proxy(myDataUser || {}, {
+ get: function (list, item) {
+ const user = Internal.LibraryStores.UserStore && Internal.LibraryStores.UserStore.getCurrentUser && Internal.LibraryStores.UserStore.getCurrentUser();
+ if (user && BDFDB.UserUtils._id != user.id) {
+ Cache.data = {};
+ BDFDB.UserUtils._id = user.id;
+ }
+ return user ? user[item] : null;
+ }
+ });
+ BDFDB.UserUtils.getStatus = function (id = BDFDB.UserUtils.me.id) {
+ id = typeof id == "number" ? id.toFixed() : id;
+ let activity = BDFDB.UserUtils.getActivity(id);
+ return activity && activity.type == Internal.DiscordConstants.ActivityTypes.STREAMING ? "streaming" : Internal.LibraryStores.PresenceStore.getStatus(id);
+ };
+ BDFDB.UserUtils.getStatusColor = function (status, useColor) {
+ if (!Internal.DiscordConstants.Colors) return null;
+ status = typeof status == "string" ? status.toLowerCase() : null;
+ let color = "";
+ switch (status) {
+ case "online": color = (useColor ? Internal.DiscordConstants.Colors.GREEN_360 : BDFDB.DiscordConstants.ColorsCSS.STATUS_POSITIVE); break;
+ case "idle": color = (useColor ? Internal.DiscordConstants.Colors.YELLOW_300 : BDFDB.DiscordConstants.ColorsCSS.STATUS_WARNING); break;
+ case "dnd": color = (useColor ? Internal.DiscordConstants.Colors.RED_400 : BDFDB.DiscordConstants.ColorsCSS.STATUS_DANGER); break;
+ case "playing": color = (useColor ? Internal.DiscordConstants.Colors.BRAND : "var(--bdfdb-blurple)"); break;
+ case "listening": color = Internal.DiscordConstants.Colors.SPOTIFY; break;
+ case "streaming": color = Internal.DiscordConstants.Colors.TWITCH; break;
+ default: color = Internal.DiscordConstants.Colors.PRIMARY_400; break;
+ }
+ return (color || Internal.DiscordConstants.Colors.GREEN_360).replace(/calc\(.+\s*\*\s*([0-9\.\%]+)\)/g, "$1");
+ };
+ BDFDB.UserUtils.getActivity = function (id = BDFDB.UserUtils.me.id) {
+ for (let activity of Internal.LibraryStores.PresenceStore.getActivities(id)) if (activity.type != Internal.DiscordConstants.ActivityTypes.CUSTOM_STATUS) return activity;
+ return null;
+ };
+ BDFDB.UserUtils.getCustomStatus = function (id = BDFDB.UserUtils.me.id) {
+ for (let activity of Internal.LibraryStores.PresenceStore.getActivities(id)) if (activity.type == Internal.DiscordConstants.ActivityTypes.CUSTOM_STATUS) return activity;
+ return null;
+ };
+ BDFDB.UserUtils.getAvatar = function (id = BDFDB.UserUtils.me.id) {
+ let user = Internal.LibraryStores.UserStore.getUser(id);
+ if (!user) return window.location.origin + "/assets/1f0bfc0865d324c2587920a7d80c609b.png";
+ else return ((user.avatar ? "" : window.location.origin) + Internal.LibraryModules.IconUtils.getUserAvatarURL(user)).split("?")[0];
+ };
+ BDFDB.UserUtils.getBanner = function (id = BDFDB.UserUtils.me.id, guildId = Internal.LibraryStores.SelectedGuildStore.getGuildId(), canAnimate = false) {
+ let displayProfile = Internal.LibraryModules.MemberDisplayUtils.getDisplayProfile(id, guildId);
+ return ((!guildId ? Internal.LibraryModules.IconUtils.getUserBannerURL({banner: displayProfile && displayProfile.banner, id, canAnimate}) : Internal.LibraryModules.IconUtils.getGuildMemberBannerURL({banner: displayProfile && displayProfile.banner, id, guildId, canAnimate})) || "").split("?")[0];
+ };
+ BDFDB.UserUtils.can = function (permission, id = BDFDB.UserUtils.me.id, channelId = Internal.LibraryStores.SelectedChannelStore.getChannelId()) {
+ if (!Internal.DiscordConstants.Permissions[permission]) BDFDB.LogUtils.warn([permission, "not found in Permissions"]);
+ else {
+ let channel = Internal.LibraryStores.ChannelStore.getChannel(channelId);
+ if (channel) return Internal.LibraryModules.PermissionRoleUtils.can({permission: Internal.DiscordConstants.Permissions[permission], user: id, context: channel});
+ }
+ return false;
+ };
+ BDFDB.UserUtils.openMenu = function (user, guildId, channelId, e = mousePosition) {
+ if (!user) return;
+ if (guildId && !channelId) channelId = (BDFDB.LibraryStores.GuildChannelStore.getDefaultChannel(guildId) || {}).id;
+ e = BDFDB.ListenerUtils.copyEvent(e.nativeEvent || e, (e.nativeEvent || e).currentTarget);
+ let type = channelId ? "UserMemberContextMenu" : "UserGenericContextMenu";
+ let moduleFindData = InternalData.PatchModules[type] && InternalData.PatchModules[type].strings;
+ if (!moduleFindData) return;
+ let menu = BDFDB.ModuleUtils.findByString(moduleFindData, {noWarnings: true});
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {user, guildId, channelId})));
+ else Internal.lazyLoadModuleImports(BDFDB.ModuleUtils.findByString(channelId ? InternalData.LibraryModules.UserPopoutUtils && InternalData.LibraryModules.UserPopoutUtils.strings : InternalData.PatchModules.ParticipantsForSelectedParticipant && InternalData.PatchModules.ParticipantsForSelectedParticipant.strings)).then(_ => {
+ menu = BDFDB.ModuleUtils.findByString(moduleFindData);
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {user, guildId, channelId})));
+ });
+ };
+
+ BDFDB.GuildUtils = {};
+ BDFDB.GuildUtils.is = function (guild) {
+ if (!BDFDB.ObjectUtils.is(guild)) return false;
+ let keys = Object.keys(guild);
+ return guild instanceof Internal.DiscordObjects.Guild || Object.keys(new Internal.DiscordObjects.Guild({})).every(key => keys.indexOf(key) > -1);
+ };
+ BDFDB.GuildUtils.getIcon = function (id) {
+ let guild = Internal.LibraryStores.GuildStore.getGuild(id);
+ if (!guild || !guild.icon) return "";
+ return Internal.LibraryModules.IconUtils.getGuildIconURL(guild).split("?")[0];
+ };
+ BDFDB.GuildUtils.getBanner = function (id) {
+ let guild = Internal.LibraryStores.GuildStore.getGuild(id);
+ if (!guild || !guild.banner) return "";
+ return Internal.LibraryModules.IconUtils.getGuildBannerURL(guild).split("?")[0];
+ };
+ BDFDB.GuildUtils.getFolder = function (id) {
+ return Internal.LibraryStores.SortedGuildStore.getGuildFolders().filter(n => n.folderId).find(n => n.guildIds.includes(id));
+ };
+ BDFDB.GuildUtils.openMenu = function (guild, e = mousePosition) {
+ if (!guild) return;
+ e = BDFDB.ListenerUtils.copyEvent(e.nativeEvent || e, (e.nativeEvent || e).currentTarget);
+ let moduleFindData = InternalData.PatchModules.GuildContextMenu && InternalData.PatchModules.GuildContextMenu.strings;
+ if (!moduleFindData) return;
+ let menu = BDFDB.ModuleUtils.findByString(moduleFindData, {noWarnings: true});
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {guild})));
+ else Internal.lazyLoadModuleImports(BDFDB.ModuleUtils.findByString(InternalData.PatchModules.GuildSidebar && InternalData.PatchModules.GuildSidebar.strings)).then(_ => {
+ menu = BDFDB.ModuleUtils.findByString(moduleFindData);
+ if (menu) Internal.LibraryModules.ContextMenuUtils.openContextMenu(e, e2 => BDFDB.ReactUtils.createElement(menu.default || menu, Object.assign({}, e2, {guild})));
+ });
+ };
+ BDFDB.GuildUtils.markAsRead = function (guildIds) {
+ guildIds = [guildIds].flat(10).filter(id => id && typeof id == "string" && Internal.LibraryStores.GuildStore.getGuild(id));
+ if (!guildIds) return;
+ let channels = guildIds.map(id => [BDFDB.ObjectUtils.toArray(Internal.LibraryStores.GuildChannelStore.getChannels(id)), BDFDB.ObjectUtils.toArray(Internal.LibraryStores.ActiveThreadsStore.getThreadsForGuild(id)).map(BDFDB.ObjectUtils.toArray).flat(), Internal.LibraryStores.GuildScheduledEventStore.getGuildScheduledEventsForGuild(id)]).flat(10).map(n => n && (n.channel && n.channel.id || n.id)).flat().filter(n => n);
+ if (channels.length) BDFDB.ChannelUtils.markAsRead(channels);
+ let eventChannels = guildIds.map(id => ({
+ channelId: id,
+ readStateType: Internal.DiscordConstants.ReadStateTypes.GUILD_EVENT,
+ messageId: Internal.LibraryStores.ReadStateStore.lastMessageId(id, Internal.DiscordConstants.ReadStateTypes.GUILD_EVENT)
+ })).filter(n => n.messageId);
+ if (eventChannels.length) Internal.LibraryModules.AckUtils.bulkAck(eventChannels);
+ };
+
+ BDFDB.FolderUtils = {};
+ BDFDB.FolderUtils.getId = function (div) {
+ if (!Node.prototype.isPrototypeOf(div) || !BDFDB.ReactUtils.getInstance(div)) return;
+ div = BDFDB.DOMUtils.getParent(BDFDB.dotCN.guildfolderwrapper, div);
+ if (!div) return;
+ return BDFDB.ReactUtils.findValue(div, "folderId", {up: true});
+ };
+ BDFDB.FolderUtils.getDefaultName = function (folderId) {
+ let folder = Internal.LibraryStores.SortedGuildStore.getGuildFolderById(folderId);
+ if (!folder) return "";
+ let rest = 2 * Internal.DiscordConstants.MAX_GUILD_FOLDER_NAME_LENGTH;
+ let names = [], allNames = folder.guildIds.map(guildId => (Internal.LibraryStores.GuildStore.getGuild(guildId) || {}).name).filter(n => n);
+ for (let name of allNames) if (name.length < rest || names.length === 0) {
+ names.push(name);
+ rest -= name.length;
+ }
+ return names.join(", ") + (names.length < allNames.length ? ", ..." : "");
+ };
+
+ BDFDB.ChannelUtils = {};
+ BDFDB.ChannelUtils.is = function (channel) {
+ if (!BDFDB.ObjectUtils.is(channel)) return false;
+ let keys = Object.keys(channel);
+ return channel instanceof Internal.DiscordObjects.Channel || Object.keys(new Internal.DiscordObjects.Channel({})).every(key => keys.indexOf(key) > -1);
+ };
+ BDFDB.ChannelUtils.isTextChannel = function (channelOrId) {
+ let channel = typeof channelOrId == "string" ? Internal.LibraryStores.ChannelStore.getChannel(channelOrId) : channelOrId;
+ return BDFDB.ObjectUtils.is(channel) && (channel.type == Internal.DiscordConstants.ChannelTypes.GUILD_TEXT || channel.type == Internal.DiscordConstants.ChannelTypes.GUILD_STORE || channel.type == Internal.DiscordConstants.ChannelTypes.GUILD_ANNOUNCEMENT);
+ };
+ BDFDB.ChannelUtils.isThread = function (channelOrId) {
+ let channel = typeof channelOrId == "string" ? Internal.LibraryStores.ChannelStore.getChannel(channelOrId) : channelOrId;
+ return channel && channel.isThread();
+ };
+ BDFDB.ChannelUtils.isForumPost = function (channelOrId) {
+ let channel = typeof channelOrId == "string" ? Internal.LibraryStores.ChannelStore.getChannel(channelOrId) : channelOrId;
+ return channel && channel.parentChannelThreadType && channel.parentChannelThreadType == Internal.DiscordConstants.ChannelTypes.GUILD_FORUM;
+ };
+ BDFDB.ChannelUtils.isEvent = function (channelOrId) {
+ let channel = typeof channelOrId == "string" ? Internal.LibraryStores.GuildScheduledEventStore.getGuildScheduledEvent(channelOrId) : channelOrId;
+ return channel && Internal.LibraryStores.GuildScheduledEventStore.getGuildScheduledEvent(channel.id) && true;
+ };
+ BDFDB.ChannelUtils.markAsRead = function (channelIds) {
+ let unreadChannels = [channelIds].flat(10).filter(id => id && typeof id == "string" && (BDFDB.LibraryStores.ChannelStore.getChannel(id) || {}).type != Internal.DiscordConstants.ChannelTypes.GUILD_CATEGORY && (Internal.LibraryStores.ReadStateStore.hasUnread(id) || Internal.LibraryStores.ReadStateStore.getMentionCount(id) > 0)).map(id => ({
+ channelId: id,
+ readStateType: Internal.DiscordConstants.ReadStateTypes.CHANNEL,
+ messageId: Internal.LibraryStores.ReadStateStore.lastMessageId(id)
+ }));
+ if (unreadChannels.length) Internal.LibraryModules.AckUtils.bulkAck(unreadChannels);
+ };
+ BDFDB.ChannelUtils.rerenderAll = function (instant) {
+ BDFDB.TimeUtils.clear(BDFDB.ChannelUtils.rerenderAll.timeout);
+ BDFDB.ChannelUtils.rerenderAll.timeout = BDFDB.TimeUtils.timeout(_ => {
+ let ChannelsIns = BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.guildchannels), {name: "ChannelsList", unlimited: true});
+ if (!ChannelsIns) return;
+ else {
+ if (ChannelsIns && ChannelsIns.props && ChannelsIns.props.guildChannels.categories && Object.keys(ChannelsIns.props.guildChannels.categories).length) {
+ let category = ChannelsIns.props.guildChannels.categories[Object.keys(ChannelsIns.props.guildChannels.categories)[0]];
+ category.isCollapsed ? BDFDB.LibraryModules.CategoryCollapseUtils.categoryCollapse(category.id) : BDFDB.LibraryModules.CategoryCollapseUtils.categoryExpand(category.id);
+ }
+ else {
+ let ChannelsPrototype = BDFDB.ObjectUtils.get(ChannelsIns, `${BDFDB.ReactUtils.instanceKey}.type.prototype`);
+ if (ChannelsIns && ChannelsPrototype) {
+ BDFDB.PatchUtils.patch({name: "BDFDB ChannelUtils"}, ChannelsPrototype, "render", {after: e => {
+ e.returnValue.props.children = typeof e.returnValue.props.children == "function" ? (_ => {return null;}) : [];
+ BDFDB.ReactUtils.forceUpdate(ChannelsIns);
+ }}, {once: true});
+ BDFDB.ReactUtils.forceUpdate(ChannelsIns);
+ }
+ }
+ }
+ }, instant ? 0 : 1000);
+ };
+
+ BDFDB.DMUtils = {};
+ BDFDB.DMUtils.isDMChannel = function (id) {
+ let channel = Internal.LibraryStores.ChannelStore.getChannel(id);
+ return BDFDB.ObjectUtils.is(channel) && (channel.isDM() || channel.isGroupDM());
+ };
+ BDFDB.DMUtils.getIcon = function (id) {
+ let channel = Internal.LibraryStores.ChannelStore.getChannel(id);
+ if (!channel) return "";
+ if (!channel.icon) return channel.isDM() ? BDFDB.UserUtils.getAvatar(channel.recipients[0]) : (channel.isGroupDM() ? window.location.origin + Internal.LibraryModules.IconUtils.getChannelIconURL(channel).split("?")[0] : null);
+ return Internal.LibraryModules.IconUtils.getChannelIconURL(channel).split("?")[0];
+ };
+ BDFDB.DMUtils.markAsRead = function (dmIds) {
+ let unreadDMs = [dmIds].flat(10).filter(id => id && typeof id == "string" && BDFDB.DMUtils.isDMChannel(id) && (Internal.LibraryStores.ReadStateStore.hasUnread(id) || Internal.LibraryStores.ReadStateStore.getMentionCount(id) > 0));
+ if (unreadDMs.length) for (let i in unreadDMs) BDFDB.TimeUtils.timeout(_ => Internal.LibraryModules.AckUtils.ack(unreadDMs[i]), i * 1000);
+ };
+
+ BDFDB.ColorUtils = {};
+ BDFDB.ColorUtils.convert = function (color, conv, type) {
+ if (typeof color == "string" && color.indexOf("var(--") == 0) return color;
+ if (BDFDB.ObjectUtils.is(color)) {
+ let newColor = {};
+ for (let pos in color) newColor[pos] = BDFDB.ColorUtils.convert(color[pos], conv, type);
+ return newColor;
+ }
+ else {
+ if (typeof color == "string") color = color.replace(/calc\(.+\s*\*\s*([0-9\.\%]+)\)/g, "$1");
+ conv = conv === undefined || !conv ? conv = "RGBCOMP" : conv.toUpperCase();
+ type = type === undefined || !type || !["RGB", "RGBA", "RGBCOMP", "HSL", "HSLA", "HSLCOMP", "HSV", "HSVA", "HSVCOMP", "HEX", "HEXA", "INT"].includes(type.toUpperCase()) ? BDFDB.ColorUtils.getType(color) : type.toUpperCase();
+ if (conv == "RGBCOMP") {
+ switch (type) {
+ case "RGBCOMP":
+ var rgbComp = [].concat(color);
+ if (rgbComp.length == 3) return processRGB(rgbComp);
+ else if (rgbComp.length == 4) {
+ let a = processA(rgbComp.pop());
+ return processRGB(rgbComp).concat(a);
+ }
+ break;
+ case "RGB":
+ return processRGB(color.replace(/\s/g, "").slice(4, -1).split(","));
+ case "RGBA":
+ var rgbComp = color.replace(/\s/g, "").slice(5, -1).split(",");
+ var a = processA(rgbComp.pop());
+ return processRGB(rgbComp).concat(a);
+ case "HSLCOMP":
+ var hslComp = [].concat(color);
+ if (hslComp.length == 3) return BDFDB.ColorUtils.convert(`hsl(${processHSX(hslComp).join(",")})`, "RGBCOMP");
+ else if (hslComp.length == 4) {
+ let a = processA(hslComp.pop());
+ return BDFDB.ColorUtils.convert(`hsl(${processHSX(hslComp).join(",")})`, "RGBCOMP").concat(a);
+ }
+ break;
+ case "HSL":
+ var hslComp = processHSX(color.replace(/\s/g, "").slice(4, -1).split(","));
+ var r, g, b, m, c, x, p, q;
+ var h = hslComp[0], s = processPercentage(hslComp[1]), l = processPercentage(hslComp[2]);
+ var a = s * Math.min(l, 1-l);
+ var f = (n, k = (n+h / 30) % 12) => parseInt((l - a * Math.max(Math.min(k-3, 9-k, 1), -1)) * 255);
+ return [f(0), f(8), f(4)];
+ case "HSLA":
+ var hslComp = color.replace(/\s/g, "").slice(5, -1).split(",");
+ return BDFDB.ColorUtils.convert(`hsl(${hslComp.slice(0, 3).join(",")})`, "RGBCOMP").concat(processA(hslComp.pop()));
+ case "HSVCOMP":
+ var hsvComp = [].concat(color);
+ if (hsvComp.length == 3) return BDFDB.ColorUtils.convert(`hsv(${processHSX(hsvComp).join(",")})`, "RGBCOMP");
+ else if (hsvComp.length == 4) {
+ let a = processA(hsvComp.pop());
+ return BDFDB.ColorUtils.convert(`hsv(${processHSX(hsvComp).join(",")})`, "RGBCOMP").concat(a);
+ }
+ break;
+ case "HSV":
+ var hsvComp = processHSX(color.replace(/\s/g, "").slice(4, -1).split(","));
+ var r, g, b, i, f, p, q, t;
+ var h = hsvComp[0] / 360, s = processPercentage(hsvComp[1]), v = processPercentage(hsvComp[2]);
+ i = Math.floor(h * 6), f = h * 6 - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s);
+
+ switch (i % 6) {
+ case 0: r = v, g = t, b = p; break;
+ case 1: r = q, g = v, b = p; break;
+ case 2: r = p, g = v, b = t; break;
+ case 3: r = p, g = q, b = v; break;
+ case 4: r = t, g = p, b = v; break;
+ case 5: r = v, g = p, b = q; break;
+ }
+ return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
+ case "HSVA":
+ var hsvComp = color.replace(/\s/g, "").slice(5, -1).split(",");
+ return BDFDB.ColorUtils.convert(`hsv(${hsvComp.slice(0, 3).join(",")})`, "RGBCOMP").concat(processA(hsvComp.pop()));
+ case "HEX":
+ var hex = /^#([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$|^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
+ return [parseInt(hex[1] + hex[1] || hex[4], 16), parseInt(hex[2] + hex[2] || hex[5], 16), parseInt(hex[3] + hex[3] || hex[6], 16)];
+ case "HEXA":
+ var hex = /^#([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$|^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
+ return [parseInt(hex[1] + hex[1] || hex[5], 16), parseInt(hex[2] + hex[2] || hex[6], 16), parseInt(hex[3] + hex[3] || hex[7], 16), Math.floor(BDFDB.NumberUtils.mapRange([0, 255], [0, 100], parseInt(hex[4] + hex[4] || hex[8], 16)))/100];
+ case "INT":
+ color = processINT(color);
+ return [parseInt(color >> 16 & 255), parseInt(color >> 8 & 255), parseInt(color & 255)];
+ default:
+ return null;
+ }
+ }
+ else {
+ if (conv && type && (conv.indexOf("HSL") == 0 && type.indexOf("HSL") == 0 || conv.indexOf("HSV") == 0 && type.indexOf("HSV") == 0)) {
+ let name = type.indexOf("HSL") == 0 ? "HSL" : "HSV";
+ if (type == `${name}COMP`) {
+ let comp = [].concat(color);
+ switch (conv) {
+ case `${name}COMP`:
+ if (comp.length == 3) return processHSX(comp);
+ else if (comp.length == 4) {
+ var a = processA(comp.pop());
+ return processHSX(comp).concat(a);
+ }
+ break;
+ case name:
+ return `${name.toLowerCase()}(${processHSX(comp.slice(0, 3)).join(",")})`;
+ case `${name}A`:
+ comp = comp.slice(0, 4);
+ var a = comp.length == 4 ? processA(comp.pop()) : 1;
+ return `${name.toLowerCase()}a(${processHSX(comp).concat(a).join(",")})`;
+ }
+ }
+ return BDFDB.ColorUtils.convert(color.replace(/\s/g, "").slice(color.toUpperCase().indexOf("A") == 3 ? 5 : 4, -1).split(","), conv, `${name}COMP`);
+ }
+ else {
+ let rgbComp = type == "RGBCOMP" ? [].concat(color) : BDFDB.ColorUtils.convert(color, "RGBCOMP", type);
+ if (rgbComp) switch (conv) {
+ case "RGB":
+ return `rgb(${processRGB(rgbComp.slice(0, 3)).join(",")})`;
+ case "RGBA":
+ rgbComp = rgbComp.slice(0, 4);
+ var a = rgbComp.length == 4 ? processA(rgbComp.pop()) : 1;
+ return `rgba(${processRGB(rgbComp).concat(a).join(",")})`;
+ case "HSLCOMP":
+ var a = rgbComp.length == 4 ? processA(rgbComp.pop()) : null;
+ var hslComp = processHSX(BDFDB.ColorUtils.convert(rgbComp, "HSL").replace(/\s/g, "").split(","));
+ return a != null ? hslComp.concat(a) : hslComp;
+ case "HSL":
+ var r = processC(rgbComp[0]) / 255, g = processC(rgbComp[1]) / 255, b = processC(rgbComp[2]) / 255;
+ var max = Math.max(r, g, b), min = Math.min(r, g, b);
+
+ var h, s, l;
+ h = s = l = (max + min) / 2;
+
+ if (max === min) return `hsl(${processHSX([0, 0, l * 100]).join(",")})`;
+
+ var dif = max - min;
+ s = l >= 0.5 ? dif / (2 - (max + min)) : dif / (max + min);
+ switch (max) {
+ case r: h = ((g - b) / dif + 0) * 60; break;
+ case g: h = ((b - r) / dif + 2) * 60; break;
+ case b: h = ((r - g) / dif + 4) * 60; break;
+ }
+ return `hsl(${processHSX([Math.round(h * 360), s * 100, l * 100]).join(",")})`;
+ case "HSLA":
+ var a = rgbComp.length == 4 ? processA(rgbComp.pop()) : 1;
+ return `hsla(${BDFDB.ColorUtils.convert(rgbComp, "HSL").slice(4, -1).split(",").concat(a).join(",")})`;
+ case "HSVCOMP":
+ var a = rgbComp.length == 4 ? processA(rgbComp.pop()) : null;
+ var hsvComp = processHSX(BDFDB.ColorUtils.convert(rgbComp, "HSV").replace(/\s/g, "").split(","));
+ return a != null ? hsvComp.concat(a) : hsvComp;
+ case "HSV":
+ var r = processC(rgbComp[0]), g = processC(rgbComp[1]), b = processC(rgbComp[2]);
+ var max = Math.max(r, g, b), min = Math.min(r, g, b), dif = max - min, h, s = max === 0 ? 0 : dif / max, v = max / 255;
+ switch (max) {
+ case min: h = 0; break;
+ case r: h = g - b + dif * (g < b ? 6 : 0); h /= 6 * dif; break;
+ case g: h = b - r + dif * 2; h /= 6 * dif; break;
+ case b: h = r - g + dif * 4; h /= 6 * dif; break;
+ }
+ return `hsv(${processHSX([Math.round(h * 360), s * 100, v * 100]).join(",")})`;
+ case "HSVA":
+ var a = rgbComp.length == 4 ? processA(rgbComp.pop()) : 1;
+ return `hsva(${BDFDB.ColorUtils.convert(rgbComp, "HSV").slice(4, -1).split(",").concat(a).join(",")})`;
+ case "HEX":
+ return ("#" + (0x1000000 + (rgbComp[2] | rgbComp[1] << 8 | rgbComp[0] << 16)).toString(16).slice(1)).toUpperCase();
+ case "HEXA":
+ return ("#" + (0x1000000 + (rgbComp[2] | rgbComp[1] << 8 | rgbComp[0] << 16)).toString(16).slice(1) + (0x100 + Math.round(BDFDB.NumberUtils.mapRange([0, 100], [0, 255], processA(rgbComp[3]) * 100))).toString(16).slice(1)).toUpperCase();
+ case "INT":
+ return processINT(rgbComp[2] | rgbComp[1] << 8 | rgbComp[0] << 16);
+ default:
+ return null;
+ }
+ }
+ }
+ }
+ return null;
+ function processC (c) {
+ if (c == null) return 255;
+ else {
+ c = parseInt(c.toString().replace(/[^0-9\-]/g, ""));
+ return isNaN(c) || c > 255 ? 255 : c < 0 ? 0 : c;
+ }
+ };
+ function processRGB (comp) {
+ return [].concat(comp).map(processC);
+ };
+ function processA (a) {
+ if (a == null) return 1;
+ else {
+ a = a.toString();
+ a = (a.indexOf("%") > -1 ? 0.01 : 1) * parseFloat(a.replace(/[^0-9\.\-]/g, ""));
+ return isNaN(a) || a > 1 ? 1 : a < 0 ? 0 : a;
+ }
+ };
+ function processPercentage (p) {
+ if (p == null) return 1;
+ else return p.indexOf("%") > -1 ? parseFloat(p)/100 : p;
+ };
+ function processSL (sl) {
+ if (sl == null) return "100%";
+ else {
+ sl = parseFloat(sl.toString().replace(/[^0-9\.\-]/g, ""));
+ return (isNaN(sl) || sl > 100 ? 100 : sl < 0 ? 0 : sl) + "%";
+ }
+ };
+ function processHSX (comp) {
+ comp = [].concat(comp);
+ let h = parseFloat(comp.shift().toString().replace(/[^0-9\.\-]/g, ""));
+ h = isNaN(h) || h > 360 ? 360 : h < 0 ? 0 : h;
+ return [h].concat(comp.map(processSL));
+ };
+ function processINT (c) {
+ if (c == null) return 16777215;
+ else {
+ c = parseInt(c.toString().replace(/[^0-9]/g, ""));
+ return isNaN(c) || c > 16777215 ? 16777215 : c < 0 ? 0 : c;
+ }
+ };
+ };
+ BDFDB.ColorUtils.setAlpha = function (color, a, conv) {
+ if (typeof color == "string" && color.indexOf("var(--") == 0) return color;
+ if (BDFDB.ObjectUtils.is(color)) {
+ let newcolor = {};
+ for (let pos in color) newcolor[pos] = BDFDB.ColorUtils.setAlpha(color[pos], a, conv);
+ return newcolor;
+ }
+ else {
+ let rgbComp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
+ if (rgbComp) {
+ a = a.toString();
+ a = (a.indexOf("%") > -1 ? 0.01 : 1) * parseFloat(a.replace(/[^0-9\.\-]/g, ""));
+ a = isNaN(a) || a > 1 ? 1 : a < 0 ? 0 : a;
+ rgbComp[3] = a;
+ conv = (conv || BDFDB.ColorUtils.getType(color)).toUpperCase();
+ conv = conv == "RGB" || conv == "HSL" || conv == "HEX" ? conv + "A" : conv;
+ return BDFDB.ColorUtils.convert(rgbComp, conv);
+ }
+ }
+ return null;
+ };
+ BDFDB.ColorUtils.getAlpha = function (color) {
+ let rgbComp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
+ if (rgbComp) {
+ if (rgbComp.length == 3) return 1;
+ else if (rgbComp.length == 4) {
+ let a = rgbComp[3].toString();
+ a = (a.indexOf("%") > -1 ? 0.01 : 1) * parseFloat(a.replace(/[^0-9\.\-]/g, ""));
+ return isNaN(a) || a > 1 ? 1 : a < 0 ? 0 : a;
+ }
+ }
+ return null;
+ };
+ BDFDB.ColorUtils.change = function (color, value, conv) {
+ if (typeof color == "string" && color.indexOf("var(--") == 0) return color;
+ value = parseFloat(value);
+ if (color != null && typeof value == "number" && !isNaN(value)) {
+ if (BDFDB.ObjectUtils.is(color)) {
+ let newColor = {};
+ for (let pos in color) newColor[pos] = BDFDB.ColorUtils.change(color[pos], value, conv);
+ return newColor;
+ }
+ else {
+ let rgbComp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
+ if (rgbComp) {
+ let a = BDFDB.ColorUtils.getAlpha(rgbComp);
+ if (parseInt(value) !== value) {
+ value = value.toString();
+ value = (value.indexOf("%") > -1 ? 0.01 : 1) * parseFloat(value.replace(/[^0-9\.\-]/g, ""));
+ value = isNaN(value) ? 0 : value;
+ return BDFDB.ColorUtils.convert([].concat(rgbComp).slice(0, 3).map(c => {
+ c = Math.round(c * (1 + value));
+ return c > 255 ? 255 : c < 0 ? 0 : c;
+ }).concat(a), conv || BDFDB.ColorUtils.getType(color));
+ }
+ else return BDFDB.ColorUtils.convert([].concat(rgbComp).slice(0, 3).map(c => {
+ c = Math.round(c + value);
+ return c > 255 ? 255 : c < 0 ? 0 : c;
+ }).concat(a), conv || BDFDB.ColorUtils.getType(color));
+ }
+ }
+ }
+ return null;
+ };
+ BDFDB.ColorUtils.invert = function (color, conv) {
+ if (typeof color == "string" && color.indexOf("var(--") == 0) return color;
+ if (BDFDB.ObjectUtils.is(color)) {
+ let newColor = {};
+ for (let pos in color) newColor[pos] = BDFDB.ColorUtils.invert(color[pos], conv);
+ return newColor;
+ }
+ else {
+ let comp = BDFDB.ColorUtils.convert(color, "RGBCOMP");
+ if (comp) return BDFDB.ColorUtils.convert([255 - comp[0], 255 - comp[1], 255 - comp[2]], conv || BDFDB.ColorUtils.getType(color));
+ }
+ return null;
+ };
+ BDFDB.ColorUtils.compare = function (color1, color2) {
+ if (color1 && color2) {
+ color1 = BDFDB.ColorUtils.convert(color1, "RGBA");
+ color2 = BDFDB.ColorUtils.convert(color2, "RGBA");
+ if (color1 && color2) return BDFDB.equals(color1, color2);
+ }
+ return null;
+ };
+ BDFDB.ColorUtils.isBright = function (color, compare = 160) {
+ if (!BDFDB.ColorUtils.getType(color)) return false;
+ color = BDFDB.ColorUtils.convert(color, "RGBCOMP");
+ if (!color) return false;
+ return parseInt(compare) < Math.sqrt(0.299 * color[0]**2 + 0.587 * color[1]**2 + 0.144 * color[2]**2);
+ };
+ BDFDB.ColorUtils.getType = function (color) {
+ if (color !== null) {
+ if (typeof color === "object" && (color.length == 3 || color.length == 4)) {
+ if (isRGB(color)) return "RGBCOMP";
+ else if (isHSL(color)) return "HSLCOMP";
+ }
+ else if (typeof color === "string") {
+ color = color.replace(/calc\(.+\s*\*\s*([0-9\.\%]+)\)/g, "$1");
+ if (/^#[a-f\d]{3}$|^#[a-f\d]{6}$/i.test(color)) return "HEX";
+ else if (/^#[a-f\d]{4}$|^#[a-f\d]{8}$/i.test(color)) return "HEXA";
+ else {
+ color = color.toUpperCase();
+ let comp = color.replace(/[^0-9\.\-\,\%]/g, "").split(",");
+ if (color.indexOf("RGB(") == 0 && comp.length == 3 && isRGB(comp)) return "RGB";
+ else if (color.indexOf("RGBA(") == 0 && comp.length == 4 && isRGB(comp)) return "RGBA";
+ else if (color.indexOf("HSL(") == 0 && comp.length == 3 && isHSL(comp)) return "HSL";
+ else if (color.indexOf("HSLA(") == 0 && comp.length == 4 && isHSL(comp)) return "HSLA";
+ else if (color.indexOf("HSV(") == 0 && comp.length == 3 && isHSL(comp)) return "HSV";
+ else if (color.indexOf("HSVA(") == 0 && comp.length == 4 && isHSL(comp)) return "HSVA";
+ }
+ }
+ else if (typeof color === "number" && parseInt(color) == color && color > -1 && color < 16777216) return "INT";
+ }
+ return null;
+ function isRGB(comp) {return comp.slice(0, 3).every(rgb => rgb.toString().indexOf("%") == -1 && parseFloat(rgb) == parseInt(rgb));};
+ function isHSL(comp) {return comp.slice(1, 3).every(hsl => hsl.toString().indexOf("%") == hsl.length - 1);};
+ };
+ BDFDB.ColorUtils.createGradient = function (colorObj, direction = "to right") {
+ let gradientString = "linear-gradient(" + direction;
+ for (let pos of Object.keys(colorObj).sort()) {
+ let color = BDFDB.ColorUtils.convert(colorObj[pos], "RGBA");
+ gradientString += color ? `, ${color} ${pos*100}%` : ''
+ }
+ return gradientString += ")";
+ };
+
+ BDFDB.DOMUtils = {};
+ BDFDB.DOMUtils.getSelection = function () {
+ let selection = document.getSelection();
+ return selection && selection.anchorNode ? selection.getRangeAt(0).toString() : "";
+ };
+ BDFDB.DOMUtils.addClass = function (eles, ...classes) {
+ if (!eles || !classes) return;
+ for (let ele of [eles].map(n => NodeList.prototype.isPrototypeOf(n) ? Array.from(n) : n).flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) add(ele);
+ else if (NodeList.prototype.isPrototypeOf(ele)) for (let e of ele) add(e);
+ else if (typeof ele == "string") for (let e of ele.split(",")) if (e && (e = e.trim())) for (let n of document.querySelectorAll(e)) add(n);
+ }
+ function add(node) {
+ if (node && node.classList) for (let cla of classes) for (let cl of [cla].flat(10).filter(n => n)) if (typeof cl == "string") for (let c of cl.split(" ")) if (c) node.classList.add(c);
+ }
+ };
+ BDFDB.DOMUtils.removeClass = function (eles, ...classes) {
+ if (!eles || !classes) return;
+ for (let ele of [eles].map(n => NodeList.prototype.isPrototypeOf(n) ? Array.from(n) : n).flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) remove(ele);
+ else if (NodeList.prototype.isPrototypeOf(ele)) for (let e of ele) remove(e);
+ else if (typeof ele == "string") for (let e of ele.split(",")) if (e && (e = e.trim())) for (let n of document.querySelectorAll(e)) remove(n);
+ }
+ function remove(node) {
+ if (node && node.classList) for (let cla of classes) for (let cl of [cla].flat(10).filter(n => n)) if (typeof cl == "string") for (let c of cl.split(" ")) if (c) node.classList.remove(c);
+ }
+ };
+ BDFDB.DOMUtils.toggleClass = function (eles, ...classes) {
+ if (!eles || !classes) return;
+ var force = classes.pop();
+ if (typeof force != "boolean") {
+ classes.push(force);
+ force = undefined;
+ }
+ if (!classes.length) return;
+ for (let ele of [eles].map(n => NodeList.prototype.isPrototypeOf(n) ? Array.from(n) : n).flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) toggle(ele);
+ else if (NodeList.prototype.isPrototypeOf(ele)) for (let e of ele) toggle(e);
+ else if (typeof ele == "string") for (let e of ele.split(",")) if (e && (e = e.trim())) for (let n of document.querySelectorAll(e)) toggle(n);
+ }
+ function toggle(node) {
+ if (node && node.classList) for (let cla of classes) for (let cl of [cla].flat(10).filter(n => n)) if (typeof cl == "string") for (let c of cl.split(" ")) if (c) node.classList.toggle(c, force);
+ }
+ };
+ BDFDB.DOMUtils.containsClass = function (eles, ...classes) {
+ if (!eles || !classes) return;
+ let all = classes.pop();
+ if (typeof all != "boolean") {
+ classes.push(all);
+ all = true;
+ }
+ if (!classes.length) return;
+ let contained = undefined;
+ for (let ele of [eles].map(n => NodeList.prototype.isPrototypeOf(n) ? Array.from(n) : n).flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) contains(ele);
+ else if (NodeList.prototype.isPrototypeOf(ele)) for (let e of ele) contains(e);
+ else if (typeof ele == "string") for (let c of ele.split(",")) if (c && (c = c.trim())) for (let n of document.querySelectorAll(c)) contains(n);
+ }
+ return contained;
+ function contains(node) {
+ if (node && node.classList) for (let cla of classes) if (typeof cla == "string") for (let c of cla.split(" ")) if (c) {
+ if (contained === undefined) contained = all;
+ if (all && !node.classList.contains(c)) contained = false;
+ if (!all && node.classList.contains(c)) contained = true;
+ }
+ }
+ };
+ BDFDB.DOMUtils.formatClassName = function (...classes) {
+ return BDFDB.ArrayUtils.removeCopies(classes.flat(10).filter(n => n).join(" ").split(" ")).join(" ").trim();
+ };
+ BDFDB.DOMUtils.removeClassFromDOM = function (...classes) {
+ for (let c of classes.flat(10).filter(n => n)) if (typeof c == "string") for (let a of c.split(",")) if (a && (a = a.replace(/\.|\s/g, ""))) BDFDB.DOMUtils.removeClass(document.querySelectorAll("." + a), a);
+ };
+ BDFDB.DOMUtils.show = function (...eles) {
+ BDFDB.DOMUtils.toggle(...eles, true);
+ };
+ BDFDB.DOMUtils.hide = function (...eles) {
+ BDFDB.DOMUtils.toggle(...eles, false);
+ };
+ BDFDB.DOMUtils.toggle = function (...eles) {
+ if (!eles) return;
+ let force = eles.pop();
+ if (typeof force != "boolean") {
+ eles.push(force);
+ force = undefined;
+ }
+ if (!eles.length) return;
+ for (let ele of eles.flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) toggle(ele);
+ else if (NodeList.prototype.isPrototypeOf(ele)) for (let node of ele) toggle(node);
+ else if (typeof ele == "string") for (let c of ele.split(",")) if (c && (c = c.trim())) for (let node of document.querySelectorAll(c)) toggle(node);
+ }
+ function toggle(node) {
+ if (!node || !Node.prototype.isPrototypeOf(node)) return;
+ let hide = force === undefined ? !BDFDB.DOMUtils.isHidden(node) : !force;
+ if (hide) {
+ let display = node.style.getPropertyValue("display");
+ if (display && display != "none") node.BDFDBhideDisplayState = {
+ display: display,
+ important: (` ${node.style.cssText} `.split(` display: ${display}`)[1] || "").trim().indexOf("!important") == 0
+ };
+ node.style.setProperty("display", "none", "important");
+ }
+ else {
+ if (node.BDFDBhideDisplayState) {
+ node.style.setProperty("display", node.BDFDBhideDisplayState.display, node.BDFDBhideDisplayState.important ? "important" : "");
+ delete node.BDFDBhideDisplayState;
+ }
+ else node.style.removeProperty("display");
+ }
+ }
+ };
+ BDFDB.DOMUtils.isHidden = function (node) {
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) return getComputedStyle(node, null).getPropertyValue("display") == "none";
+ };
+ BDFDB.DOMUtils.remove = function (...eles) {
+ for (let ele of eles.flat(10).filter(n => n)) {
+ if (Node.prototype.isPrototypeOf(ele)) ele.remove();
+ else if (NodeList.prototype.isPrototypeOf(ele)) {
+ let nodes = Array.from(ele);
+ while (nodes.length) nodes.shift().remove();
+ }
+ else if (typeof ele == "string") for (let c of ele.split(",")) if (c && (c = c.trim())) {
+ let nodes = Array.from(document.querySelectorAll(c));
+ while (nodes.length) nodes.shift().remove();
+ }
+ }
+ };
+ BDFDB.DOMUtils.create = function (html) {
+ if (typeof html != "string" || !html.trim()) return null;
+ let template = document.createElement("template");
+ try {template.innerHTML = html.replace(/(?[\t\r\n]+<(?!pre)/g, "><");}
+ catch (err) {template.innerHTML = html.replace(/>[\t\r\n]+<(?!pre)/g, "><");}
+ if (template.content.childNodes.length == 1) return template.content.firstElementChild || template.content.firstChild;
+ else {
+ let wrapper = document.createElement("span");
+ let nodes = Array.from(template.content.childNodes);
+ while (nodes.length) wrapper.appendChild(nodes.shift());
+ return wrapper;
+ }
+ };
+ BDFDB.DOMUtils.getParent = function (listOrSelector, node) {
+ let parent = null;
+ if (Node.prototype.isPrototypeOf(node) && listOrSelector) {
+ let list = NodeList.prototype.isPrototypeOf(listOrSelector) ? listOrSelector : typeof listOrSelector == "string" ? document.querySelectorAll(listOrSelector) : null;
+ if (list) for (let listNode of list) if (listNode.contains(node)) {
+ parent = listNode;
+ break;
+ }
+ }
+ return parent;
+ };
+ BDFDB.DOMUtils.setText = function (node, stringOrNode) {
+ if (!node || !Node.prototype.isPrototypeOf(node)) return;
+ let textnode = node.nodeType == Node.TEXT_NODE ? node : null;
+ if (!textnode) for (let child of node.childNodes) if (child.nodeType == Node.TEXT_NODE || BDFDB.DOMUtils.containsClass(child, "BDFDB-textnode")) {
+ textnode = child;
+ break;
+ }
+ if (textnode) {
+ if (Node.prototype.isPrototypeOf(stringOrNode) && stringOrNode.nodeType != Node.TEXT_NODE) {
+ BDFDB.DOMUtils.addClass(stringOrNode, "BDFDB-textnode");
+ node.replaceChild(stringOrNode, textnode);
+ }
+ else if (Node.prototype.isPrototypeOf(textnode) && textnode.nodeType != Node.TEXT_NODE) node.replaceChild(document.createTextNode(stringOrNode), textnode);
+ else textnode.textContent = stringOrNode;
+ }
+ else node.appendChild(Node.prototype.isPrototypeOf(stringOrNode) ? stringOrNode : document.createTextNode(stringOrNode));
+ };
+ BDFDB.DOMUtils.getText = function (node) {
+ if (!node || !Node.prototype.isPrototypeOf(node)) return;
+ for (let child of node.childNodes) if (child.nodeType == Node.TEXT_NODE) return child.textContent;
+ };
+ BDFDB.DOMUtils.getRects = function (node) {
+ let rects = {};
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) {
+ let hideNode = node;
+ while (hideNode) {
+ let hidden = BDFDB.DOMUtils.isHidden(hideNode);
+ if (hidden) {
+ BDFDB.DOMUtils.toggle(hideNode, true);
+ hideNode.BDFDBgetRectsHidden = true;
+ }
+ hideNode = hideNode.parentElement;
+ }
+ rects = node.getBoundingClientRect();
+ hideNode = node;
+ while (hideNode) {
+ if (hideNode.BDFDBgetRectsHidden) {
+ BDFDB.DOMUtils.toggle(hideNode, false);
+ delete hideNode.BDFDBgetRectsHidden;
+ }
+ hideNode = hideNode.parentElement;
+ }
+ }
+ return rects;
+ };
+ BDFDB.DOMUtils.getHeight = function (node) {
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) {
+ let rects = BDFDB.DOMUtils.getRects(node);
+ let style = getComputedStyle(node);
+ return rects.height + parseInt(style.marginTop) + parseInt(style.marginBottom);
+ }
+ return 0;
+ };
+ BDFDB.DOMUtils.getInnerHeight = function (node) {
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) {
+ let rects = BDFDB.DOMUtils.getRects(node);
+ let style = getComputedStyle(node);
+ return rects.height - parseInt(style.paddingTop) - parseInt(style.paddingBottom);
+ }
+ return 0;
+ };
+ BDFDB.DOMUtils.getWidth = function (node) {
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) {
+ let rects = BDFDB.DOMUtils.getRects(node);
+ let style = getComputedStyle(node);
+ return rects.width + parseInt(style.marginLeft) + parseInt(style.marginRight);
+ }
+ return 0;
+ };
+ BDFDB.DOMUtils.getInnerWidth = function (node) {
+ if (Node.prototype.isPrototypeOf(node) && node.nodeType != Node.TEXT_NODE) {
+ let rects = BDFDB.DOMUtils.getRects(node);
+ let style = getComputedStyle(node);
+ return rects.width - parseInt(style.paddingLeft) - parseInt(style.paddingRight);
+ }
+ return 0;
+ };
+ BDFDB.DOMUtils.appendWebScript = function (url, container) {
+ if (typeof url != "string") return;
+ if (!container && !document.body.querySelector("bd-head bd-scripts")) document.body.appendChild(BDFDB.DOMUtils.create(``));
+ container = container || document.body.querySelector("bd-head bd-scripts") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.removeWebScript(url, container);
+ let script = document.createElement("script");
+ script.src = url;
+ container.appendChild(script);
+ };
+ BDFDB.DOMUtils.removeWebScript = function (url, container) {
+ if (typeof url != "string") return;
+ container = container || document.body.querySelector("bd-head bd-scripts") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.remove(container.querySelectorAll(`script[src="${url}"]`));
+ };
+ BDFDB.DOMUtils.appendWebStyle = function (url, container) {
+ if (typeof url != "string") return;
+ if (!container && !document.body.querySelector("bd-head bd-styles")) document.body.appendChild(BDFDB.DOMUtils.create(``));
+ container = container || document.body.querySelector("bd-head bd-styles") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.removeWebStyle(url, container);
+ container.appendChild(BDFDB.DOMUtils.create(``));
+ };
+ BDFDB.DOMUtils.removeWebStyle = function (url, container) {
+ if (typeof url != "string") return;
+ container = container || document.body.querySelector("bd-head bd-styles") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.remove(container.querySelectorAll(`link[href="${url}"]`));
+ };
+ BDFDB.DOMUtils.appendLocalStyle = function (id, css, container) {
+ if (typeof id != "string" || typeof css != "string") return;
+ if (!container && !document.body.querySelector("bd-head bd-styles")) document.body.appendChild(BDFDB.DOMUtils.create(``));
+ container = container || document.body.querySelector("bd-head bd-styles") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.removeLocalStyle(id, container);
+ container.appendChild(BDFDB.DOMUtils.create(``));
+ };
+ BDFDB.DOMUtils.removeLocalStyle = function (id, container) {
+ if (typeof id != "string") return;
+ container = container || document.body.querySelector("bd-head bd-styles") || document.body;
+ container = Node.prototype.isPrototypeOf(container) ? container : document.body;
+ BDFDB.DOMUtils.remove(container.querySelectorAll(`style[id="${id}CSS"]`));
+ };
+
+ BDFDB.ModalUtils = {};
+ BDFDB.ModalUtils.open = function (plugin, config) {
+ if (!BDFDB.ObjectUtils.is(plugin) || !BDFDB.ObjectUtils.is(config)) return;
+ let modalInstance, modalProps, cancels = [], closeModal = _ => {
+ if (BDFDB.ObjectUtils.is(modalProps) && typeof modalProps.onClose == "function") modalProps.onClose();
+ };
+
+ let titleChildren = [], headerChildren = [], contentChildren = [], footerChildren = [];
+
+ if (typeof config.text == "string") {
+ config.contentClassName = BDFDB.DOMUtils.formatClassName(config.contentClassName, BDFDB.disCN.modaltextcontent);
+ contentChildren.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ children: config.text
+ }));
+ }
+
+ if (config.children) {
+ let tabBarItems = [], tabIns = {};
+ for (let child of [config.children].flat(10).filter(n => n)) if (Internal.LibraryModules.React.isValidElement(child)) {
+ if (child.type == Internal.LibraryComponents.ModalComponents.ModalTabContent) {
+ if (!tabBarItems.length) child.props.open = true;
+ else delete child.props.open;
+ let ref = typeof child.ref == "function" ? child.ref : (_ => {});
+ child.ref = instance => {
+ ref(instance);
+ if (instance) tabIns[child.props.tab] = instance;
+ };
+ tabBarItems.push({value: child.props.tab});
+ }
+ contentChildren.push(child);
+ }
+ if (tabBarItems.length) headerChildren.push(BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.tabbarcontainer,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TabBar, {
+ className: BDFDB.disCN.tabbar,
+ itemClassName: BDFDB.disCN.tabbaritem,
+ type: Internal.LibraryComponents.TabBar.Types.TOP,
+ items: tabBarItems,
+ onItemSelect: value => {
+ for (let key in tabIns) {
+ if (key == value) tabIns[key].props.open = true;
+ else delete tabIns[key].props.open;
+ }
+ BDFDB.ReactUtils.forceUpdate(BDFDB.ObjectUtils.toArray(tabIns));
+ }
+ }),
+ config.tabBarChildren
+ ].flat(10).filter(n => n)
+ }));
+ }
+
+ if (BDFDB.ArrayUtils.is(config.buttons)) for (let button of config.buttons) {
+ let contents = typeof button.contents == "string" && button.contents;
+ if (contents) {
+ let color = typeof button.color == "string" && Internal.LibraryComponents.Button.Colors[button.color.toUpperCase()];
+ let look = typeof button.look == "string" && Internal.LibraryComponents.Button.Looks[button.look.toUpperCase()];
+ let click = typeof button.click == "function" ? button.click : (typeof button.onClick == "function" ? button.onClick : _ => {});
+
+ if (button.cancel) cancels.push(click);
+
+ footerChildren.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Button, BDFDB.ObjectUtils.exclude(Object.assign({}, button, {
+ look: look || (color ? Internal.LibraryComponents.Button.Looks.FILLED : Internal.LibraryComponents.Button.Looks.LINK),
+ color: color || Internal.LibraryComponents.Button.Colors.PRIMARY,
+ onClick: _ => {
+ if (button.close) closeModal();
+ if (!(button.close && button.cancel)) click(modalInstance);
+ },
+ children: contents
+ }), "click", "close", "cancel", "contents")));
+ }
+ }
+
+ contentChildren = contentChildren.concat(config.contentChildren).filter(n => n && (typeof n == "string" || BDFDB.ReactUtils.isValidElement(n)));
+ titleChildren = titleChildren.concat(config.titleChildren).filter(n => n && (typeof n == "string" || BDFDB.ReactUtils.isValidElement(n)));
+ headerChildren = headerChildren.concat(config.headerChildren).filter(n => n && (typeof n == "string" || BDFDB.ReactUtils.isValidElement(n)));
+ footerChildren = footerChildren.concat(config.footerChildren).filter(n => n && (typeof n == "string" || BDFDB.ReactUtils.isValidElement(n)));
+
+ if (contentChildren.length) {
+ if (typeof config.onOpen != "function") config.onOpen = _ => {};
+ if (typeof config.onClose != "function") config.onClose = _ => {};
+
+ let name = plugin.name || (typeof plugin.getName == "function" ? plugin.getName() : null);
+ name = typeof name == "string" ? name : null;
+ let oldTransitionState = 0;
+ !Internal.LibraryModules.ModalUtils ? BdApi.alert(BDFDB.ReactUtils.createElement("div", {
+ style: {"display": "flex", "flex-direction": "column"},
+ children: [
+ config.header,
+ typeof config.subHeader == "string" || BDFDB.ReactUtils.isValidElement(config.subHeader) ? config.subHeader : (name || "")
+ ].filter(n => n).map(n => BDFDB.ReactUtils.createElement("span", {children: n}))
+ }), config.content || config.children) : Internal.LibraryModules.ModalUtils.openModal(props => {
+ modalProps = props;
+ return BDFDB.ReactUtils.createElement(class BDFDB_Modal extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ModalComponents.ModalRoot, {
+ className: BDFDB.DOMUtils.formatClassName(name && `${name}-modal`, BDFDB.disCN.modalwrapper, config.className),
+ size: typeof config.size == "string" && Internal.LibraryComponents.ModalComponents.ModalSize[config.size.toUpperCase()] || Internal.LibraryComponents.ModalComponents.ModalSize.SMALL,
+ transitionState: props.transitionState,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ModalComponents.ModalHeader, {
+ className: BDFDB.DOMUtils.formatClassName(config.headerClassName, config.shade && BDFDB.disCN.modalheadershade, headerChildren.length && BDFDB.disCN.modalheaderhassibling),
+ separator: config.headerSeparator || false,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormTitle, {
+ tag: Internal.LibraryComponents.FormComponents.FormTags && Internal.LibraryComponents.FormComponents.FormTags.H4,
+ children: config.header
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ size: Internal.LibraryComponents.TextElement.Sizes.SIZE_12,
+ children: typeof config.subHeader == "string" || BDFDB.ReactUtils.isValidElement(config.subHeader) ? config.subHeader : (name || "")
+ })
+ ]
+ }),
+ titleChildren,
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ModalComponents.ModalCloseButton, {
+ onClick: closeModal
+ })
+ ].flat(10).filter(n => n)
+ }),
+ headerChildren.length ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ grow: 0,
+ shrink: 0,
+ children: headerChildren
+ }) : null,
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ModalComponents.ModalContent, {
+ className: config.contentClassName,
+ scroller: config.scroller,
+ direction: config.direction,
+ content: config.content,
+ children: contentChildren
+ }),
+ footerChildren.length ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ModalComponents.ModalFooter, {
+ className: config.footerClassName,
+ direction: config.footerDirection,
+ children: footerChildren
+ }) : null
+ ]
+ });
+ }
+ componentDidMount() {
+ modalInstance = this;
+ if (props.transitionState == 1 && props.transitionState > oldTransitionState) config.onOpen(modalInstance);
+ oldTransitionState = props.transitionState;
+ }
+ componentWillUnmount() {
+ if (props.transitionState == 2) {
+ for (let cancel of cancels) cancel(modalInstance);
+ config.onClose(modalInstance);
+ }
+ }
+ }, props, true);
+ }, {
+ onCloseRequest: closeModal
+ });
+ }
+ };
+ BDFDB.ModalUtils.confirm = function (plugin, text, callback) {
+ if (!BDFDB.ObjectUtils.is(plugin) || typeof text != "string") return;
+ BDFDB.ModalUtils.open(plugin, {
+ text: text,
+ header: BDFDB.LanguageUtils.LibraryStrings.confirm,
+ className: BDFDB.disCN.modalconfirmmodal,
+ scroller: false,
+ buttons: [
+ {contents: BDFDB.LanguageUtils.LanguageStrings.OKAY, close: true, color: "RED", onClick: callback},
+ {contents: BDFDB.LanguageUtils.LanguageStrings.CANCEL, close: true}
+ ]
+ });
+ };
+
+ var MappedMenuItems = {}, RealMenuItems = BDFDB.ModuleUtils.findByProperties("MenuCheckboxItem", "MenuItem") || BDFDB.ModuleUtils.find(m => {
+ if (!m || typeof m != "function") return false;
+ let string = m.toString();
+ return string.endsWith("{return null}}") && string.indexOf("(){return null}") > -1 && string.indexOf("catch(") == -1;
+ }) || BDFDB.ModuleUtils.findByString("(){return null}function");
+ if (!RealMenuItems) {
+ RealMenuItems = {};
+ BDFDB.LogUtils.error(["could not find Module for MenuItems"]);
+ }
+ BDFDB.ContextMenuUtils = {};
+ BDFDB.ContextMenuUtils.open = function (plugin, e, children) {
+ Internal.LibraryModules.ContextMenuUtils.openContextMenu(e || mousePosition, _ => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Menu, {
+ navId: "bdfdb-context",
+ onClose: Internal.LibraryModules.ContextMenuUtils.closeContextMenu,
+ children: children
+ }, true));
+ };
+ BDFDB.ContextMenuUtils.close = function (nodeOrInstance) {
+ if (!BDFDB.ObjectUtils.is(nodeOrInstance)) return;
+ let instance = BDFDB.ReactUtils.findOwner(nodeOrInstance, {props: "closeContextMenu", up: true});
+ if (BDFDB.ObjectUtils.is(instance) && instance.props && typeof instance.props.closeContextMenu == "function") instance.props.closeContextMenu();
+ else Internal.LibraryModules.ContextMenuUtils.closeContextMenu();
+ };
+ BDFDB.ContextMenuUtils.createItem = function (component, props = {}) {
+ if (!component) return null;
+ else {
+ if (props.render || props.persisting || BDFDB.ObjectUtils.is(props.popoutProps) || (typeof props.color == "string" && !InternalData.DiscordClasses[`menu${props.color.toLowerCase()}`])) component = Internal.MenuItem;
+ if (BDFDB.ObjectUtils.toArray(RealMenuItems).some(c => c == component)) return BDFDB.ReactUtils.createElement(component, props);
+ else return BDFDB.ReactUtils.createElement(LibraryComponents.MenuItems.MenuItem, {
+ id: props.id,
+ disabled: props.disabled,
+ customItem: true,
+ render: menuItemProps => {
+ if (!props.state) props.state = BDFDB.ObjectUtils.extract(props, "checked", "value");
+ return BDFDB.ReactUtils.createElement(Internal.CustomMenuItemWrapper, {
+ disabled: props.disabled,
+ childProps: Object.assign({}, props, menuItemProps, {color: props.color}),
+ children: component
+ }, true);
+ }
+ });
+ }
+ };
+ BDFDB.ContextMenuUtils.createItemId = function (...strings) {
+ return strings.map(s => typeof s == "number" ? s.toString() : s).filter(s => typeof s == "string").map(s => s.toLowerCase().replace(/\s/, "-")).join("-");
+ };
+ BDFDB.ContextMenuUtils.findItem = function (returnvalue, config) {
+ if (!returnvalue || !BDFDB.ObjectUtils.is(config) || !config.label && !config.id) return [null, -1];
+ config.label = config.label && [config.label].flat().filter(n => n);
+ config.id = config.id && [config.id].flat().filter(n => n);
+ let contextMenu = BDFDB.ArrayUtils.is(returnvalue) ? {props: {children: returnvalue}} : BDFDB.ReactUtils.findChild(returnvalue, {props: "navId"});
+ if (contextMenu) {
+ let children = BDFDB.ArrayUtils.is(contextMenu.props.children) ? contextMenu.props.children : [contextMenu.props.children];
+ for (let i in children) if (children[i]) {
+ if (check(children[i])) return [children, parseInt(i)];
+ else if (BDFDB.ArrayUtils.is(children[i])) {
+ for (let j in children[i]) if (check(children[i][j])) return [children[i], parseInt(j)];
+ }
+ else if (children[i].props && children[i].props.children) {
+ if (BDFDB.ArrayUtils.is(children[i].props.children) && children[i].props.children.length) {
+ let [possibleChildren, possibleIndex] = BDFDB.ContextMenuUtils.findItem(children[i].props.children, config);
+ if (possibleIndex > -1) return [possibleChildren, possibleIndex];
+ }
+ else if (check(children[i].props.children)) {
+ if (config.group) return [children, parseInt(i)];
+ else {
+ children[i].props.children = [children[i].props.children];
+ return [children[i].props.children, 0];
+ }
+ }
+ else if (children[i].props.children.props && children[i].props.children.props.children) {
+ if (BDFDB.ArrayUtils.is(children[i].props.children.props.children) && children[i].props.children.props.children.length) {
+ let [possibleChildren, possibleIndex] = BDFDB.ContextMenuUtils.findItem(children[i].props.children.props.children, config);
+ if (possibleIndex > -1) return [possibleChildren, possibleIndex];
+ }
+ else if (check(children[i].props.children.props.children)) {
+ if (config.group) return [children, parseInt(i)];
+ else {
+ children[i].props.children.props.children = [children[i].props.children.props.children];
+ return [children[i].props.children.props.children, 0];
+ }
+ }
+ }
+ }
+ }
+ return [children, -1];
+ }
+ return [null, -1];
+
+ function check (child) {
+ if (!child) return false;
+ let props = child.stateNode ? child.stateNode.props : child.props;
+ if (!props) return false;
+ return config.id && config.id.some(key => key == "devmode-copy-id" ? typeof props.id == "string" && props.id.startsWith(key) : props.id == key) || config.label && config.label.some(key => props.label == key);
+ }
+ };
+
+ BDFDB.StringUtils = {};
+ BDFDB.StringUtils.upperCaseFirstChar = function (string) {
+ if (typeof string != "string") return "";
+ else return "".concat(string.charAt(0).toUpperCase()).concat(string.slice(1));
+ };
+ BDFDB.StringUtils.charIsUpperCase = function (string) {
+ if (typeof string != "string") return false;
+ else string[0].toUpperCase() === string[0] && string[0].toLowerCase() !== string[0];
+ };
+ BDFDB.StringUtils.getAcronym = function (string) {
+ if (typeof string != "string") return "";
+ return string.replace(/'s /g," ").replace(/\w+/g, n => n[0]).replace(/\s/g, "");
+ };
+ BDFDB.StringUtils.cssValueToNumber = function (string) {
+ if (typeof string != "string") return 0;
+ const value = parseInt(string, 10);
+ return isNaN(value) ? 0 : value;
+ };
+ BDFDB.StringUtils.htmlEscape = function (string) {
+ let ele = document.createElement("div");
+ ele.innerText = string;
+ return ele.innerHTML;
+ };
+ BDFDB.StringUtils.regEscape = function (string) {
+ return typeof string == "string" && string.replace(/([\-\/\\\^\$\*\+\?\.\(\)\|\[\]\{\}])/g, "\\$1");
+ };
+ BDFDB.StringUtils.insertNRST = function (string) {
+ return typeof string == "string" && string.replace(/\\r/g, "\r").replace(/\\n/g, "\n").replace(/\\t/g, "\t").replace(/\\s/g, " ");
+ };
+ BDFDB.StringUtils.equalCase = function (match, string) {
+ if (typeof match != "string" || typeof string != "string") return "";
+ let first = match.charAt(0);
+ return first != first.toUpperCase() ? (string.charAt(0).toLowerCase() + string.slice(1)) : first != first.toLowerCase() ? (string.charAt(0).toUpperCase() + string.slice(1)) : string;
+ };
+ BDFDB.StringUtils.extractSelection = function (original, selection) {
+ if (typeof original != "string") return "";
+ if (typeof selection != "string") return original;
+ let s = [], f = [], wrong = 0, canceled = false, done = false;
+ for (let i of BDFDB.ArrayUtils.getAllIndexes(original, selection[0])) if (!done) {
+ while (i <= original.length && !done) {
+ let subSelection = selection.slice(s.filter(n => n != undefined).length);
+ if (!subSelection && s.length - 20 <= selection.length) done = true;
+ else for (let j in subSelection) if (!done && !canceled) {
+ if (original[i] == subSelection[j]) {
+ s[i] = subSelection[j];
+ f[i] = subSelection[j];
+ wrong = 0;
+ if (i == original.length) done = true;
+ }
+ else {
+ s[i] = null;
+ f[i] = original[i];
+ wrong++;
+ if (wrong > 4) {
+ s = [], f = [], wrong = 0, canceled = true;
+ break;
+ }
+ }
+ break;
+ }
+ canceled = false;
+ i++;
+ }
+ }
+ if (s.filter(n => n).length) {
+ let reverseS = [].concat(s).reverse(), i = 0, j = 0;
+ for (let k in s) {
+ if (s[k] == null) i = parseInt(k) + 1;
+ else break;
+ }
+ for (let k in reverseS) {
+ if (reverseS[k] == null) j = parseInt(k) + 1;
+ else break;
+ }
+ return f.slice(i, f.length - j).join("");
+ }
+ else return original;
+ };
+
+ BDFDB.SlateUtils = {};
+ BDFDB.SlateUtils.isRichValue = function (richValue) {
+ return richValue && typeof richValue == "object" && BDFDB.SlateUtils.toRichValue("").constructor.prototype.isPrototypeOf(richValue);
+ };
+ BDFDB.SlateUtils.toTextValue = function (richValue) {
+ return BDFDB.SlateUtils.isRichValue(richValue) ? Internal.LibraryModules.SlateTextUtils.toTextValue(richValue) : "";
+ };
+ BDFDB.SlateUtils.toRichValue = function (string) {
+ return typeof string == "string" ? Internal.LibraryModules.SlateRichUtils.toRichValue(string) : null;
+ };
+
+ BDFDB.NumberUtils = {};
+ BDFDB.NumberUtils.formatBytes = function (bytes, sigDigits) {
+ bytes = parseInt(bytes);
+ if (isNaN(bytes) || bytes < 0) return "0 Bytes";
+ if (bytes == 1) return "1 Byte";
+ let size = Math.floor(Math.log(bytes) / Math.log(1024));
+ return parseFloat((bytes / Math.pow(1024, size)).toFixed(sigDigits < 1 ? 0 : sigDigits > 20 ? 20 : sigDigits || 2)) + " " + ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"][size];
+ };
+ BDFDB.NumberUtils.mapRange = function (from, to, value) {
+ if (parseFloat(value) < parseFloat(from[0])) return parseFloat(to[0]);
+ else if (parseFloat(value) > parseFloat(from[1])) return parseFloat(to[1]);
+ else return parseFloat(to[0]) + (parseFloat(value) - parseFloat(from[0])) * (parseFloat(to[1]) - parseFloat(to[0])) / (parseFloat(from[1]) - parseFloat(from[0]));
+ };
+ BDFDB.NumberUtils.generateId = function (array) {
+ array = BDFDB.ArrayUtils.is(array) ? array : [];
+ let id = Math.floor(Math.random() * 10000000000000000);
+ if (array.includes(id)) return BDFDB.NumberUtils.generateId(array);
+ else {
+ array.push(id);
+ return id;
+ }
+ };
+ BDFDB.NumberUtils.compareVersions = function (newV, oldV) {
+ if (!newV || !oldV) return true;
+ newV = newV.toString().replace(/["'`]/g, "").split(/,|\./g).map(n => parseInt(n)).filter(n => (n || n == 0) && !isNaN(n));
+ oldV = oldV.toString().replace(/["'`]/g, "").split(/,|\./g).map(n => parseInt(n)).filter(n => (n || n == 0) && !isNaN(n));
+ let length = Math.max(newV.length, oldV.length);
+ if (!length) return true;
+ if (newV.length > oldV.length) {
+ let tempArray = new Array(newV.length - oldV.length);
+ for (let i = 0; i < tempArray.length; i++) tempArray[i] = 0;
+ oldV = tempArray.concat(oldV);
+ }
+ else if (newV.length < oldV.length) {
+ let tempArray = new Array(oldV.length - newV.length);
+ for (let i = 0; i < tempArray.length; i++) tempArray[i] = 0;
+ newV = tempArray.concat(newV);
+ }
+ for (let i = 0; i < length; i++) for (let iOutdated = false, j = 0; j <= i; j++) {
+ if (j == i && newV[j] < oldV[j]) return false;
+ if (j < i) iOutdated = newV[j] == oldV[j];
+ if ((j == 0 || iOutdated) && j == i && newV[j] > oldV[j]) return true;
+ }
+ return false;
+ };
+ BDFDB.NumberUtils.getVersionDifference = function (newV, oldV) {
+ if (!newV || !oldV) return false;
+ newV = newV.toString().replace(/["'`]/g, "").split(/,|\./g).map(n => parseInt(n)).filter(n => (n || n == 0) && !isNaN(n));
+ oldV = oldV.toString().replace(/["'`]/g, "").split(/,|\./g).map(n => parseInt(n)).filter(n => (n || n == 0) && !isNaN(n));
+ let length = Math.max(newV.length, oldV.length);
+ if (!length) return false;
+ if (newV.length > oldV.length) {
+ let tempArray = new Array(newV.length - oldV.length);
+ for (let i = 0; i < tempArray.length; i++) tempArray[i] = 0;
+ oldV = tempArray.concat(oldV);
+ }
+ else if (newV.length < oldV.length) {
+ let tempArray = new Array(oldV.length - newV.length);
+ for (let i = 0; i < tempArray.length; i++) tempArray[i] = 0;
+ newV = tempArray.concat(newV);
+ }
+ let oldValue = 0, newValue = 0;
+ for (let i in oldV.reverse()) oldValue += (oldV[i] * (10 ** i));
+ for (let i in newV.reverse()) newValue += (newV[i] * (10 ** i));
+ return (newValue - oldValue) / (10 ** (length-1));
+ };
+
+ BDFDB.DiscordUtils = {};
+ BDFDB.DiscordUtils.getSetting = function (category, key) {
+ if (!category || !key) return;
+ return BDFDB.LibraryStores.UserSettingsProtoStore && BDFDB.LibraryStores.UserSettingsProtoStore.settings[category] && BDFDB.LibraryStores.UserSettingsProtoStore.settings[category][key] && BDFDB.LibraryStores.UserSettingsProtoStore.settings[category][key].value;
+ };
+ BDFDB.DiscordUtils.setSetting = function (category, key, value) {
+ if (!category || !key) return;
+ let store = BDFDB.DiscordUtils.getSettingsStore();
+ if (store) store.updateAsync(category, settings => {
+ if (!settings) return;
+ if (!settings[key]) settings[key] = {};
+ if (BDFDB.ObjectUtils.is(value)) for (let k in value) settings[key][k] = value[k];
+ else settings[key].value = value;
+ }, Internal.DiscordConstants.UserSettingsActionTypes.INFREQUENT_USER_ACTION);
+ };
+ BDFDB.DiscordUtils.getSettingsStore = function () {
+ return BDFDB.LibraryModules.UserSettingsProtoUtils && (Object.entries(BDFDB.LibraryModules.UserSettingsProtoUtils).find(n => n && n[1] && n[1].updateAsync && n[1].ProtoClass && n[1].ProtoClass.typeName && n[1].ProtoClass.typeName.endsWith(".PreloadedUserSettings")) || [])[1];
+ };
+ BDFDB.DiscordUtils.openLink = function (url, config = {}) {
+ if ((config.inBuilt || config.inBuilt === undefined && Internal.settings.general.useChromium) && Internal.LibraryRequires.electron && Internal.LibraryRequires.electron.remote) {
+ let browserWindow = new Internal.LibraryRequires.electron.remote.BrowserWindow({
+ frame: true,
+ resizeable: true,
+ show: true,
+ darkTheme: BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themedark,
+ webPreferences: {
+ nodeIntegration: false,
+ nodeIntegrationInWorker: false
+ }
+ });
+ browserWindow.setMenu(null);
+ browserWindow.loadURL(url);
+ if (config.minimized) browserWindow.minimize(null);
+ }
+ else window.open(url, "_blank");
+ };
+ window.DiscordNative && window.DiscordNative.app && window.DiscordNative.app.getPath("appData").then(path => {BDFDB.DiscordUtils.getFolder.base = path;});
+ BDFDB.DiscordUtils.isPlaformEmbedded = function () {
+ return Internal.LibraryModules.PlatformUtils && (Object.entries(Internal.LibraryModules.PlatformUtils).find(n => typeof n[1] == "boolean") || [])[1] || false;
+ };
+ BDFDB.DiscordUtils.getFolder = function () {
+ if (!BDFDB.DiscordUtils.getFolder.base) return "";
+ else if (BDFDB.DiscordUtils.getFolder.folder) return BDFDB.DiscordUtils.getFolder.folder;
+ else {
+ let folder;
+ try {
+ let build = BDFDB.DiscordUtils.getBuild();
+ build = "discord" + (build == "stable" ? "" : build);
+ folder = Internal.LibraryRequires.path.resolve(BDFDB.DiscordUtils.getFolder.base, build, BDFDB.DiscordUtils.getVersion());
+ }
+ catch (err) {folder = BDFDB.DiscordUtils.getFolder.base;}
+ return BDFDB.DiscordUtils.getFolder.folder = folder;
+ }
+ };
+ BDFDB.DiscordUtils.getLanguage = function () {
+ return Internal.LibraryModules.LanguageStore && (Internal.LibraryModules.LanguageStore.chosenLocale || Internal.LibraryModules.LanguageStore._chosenLocale) || document.querySelector("html[lang]").getAttribute("lang");
+ };
+ BDFDB.DiscordUtils.getBuild = function () {
+ if (BDFDB.DiscordUtils.getBuild.build) return BDFDB.DiscordUtils.getBuild.build;
+ else {
+ let build;
+ try {build = window.DiscordNative.app.getReleaseChannel();}
+ catch (err) {
+ let version = BDFDB.DiscordUtils.getVersion();
+ if (version) {
+ version = version.split(".");
+ if (version.length == 3 && !isNaN(version = parseInt(version[2]))) build = version > 300 ? "stable" : version > 200 ? "canary" : "ptb";
+ else build = "stable";
+ }
+ else build = "stable";
+ }
+ return BDFDB.DiscordUtils.getBuild.build = build;
+ }
+ };
+ BDFDB.DiscordUtils.getVersion = function () {
+ if (BDFDB.DiscordUtils.getVersion.version) return BDFDB.DiscordUtils.getVersion.version;
+ else {
+ let version;
+ try {version = window.DiscordNative.app.getVersion();}
+ catch (err) {version = "999.999.9999";}
+ return BDFDB.DiscordUtils.getVersion.version = version;
+ }
+ };
+ BDFDB.DiscordUtils.getTheme = function () {
+ return BDFDB.LibraryStores.ThemeStore.theme != "dark" ? BDFDB.disCN.themelight : BDFDB.disCN.themedark;
+ };
+ BDFDB.DiscordUtils.getZoomFactor = function () {
+ let aRects = BDFDB.DOMUtils.getRects(document.querySelector(BDFDB.dotCN.appmount));
+ let widthZoom = Math.round(100 * window.outerWidth / aRects.width);
+ let heightZoom = Math.round(100 * window.outerHeight / aRects.height);
+ return widthZoom < heightZoom ? widthZoom : heightZoom;
+ };
+ BDFDB.DiscordUtils.getFontScale = function () {
+ return parseInt(document.firstElementChild.style.fontSize.replace("%", ""));
+ };
+ BDFDB.DiscordUtils.shake = function () {
+ BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.appcontainer), {name: "Shakeable", unlimited: true, up: true}).shake();
+ };
+ BDFDB.DiscordUtils.rerenderAll = function (instant) {
+ BDFDB.TimeUtils.clear(BDFDB.DiscordUtils.rerenderAll.timeout);
+ BDFDB.DiscordUtils.rerenderAll.timeout = BDFDB.TimeUtils.timeout(_ => {
+ let LayersProviderIns = BDFDB.ReactUtils.findOwner(document.querySelector(BDFDB.dotCN.layers), {name: "LayersProvider", unlimited: true, up: true});
+ let LayersProviderType = LayersProviderIns && BDFDB.ObjectUtils.get(LayersProviderIns, `${BDFDB.ReactUtils.instanceKey}.type`);
+ if (!LayersProviderType) return;
+ let parentSelector = "", notices = document.querySelector("#bd-notices");
+ if (notices) {
+ let parentClasses = []
+ for (let i = 0, parent = notices.parentElement; i < 3; i++, parent = parent.parentElement) parentClasses.push(parent.className);
+ parentSelector = parentClasses.reverse().map(n => !n ? "*" : `.${n.split(" ").join(".")}`).join(" > ");
+ }
+ BDFDB.PatchUtils.patch({name: "BDFDB DiscordUtils"}, LayersProviderType.prototype, "render", {after: e => {
+ e.returnValue = BDFDB.ReactUtils.createElement(LayersProviderType, LayersProviderIns.props);
+ BDFDB.ReactUtils.forceUpdate(LayersProviderIns);
+ if (parentSelector) BDFDB.TimeUtils.timeout(_ => {
+ if (!document.contains(notices)) {
+ let parent = document.querySelector(parentSelector) || document.querySelector(BDFDB.dotCN.app).parentElement;
+ if (parent) parent.insertBefore(notices, parent.firstElementChild);
+ }
+ }, 1000);
+ }}, {once: true});
+ BDFDB.ReactUtils.forceUpdate(LayersProviderIns);
+ }, instant ? 0 : 1000);
+ };
+
+ const DiscordClassModules = Object.assign({}, InternalData.CustomClassModules);
+ Internal.DiscordClassModules = new Proxy(DiscordClassModules, {
+ get: function (_, item) {
+ if (DiscordClassModules[item]) return DiscordClassModules[item];
+ if (!InternalData.DiscordClassModules[item]) return;
+ DiscordClassModules[item] = BDFDB.ModuleUtils.findStringObject(InternalData.DiscordClassModules[item].props, Object.assign({}, InternalData.DiscordClassModules[item]));
+ return DiscordClassModules[item] ? DiscordClassModules[item] : undefined;
+ }
+ });
+ BDFDB.DiscordClassModules = Internal.DiscordClassModules;
+ for (let item in InternalData.DiscordClassModules) if (!DiscordClassModules[item]) DiscordClassModules[item] = undefined;
+
+ const DiscordClasses = Object.assign({}, InternalData.DiscordClasses);
+ BDFDB.DiscordClasses = Object.assign({}, DiscordClasses);
+ Internal.getDiscordClass = function (item, selector) {
+ let className, fallbackClassName;
+ className = fallbackClassName = Internal.DiscordClassModules.BDFDB.BDFDBundefined + "_" + Internal.generateClassId();
+ if (DiscordClasses[item] === undefined) {
+ BDFDB.LogUtils.warn([item, "not found in DiscordClasses"]);
+ return className;
+ }
+ else if (!BDFDB.ArrayUtils.is(DiscordClasses[item]) || DiscordClasses[item].length != 2) {
+ BDFDB.LogUtils.warn([item, "is not an Array of Length 2 in DiscordClasses"]);
+ return className;
+ }
+ else if (Internal.DiscordClassModules[DiscordClasses[item][0]] === undefined) {
+ BDFDB.LogUtils.warn([DiscordClasses[item][0], "not found in DiscordClassModules"]);
+ return className;
+ }
+ else if ([DiscordClasses[item][1]].flat().every(prop => Internal.DiscordClassModules[DiscordClasses[item][0]][prop] === undefined)) {
+ BDFDB.LogUtils.warn([DiscordClasses[item][1], "not found in", DiscordClasses[item][0], "in DiscordClassModules"]);
+ return className;
+ }
+ else {
+ for (let prop of [DiscordClasses[item][1]].flat()) {
+ className = Internal.DiscordClassModules[DiscordClasses[item][0]][prop];
+ if (className) break;
+ else className = fallbackClassName;
+ }
+ if (selector) {
+ className = className.split(" ").filter(n => n.indexOf("da-") != 0).join(selector ? "." : " ");
+ className = className || fallbackClassName;
+ }
+ return BDFDB.ArrayUtils.removeCopies(className.split(" ")).join(" ") || fallbackClassName;
+ }
+ };
+ const generationChars = "0123456789ABCDEFGHIJKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_-".split("");
+ Internal.generateClassId = function () {
+ let id = "";
+ while (id.length < 6) id += generationChars[Math.floor(Math.random() * generationChars.length)];
+ return id;
+ };
+ BDFDB.disCN = new Proxy({}, {
+ get: function (list, item) {
+ return Internal.getDiscordClass(item, false).replace("#", "");
+ }
+ });
+ BDFDB.disCNS = new Proxy({}, {
+ get: function (list, item) {
+ return Internal.getDiscordClass(item, false).replace("#", "") + " ";
+ }
+ });
+ BDFDB.disCNC = new Proxy({}, {
+ get: function (list, item) {
+ return Internal.getDiscordClass(item, false).replace("#", "") + ",";
+ }
+ });
+ BDFDB.dotCN = new Proxy({}, {
+ get: function (list, item) {
+ let className = Internal.getDiscordClass(item, true);
+ return (className.indexOf("#") == 0 ? "" : ".") + className;
+ }
+ });
+ BDFDB.dotCNS = new Proxy({}, {
+ get: function (list, item) {
+ let className = Internal.getDiscordClass(item, true);
+ return (className.indexOf("#") == 0 ? "" : ".") + className + " ";
+ }
+ });
+ BDFDB.dotCNC = new Proxy({}, {
+ get: function (list, item) {
+ let className = Internal.getDiscordClass(item, true);
+ return (className.indexOf("#") == 0 ? "" : ".") + className + ",";
+ }
+ });
+ BDFDB.notCN = new Proxy({}, {
+ get: function (list, item) {
+ return `:not(.${Internal.getDiscordClass(item, true).split(".")[0]})`;
+ }
+ });
+ BDFDB.notCNS = new Proxy({}, {
+ get: function (list, item) {
+ return `:not(.${Internal.getDiscordClass(item, true).split(".")[0]}) `;
+ }
+ });
+ BDFDB.notCNC = new Proxy({}, {
+ get: function (list, item) {
+ return `:not(.${Internal.getDiscordClass(item, true).split(".")[0]}),`;
+ }
+ });
+
+ const LanguageStrings = Internal.LibraryModules.LanguageStore && Internal.LibraryModules.LanguageStore._proxyContext ? Object.assign({}, Internal.LibraryModules.LanguageStore._proxyContext.defaultMessages) : Internal.LibraryModules.LanguageStore;
+ const LanguageStringsObj = Internal.LibraryModules.LanguageStore.Messages || Internal.LibraryModules.LanguageStore;
+ const LibraryStrings = Object.assign({}, InternalData.LibraryStrings);
+ BDFDB.LanguageUtils = {};
+ BDFDB.LanguageUtils.languages = Object.assign({}, InternalData.Languages);
+ BDFDB.LanguageUtils.getLanguage = function () {
+ let lang = BDFDB.DiscordUtils.getLanguage() || "en";
+ if (lang == "en-GB" || lang == "en-US") lang = "en";
+ let langIds = lang.split("-");
+ let langId = langIds[0];
+ let langId2 = langIds[1] || "";
+ lang = langId2 && langId.toUpperCase() !== langId2.toUpperCase() ? langId + "-" + langId2 : langId;
+ return BDFDB.LanguageUtils.languages[lang] || BDFDB.LanguageUtils.languages[langId] || BDFDB.LanguageUtils.languages.en;
+ };
+ BDFDB.LanguageUtils.getName = function (language) {
+ if (!language || typeof language.name != "string") return "";
+ if (language.name.startsWith("Discord")) return language.name.slice(0, -1) + (language.ownlang && (BDFDB.LanguageUtils.languages[language.id] || {}).name != language.ownlang ? ` / ${language.ownlang}` : "") + ")";
+ else return language.name + (language.ownlang && language.name != language.ownlang ? ` / ${language.ownlang}` : "");
+ };
+ BDFDB.LanguageUtils.LanguageStrings = new Proxy(LanguageStrings, {
+ get: function (list, item) {
+ let stringObj = LanguageStringsObj[item];
+ if (!stringObj) BDFDB.LogUtils.warn([item, "not found in BDFDB.LanguageUtils.LanguageStrings"]);
+ else {
+ if (stringObj && typeof stringObj == "object" && typeof stringObj.format == "function") return BDFDB.LanguageUtils.LanguageStringsFormat(item);
+ else return stringObj;
+ }
+ return "";
+ }
+ });
+ BDFDB.LanguageUtils.LanguageStringsCheck = new Proxy(LanguageStrings, {
+ get: function (list, item) {
+ return !!LanguageStringsObj[item];
+ }
+ });
+ let parseLanguageStringObj = obj => {
+ let string = "";
+ if (typeof obj == "string") string += obj;
+ else if (BDFDB.ObjectUtils.is(obj)) {
+ if (obj.content) string += parseLanguageStringObj(obj.content);
+ else if (obj.children) string += parseLanguageStringObj(obj.children);
+ else if (obj.props) string += parseLanguageStringObj(obj.props);
+ }
+ else if (BDFDB.ArrayUtils.is(obj)) for (let ele of obj) string += parseLanguageStringObj(ele);
+ return string;
+ };
+ BDFDB.LanguageUtils.LanguageStringsFormat = function (item, ...values) {
+ if (item) {
+ let stringObj = LanguageStringsObj[item];
+ if (stringObj && typeof stringObj == "object" && typeof stringObj.format == "function") {
+ let i = 0, returnvalue, formatVars = {};
+ while (!returnvalue && i < 10) {
+ i++;
+ try {returnvalue = stringObj.format(formatVars, false);}
+ catch (err) {
+ returnvalue = null;
+ let value = values.shift();
+ formatVars[err.toString().split("for: ")[1]] = value != null ? (value === 0 ? "0" : value) : "undefined";
+ if (stringObj.intMessage) {
+ try {for (let hook of stringObj.intMessage.format(formatVars).match(/\([^\(\)]+\)/gi)) formatVars[hook.replace(/[\(\)]/g, "")] = n => n;}
+ catch (err2) {}
+ }
+ if (stringObj.intlMessage) {
+ try {for (let hook of stringObj.intlMessage.format(formatVars).match(/\([^\(\)]+\)/gi)) formatVars[hook.replace(/[\(\)]/g, "")] = n => n;}
+ catch (err2) {}
+ }
+ }
+ }
+ if (returnvalue) return parseLanguageStringObj(returnvalue);
+ else {
+ BDFDB.LogUtils.warn([item, "failed to format string in BDFDB.LanguageUtils.LanguageStrings"]);
+ return "";
+ }
+ }
+ else return BDFDB.LanguageUtils.LanguageStrings[item];
+ }
+ else BDFDB.LogUtils.warn([item, "enter a valid key to format the string in BDFDB.LanguageUtils.LanguageStrings"]);
+ return "";
+ };
+ BDFDB.LanguageUtils.LibraryStrings = new Proxy(LibraryStrings.default || {}, {
+ get: function (list, item) {
+ let languageId = BDFDB.LanguageUtils.getLanguage().id;
+ if (LibraryStrings[languageId] && LibraryStrings[languageId][item]) return LibraryStrings[languageId][item];
+ else if (LibraryStrings.default[item]) return LibraryStrings.default[item];
+ else BDFDB.LogUtils.warn([item, "not found in BDFDB.LanguageUtils.LibraryStrings"]);
+ return "";
+ }
+ });
+ BDFDB.LanguageUtils.LibraryStringsCheck = new Proxy(LanguageStrings, {
+ get: function (list, item) {
+ return !!LibraryStrings.default[item];
+ }
+ });
+ BDFDB.LanguageUtils.LibraryStringsFormat = function (item, ...values) {
+ if (item) {
+ let languageId = BDFDB.LanguageUtils.getLanguage().id, string = null;
+ if (LibraryStrings[languageId] && LibraryStrings[languageId][item]) string = LibraryStrings[languageId][item];
+ else if (LibraryStrings.default[item]) string = LibraryStrings.default[item];
+ if (string) {
+ for (let i = 0; i < values.length; i++) if (typeof values[i] == "string" || typeof values[i] == "number") string = string.replace(new RegExp(`{{var${i}}}`, "g"), values[i]);
+ return string;
+ }
+ else BDFDB.LogUtils.warn([item, "not found in BDFDB.LanguageUtils.LibraryStrings"]);
+ }
+ else BDFDB.LogUtils.warn([item, "enter a valid key to format the string in BDFDB.LanguageUtils.LibraryStrings"]);
+ return "";
+ };
+ BDFDB.TimeUtils.interval(interval => {
+ if (BDFDB.DiscordUtils.getLanguage()) {
+ BDFDB.TimeUtils.clear(interval);
+ let language = BDFDB.LanguageUtils.getLanguage();
+ if (language) BDFDB.LanguageUtils.languages.$discord = Object.assign({}, language, {name: `Discord (${language.name})`});
+ }
+ }, 100);
+ for (let key in BDFDB.LanguageUtils.languages) try {
+ if (new Date(0).toLocaleString(key, {second: 'numeric'}) != "0") {
+ BDFDB.LanguageUtils.languages[key].numberMap = {};
+ for (let i = 0; i < 10; i++) BDFDB.LanguageUtils.languages[key].numberMap[i] = new Date(i*1000).toLocaleString(key, {second: 'numeric'});
+ }
+ }
+ catch (err) {}
+
+ const reactInitialized = Internal.LibraryModules.React && Internal.LibraryModules.React.Component;
+ Internal.setDefaultProps = function (component, defaultProps) {
+ if (BDFDB.ObjectUtils.is(component)) component.defaultProps = Object.assign({}, component.defaultProps, defaultProps);
+ };
+ let openedItem;
+ Internal.MenuItem = reactInitialized && class BDFDB_MenuItem extends Internal.LibraryModules.React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {hovered: false};
+ }
+ componentWillUnmount() {
+ if (openedItem == this.props.id) openedItem = null;
+ }
+ render() {
+ let color = (typeof this.props.color == "string" ? this.props.color : Internal.DiscordConstants.MenuItemColors.DEFAULT).toLowerCase();
+ let isCustomColor = false;
+ if (color) {
+ if (InternalData.DiscordClasses[`menucolor${color}`]) color = color;
+ else if (BDFDB.ColorUtils.getType(color)) {
+ isCustomColor = true;
+ color = BDFDB.ColorUtils.convert(color, "RGBA");
+ }
+ else color = (Internal.DiscordConstants.MenuItemColors.DEFAULT || "").toLowerCase();
+ }
+ let renderPopout, onClose, hasPopout = BDFDB.ObjectUtils.is(this.props.popoutProps);
+ if (hasPopout) {
+ renderPopout = instance => {
+ openedItem = this.props.id;
+ return typeof this.props.popoutProps.renderPopout == "function" && this.props.popoutProps.renderPopout(instance);
+ };
+ onClose = instance => {
+ openedItem = null;
+ typeof this.props.popoutProps.onClose == "function" && this.props.popoutProps.onClose(instance);
+ };
+ }
+ let focused = !openedItem ? this.props.isFocused : openedItem == this.props.id;
+ let themeDark = BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themedark;
+ let item = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, Object.assign({
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.menuitem, (this.props.label || this.props.subtext) && BDFDB.disCN.menulabelcontainer, color && (isCustomColor ? BDFDB.disCN.menucolorcustom : BDFDB.disCN[`menucolor${color}`]), this.props.disabled && BDFDB.disCN.menudisabled, focused && BDFDB.disCN.menufocused),
+ style: {
+ color: isCustomColor ? ((focused || this.state.hovered) ? (BDFDB.ColorUtils.isBright(color) ? "#000000" : "#ffffff") : color) : (this.state.hovered ? "#ffffff" : null),
+ background: isCustomColor && (focused || this.state.hovered) && color
+ },
+ onClick: this.props.disabled ? null : e => {
+ if (!this.props.action) return false;
+ !this.props.persisting && !hasPopout && this.props.onClose && this.props.onClose();
+ this.props.action(e, this);
+ },
+ onMouseEnter: this.props.disabled ? null : e => {
+ if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);
+ this.setState({hovered: true});
+ },
+ onMouseLeave: this.props.disabled ? null : e => {
+ if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);
+ this.setState({hovered: false});
+ },
+ "aria-disabled": this.props.disabled,
+ children: [
+ this.props.icon && this.props.showIconFirst && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuiconcontainerleft,
+ children: BDFDB.ReactUtils.createElement(this.props.icon, {
+ className: BDFDB.disCN.menuicon
+ })
+ }),
+ typeof this.props.render == "function" ? this.props.render(this) : this.props.render,
+ (this.props.label || this.props.subtext) && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menulabel,
+ children: [
+ typeof this.props.label == "function" ? this.props.label(this) : this.props.label,
+ this.props.subtext && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menusubtext,
+ children: typeof this.props.subtext == "function" ? this.props.subtext(this) : this.props.subtext
+ })
+ ].filter(n => n)
+ }),
+ this.props.hint && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuhintcontainer,
+ children: typeof this.props.hint == "function" ? this.props.hint(this) : this.props.hint
+ }),
+ this.props.icon && !this.props.showIconFirst && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuiconcontainer,
+ children: BDFDB.ReactUtils.createElement(this.props.icon, {
+ className: BDFDB.disCN.menuicon
+ })
+ }),
+ this.props.input && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuiconcontainer,
+ children: this.props.input
+ }),
+ this.props.imageUrl && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuimagecontainer,
+ children: BDFDB.ReactUtils.createElement("img", {
+ className: BDFDB.disCN.menuimage,
+ src: typeof this.props.imageUrl == "function" ? this.props.imageUrl(this) : this.props.imageUrl,
+ alt: ""
+ })
+ })
+ ].filter(n => n)
+ }, this.props.menuItemProps, {isFocused: focused}));
+ return hasPopout ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutContainer, Object.assign({}, this.props.popoutProps, {
+ children: item,
+ renderPopout: renderPopout,
+ onClose: onClose
+ })) : item;
+ }
+ };
+ Internal.CustomMenuItemWrapper = reactInitialized && class BDFDB_CustomMenuItemWrapper extends Internal.LibraryModules.React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {hovered: false};
+ }
+ render() {
+ let isItem = this.props.children == Internal.MenuItem;
+ let item = BDFDB.ReactUtils.createElement(this.props.children, Object.assign({}, this.props.childProps, {
+ onMouseEnter: isItem ? e => {
+ if (this.props.childProps && typeof this.props.childProps.onMouseEnter == "function") this.props.childProps.onMouseEnter(e, this);
+ this.setState({hovered: true});
+ } : this.props.childProps && this.props.childProps.onMouseEnter,
+ onMouseLeave: isItem ? e => {
+ if (this.props.childProps && typeof this.props.childProps.onMouseLeave == "function") this.props.childProps.onMouseLeave(e, this);
+ this.setState({hovered: false});
+ } : this.props.childProps && this.props.childProps.onMouseLeave,
+ isFocused: this.state.hovered && !this.props.disabled
+ }));
+ return isItem ? item : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ onMouseEnter: e => this.setState({hovered: true}),
+ onMouseLeave: e => this.setState({hovered: false}),
+ children: item
+ });
+ }
+ };
+ Internal.ErrorBoundary = reactInitialized && class BDFDB_ErrorBoundary extends Internal.LibraryModules.React.PureComponent {
+ constructor(props) {
+ super(props);
+ this.state = {hasError: false};
+ }
+ static getDerivedStateFromError(err) {
+ return {hasError: true};
+ }
+ componentDidCatch(err, info) {
+ BDFDB.LogUtils.error(["Could not create React Element!", err]);
+ }
+ render() {
+ if (this.state.hasError) return Internal.LibraryModules.React.createElement("span", {
+ style: {
+ background: Internal.DiscordConstants.Colors.PRIMARY,
+ borderRadius: 5,
+ color: BDFDB.DiscordConstants.ColorsCSS.STATUS_DANGER,
+ fontSize: 12,
+ fontWeight: 600,
+ padding: 6,
+ textAlign: "center",
+ verticalAlign: "center"
+ },
+ children: "React Component Error"
+ });
+ return this.props.children;
+ }
+ };
+
+ Internal.NativeSubComponents = new Proxy(NativeSubComponents, {
+ get: function (_, item) {
+ if (NativeSubComponents[item]) return NativeSubComponents[item];
+ if (!InternalData.NativeSubComponents[item]) return "div";
+
+ Internal.findModuleViaData(NativeSubComponents, InternalData.NativeSubComponents, item);
+
+ return NativeSubComponents[item] ? NativeSubComponents[item] : "div";
+ }
+ });
+
+ CustomComponents.AutoFocusCatcher = reactInitialized && class BDFDB_AutoFocusCatcher extends Internal.LibraryModules.React.Component {
+ render() {
+ const style = {padding: 0, margin: 0, border: "none", width: 0, maxWidth: 0, height: 0, maxHeight: 0, visibility: "hidden"};
+ return BDFDB.ReactUtils.forceStyle(BDFDB.ReactUtils.createElement("input", {style}), Object.keys(style));
+ }
+ };
+
+ CustomComponents.BadgeAnimationContainer = reactInitialized && class BDFDB_BadgeAnimationContainer extends Internal.LibraryModules.React.Component {
+ componentDidMount() {BDFDB.ReactUtils.forceUpdate(this);}
+ componentWillAppear(e) {if (typeof e == "function") e();}
+ componentWillEnter(e) {if (typeof e == "function") e();}
+ componentWillLeave(e) {if (typeof e == "function") this.timeoutId = setTimeout(e, 300);}
+ componentWillUnmount() {BDFDB.TimeUtils.clear(this.timeoutId)}
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.div, {
+ className: this.props.className,
+ style: this.props.animatedStyle,
+ children: this.props.children
+ });
+ }
+ };
+
+ CustomComponents.Badges = {};
+ CustomComponents.Badges.getBadgePaddingForValue = function (count) {
+ switch (count) {
+ case 1:
+ case 4:
+ case 6:
+ return 1;
+ default:
+ return 0;
+ }
+ };
+ CustomComponents.Badges.IconBadge = reactInitialized && class BDFDB_IconBadge extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.badgeiconbadge, this.props.shape && Internal.LibraryComponents.Badges.BadgeShapes[this.props.shape] || Internal.LibraryComponents.Badges.BadgeShapes.ROUND),
+ style: Object.assign({
+ backgroundColor: this.props.disableColor ? null : (this.props.color || BDFDB.DiscordConstants.ColorsCSS.STATUS_DANGER)
+ }, this.props.style),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.badgeicon,
+ name: this.props.icon
+ })
+ });
+ }
+ };
+ CustomComponents.Badges.NumberBadge = reactInitialized && class BDFDB_NumberBadge extends Internal.LibraryModules.React.Component {
+ handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
+ handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ getBadgeWidthForValue(e) {return e < 10 ? 16 : e < 100 ? 22 : 30}
+ getBadgeCountString(e) {return e < 1e3 ? "" + e : Math.min(Math.floor(e/1e3), 9) + "k+"}
+ render() {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.badgenumberbadge, this.props.shape && Internal.LibraryComponents.Badges.BadgeShapes[this.props.shape] || Internal.LibraryComponents.Badges.BadgeShapes.ROUND),
+ style: Object.assign({
+ backgroundColor: !this.props.disableColor && (this.props.color || BDFDB.DiscordConstants.ColorsCSS.STATUS_DANGER),
+ width: this.getBadgeWidthForValue(this.props.count)
+ }, this.props.style),
+ onClick: this.handleClick.bind(this),
+ onContextMenu: this.handleContextMenu.bind(this),
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this),
+ children: this.getBadgeCountString(this.props.count)
+ });
+ }
+ };
+
+ CustomComponents.BotTag = reactInitialized && class BDFDB_BotTag extends Internal.LibraryModules.React.Component {
+ handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
+ handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ render() {
+ return BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, this.props.invertColor ? BDFDB.disCN.bottaginvert : BDFDB.disCN.bottagregular, this.props.useRemSizes ? BDFDB.disCN.bottagrem : BDFDB.disCN.bottagpx),
+ style: this.props.style,
+ onClick: this.handleClick.bind(this),
+ onContextMenu: this.handleContextMenu.bind(this),
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this),
+ children: BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.bottagtext,
+ children: this.props.tag || BDFDB.LanguageUtils.LanguageStrings.BOT_TAG_BOT
+ })
+ });
+ }
+ };
+
+ CustomComponents.Button = reactInitialized && class BDFDB_Button extends Internal.LibraryModules.React.Component {
+ handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
+ handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
+ handleMouseDown(e) {if (typeof this.props.onMouseDown == "function") this.props.onMouseDown(e, this);}
+ handleMouseUp(e) {if (typeof this.props.onMouseUp == "function") this.props.onMouseUp(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ render() {
+ let processingAndListening = (this.props.disabled || this.props.submitting) && (null != this.props.onMouseEnter || null != this.props.onMouseLeave);
+ let props = BDFDB.ObjectUtils.exclude(this.props, "look", "color", "hover", "size", "fullWidth", "grow", "disabled", "submitting", "type", "style", "wrapperClassName", "className", "innerClassName", "onClick", "onContextMenu", "onMouseDown", "onMouseUp", "onMouseEnter", "onMouseLeave", "children", "rel");
+ let button = BDFDB.ReactUtils.createElement("button", Object.assign({}, !this.props.disabled && !this.props.submitting && props, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.button, this.props.look != null ? this.props.look : Internal.LibraryComponents.Button.Looks.FILLED, this.props.color != null ? this.props.color : Internal.LibraryComponents.Button.Colors.BRAND, this.props.hover, this.props.size != null ? this.props.size : Internal.LibraryComponents.Button.Sizes.MEDIUM, processingAndListening && this.props.wrapperClassName, this.props.fullWidth && BDFDB.disCN.buttonfullwidth, (this.props.grow === undefined || this.props.grow) && BDFDB.disCN.buttongrow, this.props.hover && this.props.hover !== Internal.LibraryComponents.Button.Hovers.DEFAULT && BDFDB.disCN.buttonhashover, this.props.submitting && BDFDB.disCN.buttonsubmitting),
+ onClick: (this.props.disabled || this.props.submitting) ? e => {return e.preventDefault();} : this.handleClick.bind(this),
+ onContextMenu: (this.props.disabled || this.props.submitting) ? e => {return e.preventDefault();} : this.handleContextMenu.bind(this),
+ onMouseUp: !this.props.disabled && this.handleMouseDown.bind(this),
+ onMouseDown: !this.props.disabled && this.handleMouseUp.bind(this),
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this),
+ type: !this.props.type ? "button" : this.props.type,
+ disabled: this.props.disabled,
+ style: this.props.style,
+ rel: this.props.rel,
+ children: [
+ this.props.submitting && !this.props.disabled ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SpinnerComponents.Spinner, {
+ type: Internal.LibraryComponents.SpinnerComponents.Types.PULSING_ELLIPSIS,
+ className: BDFDB.disCN.buttonspinner,
+ itemClassName: BDFDB.disCN.buttonspinneritem
+ }) : null,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.buttoncontents, this.props.innerClassName),
+ children: this.props.children
+ })
+ ]
+ }));
+ return !processingAndListening ? button : BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.buttondisabledwrapper, this.props.wrapperClassName, this.props.size != null ? this.props.size : Internal.LibraryComponents.Button.Sizes.MEDIUM, this.props.fullWidth && BDFDB.disCN.buttonfullwidth, (this.props.grow === undefined || this.props.grow) && BDFDB.disCN.buttongrow),
+ children: [
+ button,
+ BDFDB.ReactUtils.createElement("span", {
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this),
+ className: BDFDB.disCN.buttondisabledoverlay
+ })
+ ]
+ });
+ }
+ };
+
+ CustomComponents.Card = reactInitialized && class BDFDB_Card extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement("div", BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.hovercardwrapper, this.props.horizontal && BDFDB.disCN.hovercardhorizontal, this.props.backdrop && BDFDB.disCN.hovercard, this.props.className),
+ onMouseEnter: e => {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);},
+ onMouseLeave: e => {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);},
+ onClick: e => {if (typeof this.props.onClick == "function") this.props.onClick(e, this);},
+ onContextMenu: e => {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);},
+ children: [
+ !this.props.noRemove ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ "aria-label": BDFDB.LanguageUtils.LanguageStrings.REMOVE,
+ className: BDFDB.disCNS.hovercardbutton + BDFDB.disCNS.hovercardremovebutton + BDFDB.disCN.hovercardremovebuttondefault,
+ onClick: e => {
+ if (typeof this.props.onRemove == "function") this.props.onRemove(e, this);
+ BDFDB.ListenerUtils.stopEvent(e);
+ }
+ }) : null,
+ typeof this.props.children == "string" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ className: BDFDB.disCN.hovercardinner,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextScroller, {children: this.props.children})
+ }) : this.props.children
+ ].flat(10).filter(n => n)
+ }), "backdrop", "horizontal", "noRemove"));
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.Card, {backdrop: true, noRemove: false});
+
+ CustomComponents.ChannelTextAreaButton = reactInitialized && class BDFDB_ChannelTextAreaButton extends Internal.LibraryModules.React.Component {
+ render() {
+ const inner = BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.textareabuttonwrapper,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: this.props.iconName,
+ iconSVG: this.props.iconSVG,
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.textareaicon, this.props.iconClassName, this.props.pulse && BDFDB.disCN.textareaiconpulse),
+ nativeClass: this.props.nativeClass
+ })
+ });
+ const button = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Button, {
+ look: Internal.LibraryComponents.Button.Looks.BLANK,
+ size: Internal.LibraryComponents.Button.Sizes.NONE,
+ "aria-label": this.props.label,
+ tabIndex: this.props.tabIndex,
+ className: BDFDB.DOMUtils.formatClassName(this.props.isActive && BDFDB.disCN.textareabuttonactive),
+ innerClassName: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.textareabutton, this.props.className, this.props.pulse && BDFDB.disCN.textareaattachbuttonplus),
+ onClick: this.props.onClick,
+ onContextMenu: this.props.onContextMenu,
+ onMouseEnter: this.props.onMouseEnter,
+ onMouseLeave: this.props.onMouseLeave,
+ children: this.props.tooltip && this.props.tooltip.text ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, Object.assign({}, this.props.tooltip, {children: inner})) : inner
+ });
+ return (this.props.className || "").indexOf(BDFDB.disCN.textareapickerbutton) > -1 ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.textareapickerbuttoncontainer,
+ children: button
+ }) : button;
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.ChannelTextAreaButton, {tabIndex: 0});
+
+ CustomComponents.CharCounter = reactInitialized && class BDFDB_CharCounter extends Internal.LibraryModules.React.Component {
+ getCounterString() {
+ let input = this.refElement || {}, string = "";
+ if (BDFDB.DOMUtils.containsClass(this.refElement, BDFDB.disCN.textarea)) {
+ let instance = BDFDB.ReactUtils.findOwner(input, {name: "ChannelTextAreaEditor", up: true});
+ if (instance) string = instance.props.textValue;
+ else string = input.value || input.textContent || "";
+ }
+ else string = input.value || input.textContent || "";
+ if (this.props.max && this.props.showPercentage && (string.length/this.props.max) * 100 < this.props.showPercentage) return "";
+ let start = input.selectionStart || 0, end = input.selectionEnd || 0, selectlength = end - start, selection = BDFDB.DOMUtils.getSelection();
+ let select = !selectlength && !selection ? 0 : (selectlength || selection.length);
+ select = !select ? 0 : (select > string.length ? (end || start ? string.length - (string.length - end - start) : string.length) : select);
+ let children = [
+ typeof this.props.renderPrefix == "function" && this.props.renderPrefix(string.length),
+ `${string.length}${!this.props.max ? "" : "/" + this.props.max}${!select ? "" : " (" + select + ")"}`,
+ typeof this.props.renderSuffix == "function" && this.props.renderSuffix(string.length)
+ ].filter(n => n);
+ if (typeof this.props.onChange == "function") this.props.onChange(this);
+ return children.length == 1 ? children[0] : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: children
+ });
+ }
+ updateCounter() {
+ if (!this.refElement) return;
+ BDFDB.TimeUtils.clear(this.updateTimeout);
+ this.updateTimeout = BDFDB.TimeUtils.timeout(this.forceUpdateCounter.bind(this), 100);
+ }
+ forceUpdateCounter() {
+ if (!this.refElement) return;
+ this.props.children = this.getCounterString();
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleSelection() {
+ if (!this.refElement) return;
+ let mouseMove = _ => {
+ BDFDB.TimeUtils.timeout(this.forceUpdateCounter.bind(this), 10);
+ };
+ let mouseUp = _ => {
+ document.removeEventListener("mousemove", mouseMove);
+ document.removeEventListener("mouseup", mouseUp);
+ if (this.refElement.selectionEnd - this.refElement.selectionStart) BDFDB.TimeUtils.timeout(_ => {
+ document.addEventListener("click", click);
+ });
+ };
+ let click = _ => {
+ BDFDB.TimeUtils.timeout(this.forceUpdateCounter.bind(this), 100);
+ document.removeEventListener("mousemove", mouseMove);
+ document.removeEventListener("mouseup", mouseUp);
+ document.removeEventListener("click", click);
+ };
+ document.addEventListener("mousemove", mouseMove);
+ document.addEventListener("mouseup", mouseUp);
+ }
+ componentDidMount() {
+ if (this.props.refClass) {
+ let node = BDFDB.ReactUtils.findDOMNode(this);
+ if (node && node.parentElement) {
+ this.refElement = node.parentElement.querySelector(this.props.refClass);
+ if (this.refElement) {
+ if (!this._updateCounter) this._updateCounter = _ => {
+ if (!document.contains(node)) BDFDB.ListenerUtils.multiRemove(this.refElement, "keydown click change", this._updateCounter);
+ else this.updateCounter();
+ };
+ if (!this._handleSelection) this._handleSelection = _ => {
+ if (!document.contains(node)) BDFDB.ListenerUtils.multiRemove(this.refElement, "mousedown", this._handleSelection);
+ else this.handleSelection();
+ };
+ BDFDB.ListenerUtils.multiRemove(this.refElement, "mousedown", this._handleSelection);
+ BDFDB.ListenerUtils.multiAdd(this.refElement, "mousedown", this._handleSelection);
+ if (this.refElement.tagName == "INPUT" || this.refElement.tagName == "TEXTAREA") {
+ BDFDB.ListenerUtils.multiRemove(this.refElement, "keydown click change", this._updateCounter);
+ BDFDB.ListenerUtils.multiAdd(this.refElement, "keydown click change", this._updateCounter);
+ }
+ else {
+ if (!this._mutationObserver) this._mutationObserver = new MutationObserver(changes => {
+ if (!document.contains(node)) this._mutationObserver.disconnect();
+ else this.updateCounter();
+ });
+ else this._mutationObserver.disconnect();
+ this._mutationObserver.observe(this.refElement, {childList: true, subtree: true});
+ }
+ this.updateCounter();
+ }
+ else BDFDB.LogUtils.warn(["could not find referenceElement for BDFDB_CharCounter"]);
+ }
+ }
+ else BDFDB.LogUtils.warn(["refClass can not be undefined for BDFDB_CharCounter"]);
+ }
+ render() {
+ let string = this.getCounterString();
+ BDFDB.TimeUtils.timeout(_ => string != this.getCounterString() && BDFDB.ReactUtils.forceUpdate(this));
+ return BDFDB.ReactUtils.createElement("div", BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.charcounter, this.props.className),
+ children: string
+ }), "parsing", "max", "refClass", "renderPrefix", "renderSuffix", "showPercentage"));
+ }
+ };
+
+ CustomComponents.Checkbox = reactInitialized && class BDFDB_Checkbox extends Internal.LibraryModules.React.Component {
+ handleMouseDown(e) {if (typeof this.props.onMouseDown == "function") this.props.onMouseDown(e, this);}
+ handleMouseUp(e) {if (typeof this.props.onMouseUp == "function") this.props.onMouseUp(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ getInputMode() {
+ return this.props.disabled ? "disabled" : this.props.readOnly ? "readonly" : "default";
+ }
+ getStyle() {
+ let style = this.props.style || {};
+ if (!this.props.value) return style;
+ style = Object.assign({}, style);
+ this.props.color = typeof this.props.getColor == "function" ? this.props.getColor(this.props.value) : this.props.color;
+ if (Internal.LibraryComponents.Checkbox.Types) switch (this.props.type) {
+ case Internal.LibraryComponents.Checkbox.Types.DEFAULT:
+ style.borderColor = this.props.color;
+ break;
+ case Internal.LibraryComponents.Checkbox.Types.GHOST:
+ let color = BDFDB.ColorUtils.setAlpha(this.props.color, 0.15, "RGB");
+ style.backgroundColor = color;
+ style.borderColor = color;
+ break;
+ case Internal.LibraryComponents.Checkbox.Types.INVERTED:
+ style.backgroundColor = this.props.color;
+ style.borderColor = this.props.color;
+ }
+ return style;
+ }
+ getColor() {
+ return this.props.value ? (Internal.LibraryComponents.Checkbox.Types && this.props.type === Internal.LibraryComponents.Checkbox.Types.INVERTED ? Internal.DiscordConstants.Colors.WHITE : this.props.color) : "transparent";
+ }
+ handleChange(e) {
+ this.props.value = typeof this.props.getValue == "function" ? this.props.getValue(this.props.value, e, this) : !this.props.value;
+ if (typeof this.props.onChange == "function") this.props.onChange(this.props.value, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ let label = this.props.children ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.checkboxlabel, this.props.disabled ? BDFDB.disCN.checkboxlabeldisabled : BDFDB.disCN.checkboxlabelclickable, this.props.reverse ? BDFDB.disCN.checkboxlabelreversed : BDFDB.disCN.checkboxlabelforward),
+ style: {
+ lineHeight: this.props.size + "px"
+ },
+ children: this.props.children
+ }) : null;
+ return BDFDB.ReactUtils.createElement("label", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.disabled ? BDFDB.disCN.checkboxwrapperdisabled : BDFDB.disCN.checkboxwrapper, this.props.align, this.props.className),
+ children: [
+ this.props.reverse && label,
+ !this.props.displayOnly && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FocusRingScope, {
+ children: BDFDB.ReactUtils.createElement("input", {
+ className: BDFDB.disCN["checkboxinput" + this.getInputMode()],
+ type: "checkbox",
+ onClick: this.props.disabled || this.props.readOnly ? (_ => {}) : this.handleChange.bind(this),
+ onContextMenu: this.props.disabled || this.props.readOnly ? (_ => {}) : this.handleChange.bind(this),
+ onMouseUp: !this.props.disabled && this.handleMouseDown.bind(this),
+ onMouseDown: !this.props.disabled && this.handleMouseUp.bind(this),
+ onMouseEnter: !this.props.disabled && this.handleMouseEnter.bind(this),
+ onMouseLeave: !this.props.disabled && this.handleMouseLeave.bind(this),
+ checked: this.props.value,
+ style: {
+ width: this.props.size,
+ height: this.props.size
+ }
+ })
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.checkbox, BDFDB.disCN["checkbox" + this.props.shape], this.props.value && BDFDB.disCN.checkboxchecked),
+ style: Object.assign({
+ width: this.props.size,
+ height: this.props.size,
+ borderColor: this.props.checkboxColor
+ }, this.getStyle()),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Checkmark, {
+ width: 18,
+ height: 18,
+ color: this.getColor(),
+ "aria-hidden": true
+ })
+ }),
+ !this.props.reverse && label
+ ].filter(n => n)
+ });
+ }
+ };
+ CustomComponents.Checkbox.Types = {
+ DEFAULT: "DEFAULT",
+ GHOST: "GHOST",
+ INVERTED: "INVERTED"
+ };
+ CustomComponents.Checkbox.Shapes = {
+ BOX: "box",
+ ROUND: "round"
+ };
+ Internal.setDefaultProps(CustomComponents.Checkbox, {type: CustomComponents.Checkbox.Types.INVERTED, shape: CustomComponents.Checkbox.Shapes.ROUND});
+
+ CustomComponents.Clickable = reactInitialized && class BDFDB_Clickable extends Internal.LibraryModules.React.Component {
+ handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
+ handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
+ handleMouseDown(e) {if (typeof this.props.onMouseDown == "function") this.props.onMouseDown(e, this);}
+ handleMouseUp(e) {if (typeof this.props.onMouseUp == "function") this.props.onMouseUp(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.Clickable, Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, (this.props.className || "").toLowerCase().indexOf("disabled") == -1 && BDFDB.disCN.cursorpointer),
+ onClick: this.handleClick.bind(this),
+ onContextMenu: this.handleContextMenu.bind(this),
+ onMouseUp: this.handleMouseDown.bind(this),
+ onMouseDown: !this.props.disabled && this.handleMouseUp.bind(this),
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this)
+ }));
+ }
+ };
+
+ CustomComponents.CollapseContainer = reactInitialized && class BDFDB_CollapseContainer extends Internal.LibraryModules.React.Component {
+ render() {
+ if (!BDFDB.ObjectUtils.is(this.props.collapseStates)) this.props.collapseStates = {};
+ this.props.collapsed = this.props.collapsed && (this.props.collapseStates[this.props.title] || this.props.collapseStates[this.props.title] === undefined);
+ this.props.collapseStates[this.props.title] = this.props.collapsed;
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.collapsed && BDFDB.disCN.collapsecontainercollapsed, this.props.mini ? BDFDB.disCN.collapsecontainermini : BDFDB.disCN.collapsecontainer, this.props.className),
+ id: this.props.id,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.disCN.collapsecontainerheader,
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ onClick: e => {
+ this.props.collapsed = !this.props.collapsed;
+ this.props.collapseStates[this.props.title] = this.props.collapsed;
+ if (typeof this.props.onClick == "function") this.props.onClick(this.props.collapsed, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ },
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormTitle, {
+ tag: Internal.LibraryComponents.FormComponents.FormTags && Internal.LibraryComponents.FormComponents.FormTags.H5,
+ className: BDFDB.disCN.collapsecontainertitle,
+ children: this.props.title
+ })
+ }),
+ !this.props.collapsed ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.collapsecontainerinner,
+ children: this.props.children
+ }) : null
+ ]
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.CollapseContainer, {collapsed: true, mini: true});
+
+ CustomComponents.ColorPicker = reactInitialized && class BDFDB_ColorPicker extends Internal.LibraryModules.React.Component {
+ constructor(props) {
+ super(props);
+ if (!this.state) this.state = {};
+ this.state.isGradient = props.gradient && props.color && BDFDB.ObjectUtils.is(props.color);
+ this.state.gradientBarEnabled = this.state.isGradient;
+ this.state.draggingAlphaCursor = false;
+ this.state.draggingGradientCursor = false;
+ this.state.selectedGradientCursor = 0;
+ }
+ handleColorChange(color) {
+ let changed = false;
+ if (color != null) {
+ changed = !BDFDB.equals(this.state.isGradient ? this.props.color[this.state.selectedGradientCursor] : this.props.color, color);
+ if (this.state.isGradient) this.props.color[this.state.selectedGradientCursor] = color;
+ else this.props.color = color;
+ }
+ else changed = true;
+ if (changed) {
+ if (typeof this.props.onColorChange == "function") this.props.onColorChange(BDFDB.ColorUtils.convert(this.props.color, "RGBCOMP"));
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ }
+ render() {
+ if (this.state.isGradient) this.props.color = Object.assign({}, this.props.color);
+
+ let colorFormat = this.props.alpha ? "HSVA" : "HSV";
+ let hexRegex = this.props.alpha ? /^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i : /^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;
+
+ let selectedColor = BDFDB.ColorUtils.convert(this.state.isGradient ? this.props.color[this.state.selectedGradientCursor] : this.props.color, colorFormat) || BDFDB.ColorUtils.convert("#000000FF", colorFormat);
+ let currentGradient = (this.state.isGradient ? Object.entries(this.props.color, colorFormat) : [[0, selectedColor], [1, selectedColor]]);
+
+ let [h, s, v] = BDFDB.ColorUtils.convert(selectedColor, "HSVCOMP");
+ let a = BDFDB.ColorUtils.getAlpha(selectedColor);
+ a = a == null ? 1 : a;
+
+ let hexColor = BDFDB.ColorUtils.convert(selectedColor, this.props.alpha ? "HEXA" : "HEX");
+ let hexLength = hexColor.length;
+
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutFocusLock, {
+ className: BDFDB.disCNS.colorpickerwrapper + BDFDB.disCN.colorpicker,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerinner,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickersaturation,
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickersaturationcolor,
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0, cursor: "crosshair", backgroundColor: BDFDB.ColorUtils.convert([h, "100%", "50%"], "RGB")},
+ onClick: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickersaturationcolor, event.target));
+ this.handleColorChange(BDFDB.ColorUtils.convert([h, BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 100], event.clientX) + "%", BDFDB.NumberUtils.mapRange([rects.top, rects.top + rects.height], [100, 0], event.clientY) + "%", a], colorFormat, "HSVCOMP"));
+ },
+ onMouseDown: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickersaturationcolor, event.target));
+ let mouseUp = _ => {
+ document.removeEventListener("mouseup", mouseUp);
+ document.removeEventListener("mousemove", mouseMove);
+ };
+ let mouseMove = event2 => {
+ this.handleColorChange(BDFDB.ColorUtils.convert([h, BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 100], event2.clientX) + "%", BDFDB.NumberUtils.mapRange([rects.top, rects.top + rects.height], [100, 0], event2.clientY) + "%", a], colorFormat, "HSVCOMP"));
+ };
+ document.addEventListener("mouseup", mouseUp);
+ document.addEventListener("mousemove", mouseMove);
+ },
+ children: [
+ BDFDB.ReactUtils.createElement("style", {
+ children: `${BDFDB.dotCN.colorpickersaturationwhite} {background: -webkit-linear-gradient(to right, #fff, rgba(255,255,255,0));background: linear-gradient(to right, #fff, rgba(255,255,255,0));}${BDFDB.dotCN.colorpickersaturationblack} {background: -webkit-linear-gradient(to top, #000, rgba(0,0,0,0));background: linear-gradient(to top, #000, rgba(0,0,0,0));}`
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickersaturationwhite,
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickersaturationblack,
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0}
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickersaturationcursor,
+ style: {position: "absolute", cursor: "crosshair", left: s, top: `${BDFDB.NumberUtils.mapRange([0, 100], [100, 0], parseFloat(v))}%`},
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {width: 4, height: 4, boxShadow: "rgb(255, 255, 255) 0px 0px 0px 1.5px, rgba(0, 0, 0, 0.3) 0px 0px 1px 1px inset, rgba(0, 0, 0, 0.4) 0px 0px 1px 2px", borderRadius: "50%", transform: "translate(-2px, -2px)"}
+ })
+ })
+ ]
+ })
+ ]
+ })
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerhue,
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerhuehorizontal,
+ style: {padding: "0px 2px", position: "relative", height: "100%"},
+ onClick: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickerhuehorizontal, event.target));
+ this.handleColorChange(BDFDB.ColorUtils.convert([BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 360], event.clientX), s, v, a], colorFormat, "HSVCOMP"));
+ },
+ onMouseDown: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickerhuehorizontal, event.target));
+ let mouseUp = _ => {
+ document.removeEventListener("mouseup", mouseUp);
+ document.removeEventListener("mousemove", mouseMove);
+ };
+ let mouseMove = event2 => {
+ this.handleColorChange(BDFDB.ColorUtils.convert([BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 360], event2.clientX), s, v, a], colorFormat, "HSVCOMP"));
+ };
+ document.addEventListener("mouseup", mouseUp);
+ document.addEventListener("mousemove", mouseMove);
+ },
+ children: [
+ BDFDB.ReactUtils.createElement("style", {
+ children: `${BDFDB.dotCN.colorpickerhuehorizontal} {background: linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);background: -webkit-linear-gradient(to right, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);}${BDFDB.dotCN.colorpickerhuevertical} {background: linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);background: -webkit-linear-gradient(to top, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%);}`
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerhuecursor,
+ style: {position: "absolute", cursor: "ew-resize", left: `${BDFDB.NumberUtils.mapRange([0, 360], [0, 100], h)}%`},
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {marginTop: 1, width: 4, borderRadius: 1, height: 8, boxShadow: "rgba(0, 0, 0, 0.6) 0px 0px 2px", background: "rgb(255, 255, 255)", transform: "translateX(-2px)"}
+ })
+ })
+ ]
+ })
+ })
+ }),
+ this.props.alpha && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickeralpha,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickeralphacheckered,
+ style: {padding: "0px 2px", position: "relative", height: "100%"}
+ })
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickeralphahorizontal,
+ style: {padding: "0px 2px", position: "relative", height: "100%", background: `linear-gradient(to right, ${BDFDB.ColorUtils.setAlpha([h, s, v], 0, "RGBA")}, ${BDFDB.ColorUtils.setAlpha([h, s, v], 1, "RGBA")}`},
+ onClick: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickeralphahorizontal, event.target));
+ this.handleColorChange(BDFDB.ColorUtils.setAlpha([h, s, v], BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 1], event.clientX), colorFormat));
+ },
+ onMouseDown: event => {
+ let rects = BDFDB.DOMUtils.getRects(BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickeralphahorizontal, event.target));
+ let mouseUp = _ => {
+ document.removeEventListener("mouseup", mouseUp);
+ document.removeEventListener("mousemove", mouseMove);
+ this.state.draggingAlphaCursor = false;
+ BDFDB.ReactUtils.forceUpdate(this);
+ };
+ let mouseMove = event2 => {
+ this.state.draggingAlphaCursor = true;
+ this.handleColorChange(BDFDB.ColorUtils.setAlpha([h, s, v], BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0, 1], event2.clientX), colorFormat));
+ };
+ document.addEventListener("mouseup", mouseUp);
+ document.addEventListener("mousemove", mouseMove);
+ },
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickeralphacursor,
+ style: {position: "absolute", cursor: "ew-resize", left: `${a * 100}%`},
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ style: {marginTop: 1, width: 4, borderRadius: 1, height: 8, boxShadow: "rgba(0, 0, 0, 0.6) 0px 0px 2px", background: "rgb(255, 255, 255)", transform: "translateX(-2px)"}
+ }),
+ this.state.draggingAlphaCursor && BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.sliderbubble,
+ style: {opacity: 1, visibility: "visible", left: 2},
+ children: `${Math.floor(a * 100)}%`
+ })
+ ].filter(n => n)
+ })
+ })
+ })
+ ]
+ }),
+ this.state.gradientBarEnabled && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickergradient,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickergradientcheckered,
+ style: {padding: "0px 2px", position: "relative", height: "100%"}
+ })
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ style: {position: "absolute", top: 0, right: 0, bottom: 0, left: 0},
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickergradienthorizontal,
+ style: {padding: "0px 2px", position: "relative", cursor: "copy", height: "100%", background: BDFDB.ColorUtils.createGradient(currentGradient.reduce((colorObj, posAndColor) => (colorObj[posAndColor[0]] = posAndColor[1], colorObj), {}))},
+ onClick: event => {
+ let rects = BDFDB.DOMUtils.getRects(event.target);
+ let pos = BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0.01, 0.99], event.clientX);
+ if (Object.keys(this.props.color).indexOf(pos) == -1) {
+ this.props.color[pos] = BDFDB.ColorUtils.convert("#000000FF", colorFormat);
+ this.state.selectedGradientCursor = pos;
+ this.handleColorChange();
+ }
+ },
+ children: currentGradient.map(posAndColor => BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.colorpickergradientcursor, (posAndColor[0] == 0 || posAndColor[0] == 1) && BDFDB.disCN.colorpickergradientcursoredge, this.state.selectedGradientCursor == posAndColor[0] && BDFDB.disCN.colorpickergradientcursorselected),
+ style: {position: "absolute", cursor: "pointer", left: `${posAndColor[0] * 100}%`},
+ onMouseDown: posAndColor[0] == 0 || posAndColor[0] == 1 ? _ => {} : event => {
+ event = event.nativeEvent || event;
+ let mouseMove = event2 => {
+ if (Math.sqrt((event.pageX - event2.pageX)**2) > 10) {
+ document.removeEventListener("mousemove", mouseMove);
+ document.removeEventListener("mouseup", mouseUp);
+
+ this.state.draggingGradientCursor = true;
+ let cursor = BDFDB.DOMUtils.getParent(BDFDB.dotCN.colorpickergradientcursor, event.target);
+ let rects = BDFDB.DOMUtils.getRects(cursor.parentElement);
+
+ let releasing = _ => {
+ document.removeEventListener("mousemove", dragging);
+ document.removeEventListener("mouseup", releasing);
+ BDFDB.TimeUtils.timeout(_ => {this.state.draggingGradientCursor = false;});
+ };
+ let dragging = event3 => {
+ let pos = BDFDB.NumberUtils.mapRange([rects.left, rects.left + rects.width], [0.01, 0.99], event3.clientX);
+ if (Object.keys(this.props.color).indexOf(pos) == -1) {
+ delete this.props.color[posAndColor[0]];
+ posAndColor[0] = pos;
+ this.props.color[pos] = posAndColor[1];
+ this.state.selectedGradientCursor = pos;
+ this.handleColorChange();
+ }
+ };
+ document.addEventListener("mousemove", dragging);
+ document.addEventListener("mouseup", releasing);
+ }
+ };
+ let mouseUp = _ => {
+ document.removeEventListener("mousemove", mouseMove);
+ document.removeEventListener("mouseup", mouseUp);
+ };
+ document.addEventListener("mousemove", mouseMove);
+ document.addEventListener("mouseup", mouseUp);
+ },
+ onClick: event => {
+ BDFDB.ListenerUtils.stopEvent(event);
+ if (!this.state.draggingGradientCursor) {
+ this.state.selectedGradientCursor = posAndColor[0];
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ },
+ onContextMenu: posAndColor[0] == 0 || posAndColor[0] == 1 ? _ => {} : event => {
+ BDFDB.ListenerUtils.stopEvent(event);
+ delete this.props.color[posAndColor[0]];
+ this.state.selectedGradientCursor = 0;
+ this.handleColorChange();
+ },
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {background: BDFDB.ColorUtils.convert(posAndColor[1], "RGBA")}
+ })
+ }))
+ })
+ })
+ ]
+ })
+ ].filter(n => n)
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextInput, {
+ className: BDFDB.disCNS.colorpickerhexinput + BDFDB.disCN.margintop8,
+ maxLength: this.props.alpha ? 9 : 7,
+ valuePrefix: "#",
+ value: hexColor,
+ autoFocus: true,
+ onChange: value => {
+ const oldLength = hexLength;
+ hexLength = (value || "").length;
+ if (this.props.alpha && (oldLength > 8 || oldLength < 6) && hexLength == 7) value += "FF";
+ if (hexRegex.test(value)) this.handleColorChange(value);
+ },
+ inputChildren: this.props.gradient && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: BDFDB.LanguageUtils.LibraryStrings.gradient,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.colorpickergradientbutton, this.state.gradientBarEnabled && BDFDB.disCN.colorpickergradientbuttonenabled),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ nativeClass: true,
+ width: 28,
+ height: 28,
+ name: Internal.LibraryComponents.SvgIcon.Names.GRADIENT
+ }),
+ onClick: _ => {
+ this.state.gradientBarEnabled = !this.state.gradientBarEnabled;
+ if (this.state.gradientBarEnabled && !this.state.isGradient) this.props.color = {0: selectedColor, 1: selectedColor};
+ else if (!this.state.gradientBarEnabled && this.state.isGradient) this.props.color = selectedColor;
+ this.state.isGradient = this.props.color && BDFDB.ObjectUtils.is(this.props.color);
+ this.handleColorChange();
+ }
+ })
+ })
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: "move-corners",
+ children: [{top: 0, left: 0}, {top: 0, right: 0}, {bottom: 0, right: 0}, {bottom: 0, left: 0}].map(pos => BDFDB.ReactUtils.createElement("div", {
+ className: "move-corner",
+ onMouseDown: e => {
+ if (!this.domElementRef.current) return;
+ let rects = BDFDB.DOMUtils.getRects(this.domElementRef.current);
+ let left = rects.left, top = rects.top;
+ let oldX = e.pageX, oldY = e.pageY;
+ let mouseUp = _ => {
+ document.removeEventListener("mouseup", mouseUp);
+ document.removeEventListener("mousemove", mouseMove);
+ };
+ let mouseMove = e2 => {
+ left = left - (oldX - e2.pageX), top = top - (oldY - e2.pageY);
+ oldX = e2.pageX, oldY = e2.pageY;
+ this.domElementRef.current.style.setProperty("left", `${left}px`, "important");
+ this.domElementRef.current.style.setProperty("top", `${top}px`, "important");
+ };
+ document.addEventListener("mouseup", mouseUp);
+ document.addEventListener("mousemove", mouseMove);
+ },
+ style: Object.assign({}, pos, {width: 10, height: 10, cursor: "move", position: "absolute"})
+ }))
+ })
+ ]
+ });
+ }
+ };
+
+ CustomComponents.ColorSwatches = reactInitialized && class BDFDB_ColorSwatches extends Internal.LibraryModules.React.Component {
+ ColorSwatch(props) {
+ const swatches = props.swatches;
+ let useWhite = !BDFDB.ColorUtils.isBright(props.color);
+ let swatch = BDFDB.ReactUtils.createElement("button", {
+ type: "button",
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.colorpickerswatch, props.isSingle && BDFDB.disCN.colorpickerswatchsingle, props.isDisabled && BDFDB.disCN.colorpickerswatchdisabled, props.isSelected && BDFDB.disCN.colorpickerswatchselected, props.isCustom && BDFDB.disCN.colorpickerswatchcustom, props.color == null && BDFDB.disCN.colorpickerswatchnocolor),
+ number: props.number,
+ disabled: props.isDisabled,
+ onClick: _ => {
+ if (!props.isSelected) {
+ let color = props.isCustom && props.color == null ? (swatches.props.color || swatches.props.defaultCustomColor || "rgba(0, 0, 0, 1)") : props.color;
+ if (typeof swatches.props.onColorChange == "function") swatches.props.onColorChange(BDFDB.ColorUtils.convert(color, "RGBCOMP"));
+ swatches.props.color = color;
+ swatches.props.customColor = props.isCustom ? color : swatches.props.customColor;
+ swatches.props.customSelected = props.isCustom;
+ BDFDB.ReactUtils.forceUpdate(swatches);
+ }
+ },
+ style: Object.assign({}, props.style, {
+ background: BDFDB.ObjectUtils.is(props.color) ? BDFDB.ColorUtils.createGradient(props.color) : BDFDB.ColorUtils.convert(props.color, "RGBA")
+ }),
+ children: [
+ props.isCustom || props.isSingle ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.colorpickerswatchdropper,
+ foreground: BDFDB.disCN.colorpickerswatchdropperfg,
+ name: Internal.LibraryComponents.SvgIcon.Names.DROPPER,
+ width: props.isCustom ? 14 : 10,
+ height: props.isCustom ? 14 : 10,
+ color: useWhite ? Internal.DiscordConstants.Colors.WHITE : Internal.DiscordConstants.Colors.BLACK
+ }) : null,
+ props.isSelected && !props.isSingle ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.CHECKMARK,
+ width: props.isCustom ? 32 : 16,
+ height: props.isCustom ? 24 : 16,
+ color: useWhite ? Internal.DiscordConstants.Colors.WHITE : Internal.DiscordConstants.Colors.BLACK
+ }) : null
+ ]
+ });
+ if (props.isCustom || props.isSingle || props.color == null) swatch = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: props.isCustom || props.isSingle ? BDFDB.LanguageUtils.LanguageStrings.CUSTOM_COLOR : BDFDB.LanguageUtils.LanguageStrings.DEFAULT,
+ tooltipConfig: {type: props.isSingle ? "top" : "bottom"},
+ children: swatch
+ });
+ if (props.isCustom || props.isSingle) swatch = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutContainer, {
+ children: swatch,
+ wrap: false,
+ popoutClassName: BDFDB.disCNS.colorpickerwrapper + BDFDB.disCN.colorpicker,
+ animation: Internal.LibraryComponents.PopoutContainer.Animation.TRANSLATE,
+ position: Internal.LibraryComponents.PopoutContainer.Positions.BOTTOM,
+ align: Internal.LibraryComponents.PopoutContainer.Align.CENTER,
+ open: swatches.props.pickerOpen,
+ onClick: _ => swatches.props.pickerOpen = true,
+ onOpen: _ => {
+ swatches.props.pickerOpen = true;
+ if (typeof swatches.props.onPickerOpen == "function") swatches.props.onPickerOpen(this);
+ },
+ onClose: _ => {
+ delete swatches.props.pickerOpen;
+ if (typeof swatches.props.onPickerClose == "function") swatches.props.onPickerClose(this);
+ },
+ renderPopout: _ => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ColorPicker, Object.assign({}, swatches.props.pickerConfig, {
+ color: swatches.props.color,
+ onColorChange: color => {
+ if (typeof swatches.props.onColorChange == "function") swatches.props.onColorChange(color);
+ props.color = color;
+ swatches.props.color = color;
+ swatches.props.customColor = color;
+ swatches.props.customSelected = true;
+ BDFDB.ReactUtils.forceUpdate(swatches);
+ }
+ }), true)
+ });
+ if (props.isCustom) swatch = BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerswatchcustomcontainer,
+ children: swatch
+ });
+ return swatch;
+ }
+ render() {
+ this.props.color = BDFDB.ObjectUtils.is(this.props.color) ? this.props.color : BDFDB.ColorUtils.convert(this.props.color, "RGBA");
+ this.props.colors = (BDFDB.ArrayUtils.is(this.props.colors) ? this.props.colors : [null, 5433630, 3066993, 1752220, 3447003, 3429595, 8789737, 10181046, 15277667, 15286558, 15158332, 15105570, 15844367, 13094093, 7372936, 6513507, 16777215, 3910932, 2067276, 1146986, 2123412, 2111892, 7148717, 7419530, 11342935, 11345940, 10038562, 11027200, 12745742, 9936031, 6121581, 2894892]).map(c => BDFDB.ColorUtils.convert(c, "RGBA"));
+ this.props.colorRows = this.props.colors.length ? [this.props.colors.slice(0, parseInt(this.props.colors.length/2)), this.props.colors.slice(parseInt(this.props.colors.length/2))] : [];
+ this.props.customColor = !this.props.color || !this.props.customSelected && this.props.colors.indexOf(this.props.color) > -1 ? null : this.props.color;
+ this.props.defaultCustomColor = BDFDB.ObjectUtils.is(this.props.defaultCustomColor) ? this.props.defaultCustomColor : BDFDB.ColorUtils.convert(this.props.defaultCustomColor, "RGBA");
+ this.props.customSelected = !!this.props.customColor;
+ this.props.pickerConfig = BDFDB.ObjectUtils.is(this.props.pickerConfig) ? this.props.pickerConfig : {gradient: true, alpha: true};
+
+ const isSingle = !this.props.colors.length;
+ return BDFDB.ReactUtils.createElement("div", {
+ className: isSingle ? BDFDB.disCN.colorpickerswatchsinglewrapper : BDFDB.DOMUtils.formatClassName(BDFDB.disCN.colorpickerswatches, BDFDB.disCN.colorpickerswatchescontainer, this.props.disabled && BDFDB.disCN.colorpickerswatchesdisabled),
+ children: [
+ BDFDB.ReactUtils.createElement(this.ColorSwatch, {
+ swatches: this,
+ color: this.props.customColor,
+ isSingle: isSingle,
+ isCustom: !isSingle,
+ isSelected: this.props.customSelected,
+ isDisabled: this.props.disabled,
+ pickerOpen: this.props.pickerOpen,
+ style: {margin: 0}
+ }),
+ !isSingle && BDFDB.ReactUtils.createElement("div", {
+ children: this.props.colorRows.map(row => BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.colorpickerrow,
+ children: row.map(color => BDFDB.ReactUtils.createElement(this.ColorSwatch, {
+ swatches: this,
+ color: color,
+ isCustom: false,
+ isSelected: !this.props.customSelected && color == this.props.color,
+ isDisabled: this.props.disabled
+ }))
+ }))
+ })
+ ]
+ });
+ }
+ };
+
+ CustomComponents.DateInput = class BDFDB_DateInput extends Internal.LibraryModules.React.Component {
+ renderFormatButton(props) {
+ const button = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.disCN.dateinputbutton,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: props.svgName,
+ width: 20,
+ height: 20
+ })
+ });
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutContainer, {
+ width: props.popoutWidth || 350,
+ padding: 10,
+ animation: Internal.LibraryComponents.PopoutContainer.Animation.SCALE,
+ position: Internal.LibraryComponents.PopoutContainer.Positions.TOP,
+ align: Internal.LibraryComponents.PopoutContainer.Align.RIGHT,
+ onClose: instance => BDFDB.DOMUtils.removeClass(instance.domElementRef.current, BDFDB.disCN.dateinputbuttonselected),
+ renderPopout: instance => {
+ BDFDB.DOMUtils.addClass(instance.domElementRef.current, BDFDB.disCN.dateinputbuttonselected);
+ return props.children || BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ props.name && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsLabel, {
+ label: props.name
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextInput, {
+ className: BDFDB.disCN.dateinputfield,
+ placeholder: props.placeholder,
+ value: props.getValue(),
+ onChange: typeof props.onChange == "function" ? props.onChange : null
+ }),
+ props.tooltipText && this.renderInfoButton(props.tooltipText)
+ ].filter(n => n)
+ })
+ },
+ children: props.name ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: props.name,
+ children: button
+ }) : button
+ });
+ }
+ renderInfoButton(text, style) {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: [text].flat(10).filter(n => n).map(n => BDFDB.ReactUtils.createElement("div", {children: n})),
+ tooltipConfig: {
+ type: "bottom",
+ zIndex: 1009,
+ maxWidth: 560
+ },
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputbutton,
+ style: Object.assign({}, style),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.QUESTIONMARK,
+ width: 24,
+ height: 24
+ })
+ })
+ });
+ }
+ handleChange() {
+ if (typeof this.props.onChange == "function") this.props.onChange(BDFDB.ObjectUtils.extract(this.props, "formatString", "dateString", "timeString", "timeOffset", "language"));
+ }
+ render() {
+ let input = this, formatter, preview;
+ const defaultOffset = ((new Date()).getTimezoneOffset() * (-1/60));
+ return BDFDB.ReactUtils.createElement("div", BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.dateinputwrapper, this.props.className),
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsLabel, {
+ label: this.props.label
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputinner,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputcontrols,
+ children: [
+ BDFDB.ReactUtils.createElement(class DateInputPreview extends Internal.LibraryModules.React.Component {
+ componentDidMount() {formatter = this;}
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextInput, {
+ className: BDFDB.disCN.dateinputfield,
+ placeholder: Internal.LibraryComponents.DateInput.getDefaultString(input.props.language),
+ value: input.props.formatString,
+ onChange: value => {
+ input.props.formatString = value;
+ input.handleChange.apply(input, []);
+ BDFDB.ReactUtils.forceUpdate(formatter, preview);
+ }
+ });
+ }
+ }),
+ this.renderInfoButton([
+ "$date will be replaced with the Date",
+ "$time will be replaced with the Time",
+ "$time12 will be replaced with the Time (12h Form)",
+ "$month will be replaced with the Month Name",
+ "$monthS will be replaced with the Month Name (Short Form)",
+ "$day will be replaced with the Weekday Name",
+ "$dayS will be replaced with the Weekday Name (Short Form)",
+ "$agoAmount will be replaced with ('Today', 'Yesterday', 'x days/weeks/months ago')",
+ "$agoWeekday will be replaced with ('Today', 'Yesterday', $day)",
+ "$agoWeekdayS will be replaced with ('Today', 'Yesterday', $dayS)",
+ "$agoDays will be replaced with ('Today', 'Yesterday', 'x days ago')",
+ "$agoDate will be replaced with ('Today', 'Yesterday', $date)"
+ ], {marginRight: 6}),
+ this.renderFormatButton({
+ name: BDFDB.LanguageUtils.LanguageStrings.DATE,
+ svgName: Internal.LibraryComponents.SvgIcon.Names.CALENDAR,
+ placeholder: this.props.dateString,
+ getValue: _ => this.props.dateString,
+ tooltipText: [
+ "$d will be replaced with the Day",
+ "$dd will be replaced with the Day (Forced Zeros)",
+ "$m will be replaced with the Month",
+ "$mm will be replaced with the Month (Forced Zeros)",
+ "$yy will be replaced with the Year (2-Digit)",
+ "$yyyy will be replaced with the Year (4-Digit)",
+ "$month will be replaced with the Month Name",
+ "$monthS will be replaced with the Month Name (Short Form)",
+ ],
+ onChange: value => {
+ this.props.dateString = value;
+ this.handleChange.apply(this, []);
+ BDFDB.ReactUtils.forceUpdate(formatter, preview);
+ }
+ }),
+ this.renderFormatButton({
+ name: BDFDB.LanguageUtils.LibraryStrings.time,
+ svgName: Internal.LibraryComponents.SvgIcon.Names.CLOCK,
+ placeholder: this.props.timeString,
+ getValue: _ => this.props.timeString,
+ tooltipText: [
+ "$h will be replaced with the Hours",
+ "$hh will be replaced with the Hours (Forced Zeros)",
+ "$m will be replaced with the Minutes",
+ "$mm will be replaced with the Minutes (Forced Zeros)",
+ "$s will be replaced with the Seconds",
+ "$ss will be replaced with the Seconds (Forced Zeros)",
+ "$u will be replaced with the Milliseconds",
+ "$uu will be replaced with the Milliseconds (Forced Zeros)"
+ ],
+ onChange: value => {
+ this.props.timeString = value;
+ this.handleChange.apply(this, []);
+ BDFDB.ReactUtils.forceUpdate(formatter, preview);
+ }
+ }),
+ this.renderFormatButton({
+ name: BDFDB.LanguageUtils.LibraryStrings.location,
+ svgName: Internal.LibraryComponents.SvgIcon.Names.GLOBE,
+ popoutWidth: 550,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.AutoFocusCatcher, {}),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.disCN.marginbottom4,
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsLabel, {
+ label: BDFDB.LanguageUtils.LanguageStrings.LANGUAGE
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Select, {
+ className: BDFDB.disCN.dateinputfield,
+ value: this.props.language != null ? this.props.language : "$discord",
+ options: Object.keys(BDFDB.LanguageUtils.languages).map(id => ({
+ value: id,
+ label: BDFDB.LanguageUtils.getName(BDFDB.LanguageUtils.languages[id])
+ })),
+ searchable: true,
+ optionRenderer: lang => lang.label,
+ onChange: value => {
+ this.props.language = value == "$discord" ? undefined : value;
+ this.handleChange.apply(this, []);
+ BDFDB.ReactUtils.forceUpdate(formatter, preview);
+ }
+ })
+ ]
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsLabel, {
+ label: BDFDB.LanguageUtils.LibraryStrings.timezone
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Select, {
+ className: BDFDB.disCN.dateinputfield,
+ value: this.props.timeOffset != null ? this.props.timeOffset : defaultOffset,
+ options: [-12.0, -11.0, -10.0, -9.5, -9.0, -8.0, -7.0, -6.0, -5.0, -4.0, -3.5, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 5.75, 6.0, 6.5, 7.0, 8.0, 8.75, 9.0, 9.5, 10.0, 10.5, 11.0, 12.0, 12.75, 13.0, 14.0].map(offset => ({label: offset< 0 ? offset : `+${offset}`, value: offset})),
+ searchable: true,
+ onChange: value => {
+ this.props.timeOffset = value == defaultOffset ? undefined : value;
+ this.handleChange.apply(this, []);
+ BDFDB.ReactUtils.forceUpdate(formatter, preview);
+ }
+ })
+ ]
+ })
+ ]
+ })
+ ]
+ }),
+ BDFDB.ReactUtils.createElement(class DateInputPreview extends Internal.LibraryModules.React.Component {
+ componentDidMount() {preview = this;}
+ render() {
+ return !input.props.noPreview && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputpreview,
+ children: [
+ input.props.prefix && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputpreviewprefix,
+ children: typeof input.props.prefix == "function" ? input.props.prefix(input) : input.props.prefix,
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextScroller, {
+ children: Internal.LibraryComponents.DateInput.format(input.props, new Date((new Date()) - (1000*60*60*24*2)))
+ }),
+ input.props.suffix && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.dateinputpreviewsuffix,
+ children: typeof input.props.suffix == "function" ? input.props.suffix(input) : input.props.suffix,
+ })
+ ].filter(n => n)
+ });
+ }
+ })
+ ]
+ })
+ ]
+ }), "onChange", "label", "formatString", "dateString", "timeString", "timeOffset", "language", "noPreview", "prefix", "suffix"));
+ }
+ };
+ CustomComponents.DateInput.getDefaultString = function (language) {
+ language = language || BDFDB.LanguageUtils.getLanguage().id;
+ const date = new Date();
+ return date.toLocaleString(language).replace(date.toLocaleDateString(language), "$date").replace(date.toLocaleTimeString(language, {hourCycle: "h12"}), "$time12").replace(date.toLocaleTimeString(language, {hourCycle: "h11"}), "$time12").replace(date.toLocaleTimeString(language, {hourCycle: "h24"}), "$time").replace(date.toLocaleTimeString(language, {hourCycle: "h23"}), "$time");
+ };
+ CustomComponents.DateInput.parseDate = function (date, offset) {
+ let timeObj = date;
+ if (typeof timeObj == "string") {
+ const language = BDFDB.LanguageUtils.getLanguage().id;
+ for (let i = 0; i < 12; i++) {
+ const tempDate = new Date();
+ tempDate.setMonth(i);
+ timeObj = timeObj.replace(tempDate.toLocaleDateString(language, {month:"long"}), tempDate.toLocaleDateString("en", {month:"short"}));
+ }
+ timeObj = new Date(timeObj);
+ }
+ else if (typeof timeObj == "number") timeObj = new Date(timeObj);
+
+ if (timeObj.toString() == "Invalid Date") timeObj = new Date(parseInt(date));
+ if (timeObj.toString() == "Invalid Date" || typeof timeObj.toLocaleDateString != "function") timeObj = new Date();
+ offset = offset != null && parseFloat(offset);
+ if ((offset || offset === 0) && !isNaN(offset)) timeObj = new Date(timeObj.getTime() + ((offset - timeObj.getTimezoneOffset() * (-1/60)) * 60*60*1000));
+ return timeObj;
+ };
+ CustomComponents.DateInput.format = function (data, time) {
+ if (typeof data == "string") data = {formatString: data};
+ if (data && typeof data.formatString != "string") data.formatString = "";
+ if (!data || typeof data.formatString != "string" || !time) return "";
+
+ const language = data.language || BDFDB.LanguageUtils.getLanguage().id;
+ const timeObj = Internal.LibraryComponents.DateInput.parseDate(time, data.timeOffset);
+ const now = new Date();
+ const daysAgo = Math.round((Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()) - Date.UTC(timeObj.getFullYear(), timeObj.getMonth(), timeObj.getDate()))/(1000*60*60*24));
+ const date = data.dateString && typeof data.dateString == "string" ? Internal.LibraryComponents.DateInput.formatDate({dateString: data.dateString, language: language}, timeObj) : timeObj.toLocaleDateString(language);
+
+ return (data.formatString || Internal.LibraryComponents.DateInput.getDefaultString(language))
+ .replace(/\$date/g, date)
+ .replace(/\$time12/g, data.timeString && typeof data.timeString == "string" ? Internal.LibraryComponents.DateInput.formatTime({timeString: data.timeString, language: language}, timeObj, true) : timeObj.toLocaleTimeString(language, {hourCycle: "h12"}))
+ .replace(/\$time/g, data.timeString && typeof data.timeString == "string" ? Internal.LibraryComponents.DateInput.formatTime({timeString: data.timeString, language: language}, timeObj) : timeObj.toLocaleTimeString(language, {hourCycle: "h23"}))
+ .replace(/\$monthS/g, timeObj.toLocaleDateString(language, {month: "short"}))
+ .replace(/\$month/g, timeObj.toLocaleDateString(language, {month: "long"}))
+ .replace(/\$dayS/g, timeObj.toLocaleDateString(language, {weekday: "short"}))
+ .replace(/\$day/g, timeObj.toLocaleDateString(language, {weekday: "long"}))
+ .replace(/\$agoAmount/g, daysAgo < 0 || daysAgo > 1 ? Internal.DiscordObjects.Timestamp(timeObj.getTime()).fromNow() : BDFDB.LanguageUtils.LanguageStrings[`SEARCH_SHORTCUT_${daysAgo == 1 ? "YESTERDAY" : "TODAY"}`])
+ .replace(/\$agoWeekdayS/g, daysAgo < 0 || daysAgo > 1 ? timeObj.toLocaleDateString(language, {weekday: "short"}) : BDFDB.LanguageUtils.LanguageStrings[`SEARCH_SHORTCUT_${daysAgo == 1 ? "YESTERDAY" : "TODAY"}`])
+ .replace(/\$agoWeekday/g, daysAgo < 0 || daysAgo > 1 ? timeObj.toLocaleDateString(language, {weekday: "long"}) : BDFDB.LanguageUtils.LanguageStrings[`SEARCH_SHORTCUT_${daysAgo == 1 ? "YESTERDAY" : "TODAY"}`])
+ .replace(/\$agoDays/g, daysAgo < 0 ? "" : daysAgo > 1 ? BDFDB.LanguageUtils.LanguageStringsFormat(`GAME_LIBRARY_LAST_PLAYED_DAYS`, daysAgo) : BDFDB.LanguageUtils.LanguageStrings[`SEARCH_SHORTCUT_${daysAgo == 1 ? "YESTERDAY" : "TODAY"}`])
+ .replace(/\$agoDate/g, daysAgo < 0 || daysAgo > 1 ? date : BDFDB.LanguageUtils.LanguageStrings[`SEARCH_SHORTCUT_${daysAgo == 1 ? "YESTERDAY" : "TODAY"}`])
+ .replace(/\(\)|\[\]/g, "").replace(/,\s*$|^\s*,/g, "").replace(/ +/g, " ").trim();
+ };
+ CustomComponents.DateInput.formatDate = function (data, time) {
+ if (typeof data == "string") data = {dateString: data};
+ if (data && typeof data.dateString != "string") return "";
+ if (!data || typeof data.dateString != "string" || !data.dateString || !time) return "";
+
+ const language = data.language || BDFDB.LanguageUtils.getLanguage().id;
+ const timeObj = Internal.LibraryComponents.DateInput.parseDate(time, data.timeOffset);
+
+ return data.dateString
+ .replace(/\$monthS/g, timeObj.toLocaleDateString(language, {month: "short"}))
+ .replace(/\$month/g, timeObj.toLocaleDateString(language, {month: "long"}))
+ .replace(/\$dd/g, timeObj.toLocaleDateString(language, {day: "2-digit"}))
+ .replace(/\$d/g, timeObj.toLocaleDateString(language, {day: "numeric"}))
+ .replace(/\$mm/g, timeObj.toLocaleDateString(language, {month: "2-digit"}))
+ .replace(/\$m/g, timeObj.toLocaleDateString(language, {month: "numeric"}))
+ .replace(/\$yyyy/g, timeObj.toLocaleDateString(language, {year: "numeric"}))
+ .replace(/\$yy/g, timeObj.toLocaleDateString(language, {year: "2-digit"}))
+ .trim();
+ };
+ CustomComponents.DateInput.formatTime = function (data, time, hour12) {
+ if (typeof data == "string") data = {timeString: data};
+ if (data && typeof data.timeString != "string") return "";
+ if (!data || typeof data.timeString != "string" || !data.timeString || !time) return "";
+
+ const language = data.language || BDFDB.LanguageUtils.getLanguage().id;
+ const timeObj = Internal.LibraryComponents.DateInput.parseDate(time, data.timeOffset);
+
+ let hours = timeObj.getHours();
+ if (hour12) {
+ hours = hours == 0 ? 12 : hours;
+ if (hours > 12) hours -= 12;
+ }
+ const minutes = timeObj.getMinutes();
+ const seconds = timeObj.getSeconds();
+ const milli = timeObj.getMilliseconds();
+
+ let string = data.timeString
+ .replace(/\$hh/g, hours < 10 ? `0${hours}` : hours)
+ .replace(/\$h/g, hours)
+ .replace(/\$mm/g, minutes < 10 ? `0${minutes}` : minutes)
+ .replace(/\$m/g, minutes)
+ .replace(/\$ss/g, seconds < 10 ? `0${seconds}` : seconds)
+ .replace(/\$s/g, seconds)
+ .replace(/\$uu/g, milli < 10 ? `00${milli}` : milli < 100 ? `0${milli}` : milli)
+ .replace(/\$u/g, milli)
+ .trim();
+
+ let digits = "\\d";
+ if (BDFDB.LanguageUtils.languages[language] && BDFDB.LanguageUtils.languages[language].numberMap) {
+ digits = Object.entries(BDFDB.LanguageUtils.languages[language].numberMap).map(n => n[1]).join("");
+ for (let number in BDFDB.LanguageUtils.languages[language].numberMap) string = string.replace(new RegExp(number, "g"), BDFDB.LanguageUtils.languages[language].numberMap[number]);
+ }
+ return hour12 ? timeObj.toLocaleTimeString(language, {hourCycle: "h12"}).replace(new RegExp(`[${digits}]{1,2}[^${digits}][${digits}]{1,2}[^${digits}][${digits}]{1,2}`, "g"), string) : string;
+ };
+
+ CustomComponents.EmojiPickerButton = reactInitialized && class BDFDB_EmojiPickerButton extends Internal.LibraryModules.React.Component {
+ handleEmojiChange(emoji) {
+ if (emoji != null) {
+ this.props.emoji = emoji.id ? {
+ id: emoji.id,
+ name: emoji.name,
+ animated: emoji.animated
+ } : {
+ id: null,
+ name: emoji.optionallyDiverseSequence,
+ animated: false
+ };
+ if (typeof this.props.onSelect == "function") this.props.onSelect(this.props.emoji, this);
+ if (typeof this.close == "function" && !BDFDB.ListenerUtils.isPressed(16)) this.close();
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ }
+ render() {
+ let button = this;
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutContainer, {
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.EmojiButton, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.emojiinputbutton),
+ renderButtonContents: this.props.emoji ? _ => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Emoji, {
+ className: BDFDB.disCN.emojiinputbuttonemoji,
+ emojiId: this.props.emoji.id,
+ emojiName: this.props.emoji.name
+ }) : null
+ }),
+ wrap: false,
+ animation: Internal.LibraryComponents.PopoutContainer.Animation.NONE,
+ position: Internal.LibraryComponents.PopoutContainer.Positions.TOP,
+ align: Internal.LibraryComponents.PopoutContainer.Align.LEFT,
+ renderPopout: instance => {
+ this.close = instance.close;
+ return [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.EmojiPicker, {
+ closePopout: this.close,
+ onSelectEmoji: this.handleEmojiChange.bind(this),
+ allowManagedEmojis: this.props.allowManagedEmojis,
+ allowManagedEmojisUsage: this.props.allowManagedEmojisUsage
+ }),
+ BDFDB.ReactUtils.createElement(class extends Internal.LibraryModules.React.Component {
+ componentDidMount() {Internal.LibraryComponents.EmojiPickerButton.current = button;}
+ componentWillUnmount() {delete Internal.LibraryComponents.EmojiPickerButton.current;}
+ render() {return null;}
+ })
+ ];
+ }
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.EmojiPickerButton, {allowManagedEmojis: false, allowManagedEmojisUsage: false});
+
+ CustomComponents.EmptyStateImage = reactInitialized && class BDFDB_EmptyStateImage extends Internal.LibraryModules.React.Component {
+ render() {
+ let isLightTheme = BDFDB.DiscordUtils.getTheme() == BDFDB.disCN.themelight;
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.pageimagewrapper, this.props.className),
+ direction: Internal.LibraryComponents.Flex.Direction.VERTICAL,
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.pageimage, BDFDB.disCN.margintop20, BDFDB.disCN.marginbottom20, this.props.imageClassName),
+ style: {
+ flex: "0 1 auto",
+ background: `url("${this.props.src || (isLightTheme ? this.props.lightSrc : this.props.darkSrc) || this.props.lightSrc || this.props.darkSrc || (isLightTheme ? "/assets/a72746e7108167af95c8.svg" : "/assets/01864c39871ce619d855.svg")}") center/contain no-repeat`,
+ width: this.props.width || "415px",
+ height: this.props.height || "200px"
+ }
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.pageimagetext,
+ children: this.props.text || BDFDB.LanguageUtils.LanguageStrings.AUTOCOMPLETE_NO_RESULTS_HEADER
+ })
+ ]
+ });
+ }
+ };
+
+ CustomComponents.FavButton = reactInitialized && class BDFDB_FavButton extends Internal.LibraryModules.React.Component {
+ handleClick() {
+ this.props.isFavorite = !this.props.isFavorite;
+ if (typeof this.props.onClick == "function") this.props.onClick(this.props.isFavorite, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.favbuttoncontainer, BDFDB.disCN.favbutton, this.props.isFavorite && BDFDB.disCN.favbuttonselected, this.props.className),
+ onClick: this.handleClick.bind(this),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names[this.props.isFavorite ? "FAVORITE_FILLED" : "FAVORITE"],
+ width: this.props.width || 24,
+ height: this.props.height || 24,
+ className: BDFDB.disCN.favbuttonicon
+ })
+ });
+ }
+ };
+
+ CustomComponents.FileButton = reactInitialized && class BDFDB_FileButton extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ if (this.props.searchFolders) {
+ let node = BDFDB.ReactUtils.findDOMNode(this);
+ if (node && (node = node.querySelector("input[type='file']")) != null) {
+ node.setAttribute("directory", "");
+ node.setAttribute("webkitdirectory", "");
+ }
+ }
+ }
+ render() {
+ let filter = this.props.filter && [this.props.filter].flat(10).filter(n => typeof n == "string") || [];
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Button, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ onClick: e => {e.currentTarget.querySelector("input").click();},
+ children: [
+ BDFDB.LanguageUtils.LibraryStrings.file_navigator_text,
+ BDFDB.ReactUtils.createElement("input", {
+ type: "file",
+ accept: filter.length && (filter.join("/*,") + "/*"),
+ style: {display: "none"},
+ onChange: e => {
+ let file = e.currentTarget.files[0];
+ if (this.refInput && file && (!filter.length || filter.some(n => file.type.indexOf(n) == 0))) {
+ this.refInput.props.value = this.props.searchFolders ? file.path.split(file.name).slice(0, -1).join(file.name) : `${this.props.mode == "url" ? "url('" : ""}${(this.props.useFilePath) ? file.path : `data:${file.type};base64,${Internal.LibraryRequires.fs.readFileSync(file.path, "base64")}`}${this.props.mode ? "')" : ""}`;
+ BDFDB.ReactUtils.forceUpdate(this.refInput);
+ this.refInput.handleChange(this.refInput.props.value);
+ }
+ }
+ })
+ ]
+ }), "filter", "mode", "useFilePath", "searchFolders"));
+ }
+ };
+
+ CustomComponents.FormComponents = {};
+ CustomComponents.FormComponents.FormItem = reactInitialized && class BDFDB_FormItem extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: this.props.className,
+ style: this.props.style,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.BASELINE,
+ children: [
+ this.props.title != null || this.props.error != null ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ wrap: true,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormTitle, {
+ tag: this.props.tag || Internal.LibraryComponents.FormComponents.FormTags && Internal.LibraryComponents.FormComponents.FormTags.H5,
+ disabled: this.props.disabled,
+ required: this.props.required,
+ error: this.props.error,
+ className: this.props.titleClassName,
+ children: this.props.title
+ })
+ }) : null
+ ].concat([this.props.titleChildren].flat(10)).filter(n => n)
+ }),
+ ].concat(this.props.children)
+ });
+ }
+ };
+
+ CustomComponents.GuildSummaryItem = reactInitialized && class BDFDB_GuildSummaryItem extends Internal.LibraryModules.React.Component {
+ defaultRenderGuild(guild, isLast) {
+ if (!guild) return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.guildsummaryemptyguild
+ });
+ let icon = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.GuildIcon, {
+ className: BDFDB.disCN.guildsummaryicon,
+ guild: guild,
+ showTooltip: this.props.showTooltip,
+ tooltipPosition: "top",
+ size: Internal.LibraryComponents.GuildIcon.Sizes.SMALLER
+ });
+ return this.props.switchOnClick ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.disCN.guildsummaryclickableicon,
+ onClick: _ => Internal.LibraryModules.HistoryUtils.transitionTo(Internal.DiscordConstants.Routes.CHANNEL(guild.id, Internal.LibraryStores.SelectedChannelStore.getChannelId(guild.id))),
+ key: guild.id,
+ tabIndex: -1,
+ children: icon
+ }) : icon;
+ }
+ renderGuilds() {
+ let elements = [];
+ let renderGuild = typeof this.props.renderGuild != "function" ? this.defaultRenderGuild : this.props.renderGuild;
+ let loaded = 0, max = this.props.guilds.length === this.props.max ? this.props.guilds.length : this.props.max - 1;
+ while (loaded < max && loaded < this.props.guilds.length) {
+ let isLast = loaded === this.props.guilds.length - 1;
+ let guild = renderGuild.apply(this, [this.props.guilds[loaded], isLast]);
+ elements.push(BDFDB.ReactUtils.createElement("div", {
+ className: isLast ? BDFDB.disCN.guildsummaryiconcontainer : BDFDB.disCN.guildsummaryiconcontainermasked,
+ children: guild
+ }));
+ loaded++;
+ }
+ if (loaded < this.props.guilds.length) {
+ let rest = Math.min(this.props.guilds.length - loaded, 99);
+ elements.push(BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ key: "more-guilds",
+ children: this.props.renderMoreGuilds("+" + rest, rest, this.props.guilds.slice(loaded), this.props)
+ }));
+ }
+ return elements;
+ }
+ renderIcon() {
+ return this.props.renderIcon ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.WHATISTHIS,
+ className: BDFDB.disCN.guildsummarysvgicon
+ }) : null;
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.guildsummarycontainer),
+ ref: this.props._ref,
+ children: [
+ this.renderIcon.apply(this),
+ this.renderGuilds.apply(this)
+ ].flat(10).filter(n => n)
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.GuildSummaryItem, {max: 10, renderMoreGuilds: (count, amount, restGuilds, props) => {
+ let icon = BDFDB.ReactUtils.createElement("div", {className: BDFDB.disCN.guildsummarymoreguilds, children: count});
+ return props.showTooltip ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: restGuilds.map(guild => guild.name).join(", "),
+ children: icon
+ }) : icon;
+ }, renderIcon: false});
+
+ CustomComponents.GuildVoiceList = reactInitialized && class BDFDB_GuildVoiceList extends Internal.LibraryModules.React.Component {
+ render() {
+ let channels = Internal.LibraryStores.GuildChannelStore.getChannels(this.props.guild.id);
+ let voiceChannels = (channels.VOCAL || []).filter(c => c.channel.type == Internal.DiscordConstants.ChannelTypes.GUILD_VOICE).map(c => c.channel.id);
+ let stageChannels = (channels.VOCAL || []).filter(c => c.channel.type == Internal.DiscordConstants.ChannelTypes.GUILD_STAGE_VOICE && Internal.LibraryStores.StageInstanceStore.getStageInstanceByChannel(c.channel.id)).map(c => c.channel.id);
+ let streamOwnerIds = Internal.LibraryStores.ApplicationStreamingStore.getAllApplicationStreams().filter(app => app.guildId === this.props.guild.id).map(app => app.ownerId) || [];
+ let streamOwners = streamOwnerIds.map(ownerId => Internal.LibraryStores.UserStore.getUser(ownerId)).filter(n => n);
+ let voiceStates = BDFDB.ObjectUtils.toArray(Internal.LibraryStores.SortedVoiceStateStore.getVoiceStates(this.props.guild.id)).flat(10);
+ let connectedVoiceUsers = voiceStates.map(n => voiceChannels.includes(n.voiceState.channelId) && n.voiceState.channelId != this.props.guild.afkChannelId && !streamOwnerIds.includes(n.voiceState.userId) && Internal.LibraryStores.UserStore.getUser(n.voiceState.userId)).filter(n => n);
+ let connectedStageUsers = voiceStates.map(n => stageChannels.includes(n.voiceState.channelId) && n.voiceState.channelId != this.props.guild.afkChannelId && !streamOwnerIds.includes(n.voiceState.userId) && Internal.LibraryStores.UserStore.getUser(n.voiceState.userId)).filter(n => n);
+ let children = [
+ !connectedStageUsers.length ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.tooltiprow,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.PODIUM,
+ className: BDFDB.disCN.tooltipactivityicon
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.UserSummaryItem, {
+ users: connectedStageUsers,
+ max: 6
+ })
+ ]
+ }),
+ !connectedVoiceUsers.length ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.tooltiprow,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.SPEAKER,
+ className: BDFDB.disCN.tooltipactivityicon
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.UserSummaryItem, {
+ users: connectedVoiceUsers,
+ max: 6
+ })
+ ]
+ }),
+ !streamOwners.length ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.tooltiprow,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.STREAM,
+ className: BDFDB.disCN.tooltipactivityicon
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.UserSummaryItem, {
+ users: streamOwners,
+ max: 6
+ })
+ ]
+ })
+ ].filter(n => n);
+ return !children.length ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.guildvoicelist,
+ children: children
+ });
+ }
+ };
+
+ CustomComponents.KeybindRecorder = reactInitialized && class BDFDB_KeybindRecorder extends Internal.LibraryModules.React.Component {
+ handleChange(arrays) {
+ this.props.value = arrays.map(platformKey => Internal.LibraryModules.KeyEvents.codes[Internal.LibraryModules.KeyCodeUtils.codeToKey(platformKey)] || platformKey[1]);
+ if (typeof this.props.onChange == "function") this.props.onChange(this.props.value, this);
+ }
+ handleReset() {
+ this.props.value = [];
+ if (this.recorder) this.recorder.setState({codes: []});
+ if (typeof this.props.onChange == "function") this.props.onChange([], this);
+ if (typeof this.props.onReset == "function") this.props.onReset(this);
+ }
+ componentDidMount() {
+ if (!this.recorder) this.recorder = BDFDB.ReactUtils.findOwner(this, {name: "KeybindRecorder"});
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.disCN.hotkeywrapper,
+ direction: Internal.LibraryComponents.Flex.Direction.HORIZONTAL,
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.KeybindRecorder, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ defaultValue: [this.props.defaultValue || this.props.value].flat(10).filter(n => n).map(keyCode => [Internal.DiscordConstants.KeyboardDeviceTypes.KEYBOARD_KEY, Internal.LibraryModules.KeyCodeUtils.keyToCode((Object.entries(Internal.LibraryModules.KeyEvents.codes).find(n => n[1] == keyCode && Internal.LibraryModules.KeyCodeUtils.keyToCode(n[0], null)) || [])[0], null) || keyCode]),
+ onChange: this.handleChange.bind(this)
+ }), "reset", "onReset")),
+ this.props.reset || this.props.onReset ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: BDFDB.LanguageUtils.LanguageStrings.REMOVE_KEYBIND,
+ tooltipConfig: {type: "top"},
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.disCN.hotkeyresetbutton,
+ onClick: this.handleReset.bind(this),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ iconSVG: ``,
+ })
+ })
+ }) : null
+ ].filter(n => n)
+ });
+ }
+ };
+
+ CustomComponents.ListRow = reactInitialized && class BDFDB_ListRow extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement("div", BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.listrowwrapper, this.props.className, BDFDB.disCN.listrow),
+ children: [
+ this.props.prefix,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.listrowcontent,
+ style: {flex: "1 1 auto"},
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.listname, this.props.labelClassName),
+ style: {flex: "1 1 auto"},
+ children: this.props.label
+ }),
+ typeof this.props.note == "string" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormText, {
+ type: Internal.LibraryComponents.FormComponents.FormText.Types.DESCRIPTION,
+ children: this.props.note
+ }) : null
+ ].filter(n => n)
+ }),
+ this.props.suffix
+ ].filter(n => n)
+ }), "label", "note", "suffix", "prefix", "labelClassName"));
+ }
+ };
+
+ CustomComponents.MemberRole = reactInitialized && class BDFDB_MemberRole extends Internal.LibraryModules.React.Component {
+ handleClick(e) {if (typeof this.props.onClick == "function") this.props.onClick(e, this);}
+ handleContextMenu(e) {if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);}
+ render() {
+ let color = BDFDB.ColorUtils.convert(this.props.role.colorString, "RGB") || Internal.DiscordConstants.Colors.PRIMARY_300;
+ return BDFDB.ReactUtils.createElement("li", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.userrole, this.props.className),
+ style: {borderColor: BDFDB.ColorUtils.setAlpha(color, 0.6)},
+ onClick: this.handleClick.bind(this),
+ onContextMenu: this.handleContextMenu.bind(this),
+ children: [
+ !this.props.noCircle ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.userroleremovebutton,
+ children: BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.userrolecircle,
+ style: {backgroundColor: color}
+ })
+ }) : null,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.userrolename,
+ children: this.props.role.name
+ })
+ ].filter(n => n)
+ });
+ }
+ };
+
+ CustomComponents.MenuItems = {};
+ CustomComponents.MenuItems.MenuCheckboxItem = reactInitialized && class BDFDB_MenuCheckboxItem extends Internal.LibraryModules.React.Component {
+ handleClick() {
+ if (this.props.state) {
+ this.props.state.checked = !this.props.state.checked;
+ if (typeof this.props.action == "function") this.props.action(this.props.state.checked, this);
+ }
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.MenuItem, Object.assign({}, this.props, {
+ input: this.props.state && this.props.state.checked ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.menuicon,
+ background: BDFDB.disCN.menucheckbox,
+ foreground: BDFDB.disCN.menucheck,
+ name: Internal.LibraryComponents.SvgIcon.Names.CHECKBOX
+ }) : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.menuicon,
+ name: Internal.LibraryComponents.SvgIcon.Names.CHECKBOX_EMPTY
+ }),
+ action: this.handleClick.bind(this)
+ }));
+ }
+ };
+
+ CustomComponents.MenuItems.MenuHint = reactInitialized && class BDFDB_MenuHint extends Internal.LibraryModules.React.Component {
+ render() {
+ return !this.props.hint ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuhint,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextScroller, {
+ children: this.props.hint
+ })
+ });
+ }
+ };
+
+ CustomComponents.MenuItems.MenuIcon = reactInitialized && class BDFDB_MenuIcon extends Internal.LibraryModules.React.Component {
+ render() {
+ let isString = typeof this.props.icon == "string";
+ return !this.props.icon ? null : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.menuicon,
+ nativeClass: true,
+ iconSVG: isString ? this.props.icon : null,
+ name: !isString ? this.props.icon : null
+ });
+ }
+ };
+
+ CustomComponents.MenuItems.MenuControlItem = function (props) {
+ let effectRef = BDFDB.ReactUtils.useRef(null);
+ let controlRef = BDFDB.ReactUtils.useRef(null);
+
+ BDFDB.ReactUtils.useLayoutEffect((_ => {
+ if (props.isFocused) {
+ BDFDB.LibraryStores.AccessibilityStore.keyboardModeEnabled && controlRef.current && controlRef.current.scrollIntoView({
+ block: "nearest"
+ });
+ controlRef.current && controlRef.current.focus();
+ }
+ else controlRef.current && controlRef.current.blur && controlRef.current.blur(controlRef.current);
+ }), [props.isFocused]);
+
+ return BDFDB.ReactUtils.createElement("div", Object.assign({
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.menuitem, BDFDB.disCN[`menucolor${(props.color && InternalData.DiscordClasses[`menucolor${props.color.toLowerCase()}`] || Internal.DiscordConstants.MenuItemColors.DEFAULT || "").toLowerCase()}`], props.disabled && BDFDB.disCN.menudisabled, props.showDefaultFocus && props.isFocused && BDFDB.disCN.menufocused, !props.showDefaultFocus && BDFDB.disCN.menuhideinteraction),
+ onClick: BDFDB.ReactUtils.useCallback((_ => {
+ if (!controlRef.current || !controlRef.current.activate || !controlRef.current.activate.call(controlRef.current)) typeof props.onClose == "function" && props.onClose();
+ }), [props.onClose]),
+ "aria-disabled": props.disabled,
+ children: [
+ props.label && BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menulabelcontainer,
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menulabel,
+ children: props.label
+ })
+ }),
+ typeof props.control == "function" && props.control({
+ onClose: props.onClose,
+ disabled: props.disabled,
+ isFocused: props.isFocused
+ }, controlRef)
+ ]
+ }, props.menuItemProps));
+ };
+
+ CustomComponents.MenuItems.MenuSliderItem = reactInitialized && class BDFDB_MenuSliderItem extends Internal.LibraryModules.React.Component {
+ handleValueChange(value) {
+ if (this.props.state) {
+ this.props.state.value = Math.round(BDFDB.NumberUtils.mapRange([0, 100], [this.props.minValue, this.props.maxValue], value) * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ if (typeof this.props.onValueChange == "function") this.props.onValueChange(this.props.state.value, this);
+ }
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleValueRender(value) {
+ let newValue = Math.round(BDFDB.NumberUtils.mapRange([0, 100], [this.props.minValue, this.props.maxValue], value) * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ if (typeof this.props.onValueRender == "function") {
+ let tempReturn = this.props.onValueRender(newValue, this);
+ if (tempReturn != undefined) newValue = tempReturn;
+ }
+ return newValue;
+ }
+ render() {
+ let value = this.props.state && this.props.state.value || 0;
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.MenuItems.MenuControlItem, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ label: typeof this.props.renderLabel == "function" ? this.props.renderLabel(Math.round(value * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits), this) : this.props.label,
+ control: (menuItemProps, ref) => {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.menuslidercontainer,
+ children: BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.Slider, Object.assign({}, menuItemProps, {
+ ref: ref,
+ className: BDFDB.disCN.menuslider,
+ mini: true,
+ initialValue: Math.round(BDFDB.NumberUtils.mapRange([this.props.minValue, this.props.maxValue], [0, 100], value) * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits),
+ onValueChange: this.handleValueChange.bind(this),
+ onValueRender: this.handleValueRender.bind(this)
+ }))
+ });
+ }
+ }), "digits", "renderLabel"));
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.MenuItems.MenuSliderItem, {minValue: 0, maxValue: 100, digits: 0});
+
+ CustomComponents.ModalComponents = {};
+ CustomComponents.ModalComponents.ModalContent = reactInitialized && class BDFDB_ModalContent extends Internal.LibraryModules.React.Component {
+ render() {
+ return this.props.scroller ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Scrollers.Thin, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.modalcontent, this.props.className),
+ ref: this.props.scrollerRef,
+ children: this.props.children
+ }) : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.content && BDFDB.disCN.modalcontent, BDFDB.disCN.modalnoscroller, this.props.className),
+ direction: this.props.direction || Internal.LibraryComponents.Flex.Direction.VERTICAL,
+ align: Internal.LibraryComponents.Flex.Align.STRETCH,
+ children: this.props.children
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.ModalComponents.ModalContent, {scroller: true, content: true});
+
+ CustomComponents.ModalComponents.ModalTabContent = reactInitialized && class BDFDB_ModalTabContent extends Internal.LibraryModules.React.Component {
+ render() {
+ return !this.props.open ? null : BDFDB.ReactUtils.createElement(this.props.scroller ? Internal.LibraryComponents.Scrollers.Thin : "div", Object.assign(BDFDB.ObjectUtils.exclude(this.props, "scroller", "open"), {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.modaltabcontent, this.props.open && BDFDB.disCN.modaltabcontentopen, this.props.className),
+ children: this.props.children
+ }));
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.ModalComponents.ModalTabContent, {tab: "unnamed"});
+
+ CustomComponents.ModalComponents.ModalFooter = reactInitialized && class BDFDB_ModalFooter extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.modalfooter, this.props.className),
+ direction: this.props.direction || Internal.LibraryComponents.Flex.Direction.HORIZONTAL_REVERSE,
+ align: Internal.LibraryComponents.Flex.Align.STRETCH,
+ grow: 0,
+ shrink: 0,
+ children: this.props.children
+ });
+ }
+ };
+
+ CustomComponents.MultiInput = reactInitialized && class BDFDB_MultiInput extends Internal.LibraryModules.React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {focused: false};
+ }
+ render() {
+ if (this.props.children && this.props.children.props) this.props.children.props.className = BDFDB.DOMUtils.formatClassName(this.props.children.props.className, BDFDB.disCN.inputmultifield);
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.inputwrapper, BDFDB.disCN.inputmultiwrapper),
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.input, BDFDB.disCN.inputmulti, this.state.focused && BDFDB.disCN.inputfocused),
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.innerClassName, BDFDB.disCN.inputwrapper, BDFDB.disCN.inputmultifirst),
+ children: this.props.children
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextInput, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.disCN.inputmultilast,
+ inputClassName: BDFDB.disCN.inputmultifield,
+ onFocus: e => this.setState({focused: true}),
+ onBlur: e => this.setState({focused: false})
+ }), "children", "innerClassName"))
+ ]
+ })
+ });
+ }
+ };
+
+ CustomComponents.ListInput = reactInitialized && class BDFDB_ListInput extends Internal.LibraryModules.React.Component {
+ handleChange() {
+ if (typeof this.props.onChange) this.props.onChange(this.props.items, this);
+ }
+ render() {
+ if (!BDFDB.ArrayUtils.is(this.props.items)) this.props.items = [];
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.MultiInput, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.disCN.inputlist,
+ innerClassName: BDFDB.disCN.inputlistitems,
+ onKeyDown: e => {
+ if (e.which == 13 && e.target.value && e.target.value.trim()) {
+ let value = e.target.value.trim();
+ this.props.value = "";
+ if (!this.props.items.includes(value)) {
+ this.props.items.push(value);
+ BDFDB.ReactUtils.forceUpdate(this);
+ this.handleChange.apply(this, []);
+ }
+ }
+ },
+ children: this.props.items.map(item => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Badges.TextBadge, {
+ className: BDFDB.disCN.inputlistitem,
+ color: "var(--bdfdb-blurple)",
+ style: {borderRadius: "3px"},
+ text: [
+ item,
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ className: BDFDB.disCN.inputlistdelete,
+ name: Internal.LibraryComponents.SvgIcon.Names.CLOSE,
+ onClick: _ => {
+ BDFDB.ArrayUtils.remove(this.props.items, item);
+ BDFDB.ReactUtils.forceUpdate(this);
+ this.handleChange.apply(this, []);
+ }
+ })
+ ]
+ }))
+ }), "items"));
+ }
+ };
+
+ CustomComponents.PaginatedList = reactInitialized && class BDFDB_PaginatedList extends Internal.LibraryModules.React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ offset: props.offset
+ };
+ }
+ handleJump(offset) {
+ if (offset > -1 && offset < Math.ceil(this.props.items.length/this.props.amount) && this.state.offset != offset) {
+ this.state.offset = offset;
+ if (typeof this.props.onJump == "function") this.props.onJump(offset, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ }
+ renderPagination(bottom) {
+ let maxOffset = Math.ceil(this.props.items.length/this.props.amount) - 1;
+ return this.props.items.length > this.props.amount && BDFDB.ReactUtils.createElement("nav", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.pagination, bottom ? BDFDB.disCN.paginationbottom : BDFDB.disCN.paginationtop, this.props.mini && BDFDB.disCN.paginationmini),
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Paginator, {
+ totalCount: this.props.items.length,
+ currentPage: this.state.offset + 1,
+ pageSize: this.props.amount,
+ maxVisiblePages: this.props.maxVisiblePages,
+ onPageChange: page => {this.handleJump(isNaN(parseInt(page)) ? -1 : page - 1);}
+ }),
+ this.props.jump && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextInput, {
+ type: "number",
+ size: Internal.LibraryComponents.TextInput.Sizes.MINI,
+ value: this.state.offset + 1,
+ min: 1,
+ max: maxOffset + 1,
+ onKeyDown: (event, instance) => {if (event.which == 13) this.handleJump(isNaN(parseInt(instance.props.value)) ? -1 : instance.props.value - 1);}
+ }),
+ ].filter(n => n)
+ });
+ }
+ render() {
+ let items = [], alphabet = {};
+ if (BDFDB.ArrayUtils.is(this.props.items) && this.props.items.length) {
+ if (!this.props.alphabetKey) items = this.props.items;
+ else {
+ let unsortedItems = [].concat(this.props.items);
+ for (let key of ["0-9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]) {
+ let numbers = key == "0-9", alphaItems = [];
+ for (let item of unsortedItems) if (item && item[this.props.alphabetKey] && (numbers && !isNaN(parseInt(item[this.props.alphabetKey][0])) || item[this.props.alphabetKey].toUpperCase().indexOf(key) == 0)) alphaItems.push(item);
+ for (let sortedItem of alphaItems) BDFDB.ArrayUtils.remove(unsortedItems, sortedItem);
+ alphabet[key] = {items: BDFDB.ArrayUtils.keySort(alphaItems, this.props.alphabetKey), disabled: !alphaItems.length};
+ }
+ alphabet["?!"] = {items: BDFDB.ArrayUtils.keySort(unsortedItems, this.props.alphabetKey), disabled: !unsortedItems.length};
+ for (let key in alphabet) items.push(alphabet[key].items);
+ items = items.flat(10);
+ }
+ }
+ return typeof this.props.renderItem != "function" || !items.length ? null : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Scrollers.Thin, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.paginationlist, this.props.mini && BDFDB.disCN.paginationlistmini),
+ fade: this.props.fade,
+ children: [
+ this.renderPagination(),
+ items.length > this.props.amount && this.props.alphabetKey && BDFDB.ReactUtils.createElement("nav", {
+ className: BDFDB.disCN.paginationlistalphabet,
+ children: Object.keys(alphabet).map(key => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.paginationlistalphabetchar, alphabet[key].disabled &&BDFDB.disCN.paginationlistalphabetchardisabled),
+ onClick: _ => {if (!alphabet[key].disabled) this.handleJump(Math.floor(items.indexOf(alphabet[key].items[0])/this.props.amount));},
+ children: key
+ }))
+ }),
+ this.props.header,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.paginationlistcontent,
+ children: items.slice(this.state.offset * this.props.amount, (this.state.offset + 1) * this.props.amount).map((data, i) => {return this.props.renderItem(data, i);}).flat(10).filter(n => n)
+ }),
+ this.props.copyToBottom && this.renderPagination(true)
+ ].flat(10).filter(n => n)
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.PaginatedList, {amount: 50, offset: 0, mini: true, jump: true, maxVisiblePages: 7, copyToBottom: false, fade: true});
+
+ CustomComponents.Popout = reactInitialized && class BDFDB_Popout extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ this.props.containerInstance.popout = this;
+ if (typeof this.props.onOpen == "function") this.props.onOpen(this.props.containerInstance, this);
+ }
+ componentWillUnmount() {
+ delete this.props.containerInstance.popout;
+ if (typeof this.props.onClose == "function") this.props.onClose(this.props.containerInstance, this);
+ }
+ render() {
+ if (!this.props.wrap) return this.props.children;
+ let pos = typeof this.props.position == "string" ? this.props.position.toLowerCase() : null;
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutFocusLock, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.popoutwrapper, this.props.className, this.props.themed && BDFDB.disCN.popoutthemedpopout, this.props.arrow && BDFDB.disCN.popoutarrow, this.props.arrow && (pos == "top" ? BDFDB.disCN.popoutarrowtop : BDFDB.disCN.popoutarrowbottom)),
+ id: this.props.id,
+ onClick: e => e.stopPropagation(),
+ style: BDFDB.ObjectUtils.extract(this.props, "padding", "height", "maxHeight", "minHeight", "width", "maxWidth", "minWidth"),
+ children: this.props.children
+ });
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.Popout, {themed: true, wrap: true});
+
+ CustomComponents.PopoutContainer = reactInitialized && class BDFDB_PopoutContainer extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ this.toggle = this.toggle.bind(this);
+ this.onDocumentClicked = this.onDocumentClicked.bind(this);
+ this.domElementRef = BDFDB.ReactUtils.createRef();
+ this.domElementRef.current = BDFDB.ReactUtils.findDOMNode(this);
+ }
+ onDocumentClicked() {
+ const node = BDFDB.ReactUtils.findDOMNode(this.popout);
+ if (!node || !document.contains(node) || node != event.target && document.contains(event.target) && !node.contains(event.target)) this.toggle(false);
+ }
+ toggle(forceState) {
+ this.props.open = forceState != undefined ? forceState : !this.props.open;
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ if (!this.props._rendered) {
+ this.props._rendered = true;
+ const child = (BDFDB.ArrayUtils.is(this.props.children) ? this.props.children[0] : this.props.children) || BDFDB.ReactUtils.createElement("div", {style: {height: "100%", width: "100%"}});
+ child.props.className = BDFDB.DOMUtils.formatClassName(child.props.className, this.props.className);
+ const childProps = Object.assign({}, child.props);
+ child.props.onClick = (e, childThis) => {
+ if ((this.props.openOnClick || this.props.openOnClick === undefined)) this.toggle();
+ if (typeof this.props.onClick == "function") this.props.onClick(e, this);
+ if (typeof childProps.onClick == "function") childProps.onClick(e, childThis);
+ if (this.props.killEvent || childProps.killEvent) BDFDB.ListenerUtils.stopEvent(e);
+ };
+ child.props.onContextMenu = (e, childThis) => {
+ if (this.props.openOnContextMenu) this.toggle();
+ if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);
+ if (typeof childProps.onContextMenu == "function") childProps.onContextMenu(e, childThis);
+ if (this.props.killEvent || childProps.killEvent) BDFDB.ListenerUtils.stopEvent(e);
+ };
+ this.props.children = child;
+ }
+ return BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ children: [
+ this.props.children,
+ this.props.open && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.AppReferencePositionLayer, {
+ onMount: _ => BDFDB.TimeUtils.timeout(_ => document.addEventListener("click", this.onDocumentClicked)),
+ onUnmount: _ => document.removeEventListener("click", this.onDocumentClicked),
+ position: this.props.position,
+ align: this.props.align,
+ targetRef: this.domElementRef,
+ children: _ => {
+ const popout = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Popout, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: this.props.popoutClassName,
+ containerInstance: this,
+ position: this.props.position,
+ style: this.props.popoutStyle,
+ onOpen: typeof this.props.onOpen == "function" ? this.props.onOpen.bind(this) : _ => {},
+ onClose: typeof this.props.onClose == "function" ? this.props.onClose.bind(this) : _ => {},
+ children: typeof this.props.renderPopout == "function" ? this.props.renderPopout(this) : null
+ }), "popoutStyle", "popoutClassName", "shouldShow", "changing", "renderPopout", "openOnClick", "onClick", "openOnContextMenu", "onContextMenu"));
+ const animation = Object.entries(Internal.LibraryComponents.PopoutContainer.Animation).find(n => n[1] == this.props.animation);
+ return !animation || animation[0] == Internal.LibraryComponents.PopoutContainer.Animation.NONE ? popout : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutCSSAnimator, {
+ position: this.props.position,
+ type: Internal.LibraryComponents.PopoutCSSAnimator.Types[animation[0]],
+ children: popout
+ });
+ }
+ })
+ ]
+ });
+ }
+ };
+ CustomComponents.PopoutContainer.Align = {
+ BOTTOM: "bottom",
+ CENTER: "center",
+ LEFT: "left",
+ RIGHT: "right",
+ TOP: "top"
+ };
+ CustomComponents.PopoutContainer.Positions = {
+ BOTTOM: "bottom",
+ CENTER: "center",
+ LEFT: "left",
+ RIGHT: "right",
+ TOP: "top",
+ WINDOW_CENTER: "window_center"
+ };
+ CustomComponents.PopoutContainer.ObjectProperties = ["Animation"];
+ Internal.setDefaultProps(CustomComponents.PopoutContainer, {wrap: true});
+
+ CustomComponents.PopoutCSSAnimator = function (props) {
+ let positionState = BDFDB.ReactUtils.useState(props.position != null);
+ let animationState = BDFDB.ReactUtils.useState((_ => new Internal.LibraryComponents.Timeout));
+ BDFDB.ReactUtils.useEffect((_ => (_ => animationState[0].stop())), [animationState[0]]);
+ BDFDB.ReactUtils.useEffect(_ => (props.position && animationState[0].start(10, (_ => positionState[1](true)))), [props.position, animationState[0]]);
+ const position = typeof props.position == "string" && props.position.replace("window_", "");
+ const animation = (Object.entries(Internal.LibraryComponents.PopoutContainer.Animation).find(n => n[1] == props.animation) || ["NONE"])[0].toLowerCase();
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(InternalData.DiscordClasses[`animationcontainer${position}`] && BDFDB.disCN[`animationcontainer${position}`], InternalData.DiscordClasses[`animationcontainer${animation}`] && BDFDB.disCN[`animationcontainer${animation}`], positionState[0] && BDFDB.disCN.animationcontainerrender),
+ children: props.children
+ })
+ };
+ CustomComponents.PopoutCSSAnimator.Types = {
+ "1": "TRANSLATE",
+ "2": "SCALE",
+ "3": "FADE",
+ "TRANSLATE": "1",
+ "SCALE": "2",
+ "FADE": "3"
+ };
+
+ CustomComponents.QuickSelect = reactInitialized && class BDFDB_QuickSelect extends Internal.LibraryModules.React.Component {
+ handleChange(option) {
+ this.props.value = option;
+ if (typeof this.props.onChange == "function") this.props.onChange(option.value || option.key, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ let options = (BDFDB.ArrayUtils.is(this.props.options) ? this.props.options : [{}]).filter(n => n);
+ let selectedOption = BDFDB.ObjectUtils.is(this.props.value) ? this.props.value : (options[0] || {});
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.quickselectwrapper),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: BDFDB.disCN.quickselect,
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.quickselectlabel,
+ children: this.props.label
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ className: BDFDB.disCN.quickselectclick,
+ onClick: event => {
+ Internal.LibraryModules.ContextMenuUtils.openContextMenu(event, _ => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Menu, {
+ navId: "bdfdb-quickselect",
+ onClose: Internal.LibraryModules.ContextMenuUtils.closeContextMenu,
+ className: this.props.popoutClassName,
+ children: BDFDB.ContextMenuUtils.createItem(Internal.LibraryComponents.MenuItems.MenuGroup, {
+ children: options.map((option, i) => {
+ let selected = option.value && option.value === selectedOption.value || option.key && option.key === selectedOption.key;
+ return BDFDB.ContextMenuUtils.createItem(Internal.LibraryComponents.MenuItems.MenuItem, {
+ label: option.label,
+ id: BDFDB.ContextMenuUtils.createItemId("option", option.key || option.value || i),
+ action: selected ? null : event2 => this.handleChange.bind(this)(option)
+ });
+ })
+ })
+ }));
+ },
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.quickselectvalue,
+ children: typeof this.props.renderValue == "function" ? this.props.renderValue(this.props.value) : this.props.value.label
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.quickselectarrow
+ })
+ ]
+ })
+ ]
+ })
+ });
+ }
+ };
+
+ CustomComponents.RadioGroup = reactInitialized && class BDFDB_RadioGroup extends Internal.LibraryModules.React.Component {
+ handleChange(value) {
+ this.props.value = value.value;
+ if (typeof this.props.onChange == "function") this.props.onChange(value, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.RadioGroup, Object.assign({}, this.props, {
+ onChange: this.handleChange.bind(this)
+ }));
+ }
+ };
+
+ CustomComponents.SearchBar = reactInitialized && class BDFDB_SearchBar extends Internal.LibraryModules.React.Component {
+ handleChange(query) {
+ this.props.query = query;
+ if (typeof this.props.onChange == "function") this.props.onChange(query, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleClear() {
+ this.props.query = "";
+ if (this.props.changeOnClear && typeof this.props.onChange == "function") this.props.onChange("", this);
+ if (typeof this.props.onClear == "function") this.props.onClear(this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ let props = Object.assign({}, this.props, {
+ onChange: this.handleChange.bind(this),
+ onClear: this.handleClear.bind(this)
+ });
+ if (typeof props.query != "string") props.query = "";
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.SearchBar, props);
+ }
+ };
+
+ CustomComponents.Select = reactInitialized && class BDFDB_Select extends Internal.LibraryModules.React.Component {
+ handleChange(value) {
+ this.props.value = value.value || value;
+ if (typeof this.props.onChange == "function") this.props.onChange(value, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.selectwrapper),
+ children: BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.SearchableSelect, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: this.props.inputClassName,
+ autoFocus: this.props.autoFocus ? this.props.autoFocus : false,
+ maxVisibleItems: this.props.maxVisibleItems || 7,
+ renderOptionLabel: this.props.optionRenderer,
+ select: this.handleChange.bind(this),
+ serialize: typeof this.props.serialize == "function" ? this.props.serialize : _ => {},
+ isSelected: typeof this.props.isSelected == "function" ? this.props.isSelected : (value => this.props.value == value)
+ }), "inputClassName", "optionRenderer"))
+ });
+ }
+ };
+
+ CustomComponents.SettingsGuildList = reactInitialized && class BDFDB_SettingsGuildList extends Internal.LibraryModules.React.Component {
+ render() {
+ this.props.disabled = BDFDB.ArrayUtils.is(this.props.disabled) ? this.props.disabled : [];
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ className: this.props.className,
+ wrap: Internal.LibraryComponents.Flex.Wrap.WRAP,
+ children: [this.props.includeDMs && {name: BDFDB.LanguageUtils.LanguageStrings.DIRECT_MESSAGES, acronym: "DMs", id: Internal.DiscordConstants.ME, getIconURL: _ => {}}].concat(Internal.LibraryStores.SortedGuildStore.getFlattenedGuildIds().map(Internal.LibraryStores.GuildStore.getGuild)).filter(n => n).map(guild => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: guild.name,
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.guildClassName, BDFDB.disCN.settingsguild, this.props.disabled.includes(guild.id) && BDFDB.disCN.settingsguilddisabled),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.GuildIcon, {
+ guild: guild,
+ size: this.props.size || Internal.LibraryComponents.GuildIcon.Sizes.MEDIUM
+ }),
+ onClick: e => {
+ let isDisabled = this.props.disabled.includes(guild.id);
+ if (isDisabled) BDFDB.ArrayUtils.remove(this.props.disabled, guild.id, true);
+ else this.props.disabled.push(guild.id);
+ if (typeof this.props.onClick == "function") this.props.onClick(this.props.disabled, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ })
+ }))
+ });
+ }
+ };
+
+ CustomComponents.SettingsPanel = reactInitialized && class BDFDB_SettingsPanel extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ this.props._instance = this;
+ let node = BDFDB.ReactUtils.findDOMNode(this);
+ if (node) this.props._node = node;
+ }
+ componentWillUnmount() {
+ if (BDFDB.ObjectUtils.is(this.props.addon) && typeof this.props.addon.onSettingsClosed == "function") this.props.addon.onSettingsClosed();
+ }
+ render() {
+ let panelItems = [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.AutoFocusCatcher, {}),
+ typeof this.props.children == "function" ? (_ => {
+ return this.props.children(this.props.collapseStates);
+ })() : this.props.children
+ ].flat(10).filter(n => n);
+ return BDFDB.ReactUtils.createElement("div", {
+ key: this.props.addon && this.props.addon.name && `${this.props.addon.name}-settingsPanel`,
+ id: this.props.addon && this.props.addon.name && `${this.props.addon.name}-settings`,
+ className: BDFDB.disCN.settingspanel,
+ children: [
+ this.props.addon.changeLog && !BDFDB.ObjectUtils.isEmpty(this.props.addon.changeLog) && BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: BDFDB.LanguageUtils.LanguageStrings.CHANGE_LOG,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: BDFDB.disCN._repochangelogbutton,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.CHANGELOG,
+ onClick: _ => BDFDB.PluginUtils.openChangeLog(this.props.addon),
+ width: 24,
+ height: 24
+ })
+ })
+ }),
+ panelItems
+ ]
+ });
+ }
+ };
+
+ CustomComponents.SettingsPanelList = reactInitialized && class BDFDB_SettingsPanelInner extends Internal.LibraryModules.React.Component {
+ render() {
+ return this.props.children ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.settingspanellistwrapper, this.props.mini && BDFDB.disCN.settingspanellistwrappermini),
+ children: [
+ this.props.dividerTop ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormDivider, {
+ className: this.props.mini ? BDFDB.disCN.marginbottom4 : BDFDB.disCN.marginbottom8
+ }) : null,
+ typeof this.props.title == "string" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormTitle, {
+ className: BDFDB.disCN.marginbottom4,
+ tag: Internal.LibraryComponents.FormComponents.FormTags && Internal.LibraryComponents.FormComponents.FormTags.H3,
+ children: this.props.title
+ }) : null,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingspanellist,
+ children: this.props.children
+ }),
+ this.props.dividerBottom ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormDivider, {
+ className: this.props.mini ? BDFDB.disCN.margintop4 : BDFDB.disCN.margintop8
+ }) : null
+ ]
+ }) : null;
+ }
+ };
+
+ CustomComponents.SettingsItem = reactInitialized && class BDFDB_SettingsItem extends Internal.LibraryModules.React.Component {
+ handleChange(value) {
+ if (typeof this.props.onChange == "function") this.props.onChange(value, this);
+ }
+ render() {
+ if (typeof this.props.type != "string" || !["BUTTON", "SELECT", "SLIDER", "SWITCH", "TEXTINPUT"].includes(this.props.type.toUpperCase())) return null;
+ let childComponent = Internal.LibraryComponents[this.props.type];
+ if (!childComponent) return null;
+ if (this.props.mini && childComponent.Sizes) this.props.size = childComponent.Sizes.MINI || childComponent.Sizes.MIN;
+ let label = this.props.label ? (this.props.tag ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormTitle, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.labelClassName, BDFDB.disCN.marginreset),
+ tag: this.props.tag,
+ children: this.props.label
+ }) : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsLabel, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.labelClassName),
+ mini: this.props.mini,
+ label: this.props.label
+ })) : null;
+ let margin = this.props.margin != null ? this.props.margin : (this.props.mini ? 0 : 8);
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.settingsrow, BDFDB.disCN.settingsrowcontainer, this.props.disabled && BDFDB.disCN.settingsrowdisabled, margin != null && (InternalData.DiscordClasses[`marginbottom${margin}`] && BDFDB.disCN[`marginbottom${margin}`] || margin == 0 && BDFDB.disCN.marginreset)),
+ id: this.props.id,
+ children: [
+ this.props.dividerTop ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormDivider, {
+ className: this.props.mini ? BDFDB.disCN.marginbottom4 : BDFDB.disCN.marginbottom8
+ }) : null,
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingsrowlabel,
+ children: [
+ label && !this.props.basis ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ grow: 1,
+ shrink: 1,
+ wrap: true,
+ children: label
+ }) : label,
+ this.props.labelChildren,
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ className: BDFDB.disCNS.settingsrowcontrol + BDFDB.disCN.flexchild,
+ grow: 0,
+ shrink: this.props.basis ? 0 : 1,
+ basis: this.props.basis,
+ wrap: true,
+ children: BDFDB.ReactUtils.createElement(childComponent, BDFDB.ObjectUtils.exclude(Object.assign(BDFDB.ObjectUtils.exclude(this.props, "className", "id", "type"), this.props.childProps, {
+ onChange: this.handleChange.bind(this),
+ onValueChange: this.handleChange.bind(this)
+ }), "basis", "margin", "dividerBottom", "dividerTop", "label", "labelClassName", "labelChildren", "tag", "mini", "note", "childProps"))
+ })
+ ].flat(10).filter(n => n)
+ }),
+ typeof this.props.note == "string" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ className: BDFDB.disCN.settingsrownote,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormText, {
+ disabled: this.props.disabled,
+ type: Internal.LibraryComponents.FormComponents.FormText.Types.DESCRIPTION,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextScroller, {speed: 2, children: this.props.note})
+ })
+ }) : null,
+ this.props.dividerBottom ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FormComponents.FormDivider, {
+ className: this.props.mini ? BDFDB.disCN.margintop4 : BDFDB.disCN.margintop8
+ }) : null
+ ]
+ });
+ }
+ };
+
+ CustomComponents.SettingsLabel = reactInitialized && class BDFDB_SettingsLabel extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextScroller, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.settingsrowtitle, this.props.mini ? BDFDB.disCN.settingsrowtitlemini : BDFDB.disCN.settingsrowtitledefault, BDFDB.disCN.cursordefault),
+ speed: 2,
+ children: this.props.label
+ });
+ }
+ };
+
+ CustomComponents.SettingsList = reactInitialized && class BDFDB_SettingsList extends Internal.LibraryModules.React.Component {
+ componentDidMount() {
+ this.checkList();
+ }
+ componentDidUpdate() {
+ this.checkList();
+ }
+ checkList() {
+ let list = BDFDB.ReactUtils.findDOMNode(this);
+ if (list && !this.props.configWidth) {
+ let headers = Array.from(list.querySelectorAll(BDFDB.dotCN.settingstableheader));
+ headers.shift();
+ if (BDFDB.DOMUtils.getRects(headers[0]).width == 0) BDFDB.TimeUtils.timeout(_ => {this.resizeList(headers);});
+ else this.resizeList(headers);
+ }
+ }
+ resizeList(headers) {
+ let configWidth = 0, biggestWidth = 0;
+ if (!configWidth) {
+ for (let header of headers) {
+ header.style = "";
+ let width = BDFDB.DOMUtils.getRects(header).width;
+ configWidth = width > configWidth ? width : configWidth;
+ }
+ configWidth += 4;
+ biggestWidth = configWidth;
+ }
+ if (headers.length * configWidth > 300) {
+ this.props.vertical = true;
+ configWidth = parseInt(290 / headers.length);
+ }
+ else if (configWidth < 36) {
+ configWidth = 36;
+ biggestWidth = configWidth;
+ }
+ this.props.configWidth = configWidth;
+ this.props.biggestWidth = biggestWidth;
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ renderHeaderOption(props) {
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(props.className, BDFDB.disCN.colorbase, BDFDB.disCN.size10, props.clickable && BDFDB.disCN.cursorpointer),
+ onClick: _ => {if (typeof this.props.onHeaderClick == "function") this.props.onHeaderClick(props.label, this);},
+ onContextMenu: _ => {if (typeof this.props.onHeaderContextMenu == "function") this.props.onHeaderContextMenu(props.label, this);},
+ children: BDFDB.ReactUtils.createElement("span", {
+ children: props.label
+ })
+ });
+ }
+ renderItem(props) {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Card, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName([this.props.cardClassName, props.className].filter(n => n).join(" ").indexOf(BDFDB.disCN.card) == -1 && BDFDB.disCN.cardprimaryoutline, BDFDB.disCN.settingstablecard, this.props.cardClassName, props.className),
+ cardId: props.key,
+ backdrop: false,
+ horizontal: true,
+ style: Object.assign({}, this.props.cardStyle, props.style),
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingstablecardlabel,
+ children: this.props.renderLabel(props, this)
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingstablecardconfigs,
+ style: {
+ width: props.wrapperWidth || null,
+ minWidth: props.wrapperWidth || null,
+ maxWidth: props.wrapperWidth || null
+ },
+ children: this.props.settings.map(setting => BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.checkboxcontainer,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: setting.toUpperCase(),
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Checkbox, {
+ disabled: props.disabled,
+ cardId: props.key,
+ settingId: setting,
+ shape: Internal.LibraryComponents.Checkbox.Shapes && Internal.LibraryComponents.Checkbox.Shapes.ROUND,
+ type: Internal.LibraryComponents.Checkbox.Types && Internal.LibraryComponents.Checkbox.Types.INVERTED,
+ color: this.props.checkboxColor,
+ getColor: this.props.getCheckboxColor,
+ value: props[setting],
+ getValue: this.props.getCheckboxValue,
+ onChange: this.props.onCheckboxChange
+ })
+ })
+ })).flat(10).filter(n => n)
+ })
+ ]
+ }), "title", "data", "settings", "renderLabel", "cardClassName", "cardStyle", "checkboxColor", "getCheckboxColor", "getCheckboxValue", "onCheckboxChange", "configWidth", "biggestWidth", "pagination"));
+ }
+ render() {
+ this.props.settings = BDFDB.ArrayUtils.is(this.props.settings) ? this.props.settings : [];
+ this.props.renderLabel = typeof this.props.renderLabel == "function" ? this.props.renderLabel : data => data.label;
+ this.props.data = (BDFDB.ArrayUtils.is(this.props.data) ? this.props.data : [{}]).filter(n => n);
+
+ let wrapperWidth = this.props.configWidth && this.props.configWidth * this.props.settings.length;
+ let isHeaderClickable = typeof this.props.onHeaderClick == "function" || typeof this.props.onHeaderContextMenu == "function";
+ let usePagination = BDFDB.ObjectUtils.is(this.props.pagination);
+
+ let header = BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingstableheaders,
+ style: this.props.vertical && this.props.biggestWidth ? {
+ marginTop: this.props.biggestWidth - 15 || 0
+ } : {},
+ children: [
+ this.renderHeaderOption({
+ className: BDFDB.disCN.settingstableheadername,
+ clickable: this.props.title && isHeaderClickable,
+ label: this.props.title || ""
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.settingstableheaderoptions,
+ style: {
+ width: wrapperWidth || null,
+ minWidth: wrapperWidth || null,
+ maxWidth: wrapperWidth || null
+ },
+ children: this.props.settings.map(setting => this.renderHeaderOption({
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.settingstableheaderoption, this.props.vertical && BDFDB.disCN.settingstableheadervertical),
+ clickable: isHeaderClickable,
+ label: setting
+ }))
+ })
+ ]
+ });
+ return !this.props.data.length ? null : BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.settingstablelist, this.props.className),
+ children: [
+ !usePagination && header,
+ !usePagination ? this.props.data.map(data => this.renderItem(Object.assign({}, data, {wrapperWidth}))) : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PaginatedList, Object.assign({}, this.props.pagination, {
+ header: header,
+ items: this.props.data,
+ renderItem: data => this.renderItem(Object.assign({}, data, {wrapperWidth})),
+ onJump: (offset, instance) => {
+ this.props.pagination.offset = offset;
+ if (typeof this.props.pagination.onJump == "function") this.props.pagination.onJump(offset, this, instance);
+ }
+ }))
+ ].filter(n => n)
+ });
+ }
+ };
+
+ CustomComponents.SettingsSaveItem = reactInitialized && class BDFDB_SettingsSaveItem extends Internal.LibraryModules.React.Component {
+ saveSettings(value) {
+ if (!BDFDB.ArrayUtils.is(this.props.keys) || !BDFDB.ObjectUtils.is(this.props.plugin)) return;
+ let keys = this.props.keys.filter(n => n);
+ let option = keys.shift();
+ if (BDFDB.ObjectUtils.is(this.props.plugin) && option) {
+ let data = BDFDB.DataUtils.load(this.props.plugin, option);
+ let newC = "";
+ for (let key of keys) newC += `{"${key}":`;
+ value = value != null && value.value != null ? value.value : value;
+ let isString = typeof value == "string";
+ let marker = isString ? `"` : ``;
+ newC += (marker + (isString ? value.replace(/\\/g, "\\\\") : value) + marker) + "}".repeat(keys.length);
+ newC = JSON.parse(newC);
+ newC = BDFDB.ObjectUtils.is(newC) ? BDFDB.ObjectUtils.deepAssign({}, data, newC) : newC;
+ BDFDB.DataUtils.save(newC, this.props.plugin, option);
+ if (!this.props.plugin.settings) this.props.plugin.settings = {};
+ this.props.plugin.settings[option] = newC;
+ this.props.plugin.SettingsUpdated = true;
+ }
+ if (typeof this.props.onChange == "function") this.props.onChange(value, this);
+ }
+ render() {
+ if (typeof this.props.type != "string" || !["SELECT", "SLIDER", "SWITCH", "TEXTINPUT"].includes(this.props.type.toUpperCase())) return null;
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsItem, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ onChange: this.saveSettings.bind(this)
+ }), "keys", "key", "plugin"));
+ }
+ };
+
+ CustomComponents.SidebarList = reactInitialized && class BDFDB_SidebarList extends Internal.LibraryModules.React.Component {
+ handleItemSelect(item) {
+ this.props.selectedItem = item;
+ if (typeof this.props.onItemSelect == "function") this.props.onItemSelect(item, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ let items = (BDFDB.ArrayUtils.is(this.props.items) ? this.props.items : [{}]).filter(n => n);
+ let selectedItem = this.props.selectedItem || (items[0] || {}).value;
+ let selectedElements = (items.find(n => n.value == selectedItem) || {}).elements;
+ let renderElement = typeof this.props.renderElement == "function" ? this.props.renderElement : (_ => {});
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(this.props.className, BDFDB.disCN.sidebarlist),
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Scrollers.Thin, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.sidebarClassName, BDFDB.disCN.sidebar),
+ fade: true,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TabBar, {
+ itemClassName: this.props.itemClassName,
+ type: Internal.LibraryComponents.TabBar.Types.SIDE,
+ items: items,
+ selectedItem: selectedItem,
+ renderItem: this.props.renderItem,
+ onItemSelect: this.handleItemSelect.bind(this)
+ })
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Scrollers.Thin, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.contentClassName, BDFDB.disCN.sidebarcontent),
+ fade: true,
+ children: [selectedElements].flat(10).filter(n => n).map(data => renderElement(data))
+ })
+ ]
+ });
+ }
+ };
+
+ CustomComponents.Slider = reactInitialized && class BDFDB_Slider extends Internal.LibraryModules.React.Component {
+ handleMarkerRender(marker) {
+ let newMarker = BDFDB.NumberUtils.mapRange([0, 100], this.props.edges, marker);
+ if (typeof this.props.digits == "number") newMarker = Math.round(newMarker * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ return newMarker;
+ }
+ handleValueChange(value) {
+ let newValue = BDFDB.NumberUtils.mapRange([0, 100], this.props.edges, value);
+ if (typeof this.props.digits == "number") newValue = Math.round(newValue * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ this.props.defaultValue = this.props.value = newValue;
+ if (typeof this.props.onValueChange == "function") this.props.onValueChange(newValue, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleValueRender(value) {
+ let newValue = BDFDB.NumberUtils.mapRange([0, 100], this.props.edges, value);
+ if (typeof this.props.digits == "number") newValue = Math.round(newValue * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ if (typeof this.props.onValueRender == "function") {
+ let tempReturn = this.props.onValueRender(newValue, this);
+ if (tempReturn != undefined) newValue = tempReturn;
+ }
+ return newValue;
+ }
+ render() {
+ let value = this.props.value || this.props.defaultValue || 0;
+ if (!BDFDB.ArrayUtils.is(this.props.edges) || this.props.edges.length != 2) this.props.edges = [this.props.min || this.props.minValue || 0, this.props.max || this.props.maxValue || 100];
+ this.props.minValue = 0;
+ this.props.maxValue = 100;
+ let defaultValue = BDFDB.NumberUtils.mapRange(this.props.edges, [0, 100], value);
+ if (typeof this.props.digits == "number") defaultValue = Math.round(defaultValue * Math.pow(10, this.props.digits)) / Math.pow(10, this.props.digits);
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.Slider, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ initialValue: defaultValue,
+ markers: typeof this.props.markerAmount == "number" ? Array.from(Array(this.props.markerAmount).keys()).map((_, i) => i * (this.props.maxValue - this.props.minValue)/10) : undefined,
+ onMarkerRender: this.handleMarkerRender.bind(this),
+ onValueChange: this.handleValueChange.bind(this),
+ onValueRender: this.handleValueRender.bind(this)
+ }), "digits", "edges", "max", "min", "markerAmount"));
+ }
+ };
+ Internal.setDefaultProps(CustomComponents.Slider, {hideBubble: false, digits: 3});
+
+ CustomComponents.SvgIcon = reactInitialized && class BDFDB_Icon extends Internal.LibraryModules.React.Component {
+ render() {
+ if (BDFDB.ObjectUtils.is(this.props.name)) {
+ let calcClassName = [];
+ if (BDFDB.ObjectUtils.is(this.props.name.getClassName)) for (let path in this.props.name.getClassName) {
+ if (!path || BDFDB.ObjectUtils.get(this, path)) calcClassName.push(BDFDB.disCN[this.props.name.getClassName[path]]);
+ }
+ if (calcClassName.length || this.props.className) this.props.nativeClass = true;
+ this.props.iconSVG = this.props.name.icon;
+ let props = Object.assign({
+ width: 24,
+ height: 24,
+ color: "currentColor"
+ }, this.props.name.defaultProps, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(calcClassName, this.props.className)
+ });
+ for (let key in props) this.props.iconSVG = this.props.iconSVG.replace(new RegExp(`%%${key}`, "g"), props[key]);
+ }
+ if (this.props.iconSVG) {
+ let icon = BDFDB.ReactUtils.elementToReact(BDFDB.DOMUtils.create(this.props.iconSVG));
+ if (BDFDB.ReactUtils.isValidElement(icon)) {
+ icon.props.className = BDFDB.DOMUtils.formatClassName(!this.props.nativeClass && BDFDB.disCN.svgicon, icon.props.className, this.props.className);
+ icon.props.style = Object.assign({}, icon.props.style, this.props.style);
+ icon.props = Object.assign({}, BDFDB.ObjectUtils.extract(this.props, "onClick", "onContextMenu", "onMouseDown", "onMouseUp", "onMouseEnter", "onMouseLeave"), icon.props);
+ return icon;
+ }
+ }
+ return null;
+ }
+ };
+ CustomComponents.SvgIcon.Names = InternalData.SvgIcons || {};
+
+ const SwitchIconPaths = {
+ a: {
+ TOP: "M5.13231 6.72963L6.7233 5.13864L14.855 13.2704L13.264 14.8614L5.13231 6.72963Z",
+ BOTTOM: "M13.2704 5.13864L14.8614 6.72963L6.72963 14.8614L5.13864 13.2704L13.2704 5.13864Z"
+ },
+ b: {
+ TOP: "M6.56666 11.0013L6.56666 8.96683L13.5667 8.96683L13.5667 11.0013L6.56666 11.0013Z",
+ BOTTOM: "M13.5582 8.96683L13.5582 11.0013L6.56192 11.0013L6.56192 8.96683L13.5582 8.96683Z"
+ },
+ c: {
+ TOP: "M7.89561 14.8538L6.30462 13.2629L14.3099 5.25755L15.9009 6.84854L7.89561 14.8538Z",
+ BOTTOM: "M4.08643 11.0903L5.67742 9.49929L9.4485 13.2704L7.85751 14.8614L4.08643 11.0903Z"
+ }
+ };
+ const SwitchInner = function (props) {
+ let reducedMotion = BDFDB.ReactUtils.useContext(Internal.LibraryModules.PreferencesContext.AccessibilityPreferencesContext).reducedMotion;
+ let ref = BDFDB.ReactUtils.useRef(null);
+ let state = BDFDB.ReactUtils.useState(false);
+ let animation = Internal.LibraryComponents.Animations.useSpring({
+ config: {
+ mass: 1,
+ tension: 250
+ },
+ opacity: props.disabled ? .3 : 1,
+ state: state[0] ? (props.value ? .7 : .3) : (props.value ? 1 : 0)
+ });
+ let fill = animation.state.to({
+ output: [props.uncheckedColor, props.checkedColor]
+ });
+ let mini = props.size == Internal.LibraryComponents.Switch.Sizes.MINI;
+
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.div, {
+ className: BDFDB.DOMUtils.formatClassName(props.className, BDFDB.disCN.switch, props.value && BDFDB.disCN.switchchecked, mini && BDFDB.disCN.switchmini),
+ onMouseDown: _ => {
+ return !props.disabled && state[1](true);
+ },
+ onMouseUp: _ => {
+ return state[1](false);
+ },
+ onMouseLeave: _ => {
+ return state[1](false);
+ },
+ style: {
+ opacity: animation.opacity,
+ backgroundColor: animation.state.to({
+ output: [props.uncheckedColor, props.checkedColor]
+ })
+ },
+ tabIndex: -1,
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.svg, {
+ className: BDFDB.disCN.switchslider,
+ viewBox: "0 0 28 20",
+ preserveAspectRatio: "xMinYMid meet",
+ style: {
+ left: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: mini ? [-1, 2, 6, 9] : [-3, 1, 8, 12]
+ })
+ },
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.rect, {
+ fill: "white",
+ x: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: [4, 0, 0, 4]
+ }),
+ y: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: [0, 1, 1, 0]
+ }),
+ height: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: [20, 18, 18, 20]
+ }),
+ width: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: [20, 28, 28, 20]
+ }),
+ rx: "10"
+ }),
+ BDFDB.ReactUtils.createElement("svg", {
+ viewBox: "0 0 20 20",
+ fill: "none",
+ children: [
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.path, {
+ fill: fill,
+ d: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: reducedMotion.enabled ? [SwitchIconPaths.a.TOP, SwitchIconPaths.a.TOP, SwitchIconPaths.c.TOP, SwitchIconPaths.c.TOP] : [SwitchIconPaths.a.TOP, SwitchIconPaths.b.TOP, SwitchIconPaths.b.TOP, SwitchIconPaths.c.TOP]
+ })
+ }),
+ BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.path, {
+ fill: fill,
+ d: animation.state.to({
+ range: [0, .3, .7, 1],
+ output: reducedMotion.enabled ? [SwitchIconPaths.a.BOTTOM, SwitchIconPaths.a.BOTTOM, SwitchIconPaths.c.BOTTOM, SwitchIconPaths.c.BOTTOM] : [SwitchIconPaths.a.BOTTOM, SwitchIconPaths.b.BOTTOM, SwitchIconPaths.b.BOTTOM, SwitchIconPaths.c.BOTTOM]
+ })
+ })
+ ]
+ })
+ ]
+ }),
+ BDFDB.ReactUtils.createElement("input", BDFDB.ObjectUtils.exclude(Object.assign({}, props, {
+ id: props.id,
+ type: "checkbox",
+ ref: ref,
+ className: BDFDB.DOMUtils.formatClassName(props.inputClassName, BDFDB.disCN.switchinner),
+ tabIndex: props.disabled ? -1 : 0,
+ onKeyDown: e => {
+ if (!props.disabled && !e.repeat && (e.key == " " || e.key == "Enter")) state[1](true);
+ },
+ onKeyUp: e => {
+ if (!props.disabled && !e.repeat) {
+ state[1](false);
+ if (e.key == "Enter" && ref.current) ref.current.click();
+ }
+ },
+ onChange: e => {
+ state[1](false);
+ if (typeof props.onChange == "function") props.onChange(e.currentTarget.checked, e);
+ },
+ checked: props.value,
+ disabled: props.disabled
+ }), "uncheckedColor", "checkedColor", "size", "value"))
+ ]
+ });
+ };
+ CustomComponents.Switch = reactInitialized && class BDFDB_Switch extends Internal.LibraryModules.React.Component {
+ handleChange() {
+ this.props.value = !this.props.value;
+ if (typeof this.props.onChange == "function") this.props.onChange(this.props.value, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ return BDFDB.ReactUtils.createElement(SwitchInner, Object.assign({}, this.props, {
+ onChange: this.handleChange.bind(this)
+ }));
+ }
+ };
+ CustomComponents.Switch.Sizes = {
+ DEFAULT: "default",
+ MINI: "mini",
+ };
+ Internal.setDefaultProps(CustomComponents.Switch, {
+ size: CustomComponents.Switch.Sizes.DEFAULT,
+ uncheckedColor: Internal.DiscordConstants.Colors.PRIMARY_400,
+ checkedColor: Internal.DiscordConstants.Colors.BRAND
+ });
+
+ CustomComponents.TabBar = reactInitialized && class BDFDB_TabBar extends Internal.LibraryModules.React.Component {
+ handleItemSelect(item) {
+ this.props.selectedItem = item;
+ if (typeof this.props.onItemSelect == "function") this.props.onItemSelect(item, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ render() {
+ let items = (BDFDB.ArrayUtils.is(this.props.items) ? this.props.items : [{}]).filter(n => n);
+ let selectedItem = this.props.selectedItem || (items[0] || {}).value;
+ let renderItem = typeof this.props.renderItem == "function" ? this.props.renderItem : (data => data.label || data.value);
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.TabBar, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ selectedItem: selectedItem,
+ onItemSelect: this.handleItemSelect.bind(this),
+ children: items.map(data => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TabBar.Item, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.itemClassName, selectedItem == data.value && this.props.itemSelectedClassName),
+ itemType: this.props.type,
+ id: data.value,
+ children: renderItem(data),
+ "aria-label": data.label || data.value
+ }))
+ }), "itemClassName", "items", "renderItem"));
+ }
+ };
+ CustomComponents.TabBar.Types = {
+ SIDE: "side",
+ TOP: "top",
+ TOP_PILL: "top-pill"
+ };
+ CustomComponents.TabBar.Looks = {
+ 0: "GREY",
+ 1: "BRAND",
+ 2: "CUSTOM",
+ GREY: 0,
+ BRAND: 1,
+ CUSTOM: 2
+ };
+
+ CustomComponents.Table = reactInitialized && class BDFDB_Table extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.Table, Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.table, this.props.className),
+ headerCellClassName: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tableheadercell, this.props.headerCellClassName),
+ sortedHeaderCellClassName: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tableheadercellsorted, this.props.sortedHeaderCellClassName),
+ bodyCellClassName: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.tablebodycell, this.props.bodyCellClassName),
+ onSort: (sortKey, sortDirection) => {
+ this.props.sortDirection = this.props.sortKey != sortKey && sortDirection == Internal.LibraryComponents.Table.SortDirection.ASCENDING && this.props.columns.filter(n => n.key == sortKey)[0].reverse ? Internal.LibraryComponents.Table.SortDirection.DESCENDING : sortDirection;
+ this.props.sortKey = sortKey;
+ this.props.data = BDFDB.ArrayUtils.keySort(this.props.data, this.props.sortKey);
+ if (this.props.sortDirection == Internal.LibraryComponents.Table.SortDirection.DESCENDING) this.props.data.reverse();
+ if (typeof this.props.onSort == "function") this.props.onSort(this.props.sortKey, this.props.sortDirection);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ }));
+ }
+ };
+
+ CustomComponents.TextArea = reactInitialized && class BDFDB_TextArea extends Internal.LibraryModules.React.Component {
+ handleChange(e) {
+ this.props.value = e;
+ if (typeof this.props.onChange == "function") this.props.onChange(e, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleBlur(e) {if (typeof this.props.onBlur == "function") this.props.onBlur(e, this);}
+ handleFocus(e) {if (typeof this.props.onFocus == "function") this.props.onFocus(e, this);}
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.NativeSubComponents.TextArea, Object.assign({}, this.props, {
+ onChange: this.handleChange.bind(this),
+ onBlur: this.handleBlur.bind(this),
+ onFocus: this.handleFocus.bind(this)
+ }));
+ }
+ };
+
+ CustomComponents.TextGradientElement = reactInitialized && class BDFDB_TextGradientElement extends Internal.LibraryModules.React.Component {
+ render() {
+ if (this.props.gradient && this.props.children) return BDFDB.ReactUtils.createElement("span", {
+ children: this.props.children,
+ ref: instance => {
+ let ele = BDFDB.ReactUtils.findDOMNode(instance);
+ if (ele) {
+ ele.style.setProperty("background-image", this.props.gradient, "important");
+ ele.style.setProperty("color", "transparent", "important");
+ ele.style.setProperty("text-decoration-color", BDFDB.ColorUtils.convert(this.props.gradient[0], "RGBA"), "important");
+ ele.style.setProperty("-webkit-background-clip", "text", "important");
+ }
+ }
+ });
+ return this.props.children || null;
+ }
+ };
+
+ CustomComponents.TextInput = reactInitialized && class BDFDB_TextInput extends Internal.LibraryModules.React.Component {
+ handleChange(e) {
+ let value = e = BDFDB.ObjectUtils.is(e) ? e.currentTarget.value : e;
+ this.props.value = this.props.valuePrefix && !value.startsWith(this.props.valuePrefix) ? (this.props.valuePrefix + value) : value;
+ if (typeof this.props.onChange == "function") this.props.onChange(this.props.value, this);
+ BDFDB.ReactUtils.forceUpdate(this);
+ }
+ handleInput(e) {if (typeof this.props.onInput == "function") this.props.onInput(BDFDB.ObjectUtils.is(e) ? e.currentTarget.value : e, this);}
+ handleKeyDown(e) {if (typeof this.props.onKeyDown == "function") this.props.onKeyDown(e, this);}
+ handleBlur(e) {if (typeof this.props.onBlur == "function") this.props.onBlur(e, this);}
+ handleFocus(e) {if (typeof this.props.onFocus == "function") this.props.onFocus(e, this);}
+ handleMouseEnter(e) {if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);}
+ handleMouseLeave(e) {if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);}
+ handleNumberButton(ins, value) {
+ BDFDB.TimeUtils.clear(this.pressedTimeout);
+ this.pressedTimeout = BDFDB.TimeUtils.timeout(_ => {
+ delete this.props.focused;
+ BDFDB.ReactUtils.forceUpdate(this);
+ }, 1000);
+ this.props.focused = true;
+ this.handleChange.apply(this, [value]);
+ this.handleInput.apply(this, [value]);
+ }
+ componentDidMount() {
+ if (this.props.type == "file") {
+ let navigatorInstance = BDFDB.ReactUtils.findOwner(this, {name: "BDFDB_FileButton"});
+ if (navigatorInstance) navigatorInstance.refInput = this;
+ }
+ let input = BDFDB.ReactUtils.findDOMNode(this);
+ if (!input) return;
+ input = input.querySelector("input") || input;
+ if (input && !input.patched) {
+ input.addEventListener("keydown", e => {
+ this.handleKeyDown.apply(this, [e]);
+ e.stopImmediatePropagation();
+ });
+ input.patched = true;
+ }
+ }
+ render() {
+ let inputChildren = [
+ BDFDB.ReactUtils.createElement("input", BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ className: BDFDB.DOMUtils.formatClassName(this.props.size || BDFDB.disCN.inputdefault, this.props.inputClassName, this.props.focused && BDFDB.disCN.inputfocused, this.props.error || this.props.errorMessage ? BDFDB.disCN.inputerror : (this.props.success && BDFDB.disCN.inputsuccess), this.props.disabled && BDFDB.disCN.inputdisabled, this.props.editable && BDFDB.disCN.inputeditable),
+ type: this.props.type == "color" || this.props.type == "file" ? "text" : this.props.type,
+ onChange: this.handleChange.bind(this),
+ onInput: this.handleInput.bind(this),
+ onKeyDown: this.handleKeyDown.bind(this),
+ onBlur: this.handleBlur.bind(this),
+ onFocus: this.handleFocus.bind(this),
+ onMouseEnter: this.handleMouseEnter.bind(this),
+ onMouseLeave: this.handleMouseLeave.bind(this),
+ maxLength: this.props.type == "file" ? false : this.props.maxLength,
+ style: this.props.width ? {width: `${this.props.width}px`} : {},
+ ref: this.props.inputRef
+ }), "errorMessage", "focused", "error", "success", "inputClassName", "inputChildren", "valuePrefix", "inputPrefix", "size", "editable", "inputRef", "style", "mode", "colorPickerOpen", "noAlpha", "filter", "useFilePath", "searchFolders")),
+ this.props.inputChildren,
+ this.props.type == "color" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ wrap: true,
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.ColorSwatches, {
+ colors: [],
+ color: this.props.value && this.props.mode == "comp" ? BDFDB.ColorUtils.convert(this.props.value.split(","), "RGB") : this.props.value,
+ onColorChange: color => this.handleChange.apply(this, [!color ? "" : (this.props.mode == "comp" ? BDFDB.ColorUtils.convert(color, "RGBCOMP").slice(0, 3).join(",") : BDFDB.ColorUtils.convert(color, this.props.noAlpha ? "RGB" : "RGBA"))]),
+ pickerOpen: this.props.colorPickerOpen,
+ onPickerOpen: _ => this.props.colorPickerOpen = true,
+ onPickerClose: _ => delete this.props.colorPickerOpen,
+ ref: this.props.controlsRef,
+ pickerConfig: {gradient: false, alpha: this.props.mode != "comp" && !this.props.noAlpha}
+ })
+ }) : null,
+ this.props.type == "file" ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.FileButton, {
+ filter: this.props.filter,
+ mode: this.props.mode,
+ useFilePath: this.props.useFilePath,
+ searchFolders: this.props.searchFolders,
+ ref: this.props.controlsRef
+ }) : null
+ ].flat(10).filter(n => n);
+
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.inputwrapper, this.props.type == "number" && (this.props.size && Internal.LibraryComponents.TextInput.Sizes[this.props.size.toUpperCase()] && BDFDB.disCN["inputnumberwrapper" + this.props.size.toLowerCase()] || BDFDB.disCN.inputnumberwrapperdefault), this.props.className),
+ style: this.props.style,
+ children: [
+ this.props.inputPrefix ? BDFDB.ReactUtils.createElement("span", {
+ className: BDFDB.disCN.inputprefix
+ }) : null,
+ this.props.type == "number" ? BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.inputnumberbuttons,
+ children: [
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.inputnumberbuttonup,
+ onClick: e => {
+ let min = parseInt(this.props.min);
+ let max = parseInt(this.props.max);
+ let newV = parseInt(this.props.value) + 1 || min || 0;
+ if (isNaN(max) || !isNaN(max) && newV <= max) this.handleNumberButton.bind(this)(e._targetInst, isNaN(min) || !isNaN(min) && newV >= min ? newV : min);
+ }
+ }),
+ BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.inputnumberbuttondown,
+ onClick: e => {
+ let min = parseInt(this.props.min);
+ let max = parseInt(this.props.max);
+ let newV = parseInt(this.props.value) - 1 || min || 0;
+ if (isNaN(min) || !isNaN(min) && newV >= min) this.handleNumberButton.bind(this)(e._targetInst, isNaN(max) || !isNaN(max) && newV <= max ? newV : max);
+ }
+ })
+ ]
+ }) : null,
+ inputChildren.length == 1 ? inputChildren[0] : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex, {
+ align: Internal.LibraryComponents.Flex.Align.CENTER,
+ children: inputChildren.map((child, i) => i != 0 ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Flex.Child, {
+ shrink: 0,
+ children: child
+ }) : child)
+ }),
+ this.props.errorMessage ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TextElement, {
+ className: BDFDB.disCN.margintop8,
+ size: Internal.LibraryComponents.TextElement.Sizes.SIZE_12,
+ color: Internal.LibraryComponents.TextElement.Colors.STATUS_RED,
+ children: this.props.errorMessage
+ }) : null
+ ].filter(n => n)
+ });
+ }
+ };
+
+ CustomComponents.TextScroller = reactInitialized && class BDFDB_TextScroller extends Internal.LibraryModules.React.Component {
+ render() {
+ let scrolling, scroll = _ => {};
+ return BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.DOMUtils.formatClassName(BDFDB.disCN.textscroller, this.props.className),
+ style: Object.assign({}, this.props.style, {
+ position: "relative",
+ display: "block",
+ overflow: "hidden"
+ }),
+ ref: instance => {
+ const ele = BDFDB.ReactUtils.findDOMNode(instance);
+ if (ele && ele.parentElement) {
+ BDFDB.DOMUtils.hide(ele);
+ const maxWidth = BDFDB.DOMUtils.getInnerWidth(ele.parentElement);
+ if (maxWidth > 50) ele.style.setProperty("max-width", `${maxWidth}px`);
+ BDFDB.DOMUtils.show(ele);
+ if (!this.props.initiated) BDFDB.TimeUtils.timeout(_ => {
+ this.props.initiated = true;
+ if (document.contains(ele.parentElement)) BDFDB.ReactUtils.forceUpdate(this);
+ }, 3000);
+ const Animation = new Internal.LibraryModules.AnimationUtils.Value(0);
+ Animation.interpolate({inputRange: [0, 1], outputRange: [0, (BDFDB.DOMUtils.getRects(ele.firstElementChild).width - BDFDB.DOMUtils.getRects(ele).width) * -1]}).addListener(v => {
+ ele.firstElementChild.style.setProperty("display", v.value == 0 ? "inline" : "block", "important");
+ ele.firstElementChild.style.setProperty("left", `${v.value}px`, "important");
+ });
+ scroll = p => {
+ const display = ele.firstElementChild.style.getPropertyValue("display");
+ ele.firstElementChild.style.setProperty("display", "inline", "important");
+ const innerWidth = BDFDB.DOMUtils.getRects(ele.firstElementChild).width;
+ const outerWidth = BDFDB.DOMUtils.getRects(ele).width;
+ ele.firstElementChild.style.setProperty("display", display, "important");
+
+ let w = p + parseFloat(ele.firstElementChild.style.getPropertyValue("left")) / (innerWidth - outerWidth);
+ w = isNaN(w) || !isFinite(w) ? p : w;
+ w *= innerWidth / (outerWidth * 2);
+ Internal.LibraryModules.AnimationUtils.parallel([Internal.LibraryModules.AnimationUtils.timing(Animation, {toValue: p, duration: Math.sqrt(w**2) * 4000 / (parseInt(this.props.speed) || 1)})]).start();
+ };
+ }
+ },
+ onClick: e => {
+ if (typeof this.props.onClick == "function") this.props.onClick(e, this);
+ },
+ onMouseEnter: e => {
+ if (BDFDB.DOMUtils.getRects(e.currentTarget).width < BDFDB.DOMUtils.getRects(e.currentTarget.firstElementChild).width || e.currentTarget.firstElementChild.style.getPropertyValue("display") != "inline") {
+ scrolling = true;
+ scroll(1);
+ }
+ },
+ onMouseLeave: e => {
+ if (scrolling) {
+ scrolling = false;
+ scroll(0);
+ }
+ },
+ children: BDFDB.ReactUtils.createElement("div", {
+ style: {
+ left: "0",
+ position: "relative",
+ display: "inline",
+ whiteSpace: "nowrap"
+ },
+ children: this.props.children
+ })
+ });
+ }
+ };
+ CustomComponents.TooltipContainer = reactInitialized && class BDFDB_TooltipContainer extends Internal.LibraryModules.React.Component {
+ updateTooltip(text) {
+ if (this.tooltip) this.tooltip.update(text);
+ }
+ render() {
+ let child = (typeof this.props.children == "function" ? this.props.children() : (BDFDB.ArrayUtils.is(this.props.children) ? this.props.children[0] : this.props.children)) || BDFDB.ReactUtils.createElement("div", {});
+ if (!child || !child.props) return null;
+ child.props.className = BDFDB.DOMUtils.formatClassName(child.props.className, this.props.className);
+ let childProps = Object.assign({}, child.props);
+ let shown = false;
+ child.props.onMouseEnter = (e, childThis) => {
+ if (!shown && !e.currentTarget.__BDFDBtooltipShown && !(this.props.onlyShowOnShift && !e.shiftKey) && !(this.props.onlyShowOnCtrl && !e.ctrlKey)) {
+ e.currentTarget.__BDFDBtooltipShown = shown = true;
+ this.tooltip = BDFDB.TooltipUtils.create(e.currentTarget, typeof this.props.text == "function" ? this.props.text(this, e) : this.props.text, Object.assign({
+ note: this.props.note,
+ delay: this.props.delay
+ }, this.props.tooltipConfig, {
+ onHide: (tooltip, anker) => {
+ delete anker.__BDFDBtooltipShown;
+ shown = false;
+ if (this.props.tooltipConfig && typeof this.props.tooltipConfig.onHide == "function") this.props.tooltipConfig.onHide(tooltip, anker);
+ }
+ }));
+ if (typeof this.props.onMouseEnter == "function") this.props.onMouseEnter(e, this);
+ if (typeof childProps.onMouseEnter == "function") childProps.onMouseEnter(e, childThis);
+ }
+ };
+ child.props.onMouseLeave = (e, childThis) => {
+ if (typeof this.props.onMouseLeave == "function") this.props.onMouseLeave(e, this);
+ if (typeof childProps.onMouseLeave == "function") childProps.onMouseLeave(e, childThis);
+ };
+ child.props.onClick = (e, childThis) => {
+ if (typeof this.props.onClick == "function") this.props.onClick(e, this);
+ if (typeof childProps.onClick == "function") childProps.onClick(e, childThis);
+ if (typeof this.props.text == "function") this.updateTooltip(this.props.text(this, e));
+ };
+ child.props.onContextMenu = (e, childThis) => {
+ if (typeof this.props.onContextMenu == "function") this.props.onContextMenu(e, this);
+ if (typeof childProps.onContextMenu == "function") childProps.onContextMenu(e, childThis);
+ if (typeof this.props.text == "function") this.updateTooltip(this.props.text(this, e));
+ };
+ return BDFDB.ReactUtils.createElement(Internal.LibraryModules.React.Fragment, {
+ children: child
+ });
+ }
+ };
+ CustomComponents.TooltipContainer.Positions = {
+ BOTTOM: "bottom",
+ CENTER: "center",
+ LEFT: "left",
+ RIGHT: "right",
+ TOP: "top",
+ WINDOW_CENTER: "window_center"
+ };
+
+ CustomComponents.UserPopoutContainer = reactInitialized && class BDFDB_UserPopoutContainer extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(Internal.LibraryComponents.PopoutContainer, BDFDB.ObjectUtils.exclude(Object.assign({}, this.props, {
+ wrap: false,
+ renderPopout: instance => BDFDB.ReactUtils.createElement(Internal.LibraryComponents.UserPopout, {
+ user: Internal.LibraryStores.UserStore.getUser(this.props.userId),
+ userId: this.props.userId,
+ channelId: this.props.channelId,
+ guildId: this.props.guildId
+ }),
+ }), "userId", "channelId", "guildId"));
+ }
+ };
+
+ CustomComponents.UserMention = reactInitialized && class BDFDB_UserMention extends Internal.LibraryModules.React.Component {
+ render() {
+ let user = this.props.user || Internal.LibraryStores.UserStore.getUser(this.props.userId);
+ let channel = Internal.LibraryStores.ChannelStore.getChannel(this.props.channelId);
+ let guildId = this.props.guildId || channel && channel.guild_id;
+ let mention = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ className: this.props.className,
+ onContextMenu: event => BDFDB.UserUtils.openMenu(user, guildId, channel.id, event),
+ children: "@" + BDFDB.LibraryModules.UserNameUtils.getName(guildId, this.props.channelId, user)
+ });
+ return this.props.inlinePreview ? mention : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.UserPopoutContainer, Object.assign({}, this.props, {
+ position: Internal.LibraryComponents.PopoutContainer.Positions.RIGHT,
+ align: Internal.LibraryComponents.PopoutContainer.Align.BOTTOM,
+ children: mention
+ }));
+ }
+ };
+
+ const VideoInner = function (props) {
+ let ref = BDFDB.ReactUtils.useRef(null);
+ BDFDB.ReactUtils.useEffect(_ => {
+ if (ref.current) props.play ? ref.current.play() : ref.current.pause();
+ }, [props.play]);
+ return props.ignoreMaxSize || props.naturalWidth <= Internal.DiscordConstants.MAX_VIDEO_WIDTH && props.naturalHeight <= Internal.DiscordConstants.MAX_VIDEO_HEIGHT || props.naturalWidth <= Internal.DiscordConstants.MAX_VIDEO_HEIGHT && props.naturalHeight <= Internal.DiscordConstants.MAX_VIDEO_WIDTH ? BDFDB.ReactUtils.createElement(Internal.LibraryComponents.VideoForwardRef, {
+ ref: ref,
+ className: props.className,
+ poster: props.poster,
+ src: props.src,
+ width: props.width,
+ height: props.height,
+ muted: true,
+ loop: true,
+ autoPlay: props.play,
+ playOnHover: props.playOnHover,
+ preload: "none"
+ }) : BDFDB.ReactUtils.createElement("img", {
+ alt: "",
+ src: props.poster,
+ width: props.width,
+ height: props.height
+ });
+ };
+ CustomComponents.Video = reactInitialized && class BDFDB_Video extends Internal.LibraryModules.React.Component {
+ render() {
+ return BDFDB.ReactUtils.createElement(VideoInner, this.props);
+ }
+ };
+
+ Internal.LibraryComponents = new Proxy(LibraryComponents, {
+ get: function (_, item) {
+ if (LibraryComponents[item]) return LibraryComponents[item];
+ if (!InternalData.LibraryComponents[item] && !CustomComponents[item]) return "div";
+
+ Internal.findModuleViaData(LibraryComponents, InternalData.LibraryComponents, item);
+
+ if (CustomComponents[item]) LibraryComponents[item] = LibraryComponents[item] ? Object.assign({}, LibraryComponents[item], CustomComponents[item]) : CustomComponents[item];
+
+ const NativeComponent = LibraryComponents[item] && Internal.NativeSubComponents[item];
+ if (NativeComponent && typeof NativeComponent != "string") {
+ for (let key in NativeComponent) if (key != "displayName" && key != "name" && (typeof NativeComponent[key] != "function" || key.charAt(0) == key.charAt(0).toUpperCase())) {
+ if (key == "defaultProps") LibraryComponents[item][key] = Object.assign({}, LibraryComponents[item][key], NativeComponent[key]);
+ else if (!LibraryComponents[item][key]) LibraryComponents[item][key] = NativeComponent[key];
+ }
+ if (LibraryComponents[item].ObjectProperties) for (let key of LibraryComponents[item].ObjectProperties) if (!LibraryComponents[item][key]) LibraryComponents[item][key] = {};
+ }
+ return LibraryComponents[item] ? LibraryComponents[item] : "div";
+ }
+ });
+
+ const RealFilteredMenuItems = Object.keys(RealMenuItems).filter(type => typeof RealMenuItems[type] == "function" && RealMenuItems[type].toString().replace(/[\n\t\r]/g, "").endsWith("{return null}"));
+ for (let type of RealFilteredMenuItems) {
+ let children = BDFDB.ObjectUtils.get(BDFDB.ReactUtils.hookCall(Internal.LibraryComponents.Menu, {hideScroller: true, children: BDFDB.ReactUtils.createElement(RealMenuItems[type], {})}, true), "props.children.props.children.props.children");
+ let menuItem = (BDFDB.ArrayUtils.is(children) ? children : []).flat(10).filter(n => n)[0];
+ if (menuItem) {
+ let menuItemsProps = BDFDB.ReactUtils.findValue(menuItem, "menuItemProps");
+ if (menuItemsProps && menuItemsProps.id == "undefined-empty") MappedMenuItems.MenuGroup = type;
+ else if (menuItemsProps && menuItemsProps.role) {
+ switch (menuItemsProps.role) {
+ case "menuitemcheckbox": MappedMenuItems.MenuCheckboxItem = type; break;
+ case "menuitemradio": MappedMenuItems.MenuRadioItem = type; break;
+ case "menuitem": {
+ if (Object.keys(menuItem.props).includes("children")) MappedMenuItems.MenuControlItem = type;
+ else if (Object.keys(menuItem.props).includes("hasSubmenu")) MappedMenuItems.MenuItem = type;
+ break;
+ }
+ }
+ }
+ else {
+ let key = BDFDB.ReactUtils.findValue(menuItem, "key");
+ if (typeof key == "string" && key.startsWith("separator")) MappedMenuItems.MenuSeparator = type;
+ }
+ }
+ }
+ LibraryComponents.MenuItems = new Proxy(RealFilteredMenuItems.reduce((a, v) => ({ ...a, [v]: v}), {}) , {
+ get: function (_, item) {
+ if (CustomComponents.MenuItems[item]) return CustomComponents.MenuItems[item];
+ if (RealMenuItems[item]) return RealMenuItems[item];
+ if (MappedMenuItems[item] && RealMenuItems[MappedMenuItems[item]]) return RealMenuItems[MappedMenuItems[item]];
+ return null;
+ }
+ });
+
+ BDFDB.LibraryComponents = Internal.LibraryComponents;
+
+ const keyDownTimeouts = {};
+ let unfocusedWindow = false;
+ BDFDB.ListenerUtils.add(BDFDB, document, "keydown.BDFDBPressedKeys", e => {
+ if (!pressedKeys.includes(e.which)) {
+ BDFDB.TimeUtils.clear(keyDownTimeouts[e.which]);
+ pressedKeys.push(e.which);
+ keyDownTimeouts[e.which] = BDFDB.TimeUtils.timeout(_ => {
+ BDFDB.ArrayUtils.remove(pressedKeys, e.which, true);
+ }, 60000);
+ }
+ });
+ BDFDB.ListenerUtils.add(BDFDB, document, "keyup.BDFDBPressedKeys", e => {
+ BDFDB.TimeUtils.clear(keyDownTimeouts[e.which]);
+ BDFDB.ArrayUtils.remove(pressedKeys, e.which, true);
+ });
+ BDFDB.ListenerUtils.add(BDFDB, window, "focus.BDFDBPressedKeysReset", e => {
+ if (unfocusedWindow) {
+ pressedKeys = [];
+ unfocusedWindow = false;
+ }
+ });
+ BDFDB.ListenerUtils.add(BDFDB, window, "blur.BDFDBPressedKeysReset", e => {
+ if (!document.querySelector(":hover")) unfocusedWindow = true;
+ });
+ BDFDB.ListenerUtils.add(BDFDB, document, "mousedown.BDFDBMousePosition", e => {
+ mousePosition = e;
+ });
+
+ Internal.modulePatches = {
+ before: [
+ "BlobMask",
+ "EmojiPickerListRow",
+ "MemberListItem",
+ "Menu",
+ "MessageActionsContextMenu",
+ "MessageHeader",
+ "NameContainer",
+ "SearchBar"
+ ],
+ after: [
+ "DiscordTag",
+ "UserPopoutAvatar"
+ ],
+ componentDidMount: [
+ "Account",
+ "AnalyticsContext"
+ ],
+ componentDidUpdate: [
+ "Account",
+ "AnalyticsContext"
+ ]
+ };
+
+ const BDFDB_Patrons = Object.assign({}, InternalData.BDFDB_Patrons), BDFDB_Patron_Tiers = Object.assign({}, InternalData.BDFDB_Patron_Tiers);
+ Internal._processAvatarMount = function (user, avatar, wrapper) {
+ if (!user) return;
+ if (Node.prototype.isPrototypeOf(avatar) && (avatar.className || "").indexOf(BDFDB.disCN.bdfdbbadgeavatar) == -1) {
+ let role = "", note = "", color, link, addBadge = Internal.settings.general.showSupportBadges;
+ if (BDFDB_Patrons[user.id] && BDFDB_Patrons[user.id].active) {
+ link = "https://www.patreon.com/MircoWittrien";
+ role = BDFDB_Patrons[user.id].text || (BDFDB_Patron_Tiers[BDFDB_Patrons[user.id].tier] || {}).text;
+ note = BDFDB_Patrons[user.id].text && (BDFDB_Patron_Tiers[BDFDB_Patrons[user.id].tier] || {}).text;
+ color = BDFDB_Patrons[user.id].color;
+ avatar.className = BDFDB.DOMUtils.formatClassName(avatar.className, addBadge && BDFDB.disCN.bdfdbhasbadge, BDFDB.disCN.bdfdbbadgeavatar, BDFDB.disCN.bdfdbsupporter, BDFDB.disCN[`bdfdbsupporter${BDFDB_Patrons[user.id].tier}`]);
+ }
+ else if (user.id == InternalData.myId) {
+ addBadge = true;
+ role = `Theme ${BDFDB.LanguageUtils.LibraryStrings.developer}`;
+ avatar.className = BDFDB.DOMUtils.formatClassName(avatar.className, addBadge && BDFDB.disCN.bdfdbhasbadge, BDFDB.disCN.bdfdbbadgeavatar, BDFDB.disCN.bdfdbdev);
+ }
+ if (addBadge && role && !avatar.querySelector(BDFDB.dotCN.bdfdbbadge)) {
+ let badge = document.createElement("div");
+ badge.className = BDFDB.disCN.bdfdbbadge;
+ badge.setAttribute("user-id", user.id);
+ if (link) badge.addEventListener("click", _ => BDFDB.DiscordUtils.openLink(link));
+ badge.addEventListener("mouseenter", _ => BDFDB.TooltipUtils.create(badge, role, {position: "top", note: note, backgroundColor: color || ""}));
+ avatar.appendChild(badge);
+ }
+ }
+ };
+ Internal._processAvatarRender = function (user, avatar, className) {
+ if (BDFDB.ReactUtils.isValidElement(avatar) && BDFDB.ObjectUtils.is(user) && (avatar.props.className || "").indexOf(BDFDB.disCN.bdfdbbadgeavatar) == -1) {
+ let role = "", note = "", color, link, addBadge = Internal.settings.general.showSupportBadges;
+ if (BDFDB_Patrons[user.id] && BDFDB_Patrons[user.id].active) {
+ link = "https://www.patreon.com/MircoWittrien";
+ role = BDFDB_Patrons[user.id].text || (BDFDB_Patron_Tiers[BDFDB_Patrons[user.id].tier] || {}).text;
+ note = BDFDB_Patrons[user.id].text && (BDFDB_Patron_Tiers[BDFDB_Patrons[user.id].tier] || {}).text;
+ color = BDFDB_Patrons[user.id].color;
+ className = BDFDB.DOMUtils.formatClassName(avatar.props.className, className, addBadge && BDFDB.disCN.bdfdbhasbadge, BDFDB.disCN.bdfdbbadgeavatar, BDFDB.disCN.bdfdbsupporter, BDFDB.disCN[`bdfdbsupporter${BDFDB_Patrons[user.id].tier}`]);
+ }
+ else if (user.id == InternalData.myId) {
+ addBadge = true;
+ role = `Theme ${BDFDB.LanguageUtils.LibraryStrings.developer}`;
+ className = BDFDB.DOMUtils.formatClassName(avatar.props.className, className, BDFDB.disCN.bdfdbhasbadge, BDFDB.disCN.bdfdbbadgeavatar, BDFDB.disCN.bdfdbdev);
+ }
+ if (role) {
+ if (avatar.type == "img") avatar = BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Avatars.Avatar, Object.assign({}, avatar.props, {
+ size: Internal.LibraryComponents.AvatarConstants.AvatarSizes.SIZE_40
+ }));
+ delete avatar.props.className;
+ let newProps = {
+ className: className,
+ children: [avatar]
+ };
+ avatar = BDFDB.ReactUtils.createElement("div", newProps);
+ if (addBadge) avatar.props.children.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.TooltipContainer, {
+ text: role,
+ note: note,
+ tooltipConfig: {backgroundColor: color || ""},
+ onClick: link ? (_ => BDFDB.DiscordUtils.openLink(link)) : (_ => {}),
+ children: BDFDB.ReactUtils.createElement("div", {
+ className: BDFDB.disCN.bdfdbbadge,
+ "user-id": user.id
+ })
+ }));
+ return avatar;
+ }
+ }
+ };
+
+ Internal.processAccount = function (e) {
+ Internal._processAvatarMount(e.instance.props.currentUser, e.node.querySelector(BDFDB.dotCN.avatarwrapper), e.node);
+ };
+ Internal.processAnalyticsContext = function (e) {
+ if (e.instance.props.section != Internal.DiscordConstants.AnalyticsSections.PROFILE_MODAL && e.instance.props.section != Internal.DiscordConstants.AnalyticsSections.PROFILE_POPOUT) return;
+ const user = BDFDB.ReactUtils.findValue(e.instance, "user");
+ if (!user) return;
+ const avatar = e.instance.props.section != Internal.DiscordConstants.AnalyticsSections.PROFILE_POPOUT && e.node.querySelector(BDFDB.dotCN.avatarwrapper);
+ const wrapper = e.node.querySelector(BDFDB.dotCNC.userpopoutouter + BDFDB.dotCN.userprofilemodal) || e.node;
+ if (avatar) Internal._processAvatarMount(user, avatar, wrapper);
+ };
+ Internal.processBlobMask = function (e) {
+ if (!e.component.prototype || BDFDB.PatchUtils.isPatched(BDFDB, e.component.prototype, "render")) return;
+
+ let newBadges = ["lowerLeftBadge", "upperLeftBadge"];
+ let extraDefaultProps = {};
+ for (let type of newBadges) extraDefaultProps[`${type}Width`] = 16;
+
+ BDFDB.PatchUtils.patch(BDFDB, e.component.prototype, "render", {
+ before: e2 => {
+ e2.instance.props = Object.assign({}, e.component.defaultProps, extraDefaultProps, e2.instance.props);
+ for (let type of newBadges) if (!e2.instance.state[`${type}Mask`]) e2.instance.state[`${type}Mask`] = new Internal.LibraryComponents.Animations.Controller({spring: 0});
+ },
+ after: e2 => {
+ let [tChildren, tIndex] = BDFDB.ReactUtils.findParent(e2.returnValue, {name: "TransitionGroup"});
+ if (tIndex > -1) {
+ tChildren[tIndex].props.children.push(!e2.instance.props.lowerLeftBadge ? null : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.BadgeAnimationContainer, {
+ className: BDFDB.disCN.guildlowerleftbadge,
+ key: "lower-left-badge",
+ animatedStyle: _ => {
+ const spring = e2.instance.state.lowerLeftBadgeMask.springs.spring;
+ return {
+ opacity: spring.to([0, .5, 1], [0, 0, 1]),
+ transform: spring.to(value => "translate(" + -1 * (16 - 16 * value) + "px, " + (16 - 16 * value) + "px)")
+ };
+ },
+ children: e2.instance.props.lowerLeftBadge
+ }));
+ tChildren[tIndex].props.children.push(!e2.instance.props.upperLeftBadge ? null : BDFDB.ReactUtils.createElement(Internal.LibraryComponents.BadgeAnimationContainer, {
+ className: BDFDB.disCN.guildupperleftbadge,
+ key: "upper-left-badge",
+ animatedStyle: _ => {
+ const spring = e2.instance.state.upperLeftBadgeMask.springs.spring;
+ return {
+ opacity: spring.to([0, .5, 1], [0, 0, 1]),
+ transform: spring.to(value => "translate(" + -1 * (16 - 16 * value) + "px, " + -1 * (16 - 16 * value) + "px)")
+ };
+ },
+ children: e2.instance.props.upperLeftBadge
+ }));
+ }
+ let [mChildren, mIndex] = BDFDB.ReactUtils.findParent(e2.returnValue, {type: "mask"});
+ if (mIndex > -1) {
+ mChildren[mIndex].props.children.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.rect, {
+ x: -4,
+ y: -4,
+ width: e2.instance.props.upperLeftBadgeWidth + 8,
+ height: 24,
+ rx: 12,
+ ry: 12,
+ transform: e2.instance.state.upperLeftBadgeMask.springs.spring.to([0, 1], [20, 0]).to(value => `translate(${value * -1} ${value * -1})`),
+ fill: "black"
+ }));
+ mChildren[mIndex].props.children.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Animations.animated.rect, {
+ x: -4,
+ y: 28,
+ width: e2.instance.props.lowerLeftBadgeWidth + 8,
+ height: 24,
+ rx: 12,
+ ry: 12,
+ transform: e2.instance.state.lowerLeftBadgeMask.springs.spring.to([0, 1], [20, 0]).to(value => `translate(${value * -1} ${value * 1})`),
+ fill: "black"
+ }));
+ }
+ }
+ }, {name: "BlobMask"});
+ BDFDB.PatchUtils.patch(BDFDB, e.component.prototype, "componentDidMount", {
+ after: e2 => {
+ for (let type of newBadges) e2.instance.state[`${type}Mask`].update({
+ spring: e2.instance.props[type] != null ? 1 : 0,
+ immediate: true
+ }).start();
+ }
+ }, {name: "BlobMask"});
+ BDFDB.PatchUtils.patch(BDFDB, e.component.prototype, "componentWillUnmount", {
+ after: e2 => {
+ for (let type of newBadges) if (e2.instance.state[`${type}Mask`]) e2.instance.state[`${type}Mask`].dispose();
+ }
+ });
+ BDFDB.PatchUtils.patch(BDFDB, e.component.prototype, "componentDidUpdate", {
+ after: e2 => {
+ for (let type of newBadges) if (e2.instance.props[type] != null && e2.methodArguments[0][type] == null) {
+ e2.instance.state[`${type}Mask`].update({
+ spring: 1,
+ immediate: !document.hasFocus(),
+ config: {friction: 30, tension: 900, mass: 1}
+ }).start();
+ }
+ else if (e2.instance.props[type] == null && e2.methodArguments[0][type] != null) {
+ e2.instance.state[`${type}Mask`].update({
+ spring: 0,
+ immediate: !document.hasFocus(),
+ config: {duration: 150, friction: 10, tension: 100, mass: 1}
+ }).start();
+ }
+ }
+ }, {name: "BlobMask"});
+ };
+ Internal.processDiscordTag = function (e) {
+ if (e.instance && e.instance.props && e.returnvalue && e.instance.props.user) e.returnvalue.props.user = e.instance.props.user;
+ };
+ Internal.processEmojiPickerListRow = function (e) {
+ if (e.instance.props.emojiDescriptors && Internal.LibraryComponents.EmojiPickerButton.current && Internal.LibraryComponents.EmojiPickerButton.current.props && Internal.LibraryComponents.EmojiPickerButton.current.props.allowManagedEmojisUsage) for (let i in e.instance.props.emojiDescriptors) e.instance.props.emojiDescriptors[i] = Object.assign({}, e.instance.props.emojiDescriptors[i], {isDisabled: false});
+ };
+ var memberStore = {};
+ Internal.processMemberListItem = function (e) {
+ if (!e.instance.props.channel || !e.instance.props.user) return;
+ if (!memberStore || !memberStore.channel || memberStore.channel.id != e.instance.props.channel.id) memberStore = {channel: e.instance.props.channel, members: {}};
+ let src = BDFDB.UserUtils.getAvatar(e.instance.props.user.id);
+ if (!src) return;
+ memberStore.members[(src.split(".com")[1] || src).split("/").slice(0, 3).join("/").split(".")[0] + " " + e.instance.props.user.username] = e.instance.props.user;
+ };
+ Internal.processNameContainer = function (e) {
+ if (e.instance.props.innerClassName != BDFDB.disCN.memberinner || !memberStore || !memberStore.members) return;
+ let avatar = BDFDB.ReactUtils.findChild(e.instance.props.avatar, {props: ["src"]});
+ if (!avatar) return;
+ let src = avatar.props._originalSrc || avatar.props.src;
+ if (!src) return;
+ src = (src.split(".com")[1] || src).split("/").slice(0, 3).join("/").split(".")[0];
+ let username = avatar.props["aria-label"];
+ if (!memberStore.members[src + " " + username]) return;
+ e.instance.props.user = memberStore.members[src + " " + username];
+ e.instance.props.channel = memberStore.channel;
+ e.instance.props.avatar = Internal._processAvatarRender(e.instance.props.user, e.instance.props.avatar) || e.instance.props.avatar;
+ };
+ Internal.processMenu = function (e) {
+ if (e.instance.props && (e.instance.props.children || BDFDB.ArrayUtils.is(e.instance.props.children) && e.instance.props.children.length)) {
+ let patchCancel = BDFDB.PatchUtils.patch(BDFDB, Internal.LibraryModules.ContextMenuUtils, "closeContextMenu", {instead: e => {}});
+ BDFDB.TimeUtils.timeout(_ => patchCancel());
+ }
+ };
+ Internal.processMessageActionsContextMenu = function (e) {
+ e.instance.props.updatePosition = _ => {};
+ };
+ Internal.processMessageHeader = function (e) {
+ if (e.instance.props.message && e.instance.props.message.author) {
+ if (e.instance.props.avatar && e.instance.props.avatar.props && typeof e.instance.props.avatar.props.children == "function") {
+ let renderChildren = e.instance.props.avatar.props.children;
+ e.instance.props.avatar.props.children = BDFDB.TimeUtils.suppress((...args) => {
+ let renderedChildren = renderChildren(...args);
+ return Internal._processAvatarRender(e.instance.props.message.author, renderedChildren, BDFDB.disCN.messageavatar) || renderedChildren;
+ }, "Error in Avatar Render of MessageHeader!");
+ }
+ }
+ };
+ Internal.processSearchBar = function (e) {
+ if (typeof e.instance.props.query != "string") e.instance.props.query = "";
+ };
+ Internal.processUserPopoutAvatar = function (e) {
+ if (!e.instance.props.user) return;
+ let [children, index] = BDFDB.ReactUtils.findParent(e.returnvalue, {props: [["className", BDFDB.disCN.userpopoutavatarwrapper]]});
+ if (index > -1) children[index] = Internal._processAvatarRender(e.instance.props.user, children[index], e.instance) || children[index];
+ };
+
+ MyReact.instanceKey = Object.keys(document.querySelector(BDFDB.dotCN.app) || {}).some(n => n.startsWith("__reactInternalInstance")) ? "_reactInternalFiber" : "_reactInternals";
+
+ BDFDB.PluginUtils.load(BDFDB);
+ Internal.settings = BDFDB.DataUtils.get(Internal);
+ changeLogs = BDFDB.DataUtils.load(BDFDB, "changeLogs");
+ BDFDB.PluginUtils.checkChangeLog(BDFDB);
+
+ BDFDB.PatchUtils.unpatch(BDFDB);
+ Internal.addModulePatches(BDFDB);
+ Internal.addContextPatches(BDFDB);
+
+ const possibleRenderPaths = ["render", "type", "type.render"];
+ const createElementPatches = {
+ before: e => {
+ if (!e.methodArguments[0] || typeof e.methodArguments[0] == "string") return;
+ let renderFunction = null;
+ if (typeof e.methodArguments[0] == "function") renderFunction = e.methodArguments[0];
+ else for (const path of possibleRenderPaths) {
+ const possibleRenderFuncion = BDFDB.ObjectUtils.get(e.methodArguments[0], path);
+ if (typeof possibleRenderFuncion == "function") {
+ renderFunction = possibleRenderFuncion;
+ break;
+ }
+ }
+ if (!renderFunction || typeof renderFunction != "function") return;
+ if (PluginStores.modulePatches.before) for (const type in PluginStores.modulePatches.before) if (Internal.isCorrectModule(renderFunction, type, true)) {
+ let hasArgumentChildren = false, children = [...e.methodArguments].slice(2);
+ if (children.length && e.methodArguments[1].children === undefined) {
+ hasArgumentChildren = true;
+ e.methodArguments[1].children = children;
+ }
+ for (let plugin of PluginStores.modulePatches.before[type].flat(10)) Internal.initiatePatch(plugin, type, {
+ arguments: e.methodArguments,
+ instance: {props: e.methodArguments[1]},
+ returnvalue: e.returnValue,
+ component: e.methodArguments[0],
+ name: type,
+ methodname: "render",
+ patchtypes: ["before"]
+ });
+ if (hasArgumentChildren) {
+ [].splice.call(e.methodArguments, 2);
+ for (let child of e.methodArguments[1].children) [].push.call(e.methodArguments, child);
+ delete e.methodArguments[1].children;
+ }
+ break;
+ }
+ if (PluginStores.modulePatches.after) {
+ let patchFunction = "", parentModule = e.methodArguments[0];
+ if (parentModule.prototype && typeof parentModule.prototype.render == "function") parentModule = parentModule.prototype, patchFunction = "render";
+ else if (typeof parentModule.render == "function") patchFunction = "render";
+ else if (typeof parentModule.type == "function") patchFunction = "type";
+ else if (parentModule.type && typeof parentModule.type.render == "function") parentModule = parentModule.type, patchFunction = "render";
+ if (patchFunction) for (const type in PluginStores.modulePatches.after) if (Internal.isCorrectModule(renderFunction, type, true)) {
+ for (let plugin of PluginStores.modulePatches.after[type].flat(10)) if (!BDFDB.PatchUtils.isPatched(plugin, parentModule, patchFunction)) {
+ BDFDB.PatchUtils.patch(plugin, parentModule, patchFunction, {after: e2 => Internal.initiatePatch(plugin, type, {
+ arguments: e2.methodArguments,
+ instance: e2.instance,
+ returnvalue: e2.returnValue,
+ component: e.methodArguments[0],
+ name: type,
+ methodname: patchFunction,
+ patchtypes: ["after"]
+ })}, {name: type});
+ }
+ break;
+ }
+ }
+ if (e.methodArguments[0].prototype) for (let patchType of ["componentDidMount", "componentDidUpdate", "componentWillUnmount"]) {
+ if (PluginStores.modulePatches[patchType]) for (const type in PluginStores.modulePatches[patchType]) if (Internal.isCorrectModule(renderFunction, type, true)) {
+ for (let plugin of PluginStores.modulePatches[patchType][type].flat(10)) if (!BDFDB.PatchUtils.isPatched(plugin, e.methodArguments[0].prototype, patchType)) {
+ BDFDB.PatchUtils.patch(plugin, e.methodArguments[0].prototype, patchType, {after: e2 => Internal.initiatePatch(plugin, type, {
+ arguments: e2.methodArguments,
+ instance: e2.instance,
+ returnvalue: e2.returnValue,
+ component: e.methodArguments[0],
+ name: type,
+ methodname: patchType,
+ patchtypes: ["after"]
+ })}, {name: type});
+ }
+ break;
+ }
+ }
+ },
+ after: e => {
+ if (!e.methodArguments[0] || typeof e.methodArguments[0] != "function" || (e.methodArguments[0].prototype && typeof e.methodArguments[0].prototype.render == "function") || !PluginStores.modulePatches.after) return;
+ else for (const type in PluginStores.modulePatches.after) if (Internal.isCorrectModule(e.methodArguments[0], type, true) && !Internal.isCorrectModuleButDontPatch(type)) {
+ for (let plugin of PluginStores.modulePatches.after[type].flat(10)) BDFDB.PatchUtils.patch(plugin, e.returnValue, "type", {after: e2 => Internal.initiatePatch(plugin, type, {
+ arguments: e2.methodArguments,
+ instance: e2.instance,
+ returnvalue: e2.returnValue,
+ component: e.methodArguments[0],
+ name: type,
+ methodname: "type",
+ patchtypes: ["after"]
+ })}, {name: type, noCache: true});
+ break;
+ }
+ }
+ };
+ BDFDB.PatchUtils.patch(BDFDB, LibraryModules.React, "createElement", createElementPatches);
+ if (Internal.LibraryModules.InternalReactUtils) for (let key in Internal.LibraryModules.InternalReactUtils) if (typeof Internal.LibraryModules.InternalReactUtils[key] == "function" && Internal.LibraryModules.InternalReactUtils[key].toString().indexOf("return{$$typeof:") > -1) BDFDB.PatchUtils.patch(BDFDB, Internal.LibraryModules.InternalReactUtils, key, createElementPatches);
+
+ let languageChangeTimeout;
+ BDFDB.PatchUtils.patch(BDFDB, Internal.LibraryModules.AppearanceSettingsUtils, "updateLocale", {after: e => {
+ BDFDB.TimeUtils.clear(languageChangeTimeout);
+ languageChangeTimeout = BDFDB.TimeUtils.timeout(_ => {
+ for (let pluginName in PluginStores.loaded) if (PluginStores.loaded[pluginName].started) BDFDB.PluginUtils.translate(PluginStores.loaded[pluginName]);
+ }, 10000);
+ }});
+
+ Internal.onSettingsClosed = function () {
+ if (Internal.SettingsUpdated) {
+ delete Internal.SettingsUpdated;
+ Internal.forceUpdateAll();
+ }
+ };
+
+ Internal.forceUpdateAll = function () {
+ BDFDB.MessageUtils.rerenderAll();
+ BDFDB.PatchUtils.forceAllUpdates(BDFDB);
+ };
+
+ BDFDB.PatchUtils.patch(BDFDB, Internal.LibraryModules.EmojiStateUtils, "getEmojiUnavailableReason", {after: e => {
+ if (Internal.LibraryComponents.EmojiPickerButton.current && Internal.LibraryComponents.EmojiPickerButton.current.props && Internal.LibraryComponents.EmojiPickerButton.current.props.allowManagedEmojisUsage) return null;
+ }});
+
+ Internal.forceUpdateAll();
+
+ const pluginQueue = window.BDFDB_Global && BDFDB.ArrayUtils.is(window.BDFDB_Global.pluginQueue) ? window.BDFDB_Global.pluginQueue : [];
+
+ if (BDFDB.UserUtils.me.id == InternalData.myId || BDFDB.UserUtils.me.id == "350635509275557888") {
+ BDFDB.DevUtils = {};
+ BDFDB.DevUtils.generateClassId = Internal.generateClassId;
+ BDFDB.DevUtils.findByIndex = function (index) {
+ return BDFDB.DevUtils.req.c[index];
+ };
+ BDFDB.DevUtils.findPropAny = function (...strings) {
+ window.t = {"$filter":(prop => [...strings].flat(10).filter(n => typeof n == "string").every(string => prop.toLowerCase().indexOf(string.toLowerCase()) > -1))};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "object") for (let j in m) if (window.t.$filter(j)) window.t[j + "_" + i] = m;
+ if (m && typeof m == "object" && typeof m.default == "object") for (let j in m.default) if (window.t.$filter(j)) window.t[j + "_default_" + i] = m.default;
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.findPropFunc = function (...strings) {
+ window.t = {"$filter":(prop => [...strings].flat(10).filter(n => typeof n == "string").every(string => prop.toLowerCase().indexOf(string.toLowerCase()) > -1))};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "object") for (let j in m) if (window.t.$filter(j) && typeof m[j] != "string") window.t[j + "_" + i] = m;
+ if (m && typeof m == "object" && typeof m.default == "object") for (let j in m.default) if (window.t.$filter(j) && typeof m.default[j] != "string") window.t[j + "_default_" + i] = m.default;
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.findPropStringLib = function (...strings) {
+ window.t = {"$filter":(prop => [...strings].flat(10).filter(n => typeof n == "string").every(string => prop.toLowerCase().indexOf(string.toLowerCase()) > -1))};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "object") for (let j in m) if (window.t.$filter(j) && typeof m[j] == "string" && /^[A-z0-9]+\-[A-z0-9_-]{6}$/.test(m[j])) window.t[j + "_" + i] = m;
+ if (m && typeof m == "object" && typeof m.default == "object") for (let j in m.default) if (window.t.$filter(j) && typeof m.default[j] == "string" && /^[A-z0-9]+\-[A-z0-9_-]{6}$/.test(m.default[j])) window.t[j + "_default_" + i] = m.default;
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.findNameAny = function (...strings) {
+ window.t = {"$filter":(m => [...strings].flat(10).filter(n => typeof n == "string").some(string => typeof m.displayName == "string" && m.displayName.toLowerCase().indexOf(string.toLowerCase()) > -1 || m.name == "string" && m.name.toLowerCase().indexOf(string.toLowerCase()) > -1))};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && (typeof m == "object" || typeof m == "function") && window.t.$filter(m)) window.t[(m.displayName || m.name) + "_" + i] = m;
+ if (m && (typeof m == "object" || typeof m == "function") && m.default && (typeof m.default == "object" || typeof m.default == "function") && window.t.$filter(m.default)) window.t[(m.default.displayName || m.default.name) + "_" + i] = m.default;
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.findCodeAny = function (...strings) {
+ window.t = {"$filter":(m => Internal.checkModuleStrings(m, strings, {ignoreCase: true}))};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "function" && window.t.$filter(m)) window.t["module_" + i] = {string: m.toString(), func: m};
+ if (m && m.__esModule) {
+ for (let j in m) if (m[j] && typeof m[j] == "function" && window.t.$filter(m[j])) window.t[j + "_module_" + i] = {string: m[j].toString(), func: m[j], module: m};
+ if (m.default && (typeof m.default == "object" || typeof m.default == "function")) for (let j in m.default) if (m.default[j] && typeof m.default[j] == "function" && window.t.$filter(m.default[j])) window.t[j + "_module_" + i + "_default"] = {string: m.default[j].toString(), func: m.default[j], module: m};
+ }
+ }
+ for (let i in BDFDB.DevUtils.req.m) if (typeof BDFDB.DevUtils.req.m[i] == "function" && window.t.$filter(BDFDB.DevUtils.req.m[i])) window.t["function_" + i] = {string: BDFDB.DevUtils.req.m[i].toString(), func: BDFDB.DevUtils.req.m[i]};
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.getAllModules = function () {
+ window.t = {};
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "object") window.t[i] = m;
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.getAllStringLibs = function () {
+ window.t = [];
+ for (let i in BDFDB.DevUtils.req.c) if (BDFDB.DevUtils.req.c.hasOwnProperty(i)) {
+ let m = BDFDB.DevUtils.req.c[i].exports;
+ if (m && typeof m == "object" && !BDFDB.ArrayUtils.is(m) && Object.keys(m).length) {
+ var string = true, stringlib = false;
+ for (let j in m) {
+ if (typeof m[j] != "string") string = false;
+ if (typeof m[j] == "string" && /^[A-z0-9]+\-[A-z0-9_-]{6}$/.test(m[j])) stringlib = true;
+ }
+ if (string && stringlib) window.t.push(m);
+ }
+ if (m && typeof m == "object" && m.default && typeof m.default == "object" && !BDFDB.ArrayUtils.is(m.default) && Object.keys(m.default).length) {
+ var string = true, stringlib = false;
+ for (let j in m.default) {
+ if (typeof m.default[j] != "string") string = false;
+ if (typeof m.default[j] == "string" && /^[A-z0-9]+\-[A-z0-9_-]{6}$/.test(m.default[j])) stringlib = true;
+ }
+ if (string && stringlib) window.t.push(m.default);
+ }
+ }
+ console.clear();
+ console.log(window.t);
+ };
+ BDFDB.DevUtils.listen = function (strings) {
+ strings = BDFDB.ArrayUtils.is(strings) ? strings : Array.from(arguments);
+ BDFDB.DevUtils.listenStop();
+ BDFDB.DevUtils.listen.p = BDFDB.PatchUtils.patch("WebpackSearch", BDFDB.ModuleUtils.findByProperties(strings), strings[0], {after: e => {
+ console.log(e);
+ }});
+ };
+ BDFDB.DevUtils.listenStop = function () {
+ if (typeof BDFDB.DevUtils.listen.p == "function") BDFDB.DevUtils.listen.p();
+ };
+ BDFDB.DevUtils.generateLanguageStrings = function (strings, config = {}) {
+ const language = config.language || "en";
+ const languages = BDFDB.ArrayUtils.removeCopies(BDFDB.ArrayUtils.is(config.languages) ? config.languages : ["en"].concat((Internal.LibraryModules.LanguageStore.languages || Internal.LibraryModules.LanguageStore._languages).filter(n => n.enabled).map(n => {
+ if (BDFDB.LanguageUtils.languages[n.code]) return n.code;
+ else {
+ const code = n.code.split("-")[0];
+ if (BDFDB.LanguageUtils.languages[code]) return code;
+ }
+ })).filter(n => n && !n.startsWith("en-") && !n.startsWith("$") && n != language)).sort();
+ let translations = {};
+ strings = BDFDB.ObjectUtils.sort(strings);
+ const stringKeys = Object.keys(strings);
+ translations[language] = BDFDB.ObjectUtils.toArray(strings);
+ let text = Object.keys(translations[language]).map(k => translations[language][k]).join("\n\n");
+
+ let fails = 0, next = lang => {
+ if (!lang) {
+ let formatTranslation = (l, s, i) => {
+ l = l == "en" ? "default" : l;
+ return config.cached && config.cached[l] && config.cached[l][stringKeys[i]] || (translations[language][i][0] == translations[language][i][0].toUpperCase() ? BDFDB.StringUtils.upperCaseFirstChar(s) : s);
+ };
+ let format = config.asObject ? ((l, isNotFirst) => {
+ return `${isNotFirst ? "," : ""}\n\t\t"${l == "en" ? "default" : l}": {${translations[l].map((s, i) => `\n\t\t\t"${stringKeys[i]}": "${formatTranslation(l, s, i)}"`).join(",")}\n\t\t}`;
+ }) : ((l, isNotFirst) => {
+ return `\n\t\t\t\t\t${l == "en" ? "default" : `case "${l}"`}:"\t\t"// ${BDFDB.LanguageUtils.languages[l].name}\n\t\t\t\t\t\treturn {${translations[l].map((s, i) => `\n\t\t\t\t\t\t\t${stringKeys[i]}:${"\t".repeat(10 - ((stringKeys[i].length + 2) / 4))}"${formatTranslation(l, s, i)}"`).join(",")}\n\t\t\t\t\t\t};`;
+ });
+ let result = Object.keys(translations).filter(n => n != "en").sort().map((l, i) => format(l, i)).join("");
+ if (translations.en) result += format("en", result ? 1 : 0);
+ BDFDB.NotificationUtils.toast("Translation copied to clipboard", {
+ type: "success"
+ });
+ BDFDB.LibraryModules.WindowUtils.copy(result);
+ }
+ else {
+ const callback = translation => {
+ BDFDB.LogUtils.log(lang);
+ if (!translation) {
+ console.warn("No Translation");
+ fails++;
+ if (fails > 10) console.error("Skipped Language");
+ else languages.unshift(lang);
+ }
+ else {
+ fails = 0;
+ translations[lang] = translation.split("\n\n");
+ }
+ next(languages.shift());
+ };
+ requestFunction(`https://translate.googleapis.com/translate_a/single?client=gtx&sl=${language}&tl=${lang}&dt=t&dj=1&source=input&q=${encodeURIComponent(text)}`, (error, response, result) => {
+ if (!error && result && response.statusCode == 200) {
+ try {callback(JSON.parse(result).sentences.map(n => n && n.trans).filter(n => n).join(""));}
+ catch (err) {callback("");}
+ }
+ else {
+ if (response.statusCode == 429) {
+ BDFDB.NotificationUtils.toast("Too many Requests", {
+ type: "danger"
+ });
+ }
+ else {
+ BDFDB.NotificationUtils.toast("Failed to translate Text", {
+ type: "danger"
+ });
+ callback("");
+ }
+ }
+ });
+ }
+ };
+ if (stringKeys.length) next(languages.shift());
+ };
+ BDFDB.DevUtils.req = Internal.getWebModuleReq();
+ }
+
+ if (libraryCSS) BDFDB.DOMUtils.appendLocalStyle("BDFDB", libraryCSS.replace(/[\n\t\r]/g, "").replace(/\[REPLACE_CLASS_([A-z0-9_]+?)\]/g, (a, b) => BDFDB.dotCN[b]));
+
+ BDFDB.LogUtils.log("Finished loading Library");
+
+ window.BDFDB_Global = Object.assign({
+ started: true,
+ loaded: true,
+ PluginUtils: {
+ buildPlugin: BDFDB.PluginUtils.buildPlugin,
+ cleanUp: BDFDB.PluginUtils.cleanUp
+ }
+ });
+
+ while (PluginStores.delayed.loads.length) PluginStores.delayed.loads.shift().load();
+ while (PluginStores.delayed.starts.length) PluginStores.delayed.starts.shift().start();
+ while (pluginQueue.length) {
+ let pluginName = pluginQueue.shift();
+ if (pluginName) BDFDB.TimeUtils.timeout(_ => BDFDB.BDUtils.reloadPlugin(pluginName));
+ }
+ };
+ requestLibraryHashes(true);
+
+ this.loaded = true;
+ }
+ start () {
+ if (!this.loaded) this.load();
+ }
+ stop () {
+
+ }
+
+ getSettingsPanel (collapseStates = {}) {
+ let settingsPanel;
+ let getString = (type, key, property) => {
+ return BDFDB.LanguageUtils.LibraryStringsCheck[`settings_${key}_${property}`] ? BDFDB.LanguageUtils.LibraryStringsFormat(`settings_${key}_${property}`, BDFDB.BDUtils.getSettingsProperty("name", BDFDB.BDUtils.settingsIds[key]) || BDFDB.StringUtils.upperCaseFirstChar(key.replace(/([A-Z])/g, " $1"))) : Internal.defaults[type][key][property];
+ };
+ return settingsPanel = BDFDB.PluginUtils.createSettingsPanel(BDFDB, {
+ collapseStates: collapseStates,
+ children: _ => {
+ let settingsItems = [];
+
+ for (let key in Internal.settings.choices) settingsItems.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsSaveItem, {
+ type: "Select",
+ plugin: Internal,
+ keys: ["choices", key],
+ label: getString("choices", key, "description"),
+ note: getString("choices", key, "note"),
+ basis: "50%",
+ value: Internal.settings.choices[key],
+ options: Object.keys(Internal.DiscordConstants[Internal.defaults.choices[key].items] || {}).map(p => ({
+ value: p,
+ label: BDFDB.LanguageUtils.LibraryStrings[p] || p
+ })),
+ searchable: true
+ }));
+ for (let key in Internal.settings.general) {
+ let nativeSetting = BDFDB.BDUtils.settingsIds[key] && BDFDB.BDUtils.getSettings(BDFDB.BDUtils.settingsIds[key]);
+ let disabled = typeof Internal.defaults.general[key].isDisabled == "function" && Internal.defaults.general[key].isDisabled({
+ value: Internal.settings.general[key],
+ nativeValue: nativeSetting
+ });
+ let hidden = typeof Internal.defaults.general[key].isHidden == "function" && Internal.defaults.general[key].isHidden({
+ value: Internal.settings.general[key],
+ nativeValue: nativeSetting
+ });
+ if (!hidden) settingsItems.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsSaveItem, {
+ type: "Switch",
+ plugin: Internal,
+ disabled: disabled,
+ keys: ["general", key],
+ label: getString("general", key, "description"),
+ note: (typeof Internal.defaults.general[key].hasNote == "function" ? Internal.defaults.general[key].hasNote({
+ value: Internal.settings.general[key],
+ nativeValue: nativeSetting,
+ disabled: disabled
+ }) : Internal.defaults.general[key].hasNote) && getString("general", key, "note"),
+ value: (typeof Internal.defaults.general[key].getValue == "function" ? Internal.defaults.general[key].getValue({
+ value: Internal.settings.general[key],
+ nativeValue: nativeSetting,
+ disabled: disabled
+ }) : true) && (Internal.settings.general[key] || nativeSetting),
+ onChange: typeof Internal.defaults.general[key].onChange == "function" ? Internal.defaults.general[key].onChange : (_ => {})
+ }));
+ }
+ settingsItems.push(BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SettingsItem, {
+ type: "Button",
+ label: BDFDB.LanguageUtils.LibraryStrings.update_check_info,
+ dividerTop: true,
+ basis: "20%",
+ children: BDFDB.LanguageUtils.LibraryStrings.check_for_updates,
+ labelChildren: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.Clickable, {
+ children: BDFDB.ReactUtils.createElement(Internal.LibraryComponents.SvgIcon, {
+ name: Internal.LibraryComponents.SvgIcon.Names.QUESTIONMARK,
+ width: 20,
+ height: 20,
+ onClick: _ => BDFDB.ModalUtils.open(Internal, {
+ header: "Plugins",
+ subHeader: "",
+ contentClassName: BDFDB.disCN.marginbottom20,
+ text: BDFDB.ObjectUtils.toArray(Object.assign({}, window.PluginUpdates && window.PluginUpdates.plugins, PluginStores.updateData.plugins)).map(p => p.name).filter(n => n).sort().join(", ")
+ })
+ })
+ }),
+ onClick: _ => {
+ let toast = BDFDB.NotificationUtils.toast(`${BDFDB.LanguageUtils.LanguageStrings.CHECKING_FOR_UPDATES} - ${BDFDB.LanguageUtils.LibraryStrings.please_wait}`, {
+ type: "info",
+ timeout: 0,
+ ellipsis: true
+ });
+ BDFDB.PluginUtils.checkAllUpdates().then(outdated => {
+ toast.close();
+ if (outdated > 0) BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStringsFormat("update_check_complete_outdated", outdated), {
+ type: "danger"
+ });
+ else BDFDB.NotificationUtils.toast(BDFDB.LanguageUtils.LibraryStrings.update_check_complete, {
+ type: "success"
+ });
+ });
+ }
+ }));
+
+ return settingsItems;
+ }
+ });
+ }
+ }
+})();
diff --git a/Configs/BetterDiscord/plugins/0BDFDB.raw.css b/Configs/BetterDiscord/plugins/0BDFDB.raw.css
new file mode 100644
index 0000000..0ac0d6e
--- /dev/null
+++ b/Configs/BetterDiscord/plugins/0BDFDB.raw.css
@@ -0,0 +1,1660 @@
+@import url(https://mwittrien.github.io/BetterDiscordAddons/Themes/_res/SupporterBadge.css);
+
+:root {
+ --bdfdb-blurple: var(--brand-experiment, hsl(235, calc(var(--saturation-factor, 1) * 85.6%), 64.7%));
+}
+
+img:not([src]), img[src=""], img[src="null"] {
+ opacity: 0;
+}
+
+[REPLACE_CLASS_appmount] > [REPLACE_CLASS_itemlayercontainer] {
+ position: fixed;
+ z-index: 1001;
+}
+
+[REPLACE_CLASS_titlebarmac] {
+ z-index: 1000001;
+}
+
+[REPLACE_CLASS_itemlayercontainerzindexdisabled] {
+ position: absolute !important;
+ z-index: unset !important;
+}
+[REPLACE_CLASS_itemlayercontainerzindexdisabled] > * {
+ z-index: 1002;
+}
+[REPLACE_CLASS_itemlayer] ~ [REPLACE_CLASS_itemlayer] [REPLACE_CLASS_menu] {
+ z-index: 1001;
+}
+[REPLACE_CLASS_menu] [REPLACE_CLASS_itemlayer] {
+ z-index: 1002;
+}
+
+[REPLACE_CLASS_loadingiconwrapper] {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ z-index: 1000;
+ animation: loadingwrapper-fade 3s infinite ease;
+}
+[REPLACE_CLASS_loadingiconwrapper] [REPLACE_CLASS_loadingicon] {
+ margin: 0 5px;
+}
+@keyframes loadingwrapper-fade {
+ from {opacity: 0.1;}
+ 50% {opacity: 0.9;}
+ to {opacity: 0.1;}
+}
+
+[REPLACE_CLASS_settingspanellistwrapper] {
+ margin-bottom: 8px;
+}
+[REPLACE_CLASS_settingspanellistwrapper][REPLACE_CLASS_settingspanellistwrappermini] {
+ margin-bottom: 4px;
+}
+[REPLACE_CLASS_settingspanellist] {
+ padding-left: 15px;
+}
+[REPLACE_CLASS_settingspanellistwrapper][REPLACE_CLASS_settingspanellistwrappermini] [REPLACE_CLASS_settingspanellist] {
+ padding-left: 10px;
+}
+
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginreset] {
+ margin-bottom: 0;
+}
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginbottom4] {
+ margin-bottom: 4px;
+}
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginbottom8] {
+ margin-bottom: 8px;
+}
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginbottom20] {
+ margin-bottom: 20px;
+}
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginbottom40] {
+ margin-bottom: 40px;
+}
+[REPLACE_CLASS_settingsrowcontainer][REPLACE_CLASS_marginbottom60] {
+ margin-bottom: 60px;
+}
+[REPLACE_CLASS_flexdirectionrow] > [REPLACE_CLASS_settingsrowcontainer] + [REPLACE_CLASS_settingsrowcontainer] {
+ margin-left: 8px;
+}
+[REPLACE_CLASS_settingsrowcontainer] [REPLACE_CLASS_settingsrowlabel] {
+ align-items: center;
+}
+[REPLACE_CLASS_settingsrowcontainer] [REPLACE_CLASS_settingsrowcontrol] {
+ margin-left: 8px;
+}
+[REPLACE_CLASS_settingsrowcontainer] [REPLACE_CLASS_settingsrowtitlemini] {
+ line-height: 18px;
+ font-size: 12px;
+ font-weight: 400;
+}
+[REPLACE_CLASS_h5][REPLACE_CLASS_marginreset] {
+ flex: 1 1 auto;
+}
+
+[REPLACE_CLASS_settingspanel] [REPLACE_CLASS_slidermark] {
+ line-height: 10px;
+}
+
+[REPLACE_CLASS_switch][REPLACE_CLASS_switchmini] {
+ width: 26px;
+ height: 16px;
+}
+[REPLACE_CLASS_switch][REPLACE_CLASS_switchmini] [REPLACE_CLASS_switchslider] {
+ width: 16px;
+ height: 14px;
+ margin: 1px;
+}
+
+[REPLACE_CLASS_accountinfobutton][REPLACE_CLASS_accountinfobuttondisabled] {
+ opacity: .4;
+}
+
+[REPLACE_CLASS_marginleft4] {
+ margin-left: 4px;
+}
+[REPLACE_CLASS_marginleft8] {
+ margin-left: 8px;
+}
+
+[REPLACE_CLASS_collapsecontainer] {
+ margin-bottom: 20px;
+}
+[REPLACE_CLASS_collapsecontainermini] {
+ margin-bottom: 8px;
+}
+[REPLACE_CLASS_collapsecontainerheader] {
+ margin-bottom: 4px;
+}
+[REPLACE_CLASS_collapsecontainercollapsed] [REPLACE_CLASS_collapsecontainertitle] {
+ margin-bottom: 0;
+}
+[REPLACE_CLASS_collapsecontainertitle] {
+ flex: 1 1 auto;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ cursor: pointer;
+ order: 1;
+}
+[REPLACE_CLASS_collapsecontainertitle]:hover {
+ color: var(--text-normal);
+}
+[REPLACE_CLASS_collapsecontainertitle]::before {
+ content: "";
+ flex: 1 1 auto;
+ background-color: currentColor;
+ height: 2px;
+ margin: 0 10px 0 15px;
+ opacity: 0.2;
+ order: 2;
+}
+[REPLACE_CLASS_collapsecontainertitle]::after {
+ content: "";
+ -webkit-mask: url('data:image/svg+xml; utf8, ') center/cover no-repeat;
+ background-color: currentColor;
+ width: 20px;
+ height: 20px;
+ order: 3;
+ transition: transform .3s ease;
+ transform: rotate(0);
+}
+[REPLACE_CLASS_collapsecontainercollapsed] [REPLACE_CLASS_collapsecontainertitle]::after {
+ transform: rotate(90deg)
+}
+[REPLACE_CLASS_collapsecontainerinner] {
+ padding-left: 15px;
+}
+
+[REPLACE_CLASS_settingsguild] {
+ flex: 0 0 auto;
+ border-radius: 50%;
+ border: 3px solid #43b581;
+ box-sizing: border-box;
+ cursor: pointer;
+ margin: 3px;
+ overflow: hidden;
+}
+[REPLACE_CLASS_settingsguilddisabled] {
+ border-color: #747f8d;
+ filter: grayscale(100%) brightness(50%);
+}
+
+[REPLACE_CLASS_guildslabel] {
+ color: var(--text-muted);
+ text-align: center;
+ text-transform: uppercase;
+ font-size: 9px;
+ font-weight: 500;
+ line-height: 1.3;
+ width: 70px;
+ word-wrap: normal;
+ white-space: nowrap;
+}
+[REPLACE_CLASS_guildslabel]:hover {
+ color: var(--header-secondary);
+}
+[REPLACE_CLASS_guildslabel]:active {
+ color: var(--header-primary);
+}
+
+[REPLACE_CLASS_searchbarwrapper] {
+ padding: 10px;
+}
+[REPLACE_CLASS_popoutwrapper] [REPLACE_CLASS_searchbarwrapper] {
+ padding: 0 0 5px 0;
+ border-bottom: 1px solid var(--background-modifier-accent);
+}
+
+[REPLACE_CLASS_pagination] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+}
+[REPLACE_CLASS_paginationtop] {
+ margin-bottom: 10px;
+}
+[REPLACE_CLASS_paginationbottom] {
+ margin-top: 10px;
+}
+[REPLACE_CLASS_pagination] [REPLACE_CLASS_paginationcontainer] {
+ width: unset;
+ margin: 0;
+}
+[REPLACE_CLASS_paginationmini][REPLACE_CLASS_paginationtop] {
+ margin-bottom: 5px;
+}
+[REPLACE_CLASS_paginationmini][REPLACE_CLASS_paginationbottom] {
+ margin-top: 5px;
+}
+[REPLACE_CLASS_paginationmini] [REPLACE_CLASS_paginationbutton],
+[REPLACE_CLASS_paginationmini] [REPLACE_CLASS_paginationgap] {
+ font-size: 14px;
+ margin: 4px 2px;
+}
+[REPLACE_CLASS_paginationmini] [REPLACE_CLASS_paginationgap] {
+ width: 20px;
+}
+[REPLACE_CLASS_paginationmini] [REPLACE_CLASS_inputwrapper] {
+ min-width: 54px;
+}
+
+[REPLACE_CLASS_paginationlist] {
+ height: 100%;
+}
+[REPLACE_CLASS_paginationlistalphabet] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 16px;
+ line-height: 20px;
+ margin-bottom: 10px;
+ color: var(--text-normal);
+}
+[REPLACE_CLASS_paginationlistalphabetchar] {
+ min-width: 12px;
+ text-align: center;
+ margin: 0 4px;
+}
+[REPLACE_CLASS_paginationlistalphabetchar]:not([REPLACE_CLASS_paginationlistalphabetchardisabled]):hover {
+ color: var(--header-primary);
+}
+[REPLACE_CLASS_paginationlistalphabetchar][REPLACE_CLASS_paginationlistalphabetchardisabled] {
+ color: var(--text-muted);
+}
+[REPLACE_CLASS_paginationlistmini] [REPLACE_CLASS_paginationlistalphabet] {
+ font-size: 14px;
+ line-height: 18px;
+ margin-bottom: 5px;
+}
+[REPLACE_CLASS_paginationlistmini] [REPLACE_CLASS_paginationlistalphabetchar] {
+ min-width: 10px;
+ margin: 0 3px;
+}
+
+[REPLACE_CLASS_discoverycards] {
+ display: grid;
+ grid-gap: 16px;
+ grid-template-columns: repeat(auto-fill, minmax(294px, 1fr));
+ padding: 10px 0;
+}
+[REPLACE_CLASS_discoverycard] {
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ background-color: var(--activity-card-background);
+ border: 2px solid var(--activity-card-background);
+ border-radius: 8px;
+ box-shadow: var(--elevation-medium);
+ height: 370px;
+ width: 100%;
+ overflow: hidden;
+ transition: box-shadow .2s ease-out,transform .2s ease-out,background .2s ease-out,border .2s ease-out,opacity .2s ease-in;
+}
+[REPLACE_CLASS_themedark] [REPLACE_CLASS_discoverycard] {
+ background-color: var(--background-secondary-alt);
+ border-color: var(--background-secondary-alt);
+}
+[REPLACE_CLASS_discoverycard]:focus,
+[REPLACE_CLASS_discoverycard]:hover {
+ background-color: var(--background-tertiary);
+ border-color: var(--background-tertiary);
+ box-shadow: var(--elevation-high);
+ transform: translateY(-1px);
+}
+[REPLACE_CLASS_discoverycardheader] {
+ display: block;
+ flex: 0 0 auto;
+ position: relative;
+ height: 143px;
+ overflow: visible;
+ margin-bottom: 28px;
+}
+[REPLACE_CLASS_discoverycardcoverwrapper] {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ background: url(https://mwittrien.github.io/_res/imgs/cardplaceholder.svg) center/cover no-repeat;
+ transform: scale(1);
+ transition: transform .2s ease-out;
+}
+[REPLACE_CLASS_discoverycard]:focus [REPLACE_CLASS_discoverycardcoverwrapper],
+[REPLACE_CLASS_discoverycard]:hover [REPLACE_CLASS_discoverycardcoverwrapper] {
+ transform: scale(1.01) translateZ(0);
+}
+[REPLACE_CLASS_discoverycardcoverwrapper],
+[REPLACE_CLASS_discoverycardcover] {
+ width: 100%;
+ height: 100%;
+}
+[REPLACE_CLASS_discoverycardcover] {
+ object-fit: cover;
+ cursor: pointer;
+}
+[REPLACE_CLASS_discoverycardcoverbadge] {
+ position: absolute;
+ top: 6px;
+ right: 8px;
+}
+[REPLACE_CLASS_discoverycardiconwrapper] {
+ position: absolute;
+ bottom: -21px;
+ left: 12px;
+ background-color: var(--activity-card-background);
+ border-radius: 10px;
+ padding: 6px;
+ transition: box-shadow .2s ease-out, transform .2s ease-out, background .2s ease-out;
+}
+[REPLACE_CLASS_themedark] [REPLACE_CLASS_discoverycardiconwrapper] {
+ background-color: var(--background-secondary-alt);
+}
+[REPLACE_CLASS_discoverycard]:focus [REPLACE_CLASS_discoverycardiconwrapper],
+[REPLACE_CLASS_discoverycard]:hover [REPLACE_CLASS_discoverycardiconwrapper] {
+ background-color: var(--background-tertiary);
+}
+[REPLACE_CLASS_discoverycardicon] {
+ color: var(--header-primary);
+ border-radius: 10px;
+ width: 32px;
+ height: 32px;
+}
+[REPLACE_CLASS_discoverycardiconloading] {
+ visibility: hidden;
+}
+[REPLACE_CLASS_discoverycardinfo] {
+ display: flex;
+ flex: 1 1 auto;
+ position: relative;
+ flex-direction: column;
+ align-content: stretch;
+ padding: 0 16px 16px;
+ overflow: hidden;
+}
+[REPLACE_CLASS_discoverycardtitle] {
+ display: flex;
+ align-items: center;
+ color: var(--header-primary);
+ width: 100%;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 20px;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_discoverycardname] {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_discoverycardtitlebutton] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-left: 6px;
+}
+[REPLACE_CLASS_discoverycard] [REPLACE_CLASS_favbuttoncontainer] {
+ width: 20px;
+ height: 20px;
+ flex: 0 0 auto;
+ margin-left: 3px;
+}
+[REPLACE_CLASS_discoverycard] [REPLACE_CLASS_favbuttoncontainer] [REPLACE_CLASS_giffavoritesize] {
+ width: 20px;
+ height: 20px;
+}
+[REPLACE_CLASS_discoverycardauthor] {
+ color: var(--header-secondary);
+ margin: 3px 0 6px;
+ font-size: 14px;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_discoverycarddescription] {
+ color: var(--header-secondary);
+ margin: 4px 0 12px;
+ font-size: 14px;
+ line-height: 18px;
+}
+[REPLACE_CLASS_discoverycardfooter] {
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_discoverycardtags] {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ margin-bottom: 4px;
+}
+[REPLACE_CLASS_discoverycardtag] {
+ margin-right: 6px;
+ margin-bottom: 6px;
+ font-weight: 500;
+}
+[REPLACE_CLASS_discoverycardcontrols] {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+ align-items: center;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_discoverycardbutton] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ border-radius: 3px;
+ color: var(--header-primary);
+ font-size: 14px;
+ font-weight: 500;
+ padding: 6px 8px;
+}
+[REPLACE_CLASS_discoverycardstats] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ color: var(--header-secondary);
+ font-size: 14px;
+}
+[REPLACE_CLASS_discoverycardstat] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin-right: 8px;
+}
+[REPLACE_CLASS_discoverycardstaticon] {
+ margin-right: 4px;
+}
+
+[REPLACE_CLASS_overflowellipsis] {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+
+[REPLACE_CLASS_userpopoutheaderbottag] {
+ margin-top: 4px !important;
+}
+
+[REPLACE_CLASS_avatardisabled] {
+ filter: grayscale(100%) brightness(50%);
+}
+
+[REPLACE_CLASS_messagebottag] {
+ top: .15rem;
+}
+[REPLACE_CLASS_messageusername] ~ [REPLACE_CLASS_messagebottagcompact] {
+ margin-right: 0;
+ margin-left: .25rem;
+}
+[REPLACE_CLASS_messagerepliedmessage] [REPLACE_CLASS_messageusername] ~ [REPLACE_CLASS_messagebottagcompact] {
+ margin-right: .25rem;
+ margin-left: 0;
+}
+
+[REPLACE_CLASS_messageavatar][REPLACE_CLASS_bdfdbbadgeavatar] > :not([REPLACE_CLASS_bdfdbbadge]),
+[REPLACE_CLASS_messageavatar][REPLACE_CLASS_bdfdbbadgeavatar] [REPLACE_CLASS_avatarwrapper] {
+ width: inherit !important;
+ height: inherit !important;
+}
+[REPLACE_CLASS_messageavatar][REPLACE_CLASS_bdfdbbadgeavatar] [REPLACE_CLASS_messageavatar] {
+ position: static !important;
+ margin: unset !important;
+}
+
+[REPLACE_CLASS_favbuttoncontainer] {
+ display: flex;
+ position: relative;
+ cursor: pointer;
+ width: 24px;
+ height: 24px;
+}
+
+[REPLACE_CLASS_menuhint] {
+ width: 42px;
+ max-width: 42px;
+ margin-left: 8px;
+}
+
+[REPLACE_CLASS_cursordefault] {
+ cursor: default !important;
+}
+[REPLACE_CLASS_cursorpointer] {
+ cursor: pointer !important;
+}
+
+[REPLACE_CLASS_slidergrabber]:active [REPLACE_CLASS_sliderbubble],
+[REPLACE_CLASS_slidergrabber]:hover [REPLACE_CLASS_sliderbubble] {
+ visibility: visible;
+}
+[REPLACE_CLASS_sliderbubble] {
+ background-color: var(--background-floating);
+ border-radius: 3px;
+ top: -32px;
+ height: 22px;
+ width: auto;
+ padding: 0 5px;
+ white-space: pre;
+ transform: translateX(-50%);
+ line-height: 22px;
+ text-align: center;
+ font-weight: 600;
+ font-size: 12px;
+ color: var(--header-primary);
+ visibility: hidden;
+}
+[REPLACE_CLASS_sliderbubble],
+[REPLACE_CLASS_sliderbubble]::before {
+ position: absolute;
+ left: 50%;
+ pointer-events: none;
+}
+[REPLACE_CLASS_sliderbubble]::before {
+ border: 5px solid transparent;
+ border-top-color: var(--background-floating);
+ content: " ";
+ width: 0;
+ height: 0;
+ margin-left: -5px;
+ top: 100%;
+}
+
+[REPLACE_CLASS_quickselectwrapper] {
+ margin-left: 12px;
+}
+
+[REPLACE_CLASS_selectwrapper] {
+ display: flex;
+ align-items: center;
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_selectwrapper] [REPLACE_CLASS_select] {
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_selectwrapper] [REPLACE_CLASS_selectouter],
+[REPLACE_CLASS_selectwrapper] [REPLACE_CLASS_selectsearchinput] {
+ width: 100%;
+}
+[REPLACE_CLASS_selectoption] [REPLACE_CLASS_giffavoritesize] {
+ width: 20px;
+ height: 20px;
+}
+
+[REPLACE_CLASS_hotkeywrapper] {
+ min-width: 200px;
+}
+[REPLACE_CLASS_hotkeywrapper] [REPLACE_CLASS_hotkeycontainer] {
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_hotkeyresetbutton] {
+ cursor: pointer;
+ margin-left: 5px;
+}
+[REPLACE_CLASS_hotkeyresetbutton] [REPLACE_CLASS_svgicon]:hover {
+ color: #f04747;
+}
+
+[REPLACE_CLASS_hovercardwrapper] {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+[REPLACE_CLASS_hovercardhorizontal] {
+ flex-direction: row;
+}
+[REPLACE_CLASS_hovercardhorizontal] > [REPLACE_CLASS_flexchild] + [REPLACE_CLASS_flexchild] {
+ margin-left: 8px;
+}
+[REPLACE_CLASS_hovercarddisabled] {
+ opacity: 0.7;
+ filter: grayscale(0.2);
+}
+[REPLACE_CLASS_settingspanel] [REPLACE_CLASS_hovercardwrapper] {
+ width: calc(100% - 32px);
+}
+[REPLACE_CLASS_hovercardwrapper][REPLACE_CLASS_hovercard] {
+ padding: 10px 0;
+}
+[REPLACE_CLASS_hovercardwrapper][REPLACE_CLASS_hovercard] > * {
+ z-index: 1;
+}
+[REPLACE_CLASS_hovercardwrapper], [REPLACE_CLASS_hovercardinner] {
+ min-height: 28px;
+}
+[REPLACE_CLASS_hovercardinner] {
+ width: 100%;
+ padding-right: 5px;
+ display: flex;
+ align-items: center;
+ z-index: 1;
+}
+[REPLACE_CLASS_hovercardwrapper] [REPLACE_CLASS_hovercardbutton] {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ opacity: 0;
+}
+[REPLACE_CLASS_hovercardwrapper][REPLACE_CLASS_hovercard] [REPLACE_CLASS_hovercardbutton] {
+ right: -25px;
+}
+[REPLACE_CLASS_hovercardwrapper]:hover [REPLACE_CLASS_hovercardbutton] {
+ opacity: 1;
+}
+
+[REPLACE_CLASS_textareabuttonwrapper] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+[REPLACE_CLASS_guildsummarycontainer] {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+[REPLACE_CLASS_guildsummarysvgicon] {
+ -webkit-box-flex: 0;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ color: var(--text-muted);
+ width: 20px;
+ height: 20px;
+ margin-right: 8px;
+}
+[REPLACE_CLASS_guildsummaryiconcontainer] {
+ width: 24px;
+ height: 24px;
+}
+[REPLACE_CLASS_guildsummaryiconcontainermasked] {
+ margin-right: -4px;
+ -webkit-mask: url('data:image/svg+xml; utf8, ') center/cover no-repeat;
+}
+[REPLACE_CLASS_guildsummaryclickableicon] {
+ cursor: pointer;
+}
+[REPLACE_CLASS_guildsummaryicon],
+[REPLACE_CLASS_guildsummaryclickableicon],
+[REPLACE_CLASS_guildsummaryemptyguild] {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+}
+[REPLACE_CLASS_guildsummaryemptyguild] {
+ background: var(--background-accent);
+}
+[REPLACE_CLASS_guildsummarymoreguilds] {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background-color: var(--background-tertiary);
+ font-size: 12px;
+ line-height: 24px;
+ font-weight: 500;
+ text-align: center;
+ color: var(--text-normal);
+ height: 24px;
+ min-width: 24px;
+ border-radius: 12px;
+ padding: 0 8px;
+}
+
+[REPLACE_CLASS_table] {
+ position: relative;
+ width: 100%;
+}
+[REPLACE_CLASS_table] [REPLACE_CLASS_tablerow]:first-child {
+ padding: 0px 12px 8px 0;
+ margin-bottom: 5px;
+ box-sizing: border-box;
+ background-color: var(--background-primary);
+ border-bottom: 1px solid var(--background-modifier-accent);
+}
+[REPLACE_CLASS_table] [REPLACE_CLASS_tablestickyheader] {
+ position: sticky;
+ width: 100%;
+}
+[REPLACE_CLASS_modalsub] [REPLACE_CLASS_table] [REPLACE_CLASS_tablestickyheader]:first-child {
+ padding-left: 20px;
+}
+[REPLACE_CLASS_tableheadercell] {
+ color: var(--interactive-normal);
+ font-size: 12px;
+ font-weight: 600;
+ text-transform: uppercase;
+}
+[REPLACE_CLASS_tableheadercell],
+[REPLACE_CLASS_tablebodycell] {
+ border-left: 1px solid var(--background-modifier-accent);
+ box-sizing: border-box;
+ padding: 0 12px;
+}
+[REPLACE_CLASS_tableheadercell]:first-child,
+[REPLACE_CLASS_tablebodycell]:first-child {
+ border-left: none;
+ padding-left: 0;
+}
+[REPLACE_CLASS_table] [REPLACE_CLASS_tablerow] {
+ position: relative;
+ display: flex;
+ margin-bottom: 5px;
+ align-items: center;
+ color: var(--header-secondary);
+}
+[REPLACE_CLASS_tablebodycell] {
+ font-size: 15px;
+}
+
+[REPLACE_CLASS_settingstableheaders] {
+ display: flex;
+ align-items: center;
+ flex: 1 0 auto;
+ margin-right: 20px;
+ margin-left: 10px;
+}
+[REPLACE_CLASS_settingstableheaderoptions] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_settingstablelist] [REPLACE_CLASS_settingstableheader] {
+ min-height: 10px;
+ text-transform: uppercase;
+}
+[REPLACE_CLASS_settingstablelist] [REPLACE_CLASS_settingstableheaderoption] {
+ width: unset;
+}
+[REPLACE_CLASS_settingstablelist] [REPLACE_CLASS_settingstableheaderoption][REPLACE_CLASS_settingstableheadervertical] {
+ width: 24px;
+}
+[REPLACE_CLASS_settingstableheadervertical] {
+ position: relative;
+}
+[REPLACE_CLASS_settingstableheadervertical] > span {
+ position: absolute;
+ bottom: 50%;
+ right: calc(50% - 4px);
+ margin-bottom: -5px;
+ writing-mode: vertical-rl;
+}
+[REPLACE_CLASS_settingstablecard] {
+ height: 60px;
+ padding: 0 10px;
+ margin-bottom: 10px;
+}
+[REPLACE_CLASS_settingstablecard][REPLACE_CLASS_cardprimaryoutline] {
+ border: 1px solid var(--background-tertiary);
+}
+[REPLACE_CLASS_settingstablecardlabel] {
+ display: flex;
+ align-items: center;
+ flex: 1 1 auto;
+ overflow: hidden;
+ color: var(--header-primary);
+}
+[REPLACE_CLASS_settingstablecardconfigs] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS_settingstablecard] [REPLACE_CLASS_settingstablecardlabel] {
+ padding-right: 10px;
+}
+[REPLACE_CLASS_settingstablecard] [REPLACE_CLASS_settingstablecardlabel],
+[REPLACE_CLASS_settingstablecard] [REPLACE_CLASS_settingstablecardconfigs] {
+ margin: 0;
+}
+[REPLACE_CLASS_settingstablelist] [REPLACE_CLASS_checkboxcontainer]::before {
+ display: none;
+}
+
+[REPLACE_CLASS_popoutwrapper] [REPLACE_CLASS_messagespopouttabbarheader] {
+ flex: 1 0 auto;
+ align-items: center;
+ height: unset;
+ min-height: 56px;
+}
+[REPLACE_CLASS_popoutwrapper] [REPLACE_CLASS_messagespopouttabbarheader] [REPLACE_CLASS_messagespopouttabbar] {
+ align-items: center;
+ flex: 1 1 auto;
+ min-height: 32px;
+}
+
+[REPLACE_CLASS_charcounter] {
+ color: var(--channels-default);
+}
+
+[REPLACE_CLASS_inputmulti] {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+[REPLACE_CLASS_inputmultifirst] {
+ flex-grow: 1;
+ padding: 0 8px;
+}
+[REPLACE_CLASS_inputmultilast]::before {
+ content: "";
+ position: absolute;
+ border: 1px solid var(--header-primary);
+ width: 1px;
+ height: 30px;
+ margin-top: 5px;
+ opacity: .1;
+}
+[REPLACE_CLASS_inputmultilast] input {
+ width: 250px;
+ padding-left: 16px;
+}
+[REPLACE_CLASS_inputmultifield] {
+ border: none !important;
+}
+
+[REPLACE_CLASS_inputlistitems] {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+ flex-wrap: wrap;
+}
+[REPLACE_CLASS_inputlistitem] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+[REPLACE_CLASS_inputlistitem]:not(:last-child) {
+ margin-right: 4px;
+}
+[REPLACE_CLASS_inputlistdelete] {
+ cursor: pointer;
+ margin-left: 6px;
+}
+
+[REPLACE_CLASS_dateinputwrapper] {
+ display: flex;
+ align-items: center;
+ margin-bottom: 8px;
+}
+[REPLACE_CLASS_dateinputinner] {
+ flex: 1 1 auto;
+ color: var(--header-primary);
+ max-width: calc(100% - 150px);
+ margin-left: 8px;
+}
+[REPLACE_CLASS_dateinputcontrols] {
+ display: flex;
+ align-items: center;
+}
+[REPLACE_CLASS_dateinputpreview] {
+ display: flex;
+ align-items: center;
+ color: var(--header-primary);
+ margin-top: 8px;
+ font-weight: normal;
+}
+[REPLACE_CLASS_dateinputpreviewprefix],
+[REPLACE_CLASS_dateinputpreviewsuffix] {
+ font-weight: 600;
+}
+[REPLACE_CLASS_dateinputpreviewprefix]:not(:empty) {
+ margin-right: 6px;
+}
+[REPLACE_CLASS_dateinputpreviewsuffix]:not(:empty) {
+ margin-left: 6px;
+}
+[REPLACE_CLASS_dateinputfield] {
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_dateinputbutton] {
+ margin-left: 8px;
+}
+[REPLACE_CLASS_dateinputbuttonselected] [REPLACE_CLASS_svgicon],
+[REPLACE_CLASS_dateinputbuttonselected] [REPLACE_CLASS_svgicon]:hover {
+ color: var(--interactive-active);
+}
+
+input[REPLACE_CLASS_input][REPLACE_CLASS_inputsuccess],
+input[REPLACE_CLASS_input][REPLACE_CLASS_inputerror] {
+ border-style: solid;
+ border-width: 1px;
+}
+[REPLACE_CLASS_inputnumberwrapper] {
+ position: relative;
+}
+[REPLACE_CLASS_inputnumberbuttons]:hover + [REPLACE_CLASS_input]:not([REPLACE_CLASS_inputfocused]):not([REPLACE_CLASS_inputerror]):not([REPLACE_CLASS_inputsuccess]):not([REPLACE_CLASS_inputdisabled]):not(:focus) {
+ border-color: var(--deprecated-text-input-border-hover);
+}
+[REPLACE_CLASS_inputnumberwrapper] [REPLACE_CLASS_input] {
+ text-align: right;
+}
+[REPLACE_CLASS_inputnumberwrapperdefault] [REPLACE_CLASS_input] {
+ padding-right: 25px;
+}
+[REPLACE_CLASS_inputnumberwrappermini] [REPLACE_CLASS_input] {
+ padding-left: 6px;
+ padding-right: 17px;
+}
+[REPLACE_CLASS_inputnumberwrapper] [REPLACE_CLASS_input]::-webkit-inner-spin-button,
+[REPLACE_CLASS_inputnumberwrapper] [REPLACE_CLASS_input]::-webkit-outer-spin-button{
+ -webkit-appearance: none !important;
+}
+[REPLACE_CLASS_inputnumberbuttons] {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-around;
+ height: 110%;
+ top: -2%;
+}
+[REPLACE_CLASS_inputnumberwrapperdefault] [REPLACE_CLASS_inputnumberbuttons] {
+ right: 8px;
+}
+[REPLACE_CLASS_inputnumberwrappermini] [REPLACE_CLASS_inputnumberbuttons] {
+ right: 4px;
+}
+[REPLACE_CLASS_inputnumberbutton] {
+ cursor: pointer;
+ border: transparent solid 5px;
+ border-top-width: 2.5px;
+ display: inline-block;
+}
+[REPLACE_CLASS_inputnumberbutton] {
+ border-bottom-color: var(--interactive-normal);
+}
+[REPLACE_CLASS_inputnumberbutton]:hover {
+ border-bottom-color: var(--interactive-active);
+}
+[REPLACE_CLASS_inputnumberbuttondown] {
+ transform: rotate(180deg);
+}
+
+[REPLACE_CLASS_guildupperleftbadge] {
+ top: 0;
+}
+[REPLACE_CLASS_guildlowerleftbadge] {
+ bottom: 0;
+}
+[REPLACE_CLASS_guildlowerleftbadge], [REPLACE_CLASS_guildupperleftbadge] {
+ pointer-events: none;
+ position: absolute;
+ left: 0;
+}
+
+[REPLACE_CLASS_guildswrapper] [style*="--folder-color"] [REPLACE_CLASS_guildfolderexpandedbackground] {
+ background: var(--folder-color) !important;
+ opacity: 0.2 !important;
+}
+
+[REPLACE_CLASS_svgiconwrapper] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+[REPLACE_CLASS_svgicon] {
+ color: var(--interactive-normal);
+}
+[REPLACE_CLASS_svgicon]:hover {
+ color: var(--interactive-hover);
+}
+[REPLACE_CLASS_svgicon]:active {
+ color: var(--interactive-active);
+}
+
+[REPLACE_CLASS_listrowwrapper] [REPLACE_CLASS_listavatar] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+[REPLACE_CLASS_sidebarlist] {
+ display: flex;
+ flex-direction: row;
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_sidebar] {
+ padding: 8px;
+ flex: 0 1 auto;
+}
+[REPLACE_CLASS_sidebarcontent] {
+ padding: 8px 0;
+ flex: 1 1 auto;
+}
+
+[REPLACE_CLASS_modalwrapper] {
+ color: var(--header-secondary);
+}
+[REPLACE_CLASS_modalwrapper] [REPLACE_CLASS_modalheader] > [REPLACE_CLASS_headerwrapper] {
+ flex: 1 0 auto;
+}
+[REPLACE_CLASS_modalwrapper] [REPLACE_CLASS_modalfooter] [REPLACE_CLASS_button] {
+ margin-left: 8px;
+}
+[REPLACE_CLASS_modalwrapper] [REPLACE_CLASS_modalclose] [REPLACE_CLASS_buttoncontents] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+[REPLACE_CLASS_modalsubinner] {
+ padding-left: 16px;
+ padding-right: 8px;
+}
+[REPLACE_CLASS_modaltextcontent] {
+ margin-bottom: 10px;
+}
+[REPLACE_CLASS_modalnoscroller] {
+ overflow: hidden;
+}
+[REPLACE_CLASS_modalcontent][REPLACE_CLASS_modalnoscroller] {
+ padding-bottom: 10px;
+}
+[REPLACE_CLASS_modaltabcontent] {
+ margin-top: 10px;
+}
+[REPLACE_CLASS_listscroller] [REPLACE_CLASS_modaltabcontent] {
+ margin-top: 0;
+}
+[REPLACE_CLASS_modalheaderhassibling] {
+ padding-bottom: 10px;
+}
+[REPLACE_CLASS_modalheadershade],
+[REPLACE_CLASS_modalsidebar] {
+ background: rgba(0, 0, 0, 0.1);
+}
+[REPLACE_CLASS_themedark] [REPLACE_CLASS_modalheadershade],
+[REPLACE_CLASS_themedark] [REPLACE_CLASS_modalsidebar] {
+ background: rgba(0, 0, 0, 0.2);
+}
+[REPLACE_CLASS_tabbarcontainer][REPLACE_CLASS_tabbarcontainerbottom] {
+ border-top: unset;
+ border-bottom: 1px solid hsla(0,0%,100%,.1);
+}
+[REPLACE_CLASS_modal] [REPLACE_CLASS_tabbarcontainer] {
+ background: rgba(0, 0, 0, 0.1);
+ border: none;
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.05);
+ flex: 1 1 auto;
+ margin: 0;
+ padding: 16px 16px 0 16px;
+}
+[REPLACE_CLASS_themedark] [REPLACE_CLASS_modal] [REPLACE_CLASS_tabbarcontainer] {
+ background: rgba(0, 0, 0, 0.2);
+ box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.1);
+}
+[REPLACE_CLASS_modalchangelogmodal] [REPLACE_CLASS_changelogsociallink] {
+ margin-right: 12px;
+}
+[REPLACE_CLASS_changelogfooter] {
+ align-items: center;
+}
+
+[REPLACE_CLASS_popoutwrapper] {
+ position: relative;
+}
+[REPLACE_CLASS_popoutarrow]::before {
+ content: "";
+ display: block;
+ position: absolute;
+ border: 8px solid var(--background-secondary);
+ border-right-color: transparent;
+ border-left-color: transparent;
+ left: calc(50% - 8px);
+ z-index: 1;
+}
+[REPLACE_CLASS_popoutarrowtop] {
+ margin-bottom: 8px;
+}
+[REPLACE_CLASS_popoutarrowbottom] {
+ margin-top: 8px;
+}
+[REPLACE_CLASS_popoutarrowtop]::before {
+ border-bottom-color: transparent;
+ bottom: -16px;
+}
+[REPLACE_CLASS_popoutarrowbottom]::before {
+ border-top-color: transparent;
+ top: -16px;
+}
+[REPLACE_CLASS_popoutthemedpopout] {
+ background-color: var(--background-secondary);
+ border-radius: 5px;
+ -webkit-box-shadow: var(--elevation-stroke),var(--elevation-high);
+ box-shadow: var(--elevation-stroke),var(--elevation-high);
+ box-sizing: border-box;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+
+[REPLACE_CLASS__repomodal] {
+ min-height: unset;
+}
+[REPLACE_CLASS__repomodalheader] {
+ pointer-events: none;
+}
+[REPLACE_CLASS__repomodalsettings] {
+ padding: 0 16px 16px 16px;
+}
+[REPLACE_CLASS__repochangelogbutton] {
+ position: fixed;
+ top: 14px;
+ right: 14px;
+}
+
+[REPLACE_CLASS__repo] {
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 auto;
+ width: 100%;
+ height: 100%;
+}
+[REPLACE_CLASS__repo] ~ [REPLACE_CLASS_settingswindowtoolscontainer] {
+ position: absolute;
+ right: 0;
+ margin-right: 21px;
+}
+[REPLACE_CLASS__repolistheader] {
+ display: flex;
+ flex-direction: column;
+ padding-right: 100px;
+ padding-bottom: 0;
+}
+[REPLACE_CLASS__repolistscroller] {
+ padding-top: 0;
+}
+[REPLACE_CLASS__repolistheader] [REPLACE_CLASS_tabbarcontainer] {
+ display: flex;
+ align-items: flex-start;
+}
+[REPLACE_CLASS__repolistheader] [REPLACE_CLASS_quickselectwrapper] {
+ line-height: 20px;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repofooter] {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repofooter] > *:only-child {
+ margin-left: auto;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repoheadercontrols],
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repofootercontrols] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 auto;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repoheadercontrols] > *,
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repocontrols] > * {
+ margin-left: 10px;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repofootercontrols][REPLACE_CLASS__repocontrols] > * {
+ margin-left: 0;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repocontrolsbutton] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+}
+[REPLACE_CLASS__repoentry] [REPLACE_CLASS__repocontrols] > [REPLACE_CLASS__repocontrolsbutton]:only-child {
+ border-radius: 3px;
+}
+
+[REPLACE_CLASS_noticewrapper] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px !important;
+ border-radius: 0 !important;
+ transition: height 0.5s ease !important;
+}
+[REPLACE_CLASS_noticeclosing] {
+ height: 0 !important;
+ overflow: hidden !important;
+}
+[REPLACE_CLASS_noticetext] {
+ display: inline-flex;
+ flex: 0 1 auto;
+ white-space: pre;
+ overflow: hidden;
+}
+[REPLACE_CLASS_noticewrapper] [REPLACE_CLASS_noticeplatformicon] {
+ display: inline-flex;
+ flex: 0 0 auto;
+ position: static;
+ margin: 0 10px 0 0;
+}
+[REPLACE_CLASS_noticewrapper] svg[REPLACE_CLASS_noticeplatformicon] {
+ max-height: 28px;
+ width: unset;
+}
+[REPLACE_CLASS_noticewrapper] [REPLACE_CLASS_noticebutton] {
+ display: inline-flex;
+ flex: 0 0 auto;
+ position: static;
+}
+
+#pluginNotice .notice-message {
+ white-space: pre;
+}
+#pluginNotice #outdatedPlugins {
+ font-weight: 700;
+}
+#pluginNotice #outdatedPlugins span {
+ -webkit-app-region: no-drag;
+ color: #fff;
+ cursor: pointer;
+}
+#pluginNotice #outdatedPlugins span:hover {
+ text-decoration: underline;
+}
+[REPLACE_CLASS_noticeupdateentries] {
+ display: flex;
+ font-weight: 700;
+}
+[REPLACE_CLASS_noticeupdateentry] {
+ cursor: pointer;
+ -webkit-app-region: no-drag;
+}
+[REPLACE_CLASS_noticeupdateentry]:hover {
+ text-decoration: underline;
+}
+[REPLACE_CLASS_noticeupdateseparator] {
+ pointer-events: none;
+}
+
+.platform-osx [REPLACE_CLASS_noticewrapper] ~ * [REPLACE_CLASS_guildswrapper] {
+ margin-top: 0;
+}
+.platform-osx [REPLACE_CLASS_noticewrapper] ~ * [REPLACE_CLASS_guildsscroller] {
+ padding-top: 4px;
+}
+
+[REPLACE_CLASS_tooltiprow]:has([REPLACE_CLASS_usersummarycontainer]:empty) {
+ display: none;
+}
+[REPLACE_CLASS_tooltipnote] {
+ color: var(--text-muted);
+ font-size: 11px;
+ margin-top: 2px;
+}
+[REPLACE_CLASS_tooltip][REPLACE_CLASS_tooltipcustom],
+[REPLACE_CLASS_tooltiplistitem][REPLACE_CLASS_tooltipcustom] {
+ color: #fff;
+}
+[REPLACE_CLASS_tooltip]:has([REPLACE_CLASS_tooltipcontent]:empty) {
+ display: none !important;
+}
+[REPLACE_CLASS_tooltip][REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltipnote],
+[REPLACE_CLASS_tooltiplistitem][REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltipnote] {
+ color: #bbb;
+}
+[REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltippointer] {
+ border-top-color: inherit !important;
+}
+[REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltipguildnametext],
+[REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltipmutetext] {
+ color: inherit;
+}
+[REPLACE_CLASS_tooltipcustom] [REPLACE_CLASS_tooltipmutetext] {
+ opacity: .7;
+}
+[REPLACE_CLASS_guildvoicelist] ~ [REPLACE_CLASS_tooltipmutetext] {
+ margin-top: 8px;
+}
+[REPLACE_CLASS_tooltiprowextra]:empty {
+ display: none;
+}
+[REPLACE_CLASS_tooltiprowextra]:not(:empty) [REPLACE_CLASS_tooltipmutetext] {
+ margin-top: 8px;
+}
+
+[REPLACE_CLASS_colorpickerswatches] > div:not([class]),
+[REPLACE_CLASS_colorpickerswatches] [REPLACE_CLASS_colorpickerswatch] {
+ flex: 1 1 auto;
+}
+[REPLACE_CLASS_colorpickerswatchsinglewrapper] {
+ position: relative;
+ z-index: 1;
+}
+[REPLACE_CLASS_colorpickerswatchsingle] {
+ height: 30px;
+ width: 30px;
+}
+[REPLACE_CLASS_colorpickerswatchesdisabled] {
+ cursor: no-drop;
+ filter: grayscale(70%) brightness(50%);
+}
+[REPLACE_CLASS_colorpickerswatch][REPLACE_CLASS_colorpickerswatchnocolor] {
+ border-color: var(--text-muted);
+}
+[REPLACE_CLASS_colorpickerswatch][style*="background: rgb(255, 255, 255)"] {
+ border-color: var(--header-primary) !important;
+}
+[REPLACE_CLASS_colorpickerswatch][REPLACE_CLASS_colorpickerswatchnocolor] [REPLACE_CLASS_colorpickerswatchdropperfg] {
+ border-color: var(--text-muted);
+}
+[REPLACE_CLASS_colorpickerswatch]:not([REPLACE_CLASS_colorpickerswatchnocolor]):not([REPLACE_CLASS_colorpickerswatchdefault]):not([REPLACE_CLASS_colorpickerswatchdisabled]) {
+ overflow: hidden;
+}
+[REPLACE_CLASS_colorpickerswatch][REPLACE_CLASS_colorpickerswatchcustom][style*="background"] {
+ border: none;
+}
+[REPLACE_CLASS_colorpickerswatch]:not([REPLACE_CLASS_colorpickerswatchdefault])::after {
+ border-radius: 3px;
+}
+[REPLACE_CLASS_colorpickerswatch][REPLACE_CLASS_colorpickerswatchcustom]:not([REPLACE_CLASS_colorpickerswatchdefault])::after {
+ border-radius: 5px;
+}
+[REPLACE_CLASS_colorpickerswatch]:not([REPLACE_CLASS_colorpickerswatchnocolor]):not([REPLACE_CLASS_colorpickerswatchdefault]):not([REPLACE_CLASS_colorpickerswatchdisabled])::after {
+ content: "";
+ background: url('data:image/svg+xml; utf8, ') center repeat;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: -1;
+}
+
+[REPLACE_CLASS_colorpickeralpha] {
+ position: relative;
+ height: 8px;
+ margin: 16px 0 8px;
+}
+[REPLACE_CLASS_colorpickergradient] {
+ position: relative;
+ height: 8px;
+ margin: 27px 2px 2px 2px;
+}
+[REPLACE_CLASS_colorpickeralpha] > div > div > div > div {
+ height: 16px !important;
+ width: 8px !important;
+ margin-top: -3px !important;
+ border-radius: 3px !important;
+}
+[REPLACE_CLASS_colorpickersaturation] > div > div > div > div {
+ box-shadow: var(--header-primary) 0px 0px 0px 1.5px, var(--background-floating) 0px 0px 1px 1px inset, var(--background-floating) 0px 0px 1px 2px !important;
+}
+[REPLACE_CLASS_colorpickerhue] > div > div > div > div,
+[REPLACE_CLASS_colorpickeralpha] > div > div > div > div {
+ background: var(--header-primary) !important;
+ box-shadow: var(--background-floating) 0px 0px 2px !important;
+}
+[REPLACE_CLASS_colorpickeralpha] > div > div,
+[REPLACE_CLASS_colorpickergradient] > div > div {
+ border-radius: 3px;
+}
+[REPLACE_CLASS_colorpickeralpha] [REPLACE_CLASS_colorpickeralphacheckered],
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcheckered],
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor] > div::after {
+ background: url('data:image/svg+xml; utf8, ') center repeat;
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor] > div {
+ height: 8px;
+ width: 8px;
+ margin-top: -15px;
+ border: 1px solid rgb(128, 128, 128);
+ border-radius: 3px;
+ transform: translateX(-5px);
+ transform-style: preserve-3d;
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor] > div::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: -1;
+ border-radius: 3px;
+ transform: translateZ(-1px);
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor] > div::before {
+ content: "";
+ position: absolute;
+ border: 3px solid transparent;
+ border-top-width: 5px;
+ border-top-color: rgb(128, 128, 128);
+ width: 0;
+ height: 0;
+ top: 100%;
+ left: -50%;
+ transform: translateX(5px);
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor][REPLACE_CLASS_colorpickergradientcursoredge] > div::before {
+ border-right-width: 0;
+ border-left-width: 5px;
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor][REPLACE_CLASS_colorpickergradientcursoredge] ~ [REPLACE_CLASS_colorpickergradientcursor][REPLACE_CLASS_colorpickergradientcursoredge] > div::before {
+ border-right-width: 5px;
+ border-left-width: 0;
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor][REPLACE_CLASS_colorpickergradientcursorselected] > div {
+ border-color: var(--header-secondary);
+ width: 10px;
+ height: 10px;
+ margin-top: -17px;
+ transform: translateX(-6px);
+}
+[REPLACE_CLASS_colorpickergradient] [REPLACE_CLASS_colorpickergradientcursor][REPLACE_CLASS_colorpickergradientcursorselected] > div::before {
+ border-top-color: var(--header-secondary);
+ transform: translateX(7px);
+}
+[REPLACE_CLASS_colorpickergradientbutton] {
+ color: var(--interactive-normal);
+ opacity: 0.6;
+ margin-left: 6px;
+ transition: color 200ms ease, opactity 200ms ease;
+}
+[REPLACE_CLASS_colorpickergradientbutton]:hover {
+ color: var(--interactive-hover);
+ opacity: 1;
+}
+[REPLACE_CLASS_colorpickergradientbutton][REPLACE_CLASS_colorpickergradientbuttonenabled],
+[REPLACE_CLASS_colorpickergradientbutton][REPLACE_CLASS_colorpickergradientbuttonenabled]:hover {
+ color: var(--interactive-active);
+ opacity: 1;
+}
+
+[REPLACE_CLASS_modallarge], [REPLACE_CLASS_modalsublarge] {
+ max-height: 95vh;
+}
+@media only screen and (max-height: 900px) {
+ [REPLACE_CLASS_modalmedium], [REPLACE_CLASS_modalsubmedium] {
+ max-height: 75vh;
+ }
+}
+
+[REPLACE_CLASS_peoplesnowplayingmember] [REPLACE_CLASS_nametag] {
+ pointer-events: none;
+}
+
+.platform-win [REPLACE_CLASS_toasts] {
+ padding-top: 22px;
+}
+[REPLACE_CLASS_toasts] {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ left: 10px;
+ display: flex;
+ flex-direction: column;
+ pointer-events: none;
+ z-index: 100001;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastsleft] {
+ bottom: 10px;
+ justify-content: flex-start;
+ align-items: flex-start;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastscenter] {
+ bottom: 80px;
+ justify-content: flex-end;
+ align-items: center;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastsright] {
+ bottom: 10px;
+ justify-content: flex-start;
+ align-items: flex-end;
+}
+[REPLACE_CLASS_toast] {
+ position: relative;
+ display: flex;
+ align-items: center;
+ backdrop-filter: blur(5px);
+ border-radius: 3px;
+ box-shadow: var(--elevation-medium);
+ margin-top: 10px;
+ padding: 10px 10px 12px 10px;
+ overflow: hidden;
+ max-width: 50vw;
+ min-height: 24px;
+ height: unset;
+ opacity: 1;
+ transform: scale(1);
+ transition: all 300ms ease;
+}
+[REPLACE_CLASS_toastclosable] {
+ cursor: pointer;
+ pointer-events: auto;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastsleft] [REPLACE_CLASS_toast] {
+ min-width: 200px;
+ transform-origin: left top;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastscenter] [REPLACE_CLASS_toast] {
+ min-width: 100px;
+ transform-origin: center bottom;
+}
+[REPLACE_CLASS_toasts][REPLACE_CLASS_toastsright] [REPLACE_CLASS_toast] {
+ min-width: 200px;
+ transform-origin: right top;
+}
+[REPLACE_CLASS_toastopening],
+[REPLACE_CLASS_toastclosing] {
+ opacity: 0;
+ transform: scale(0);
+}
+[REPLACE_CLASS_toastclosing] {
+ min-height: 0;
+ height: 0;
+}
+[REPLACE_CLASS_toastbg] {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ opacity: 0.9;
+ z-index: 1;
+}
+[REPLACE_CLASS_toastinner] {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex: 1 0 auto;
+ z-index: 2;
+}
+[REPLACE_CLASS_toasticon] {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex: 0 0 auto;
+ margin-right: 10px;
+}
+[REPLACE_CLASS_toastavatar] {
+ width: 24px;
+ height: 24px;
+}
+[REPLACE_CLASS_toasttext] {
+ max-width: calc(50vw - 50px);
+ flex: 1 0 auto;
+ font-size: 14px;
+ font-weight: 500;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+[REPLACE_CLASS_toastcloseicon] {
+ display: none;
+ margin-left: 6px;
+}
+[REPLACE_CLASS_toast]:hover [REPLACE_CLASS_toastcloseicon] {
+ display: block;
+}
+[REPLACE_CLASS_toastbar] {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 4px;
+ background: black;
+ opacity: 0.3;
+ z-index: 3;
+ transition: all;
+}
+[REPLACE_CLASS_toast]:hover [REPLACE_CLASS_toastbar] {
+ animation-play-state: paused !important;
+}
+[REPLACE_CLASS_toastclosing] [REPLACE_CLASS_toastbar] {
+ animation: unset !important;
+ right: 0 !important;
+ transition: all !important;
+}
+@keyframes toast-bar {
+ from {right: 100%;}
+ to {right: 0;}
+}
+[REPLACE_CLASS_toastdefault] [REPLACE_CLASS_toastbar] {
+ background: var(--header-primary);
+}
+[REPLACE_CLASS_toastbar][REPLACE_CLASS_toastcustombar] {
+ opacity: 1;
+}
+[REPLACE_CLASS_toastdefault] [REPLACE_CLASS_toastbg] {
+ background-color: var(--background-floating);
+}
+[REPLACE_CLASS_toastdefault] [REPLACE_CLASS_toastinner] {
+ color: var(--header-primary);
+}
+[REPLACE_CLASS_toastbrand] [REPLACE_CLASS_toastbg] {
+ background-color: var(--bdfdb-blurple);
+}
+[REPLACE_CLASS_toastbrand] [REPLACE_CLASS_toastinner] {
+ color: #fff;
+}
+[REPLACE_CLASS_toastdanger] [REPLACE_CLASS_toastbg] {
+ background-color: var(--status-danger);
+}
+[REPLACE_CLASS_toastdanger] [REPLACE_CLASS_toastinner] {
+ color: var(--status-danger-text);
+}
+[REPLACE_CLASS_toastinfo] [REPLACE_CLASS_toastbg] {
+ background-color: #4A90E2;
+}
+[REPLACE_CLASS_toastinfo] [REPLACE_CLASS_toastinner] {
+ color: #fff;
+}
+[REPLACE_CLASS_toastsuccess] [REPLACE_CLASS_toastbg] {
+ background-color: var(--status-positive);
+}
+[REPLACE_CLASS_toastsuccess] [REPLACE_CLASS_toastinner] {
+ color: var(--status-positive-text);
+}
+[REPLACE_CLASS_toastwarning] [REPLACE_CLASS_toastbg] {
+ background-color: var(--status-warning);
+}
+[REPLACE_CLASS_toastwarning] [REPLACE_CLASS_toastinner] {
+ color: var(--status-warning-text);
+}