Showing preview only (2,700K chars total). Download the full file or copy to clipboard to get everything.
Repository: Vendicated/Vencord
Branch: main
Commit: cba0eb989741
Files: 752
Total size: 2.4 MB
Directory structure:
gitextract_c3tzg39v/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── blank.yml
│ │ ├── bug_report.yml
│ │ └── config.yml
│ └── workflows/
│ ├── build.yml
│ ├── codeberg-mirror.yml
│ ├── publish.yml
│ ├── reportBrokenPlugins.yml
│ └── test.yml
├── .gitignore
├── .npmrc
├── .stylelintrc.json
├── .vscode/
│ ├── extensions.json
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── browser/
│ ├── GMPolyfill.js
│ ├── Vencord.ts
│ ├── VencordNativeStub.ts
│ ├── background.js
│ ├── content.js
│ ├── manifest.json
│ ├── manifestv2.json
│ ├── modifyResponseHeaders.json
│ ├── monaco.ts
│ ├── monacoWin.html
│ ├── patch-worker.js
│ └── userscript.meta.js
├── eslint.config.mjs
├── package.json
├── packages/
│ ├── discord-types/
│ │ ├── .npmignore
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── enums/
│ │ │ ├── activity.ts
│ │ │ ├── channel.ts
│ │ │ ├── commands.ts
│ │ │ ├── index.ts
│ │ │ ├── messages.ts
│ │ │ ├── misc.ts
│ │ │ └── user.ts
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── common/
│ │ │ │ ├── Activity.d.ts
│ │ │ │ ├── Application.d.ts
│ │ │ │ ├── Channel.d.ts
│ │ │ │ ├── Guild.d.ts
│ │ │ │ ├── GuildMember.d.ts
│ │ │ │ ├── Record.d.ts
│ │ │ │ ├── Role.d.ts
│ │ │ │ ├── User.d.ts
│ │ │ │ ├── index.d.ts
│ │ │ │ └── messages/
│ │ │ │ ├── Commands.d.ts
│ │ │ │ ├── Embed.d.ts
│ │ │ │ ├── Emoji.d.ts
│ │ │ │ ├── Message.d.ts
│ │ │ │ ├── Sticker.d.ts
│ │ │ │ └── index.d.ts
│ │ │ ├── components.d.ts
│ │ │ ├── flux.d.ts
│ │ │ ├── fluxEvents.d.ts
│ │ │ ├── index.d.ts
│ │ │ ├── menu.d.ts
│ │ │ ├── modules/
│ │ │ │ ├── CloudUpload.d.ts
│ │ │ │ └── index.d.ts
│ │ │ ├── stores/
│ │ │ │ ├── AccessibilityStore.d.ts
│ │ │ │ ├── ActiveJoinedThreadsStore.d.ts
│ │ │ │ ├── ApplicationStore.d.ts
│ │ │ │ ├── AuthenticationStore.d.ts
│ │ │ │ ├── CallStore.d.ts
│ │ │ │ ├── ChannelRTCStore.d.ts
│ │ │ │ ├── ChannelStore.d.ts
│ │ │ │ ├── DraftStore.d.ts
│ │ │ │ ├── EmojiStore.d.ts
│ │ │ │ ├── FluxStore.d.ts
│ │ │ │ ├── FriendsStore.d.ts
│ │ │ │ ├── GuildChannelStore.d.ts
│ │ │ │ ├── GuildMemberCountStore.d.ts
│ │ │ │ ├── GuildMemberStore.d.ts
│ │ │ │ ├── GuildRoleStore.d.ts
│ │ │ │ ├── GuildScheduledEventStore.d.ts
│ │ │ │ ├── GuildStore.d.ts
│ │ │ │ ├── InstantInviteStore.d.ts
│ │ │ │ ├── InviteStore.d.ts
│ │ │ │ ├── LocaleStore.d.ts
│ │ │ │ ├── MediaEngineStore.d.ts
│ │ │ │ ├── MessageStore.d.ts
│ │ │ │ ├── NotificationSettingsStore.d.ts
│ │ │ │ ├── OverridePremiumTypeStore.d.ts
│ │ │ │ ├── PendingReplyStore.d.ts
│ │ │ │ ├── PermissionStore.d.ts
│ │ │ │ ├── PopoutWindowStore.d.ts
│ │ │ │ ├── PresenceStore.d.ts
│ │ │ │ ├── RTCConnectionStore.d.ts
│ │ │ │ ├── ReadStateStore.d.ts
│ │ │ │ ├── RelationshipStore.d.ts
│ │ │ │ ├── RunningGameStore.d.ts
│ │ │ │ ├── SelectedChannelStore.d.ts
│ │ │ │ ├── SelectedGuildStore.d.ts
│ │ │ │ ├── SoundboardStore.d.ts
│ │ │ │ ├── SpellCheckStore.d.ts
│ │ │ │ ├── SpotifyStore.d.ts
│ │ │ │ ├── StickersStore.d.ts
│ │ │ │ ├── StreamerModeStore.d.ts
│ │ │ │ ├── ThemeStore.d.ts
│ │ │ │ ├── TypingStore.d.ts
│ │ │ │ ├── UploadAttachmentStore.d.ts
│ │ │ │ ├── UserGuildSettingsStore.d.ts
│ │ │ │ ├── UserProfileStore.d.ts
│ │ │ │ ├── UserSettingsProtoStore.d.ts
│ │ │ │ ├── UserStore.d.ts
│ │ │ │ ├── VoiceStateStore.d.ts
│ │ │ │ ├── WindowStore.d.ts
│ │ │ │ └── index.d.ts
│ │ │ └── utils.d.ts
│ │ └── webpack/
│ │ └── index.d.ts
│ └── vencord-types/
│ ├── .gitignore
│ ├── .npmignore
│ ├── HOW2PUB.md
│ ├── README.md
│ ├── globals.d.ts
│ ├── index.d.ts
│ ├── package.json
│ └── prepare.ts
├── patches/
│ └── eslint-plugin-path-alias@2.1.0.patch
├── pnpm-workspace.yaml
├── scripts/
│ ├── build/
│ │ ├── build.mjs
│ │ ├── buildWeb.mjs
│ │ ├── common.mjs
│ │ ├── inject/
│ │ │ └── react.mjs
│ │ └── module/
│ │ └── style.js
│ ├── checkNodeVersion.js
│ ├── generatePluginList.ts
│ ├── generateReport.ts
│ ├── header-new.txt
│ ├── header-old.txt
│ ├── runInstaller.mjs
│ ├── suppressExperimentalWarnings.js
│ └── utils.mjs
├── src/
│ ├── Vencord.ts
│ ├── VencordNative.ts
│ ├── api/
│ │ ├── Badges.ts
│ │ ├── ChatButton.css
│ │ ├── ChatButtons.tsx
│ │ ├── Commands/
│ │ │ ├── commandHelpers.ts
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── ContextMenu.ts
│ │ ├── DataStore/
│ │ │ ├── LICENSE
│ │ │ └── index.ts
│ │ ├── MemberListDecorators.tsx
│ │ ├── MessageAccessories.tsx
│ │ ├── MessageDecorations.tsx
│ │ ├── MessageEvents.ts
│ │ ├── MessagePopover.tsx
│ │ ├── MessageUpdater.ts
│ │ ├── Notices.tsx
│ │ ├── Notifications/
│ │ │ ├── NotificationComponent.tsx
│ │ │ ├── Notifications.tsx
│ │ │ ├── index.ts
│ │ │ ├── notificationLog.tsx
│ │ │ └── styles.css
│ │ ├── PluginManager.ts
│ │ ├── ServerList.tsx
│ │ ├── Settings.ts
│ │ ├── SettingsSync/
│ │ │ ├── cloudSetup.tsx
│ │ │ ├── cloudSync.ts
│ │ │ └── offline.ts
│ │ ├── Styles.ts
│ │ ├── Themes.ts
│ │ ├── UserSettings.ts
│ │ └── index.ts
│ ├── components/
│ │ ├── BaseText.css
│ │ ├── BaseText.tsx
│ │ ├── Button.css
│ │ ├── Button.tsx
│ │ ├── Card.css
│ │ ├── Card.tsx
│ │ ├── CheckedTextInput.tsx
│ │ ├── CodeBlock.tsx
│ │ ├── Divider.css
│ │ ├── Divider.tsx
│ │ ├── ErrorBoundary.tsx
│ │ ├── ErrorCard.css
│ │ ├── ErrorCard.tsx
│ │ ├── ExpandableCard.css
│ │ ├── ExpandableCard.tsx
│ │ ├── Flex.tsx
│ │ ├── FormSwitch.css
│ │ ├── FormSwitch.tsx
│ │ ├── Grid.tsx
│ │ ├── Heading.css
│ │ ├── Heading.tsx
│ │ ├── Heart.tsx
│ │ ├── Icons.tsx
│ │ ├── Link.tsx
│ │ ├── Paragraph.tsx
│ │ ├── Span.tsx
│ │ ├── Switch.css
│ │ ├── Switch.tsx
│ │ ├── TooltipContainer.tsx
│ │ ├── TooltipFallback.tsx
│ │ ├── handleComponentFailed.ts
│ │ ├── iconStyles.css
│ │ ├── index.ts
│ │ ├── margins.ts
│ │ └── settings/
│ │ ├── AddonCard.css
│ │ ├── AddonCard.tsx
│ │ ├── DonateButton.tsx
│ │ ├── PluginBadge.tsx
│ │ ├── QuickAction.css
│ │ ├── QuickAction.tsx
│ │ ├── SpecialCard.css
│ │ ├── SpecialCard.tsx
│ │ ├── index.ts
│ │ └── tabs/
│ │ ├── BaseTab.tsx
│ │ ├── index.ts
│ │ ├── patchHelper/
│ │ │ ├── FullPatchInput.tsx
│ │ │ ├── PatchPreview.tsx
│ │ │ ├── ReplacementInput.tsx
│ │ │ └── index.tsx
│ │ ├── plugins/
│ │ │ ├── ContributorModal.css
│ │ │ ├── ContributorModal.tsx
│ │ │ ├── LinkIconButton.css
│ │ │ ├── LinkIconButton.tsx
│ │ │ ├── PluginCard.tsx
│ │ │ ├── PluginModal.css
│ │ │ ├── PluginModal.tsx
│ │ │ ├── UIElements.css
│ │ │ ├── UIElements.tsx
│ │ │ ├── components/
│ │ │ │ ├── BooleanSetting.tsx
│ │ │ │ ├── Common.tsx
│ │ │ │ ├── ComponentSetting.tsx
│ │ │ │ ├── NumberSetting.tsx
│ │ │ │ ├── SelectSetting.tsx
│ │ │ │ ├── SliderSetting.tsx
│ │ │ │ ├── TextSetting.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── styles.css
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── styles.css
│ │ ├── sync/
│ │ │ ├── BackupAndRestoreTab.tsx
│ │ │ └── CloudTab.tsx
│ │ ├── themes/
│ │ │ ├── CspErrorCard.tsx
│ │ │ ├── LocalThemesTab.tsx
│ │ │ ├── OnlineThemesTab.tsx
│ │ │ ├── ThemeCard.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── updater/
│ │ │ ├── Components.tsx
│ │ │ ├── index.tsx
│ │ │ └── runWithDispatch.tsx
│ │ └── vencord/
│ │ ├── DonateButton.tsx
│ │ ├── MacVibrancySettings.tsx
│ │ ├── NotificationSettings.tsx
│ │ └── index.tsx
│ ├── debug/
│ │ ├── Tracer.ts
│ │ ├── loadLazyChunks.ts
│ │ └── runReporter.ts
│ ├── globals.d.ts
│ ├── main/
│ │ ├── csp/
│ │ │ ├── index.ts
│ │ │ └── manager.ts
│ │ ├── index.ts
│ │ ├── ipcMain.ts
│ │ ├── ipcPlugins.ts
│ │ ├── monacoWin.html
│ │ ├── patchWin32Updater.ts
│ │ ├── patcher.ts
│ │ ├── settings.ts
│ │ ├── themes/
│ │ │ ├── LICENSE
│ │ │ └── index.ts
│ │ ├── updater/
│ │ │ ├── common.ts
│ │ │ ├── git.ts
│ │ │ ├── http.ts
│ │ │ └── index.ts
│ │ └── utils/
│ │ ├── constants.ts
│ │ ├── crxToZip.ts
│ │ ├── extensions.ts
│ │ ├── externalLinks.ts
│ │ └── http.ts
│ ├── modules.d.ts
│ ├── nativeModules.d.ts
│ ├── plugins/
│ │ ├── _api/
│ │ │ ├── badges/
│ │ │ │ ├── fixDiscordBadgePadding.css
│ │ │ │ └── index.tsx
│ │ │ ├── chatButtons.ts
│ │ │ ├── commands.ts
│ │ │ ├── contextMenu.ts
│ │ │ ├── dynamicImageModalApi.ts
│ │ │ ├── memberListDecorators/
│ │ │ │ ├── index.tsx
│ │ │ │ └── style.css
│ │ │ ├── menuItemDemangler.ts
│ │ │ ├── messageAccessories.ts
│ │ │ ├── messageDecorations/
│ │ │ │ ├── index.tsx
│ │ │ │ └── style.css
│ │ │ ├── messageEvents.ts
│ │ │ ├── messagePopover.ts
│ │ │ ├── messageUpdater.ts
│ │ │ ├── notices.ts
│ │ │ ├── serverList.ts
│ │ │ └── userSettings.ts
│ │ ├── _core/
│ │ │ ├── noTrack.ts
│ │ │ ├── settings.tsx
│ │ │ └── supportHelper.tsx
│ │ ├── accountPanelServerProfile/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── alwaysAnimate/
│ │ │ └── index.ts
│ │ ├── alwaysExpandRoles/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── alwaysTrust/
│ │ │ └── index.ts
│ │ ├── anonymiseFileNames/
│ │ │ └── index.tsx
│ │ ├── appleMusic.desktop/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── native.ts
│ │ ├── arRPC.web/
│ │ │ └── index.tsx
│ │ ├── autoDndWhilePlaying.discordDesktop/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── betterFolders/
│ │ │ ├── FolderSideBar.tsx
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── betterGifAltText/
│ │ │ └── index.ts
│ │ ├── betterGifPicker/
│ │ │ └── index.ts
│ │ ├── betterNotes/
│ │ │ └── index.tsx
│ │ ├── betterRoleContext/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── betterRoleDot/
│ │ │ └── index.ts
│ │ ├── betterSessions/
│ │ │ ├── README.md
│ │ │ ├── components/
│ │ │ │ ├── RenameButton.tsx
│ │ │ │ ├── RenameModal.tsx
│ │ │ │ └── icons.tsx
│ │ │ ├── index.tsx
│ │ │ ├── styles.css
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ ├── betterSettings/
│ │ │ ├── README.md
│ │ │ ├── fullHeightContext.css
│ │ │ └── index.tsx
│ │ ├── betterUploadButton/
│ │ │ └── index.ts
│ │ ├── biggerStreamPreview/
│ │ │ ├── index.tsx
│ │ │ └── webpack/
│ │ │ ├── stores.ts
│ │ │ └── types/
│ │ │ └── stores.ts
│ │ ├── blurNsfw/
│ │ │ └── index.ts
│ │ ├── callTimer/
│ │ │ ├── alignedChatInputFix.css
│ │ │ └── index.tsx
│ │ ├── clearURLs/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── clientTheme/
│ │ │ ├── README.md
│ │ │ ├── clientTheme.css
│ │ │ ├── components/
│ │ │ │ └── Settings.tsx
│ │ │ ├── index.tsx
│ │ │ └── utils/
│ │ │ ├── colorUtils.ts
│ │ │ └── styleUtils.ts
│ │ ├── colorSighted/
│ │ │ └── index.ts
│ │ ├── consoleJanitor/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── consoleShortcuts/
│ │ │ ├── index.ts
│ │ │ └── native.ts
│ │ ├── copyEmojiMarkdown/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── copyFileContents/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── copyStickerLinks/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── copyUserURLs/
│ │ │ └── index.tsx
│ │ ├── crashHandler/
│ │ │ └── index.ts
│ │ ├── ctrlEnterSend/
│ │ │ └── index.ts
│ │ ├── customCommands/
│ │ │ ├── CreateTagModal.tsx
│ │ │ ├── SettingsTagList.tsx
│ │ │ ├── index.ts
│ │ │ ├── settings.ts
│ │ │ └── styles.css
│ │ ├── customIdle/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── customRPC/
│ │ │ ├── README.md
│ │ │ ├── RpcSettings.tsx
│ │ │ ├── index.tsx
│ │ │ └── settings.css
│ │ ├── dearrow/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── decor/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ ├── lib/
│ │ │ │ ├── api.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── stores/
│ │ │ │ │ ├── AuthorizationStore.tsx
│ │ │ │ │ ├── CurrentUserDecorationsStore.ts
│ │ │ │ │ └── UsersDecorationsStore.ts
│ │ │ │ └── utils/
│ │ │ │ └── decoration.ts
│ │ │ ├── settings.tsx
│ │ │ └── ui/
│ │ │ ├── components/
│ │ │ │ ├── DecorDecorationGridDecoration.tsx
│ │ │ │ ├── DecorSection.tsx
│ │ │ │ ├── DecorationContextMenu.tsx
│ │ │ │ ├── DecorationGridCreate.tsx
│ │ │ │ ├── DecorationGridNone.tsx
│ │ │ │ ├── Grid.tsx
│ │ │ │ ├── SectionedGridList.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── modals/
│ │ │ │ ├── ChangeDecorationModal.tsx
│ │ │ │ ├── CreateDecorationModal.tsx
│ │ │ │ └── GuidelinesModal.tsx
│ │ │ └── styles.css
│ │ ├── devCompanion.dev/
│ │ │ └── index.tsx
│ │ ├── disableCallIdle/
│ │ │ └── index.ts
│ │ ├── dontRoundMyTimestamps/
│ │ │ └── index.ts
│ │ ├── experiments/
│ │ │ ├── hideBugReport.css
│ │ │ └── index.tsx
│ │ ├── expressionCloner/
│ │ │ └── index.tsx
│ │ ├── f8break/
│ │ │ └── index.ts
│ │ ├── fakeNitro/
│ │ │ └── index.tsx
│ │ ├── fakeProfileThemes/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── favEmojiFirst/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── favGifSearch/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── fixCodeblockGap/
│ │ │ └── index.ts
│ │ ├── fixImagesQuality/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── fixSpotifyEmbeds.desktop/
│ │ │ ├── index.tsx
│ │ │ └── native.ts
│ │ ├── fixYoutubeEmbeds.desktop/
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ └── native.ts
│ │ ├── forceOwnerCrown/
│ │ │ └── index.ts
│ │ ├── friendInvites/
│ │ │ └── index.ts
│ │ ├── friendsSince/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── fullSearchContext/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── fullUserInChatbox/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── gameActivityToggle/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── gifPaste/
│ │ │ └── index.ts
│ │ ├── greetStickerPicker/
│ │ │ └── index.tsx
│ │ ├── hideAttachments/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── iLoveSpam/
│ │ │ └── index.ts
│ │ ├── ignoreActivities/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── imageFilename/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── imageLink/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── imageZoom/
│ │ │ ├── README.md
│ │ │ ├── components/
│ │ │ │ └── Magnifier.tsx
│ │ │ ├── constants.ts
│ │ │ ├── index.tsx
│ │ │ ├── styles.css
│ │ │ └── utils/
│ │ │ └── waitFor.ts
│ │ ├── implicitRelationships/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── ircColors/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── keepCurrentChannel/
│ │ │ └── index.ts
│ │ ├── lastfmRichPresence/
│ │ │ └── index.tsx
│ │ ├── loadingQuotes/
│ │ │ ├── index.ts
│ │ │ └── quotes.txt
│ │ ├── memberCount/
│ │ │ ├── CircleIcon.tsx
│ │ │ ├── MemberCount.tsx
│ │ │ ├── OnlineMemberCountStore.ts
│ │ │ ├── VoiceIcon.tsx
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── mentionAvatars/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── messageClickActions/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── messageLatency/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── messageLinkEmbeds/
│ │ │ └── index.tsx
│ │ ├── messageLogger/
│ │ │ ├── HistoryModal.tsx
│ │ │ ├── deleteStyleOverlay.css
│ │ │ ├── deleteStyleText.css
│ │ │ ├── index.tsx
│ │ │ └── messageLogger.css
│ │ ├── moreQuickReactions/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── mutualGroupDMs/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── newGuildSettings/
│ │ │ └── index.tsx
│ │ ├── noBlockedMessages/
│ │ │ └── index.ts
│ │ ├── noDeepLinks.web/
│ │ │ └── index.ts
│ │ ├── noDefaultHangStatus/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── noDevtoolsWarning/
│ │ │ └── index.ts
│ │ ├── noF1/
│ │ │ └── index.ts
│ │ ├── noMaskedUrlPaste/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── noMosaic/
│ │ │ └── index.ts
│ │ ├── noOnboardingDelay/
│ │ │ └── index.ts
│ │ ├── noPendingCount/
│ │ │ └── index.ts
│ │ ├── noProfileThemes/
│ │ │ └── index.ts
│ │ ├── noReplyMention/
│ │ │ └── index.tsx
│ │ ├── noServerEmojis/
│ │ │ └── index.ts
│ │ ├── noSystemBadge.discordDesktop/
│ │ │ └── index.ts
│ │ ├── noTypingAnimation/
│ │ │ └── index.ts
│ │ ├── noUnblockToJump/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── notificationVolume/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── onePingPerDM/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── oneko/
│ │ │ └── index.ts
│ │ ├── openInApp/
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ └── native.ts
│ │ ├── overrideForumDefaults/
│ │ │ └── index.tsx
│ │ ├── pauseInvitesForever/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── permissionFreeWill/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── permissionsViewer/
│ │ │ ├── components/
│ │ │ │ ├── RolesAndUsersPermissions.tsx
│ │ │ │ ├── UserPermissions.tsx
│ │ │ │ └── icons.tsx
│ │ │ ├── index.tsx
│ │ │ ├── styles.css
│ │ │ └── utils.ts
│ │ ├── petpet/
│ │ │ └── index.ts
│ │ ├── pictureInPicture/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── pinDms/
│ │ │ ├── components/
│ │ │ │ ├── CreateCategoryModal.tsx
│ │ │ │ └── contextMenu.tsx
│ │ │ ├── constants.ts
│ │ │ ├── data.ts
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── plainFolderIcon/
│ │ │ ├── index.ts
│ │ │ └── style.css
│ │ ├── platformIndicators/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── previewMessage/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── quickMention/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── quickReply/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── reactErrorDecoder/
│ │ │ └── index.ts
│ │ ├── readAllNotificationsButton/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── relationshipNotifier/
│ │ │ ├── functions.ts
│ │ │ ├── index.ts
│ │ │ ├── settings.ts
│ │ │ ├── types.ts
│ │ │ └── utils.ts
│ │ ├── replaceGoogleSearch/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── replyTimestamp/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── revealAllSpoilers/
│ │ │ └── index.ts
│ │ ├── reverseImageSearch/
│ │ │ └── index.tsx
│ │ ├── reviewDB/
│ │ │ ├── auth.tsx
│ │ │ ├── components/
│ │ │ │ ├── BlockedUserModal.tsx
│ │ │ │ ├── MessageButton.tsx
│ │ │ │ ├── ReviewBadge.tsx
│ │ │ │ ├── ReviewComponent.tsx
│ │ │ │ ├── ReviewModal.tsx
│ │ │ │ └── ReviewsView.tsx
│ │ │ ├── entities.ts
│ │ │ ├── index.tsx
│ │ │ ├── reviewDbApi.ts
│ │ │ ├── settings.tsx
│ │ │ ├── style.css
│ │ │ └── utils.tsx
│ │ ├── roleColorEverywhere/
│ │ │ └── index.tsx
│ │ ├── secretRingTone/
│ │ │ └── index.ts
│ │ ├── seeSummaries/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── sendTimestamps/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── serverInfo/
│ │ │ ├── GuildInfoModal.tsx
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── serverListIndicators/
│ │ │ └── index.tsx
│ │ ├── shikiCodeblocks.desktop/
│ │ │ ├── api/
│ │ │ │ ├── languages.ts
│ │ │ │ ├── shiki.ts
│ │ │ │ └── themes.ts
│ │ │ ├── components/
│ │ │ │ ├── ButtonRow.tsx
│ │ │ │ ├── Code.tsx
│ │ │ │ ├── CopyButton.tsx
│ │ │ │ ├── Header.tsx
│ │ │ │ └── Highlighter.tsx
│ │ │ ├── devicon.css
│ │ │ ├── hooks/
│ │ │ │ ├── useCopyCooldown.ts
│ │ │ │ ├── useShikiSettings.ts
│ │ │ │ └── useTheme.ts
│ │ │ ├── index.ts
│ │ │ ├── previewExample.tsx
│ │ │ ├── settings.ts
│ │ │ ├── shiki.css
│ │ │ ├── types.ts
│ │ │ └── utils/
│ │ │ ├── color.ts
│ │ │ ├── createStyle.ts
│ │ │ └── misc.ts
│ │ ├── showAllMessageButtons/
│ │ │ └── index.ts
│ │ ├── showConnections/
│ │ │ ├── VerifiedIcon.tsx
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── showHiddenChannels/
│ │ │ ├── components/
│ │ │ │ └── HiddenChannelLockScreen.tsx
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── showHiddenThings/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── showMeYourName/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── showTimeoutDuration/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── silentMessageToggle/
│ │ │ └── index.tsx
│ │ ├── silentTyping/
│ │ │ └── index.tsx
│ │ ├── sortFriendRequests/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── spotifyControls/
│ │ │ ├── PlayerComponent.tsx
│ │ │ ├── SeekBar.ts
│ │ │ ├── SpotifyStore.ts
│ │ │ ├── hoverOnly.css
│ │ │ ├── index.tsx
│ │ │ └── spotifyStyles.css
│ │ ├── spotifyCrack/
│ │ │ └── index.ts
│ │ ├── spotifyShareCommands/
│ │ │ └── index.ts
│ │ ├── startupTimings/
│ │ │ ├── StartupTimingPage.tsx
│ │ │ └── index.tsx
│ │ ├── stickerPaste/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── streamerModeOnStream/
│ │ │ └── index.ts
│ │ ├── superReactionTweaks/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── textReplace/
│ │ │ ├── index.tsx
│ │ │ └── styles.css
│ │ ├── themeAttributes/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── translate/
│ │ │ ├── TranslateIcon.tsx
│ │ │ ├── TranslateModal.tsx
│ │ │ ├── TranslationAccessory.tsx
│ │ │ ├── index.tsx
│ │ │ ├── languages.ts
│ │ │ ├── native.ts
│ │ │ ├── settings.ts
│ │ │ ├── styles.css
│ │ │ └── utils.ts
│ │ ├── typingIndicator/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── typingTweaks/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── unindent/
│ │ │ └── index.ts
│ │ ├── unlockedAvatarZoom/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── unsuppressEmbeds/
│ │ │ └── index.tsx
│ │ ├── userMessagesPronouns/
│ │ │ ├── PronounsChatComponent.tsx
│ │ │ ├── README.md
│ │ │ ├── index.ts
│ │ │ ├── settings.ts
│ │ │ └── utils.ts
│ │ ├── userVoiceShow/
│ │ │ ├── README.md
│ │ │ ├── components.tsx
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── usrbg/
│ │ │ └── index.tsx
│ │ ├── validReply/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── validUser/
│ │ │ └── index.tsx
│ │ ├── vcDoubleClick/
│ │ │ └── index.ts
│ │ ├── vcNarrator/
│ │ │ ├── VoiceSetting.tsx
│ │ │ ├── index.tsx
│ │ │ └── settings.ts
│ │ ├── vencordToolbox/
│ │ │ ├── index.tsx
│ │ │ ├── menu.tsx
│ │ │ └── styles.css
│ │ ├── viewIcons/
│ │ │ └── index.tsx
│ │ ├── viewRaw/
│ │ │ └── index.tsx
│ │ ├── voiceDownload/
│ │ │ ├── index.tsx
│ │ │ └── style.css
│ │ ├── voiceMessages/
│ │ │ ├── DesktopRecorder.tsx
│ │ │ ├── VoicePreview.tsx
│ │ │ ├── WebRecorder.tsx
│ │ │ ├── index.tsx
│ │ │ ├── native.ts
│ │ │ ├── settings.ts
│ │ │ └── styles.css
│ │ ├── volumeBooster/
│ │ │ ├── README.md
│ │ │ └── index.ts
│ │ ├── webContextMenus.web/
│ │ │ └── index.ts
│ │ ├── webKeybinds.web/
│ │ │ └── index.ts
│ │ ├── webScreenShareFixes.web/
│ │ │ └── index.ts
│ │ ├── whoReacted/
│ │ │ ├── README.md
│ │ │ └── index.tsx
│ │ ├── xsOverlay/
│ │ │ ├── README.md
│ │ │ ├── index.tsx
│ │ │ └── native.ts
│ │ └── youtubeAdblock.desktop/
│ │ ├── README.md
│ │ ├── adguard.js
│ │ ├── index.ts
│ │ └── native.ts
│ ├── preload.ts
│ ├── shared/
│ │ ├── IpcEvents.ts
│ │ ├── SettingsStore.ts
│ │ ├── debounce.ts
│ │ ├── onceDefined.ts
│ │ └── vencordUserAgent.ts
│ ├── utils/
│ │ ├── ChangeList.ts
│ │ ├── Logger.ts
│ │ ├── Queue.ts
│ │ ├── apng.ts
│ │ ├── clipboard.ts
│ │ ├── constants.ts
│ │ ├── cspViolations.ts
│ │ ├── css.ts
│ │ ├── dependencies.ts
│ │ ├── discord.tsx
│ │ ├── guards.ts
│ │ ├── index.ts
│ │ ├── intlHash.ts
│ │ ├── lazy.ts
│ │ ├── lazyReact.tsx
│ │ ├── localStorage.ts
│ │ ├── margins.ts
│ │ ├── mergeDefaults.ts
│ │ ├── misc.ts
│ │ ├── modal.tsx
│ │ ├── native.ts
│ │ ├── onlyOnce.ts
│ │ ├── patches.ts
│ │ ├── react.tsx
│ │ ├── text.ts
│ │ ├── types.ts
│ │ ├── updater.ts
│ │ ├── web-metadata.ts
│ │ └── web.ts
│ └── webpack/
│ ├── common/
│ │ ├── components.ts
│ │ ├── index.ts
│ │ ├── internal.tsx
│ │ ├── menu.ts
│ │ ├── react.ts
│ │ ├── stores.ts
│ │ ├── userSettings.ts
│ │ └── utils.ts
│ ├── index.ts
│ ├── patchWebpack.ts
│ ├── types.ts
│ └── webpack.ts
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
================================================
FILE: .gitattributes
================================================
* text=auto eol=lf
================================================
FILE: .github/ISSUE_TEMPLATE/blank.yml
================================================
name: Blank Issue
description: Create a blank issue. ALWAYS FIRST USE OUR SUPPORT CHANNEL! ONLY USE THIS FORM IF YOU ARE A CONTRIBUTOR OR WERE TOLD TO DO SO IN THE SUPPORT CHANNEL.
body:
- type: markdown
attributes:
value: |

GitHub Issues are for development, not support! Please use our [support server](https://vencord.dev/discord) unless you are a Vencord Developer.
- type: textarea
id: content
attributes:
label: Content
validations:
required: true
- type: checkboxes
id: agreement-check
attributes:
label: Request Agreement
options:
- label: I have read the requirements for opening an issue above
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug/Crash Report
description: Create a bug or crash report for Vencord. ALWAYS FIRST USE OUR SUPPORT CHANNEL! ONLY USE THIS FORM IF YOU ARE A CONTRIBUTOR OR WERE TOLD TO DO SO IN THE SUPPORT CHANNEL.
labels: [bug]
title: "[Bug] <title>"
body:
- type: markdown
attributes:
value: |

GitHub Issues are for development, not support! Please use our [support server](https://vencord.dev/discord) unless you are a Vencord Developer.
- type: textarea
id: bug-description
attributes:
label: What happens when the bug or crash occurs?
description: Where does this bug or crash occur, when does it occur, etc.
placeholder: The bug/crash happens sometimes when I do ..., causing this to not work/the app to crash. I think it happens because of ...
validations:
required: true
- type: textarea
id: expected-behaviour
attributes:
label: What is the expected behaviour?
description: Simply detail what the expected behaviour is.
placeholder: I expect Vencord/Discord to open the ... page instead of ..., it prevents me from doing ...
validations:
required: true
- type: textarea
id: steps-to-take
attributes:
label: How do you recreate this bug or crash?
description: Give us a list of steps in order to recreate the bug or crash.
placeholder: |
1. Do ...
2. Then ...
3. Do this ..., ... and then ...
4. Observe "the bug" or "the crash"
validations:
required: true
- type: textarea
id: crash-log
attributes:
label: Errors
description: Open the Developer Console with Ctrl/Cmd + Shift + i. Then look for any red errors (Ignore network errors like Failed to load resource) and paste them between the "```".
value: |
```
Replace this text with your crash-log.
```
validations:
required: false
- type: checkboxes
id: agreement-check
attributes:
label: Request Agreement
description: We only accept reports for bugs that happen on Discord Stable. Canary and PTB are Development branches and may be unstable
options:
- label: I am using Discord Stable or tried on Stable and this bug happens there as well
required: true
- label: I am a Vencord Developer
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Vencord Support Server
url: https://discord.gg/D9uwnFnqmd
about: If you need help regarding Vencord, please join our support server!
- name: Vencord Installer
url: https://github.com/Vencord/Installer
about: You can find the Vencord Installer here
================================================
FILE: .github/workflows/build.yml
================================================
name: Build DevBuild
on:
push:
branches:
- main
paths:
- .github/workflows/build.yml
- src/**
- browser/**
- scripts/build/**
- package.json
- pnpm-lock.yaml
env:
FORCE_COLOR: true
jobs:
Build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json
- name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build web
run: pnpm buildWebStandalone
- name: Build
run: pnpm build --standalone
- name: Generate plugin list
run: pnpm generatePluginJson dist/plugins.json dist/plugin-readmes.json
- name: Clean up obsolete files
run: |
rm -rf dist/*-unpacked dist/vendor Vencord.user.css vencordDesktopRenderer.css vencordDesktopRenderer.css.map
- name: Get some values needed for the release
id: release_values
run: |
echo "release_tag=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
- name: Upload DevBuild as release
if: github.repository == 'Vendicated/Vencord'
run: |
gh release upload devbuild --clobber dist/*
gh release edit devbuild --title "DevBuild $RELEASE_TAG"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_TAG: ${{ env.release_tag }}
- name: Upload DevBuild to builds repo
if: github.repository == 'Vendicated/Vencord'
run: |
git config --global user.name "$USERNAME"
git config --global user.email actions@github.com
git clone https://$USERNAME:$API_TOKEN@github.com/$GH_REPO.git upload
cd upload
GLOBIGNORE=.git:.gitignore:README.md:LICENSE
rm -rf *
cp -r ../dist/* .
git add -A
git commit -m "Builds for https://github.com/$GITHUB_REPOSITORY/commit/$GITHUB_SHA"
git push --force https://$USERNAME:$API_TOKEN@github.com/$GH_REPO.git
env:
API_TOKEN: ${{ secrets.BUILDS_TOKEN }}
GH_REPO: Vencord/builds
USERNAME: GitHub-Actions
================================================
FILE: .github/workflows/codeberg-mirror.yml
================================================
name: Sync to Codeberg
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
on:
push:
workflow_dispatch:
schedule:
- cron: "0 */6 * * *"
jobs:
codeberg:
if: github.repository == 'Vendicated/Vencord'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: pixta-dev/repository-mirroring-action@674e65a7d483ca28dafaacba0d07351bdcc8bd75 # v1.1.1
with:
target_repo_url: "git@codeberg.org:Vee/cord.git"
ssh_private_key: ${{ secrets.CODEBERG_SSH_PRIVATE_KEY }}
================================================
FILE: .github/workflows/publish.yml
================================================
name: Release Browser Extension
on:
push:
tags:
- v*
jobs:
Publish:
if: github.repository == 'Vendicated/Vencord'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: check that tag matches package.json version
run: |
pkg_version="v$(jq -r .version < package.json)"
if [[ "${{ github.ref_name }}" != "$pkg_version" ]]; then
echo "Tag ${{ github.ref_name }} does not match package.json version $pkg_version" >&2
exit 1
fi
- uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json
- name: Use Node.js 19
uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build web
run: pnpm buildWebStandalone
- name: Publish extension
run: |
cd dist/chromium-unpacked
pnpx chrome-webstore-upload-cli@2.1.0 upload --auto-publish
env:
EXTENSION_ID: ${{ secrets.CHROME_EXTENSION_ID }}
CLIENT_ID: ${{ secrets.CHROME_CLIENT_ID }}
CLIENT_SECRET: ${{ secrets.CHROME_CLIENT_SECRET }}
REFRESH_TOKEN: ${{ secrets.CHROME_REFRESH_TOKEN }}
================================================
FILE: .github/workflows/reportBrokenPlugins.yml
================================================
name: Test Patches
on:
workflow_dispatch:
inputs:
discord_branch:
type: choice
description: "Discord Branch to test patches on"
options:
- both
- stable
- canary
default: both
webhook_url:
type: string
description: "Webhook URL that the report will be posted to. This will be visible for everyone, so DO NOT pass sensitive webhooks like discord webhook. This is meant to be used by Venbot."
required: false
# schedule:
# # Every day at midnight
# - cron: 0 0 * * *
jobs:
TestPlugins:
if: github.repository == 'Vendicated/Vencord'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
if: ${{ github.event_name == 'schedule' }}
with:
ref: dev
- uses: actions/checkout@v4
if: ${{ github.event_name == 'workflow_dispatch' }}
- uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json
- name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- name: Install dependencies
run: |
pnpm install --frozen-lockfile
- name: Build Vencord Reporter Version
run: pnpm buildReporter
- name: Run Reporter
timeout-minutes: 10
run: |
export PATH="$PWD/node_modules/.bin:$PATH"
export CHROMIUM_BIN=/usr/bin/google-chrome
esbuild scripts/generateReport.ts > dist/report.mjs
stable_output_file=$(mktemp)
canary_output_file=$(mktemp)
pids=""
branch="${{ inputs.discord_branch }}"
if [[ "${{ github.event_name }}" = "schedule" ]]; then
branch="both"
fi
if [[ "$branch" = "both" || "$branch" = "stable" ]]; then
node dist/report.mjs > "$stable_output_file" &
pids+=" $!"
fi
if [[ "$branch" = "both" || "$branch" = "canary" ]]; then
USE_CANARY=true node dist/report.mjs > "$canary_output_file" &
pids+=" $!"
fi
exit_code=0
for pid in $pids; do
if ! wait "$pid"; then
exit_code=1
fi
done
cat "$stable_output_file" "$canary_output_file" >> $GITHUB_STEP_SUMMARY
exit $exit_code
env:
WEBHOOK_URL: ${{ inputs.webhook_url || secrets.DISCORD_WEBHOOK }}
WEBHOOK_SECRET: ${{ secrets.WEBHOOK_SECRET }}
================================================
FILE: .github/workflows/test.yml
================================================
name: test
on:
push:
pull_request:
branches:
- main
- dev
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v3 # Install pnpm using packageManager key in package.json
- name: Use Node.js 20
uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Lint & Test if desktop version compiles
run: pnpm test
- name: Test if web version compiles
run: pnpm buildWeb
- name: Test if plugin structure is valid
run: pnpm generatePluginJson
================================================
FILE: .gitignore
================================================
dist
node_modules
*.exe
vencord_installer
.idea
.DS_Store
yarn.lock
bun.lock
package-lock.json
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
*.tsbuildinfo
src/userplugins
ExtensionCache/
/settings
================================================
FILE: .npmrc
================================================
strict-peer-dependencies=false
package-manager-strict=false
================================================
FILE: .stylelintrc.json
================================================
{
"extends": "stylelint-config-standard",
"rules": {
"selector-class-pattern": [
"^[a-z][a-zA-Z0-9]*(-[a-z0-9][a-zA-Z0-9]*)*$",
{
"message": "Expected class selector to be kebab-case with camelCase segments"
}
]
}
}
================================================
FILE: .vscode/extensions.json
================================================
{
"recommendations": [
"dbaeumer.vscode-eslint",
"EditorConfig.EditorConfig",
"GregorBiswanger.json2ts",
"stylelint.vscode-stylelint",
"Vendicated.vencord-companion"
]
}
================================================
FILE: .vscode/launch.json
================================================
{
// this allows you to debug Vencord from VSCode.
// How to use:
// You need to run Discord via the command line to pass some flags to it.
// If you want to debug the main (node.js) process (preload.ts, ipcMain/*, patcher.ts),
// add the --inspect flag
// To debug the renderer (99% of Vencord), add the --remote-debugging-port=9223 flag
//
// Now launch the desired configuration in VSCode and start Discord with the flags.
// For example, to debug both process, run Electron: All then launch Discord with
// discord --remote-debugging-port=9223 --inspect
"version": "0.2.0",
"configurations": [
{
"name": "Electron: Main",
"type": "node",
"request": "attach",
"port": 9229,
"timeout": 30000
},
{
"name": "Electron: Renderer",
"type": "chrome",
"request": "attach",
"port": 9223,
"timeout": 30000,
"webRoot": "${workspaceFolder}/src"
}
],
"compounds": [
{
"name": "Electron: All",
"configurations": ["Electron: Main", "Electron: Renderer"]
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"[typescript]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"[typescriptreact]": {
"editor.defaultFormatter": "vscode.typescript-language-features"
},
"javascript.format.semicolons": "insert",
"typescript.format.semicolons": "insert",
"typescript.preferences.quoteStyle": "double",
"javascript.preferences.quoteStyle": "double",
"gitlens.remotes": [
{
"domain": "codeberg.org",
"type": "Gitea"
}
],
"css.format.spaceAroundSelectorSeparator": true,
"[css]": {
"editor.defaultFormatter": "vscode.css-language-features"
}
}
================================================
FILE: .vscode/tasks.json
================================================
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build",
"type": "shell",
"command": "pnpm build",
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Watch",
"type": "shell",
"command": "pnpm watch",
"problemMatcher": [],
"group": {
"kind": "build"
}
}
]
}
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
Our community is welcoming to everyone, regardless of their characteristics.
As such, we expect you to treat everyone with respect and contribute to an open and welcoming community.
DO
- have empathy and be nice to others
- be respectful of differing opinions, even if you disagree
- give and accept constructive criticism
DON'T
- use offensive or derogatory language
- troll or spam
- personally attack or harass others
Repetitive violations of these guidelines might get your access to the repository restricted.
If you feel like a user is violating these guidelines or feel treated unfairly, please refrain from vigilantism
and instead report the issue to a moderator! The best way is joining our [official Discord community](https://vencord.dev/discord)
and opening a modmail ticket.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Vencord
Vencord is a community project and welcomes any kind of contribution from anyone!
We have development documentation for new contributors, which can be found at <https://docs.vencord.dev>.
All contributions should be made in accordance with our [Code of Conduct](./CODE_OF_CONDUCT.md).
## How to contribute
Contributions can be sent via pull requests. If you're new to Git, check [this guide](https://opensource.com/article/19/7/create-pull-request-github).
Pull requests can be made either to the `main` or the `dev` branch. However, unless you're an advanced user, I recommend sticking to `main`. This is because the dev branch might contain unstable changes and be force pushed frequently, which could cause conflicts in your pull request.
## Write a plugin
Writing a plugin is the primary way to contribute.
Before starting your plugin:
- Check existing pull requests to see if someone is already working on a similar plugin
- Check our [plugin requests tracker](https://github.com/Vencord/plugin-requests/issues) to see if there is an existing request, or if the same idea has been rejected
- If there isn't an existing request, [open one](https://github.com/Vencord/plugin-requests/issues/new?assignees=&labels=&projects=&template=request.yml) yourself
and include that you'd like to work on this yourself. Then wait for feedback to see if the idea even has any chance of being accepted. Or maybe others have some ideas to improve it!
- Familarise yourself with our plugin rules below to ensure your plugin is not banned
### Plugin Rules
- No simple slash command plugins like `/cat`. Instead, make a [user installable Discord bot](https://discord.com/developers/docs/change-log#userinstallable-apps-preview)
- No simple text replace plugins like Let me Google that for you. The TextReplace plugin can do this
- No raw DOM manipulation. Use proper patches and React
- No FakeDeafen or FakeMute
- No StereoMic
- No plugins that simply hide or redesign ui elements. This can be done with CSS
- No plugins that interact with specific Discord bots (official Discord apps like Youtube WatchTogether are okay)
- No selfbots or API spam (animated status, message pruner, auto reply, nitro snipers, etc)
- No untrusted third party APIs. Popular services like Google or GitHub are fine, but absolutely no self hosted ones
- No plugins that require the user to enter their own API key
- Do not introduce new dependencies unless absolutely necessary and warranted
## Improve Vencord itself
If you have any ideas on how to improve Vencord itself, or want to propose a new plugin API, feel free to open a feature request so we can discuss.
Or if you notice any bugs or typos, feel free to fix them!
## Contribute to our Documentation
The source code of our documentation is available at <https://github.com/Vencord/Docs>
If you see anything outdated, incorrect or lacking, please fix it!
If you think a new page should be added, feel free to suggest it via an issue and we can discuss.
## Help out users in our Discord community
We have an open support channel in our [Discord community](https://vencord.dev/discord).
Helping out users there is always appreciated! The more, the merrier.
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
# Vencord

[](https://codeberg.org/Vee/cord)
The cutest Discord client mod

## Features
- Easy to install
- [100+ built in plugins](https://vencord.dev/plugins)
- Fairly lightweight despite the many inbuilt plugins
- Excellent Browser Support: Run Vencord in your Browser via extension or UserScript
- Works on any Discord branch: Stable, Canary or PTB all work
- Custom CSS and Themes: Inbuilt css editor with support to import any css files (including BetterDiscord themes)
- Privacy friendly: blocks Discord analytics & crash reporting out of the box and has no telemetry
- Maintained very actively, broken plugins are usually fixed within 12 hours
- Settings sync: Keep your plugins and their settings synchronised between devices / apps (optional)
## Installing / Uninstalling
Visit https://vencord.dev/download
## Join our Support/Community Server
https://discord.gg/D9uwnFnqmd
## Sponsors
| **Thanks a lot to all Vencord [sponsors](https://github.com/sponsors/Vendicated)!!** |
| :------------------------------------------------------------------------------------------: |
| [](https://github.com/sponsors/Vendicated) |
| *generated using [github-sponsor-graph](https://github.com/Vendicated/github-sponsor-graph)* |
## Star History
<a href="https://star-history.com/#Vendicated/Vencord&Timeline">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Vendicated/Vencord&type=Timeline&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=Vendicated/Vencord&type=Timeline" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=Vendicated/Vencord&type=Timeline" />
</picture>
</a>
## Disclaimer
Discord is trademark of Discord Inc. and solely mentioned for the sake of descriptivity.
Mention of it does not imply any affiliation with or endorsement by Discord Inc.
<details>
<summary>Using Vencord violates Discord's terms of service</summary>
Client modifications are against Discord’s Terms of Service.
However, Discord is pretty indifferent about them and there are no known cases of users getting banned for using client mods! So you should generally be fine as long as you don’t use any plugins that implement abusive behaviour. But no worries, all inbuilt plugins are safe to use!
Regardless, if your account is very important to you and it getting disabled would be a disaster for you, you should probably not use any client mods (not exclusive to Vencord), just to be safe
Additionally, make sure not to post screenshots with Vencord in a server where you might get banned for it
</details>
================================================
FILE: browser/GMPolyfill.js
================================================
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
function parseHeaders(headers) {
const result = new Headers();
if (!headers)
return result;
const headersArr = headers.trim().split("\n");
for (var i = 0; i < headersArr.length; i++) {
var row = headersArr[i];
var index = row.indexOf(":")
, key = row.slice(0, index).trim().toLowerCase()
, value = row.slice(index + 1).trim();
result.append(key, value);
}
return result;
}
function blobTo(to, blob) {
if (to === "arrayBuffer" && blob.arrayBuffer) return blob.arrayBuffer();
return new Promise((resolve, reject) => {
var fileReader = new FileReader();
fileReader.onload = event => resolve(event.target.result);
if (to === "arrayBuffer") fileReader.readAsArrayBuffer(blob);
else if (to === "text") fileReader.readAsText(blob, "utf-8");
else reject("unknown to");
});
}
function GM_fetch(url, opt) {
return new Promise((resolve, reject) => {
// https://www.tampermonkey.net/documentation.php?ext=dhdg#GM_xmlhttpRequest
const options = opt || {};
options.url = url;
options.data = options.body;
options.responseType = "blob";
options.onload = resp => {
var blob = resp.response;
resp.blob = () => Promise.resolve(blob);
resp.arrayBuffer = () => blobTo("arrayBuffer", blob);
resp.text = () => blobTo("text", blob);
resp.json = async () => JSON.parse(await blobTo("text", blob));
resp.headers = parseHeaders(resp.responseHeaders);
resp.ok = resp.status >= 200 && resp.status < 300;
resolve(resp);
};
options.ontimeout = () => reject("fetch timeout");
options.onerror = () => reject("fetch error");
options.onabort = () => reject("fetch abort");
GM_xmlhttpRequest(options);
});
}
export const fetch = GM_fetch;
================================================
FILE: browser/Vencord.ts
================================================
/*!
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import "./VencordNativeStub";
export * from "../src/Vencord";
================================================
FILE: browser/VencordNativeStub.ts
================================================
/*
* Vencord, a modification for Discord's desktop app
* Copyright (c) 2022 Vendicated and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/// <reference path="../src/modules.d.ts" />
/// <reference path="../src/globals.d.ts" />
// Be very careful with imports in this file to avoid circular dependency issues.
// Only import pure modules that don't import other parts of Vencord.
import monacoHtmlLocal from "file://monacoWin.html?minify";
import * as DataStore from "@api/DataStore";
import type { Settings } from "@api/Settings";
import { getThemeInfo } from "@main/themes";
import { debounce } from "@shared/debounce";
import { localStorage } from "@utils/localStorage";
import { getStylusWebStoreUrl } from "@utils/web";
import { EXTENSION_BASE_URL, metaReady, RENDERER_CSS_URL } from "@utils/web-metadata";
// listeners for ipc.on
const cssListeners = new Set<(css: string) => void>();
const NOOP = () => { };
const NOOP_ASYNC = async () => { };
const setCssDebounced = debounce((css: string) => VencordNative.quickCss.set(css));
const themeStore = DataStore.createStore("VencordThemes", "VencordThemeData");
// probably should make this less cursed at some point
window.VencordNative = {
themes: {
uploadTheme: (fileName: string, fileData: string) => DataStore.set(fileName, fileData, themeStore),
deleteTheme: (fileName: string) => DataStore.del(fileName, themeStore),
getThemesList: () => DataStore.entries(themeStore).then(entries =>
entries.map(([name, css]) => getThemeInfo(css, name.toString()))
),
getThemeData: (fileName: string) => DataStore.get(fileName, themeStore),
getSystemValues: async () => ({}),
openFolder: async () => Promise.reject("themes:openFolder is not supported on web"),
},
native: {
getVersions: () => ({}),
openExternal: async (url) => void open(url, "_blank"),
getRendererCss: async () => {
if (IS_USERSCRIPT)
// need to wait for next tick for _vcUserScriptRendererCss to be set
return Promise.resolve().then(() => window._vcUserScriptRendererCss);
await metaReady;
return fetch(RENDERER_CSS_URL)
.then(res => res.text());
},
onRendererCssUpdate: NOOP,
},
updater: {
getRepo: async () => ({ ok: true, value: "https://github.com/Vendicated/Vencord" }),
getUpdates: async () => ({ ok: true, value: [] }),
update: async () => ({ ok: true, value: false }),
rebuild: async () => ({ ok: true, value: true }),
},
quickCss: {
get: () => DataStore.get("VencordQuickCss").then(s => s ?? ""),
set: async (css: string) => {
await DataStore.set("VencordQuickCss", css);
cssListeners.forEach(l => l(css));
},
addChangeListener(cb) {
cssListeners.add(cb);
},
addThemeChangeListener: NOOP,
openFile: NOOP_ASYNC,
async openEditor() {
if (IS_USERSCRIPT) {
const shouldOpenWebStore = confirm("QuickCSS is not supported on the Userscript. You can instead use the Stylus extension.\n\nDo you want to open the Stylus web store page?");
if (shouldOpenWebStore) {
window.open(getStylusWebStoreUrl(), "_blank");
}
return;
}
const features = `popup,width=${Math.min(window.innerWidth, 1000)},height=${Math.min(window.innerHeight, 1000)}`;
const win = open("about:blank", "VencordQuickCss", features);
if (!win) {
alert("Failed to open QuickCSS popup. Make sure to allow popups!");
return;
}
win.baseUrl = EXTENSION_BASE_URL;
win.setCss = setCssDebounced;
win.getCurrentCss = () => VencordNative.quickCss.get();
win.getTheme = this.getEditorTheme;
win.document.write(monacoHtmlLocal);
},
getEditorTheme: () => {
const { getTheme, Theme } = require("@utils/discord");
return getTheme() === Theme.Light
? "vs-light"
: "vs-dark";
}
},
settings: {
get: () => {
try {
return JSON.parse(localStorage.getItem("VencordSettings") || "{}");
} catch (e) {
console.error("Failed to parse settings from localStorage: ", e);
return {};
}
},
set: async (s: Settings) => localStorage.setItem("VencordSettings", JSON.stringify(s)),
openFolder: async () => Promise.reject("settings:openFolder is not supported on web"),
},
pluginHelpers: {} as any,
csp: {} as any,
};
================================================
FILE: browser/background.js
================================================
/**
* @template T
* @param {T[]} arr
* @param {(v: T) => boolean} predicate
*/
function removeFirst(arr, predicate) {
const idx = arr.findIndex(predicate);
if (idx !== -1) arr.splice(idx, 1);
}
chrome.webRequest.onHeadersReceived.addListener(
({ responseHeaders, type, url }) => {
if (!responseHeaders) return;
if (type === "main_frame" && url.includes("discord.com")) {
// In main frame requests, the CSP needs to be removed to enable fetching of custom css
// as desired by the user
removeFirst(responseHeaders, h => h.name.toLowerCase() === "content-security-policy");
} else if (type === "stylesheet" && url.startsWith("https://raw.githubusercontent.com/")) {
// Most users will load css from GitHub, but GitHub doesn't set the correct content type,
// so we fix it here
removeFirst(responseHeaders, h => h.name.toLowerCase() === "content-type");
responseHeaders.push({
name: "Content-Type",
value: "text/css"
});
}
return { responseHeaders };
},
{ urls: ["https://raw.githubusercontent.com/*", "*://*.discord.com/*"], types: ["main_frame", "stylesheet"] },
["blocking", "responseHeaders"]
);
================================================
FILE: browser/content.js
================================================
if (typeof browser === "undefined") {
var browser = chrome;
}
document.addEventListener(
"DOMContentLoaded",
() => {
window.postMessage({
type: "vencord:meta",
meta: {
EXTENSION_VERSION: browser.runtime.getManifest().version,
EXTENSION_BASE_URL: browser.runtime.getURL(""),
RENDERER_CSS_URL: browser.runtime.getURL("dist/Vencord.css"),
}
});
},
{ once: true }
);
================================================
FILE: browser/manifest.json
================================================
{
"manifest_version": 3,
"minimum_chrome_version": "111",
"name": "Vencord Web",
"description": "The cutest Discord mod now in your browser",
"author": "Vendicated",
"homepage_url": "https://github.com/Vendicated/Vencord",
"icons": {
"128": "icon.png"
},
"host_permissions": [
"*://*.discord.com/*",
"https://raw.githubusercontent.com/*"
],
"permissions": ["declarativeNetRequest"],
"content_scripts": [
{
"run_at": "document_start",
"matches": ["*://*.discord.com/*"],
"js": ["content.js"],
"all_frames": true,
"world": "ISOLATED"
},
{
"run_at": "document_start",
"matches": ["*://*.discord.com/*"],
"js": ["dist/Vencord.js"],
"all_frames": true,
"world": "MAIN"
}
],
"web_accessible_resources": [
{
"resources": ["dist/*", "vendor/*"],
"matches": ["*://*.discord.com/*"]
}
],
"declarative_net_request": {
"rule_resources": [
{
"id": "modifyResponseHeaders",
"enabled": true,
"path": "modifyResponseHeaders.json"
}
]
}
}
================================================
FILE: browser/manifestv2.json
================================================
{
"manifest_version": 2,
"minimum_chrome_version": "91",
"name": "Vencord Web",
"description": "The cutest Discord mod now in your browser",
"author": "Vendicated",
"homepage_url": "https://github.com/Vendicated/Vencord",
"icons": {
"128": "icon.png"
},
"permissions": [
"webRequest",
"webRequestBlocking",
"*://*.discord.com/*",
"https://raw.githubusercontent.com/*"
],
"content_scripts": [
{
"run_at": "document_start",
"matches": ["*://*.discord.com/*"],
"js": ["content.js"],
"all_frames": true,
"world": "ISOLATED"
},
{
"run_at": "document_start",
"matches": ["*://*.discord.com/*"],
"js": ["dist/Vencord.js"],
"all_frames": true,
"world": "MAIN"
}
],
"background": {
"scripts": ["background.js"]
},
"web_accessible_resources": ["dist/Vencord.js", "dist/Vencord.css"],
"browser_specific_settings": {
"gecko": {
"id": "vencord-firefox@vendicated.dev",
"strict_min_version": "128.0"
}
}
}
================================================
FILE: browser/modifyResponseHeaders.json
================================================
[
{
"id": 1,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{
"header": "content-security-policy",
"operation": "remove"
},
{
"header": "content-security-policy-report-only",
"operation": "remove"
}
]
},
"condition": {
"resourceTypes": ["main_frame", "sub_frame"],
"urlFilter": "||discord.com^"
}
},
{
"id": 2,
"action": {
"type": "modifyHeaders",
"responseHeaders": [
{
"header": "content-type",
"operation": "set",
"value": "text/css"
}
]
},
"condition": {
"resourceTypes": ["stylesheet"],
"urlFilter": "||raw.githubusercontent.com^"
}
}
]
================================================
FILE: browser/monaco.ts
================================================
/*
* Vencord, a Discord client mod
* Copyright (c) 2023 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import "./patch-worker";
import * as monaco from "monaco-editor/esm/vs/editor/editor.main.js";
declare global {
const baseUrl: string;
const getCurrentCss: () => Promise<string>;
const setCss: (css: string) => void;
const getTheme: () => string;
}
const BASE = "/vendor/monaco/vs";
self.MonacoEnvironment = {
getWorkerUrl(_moduleId: unknown, label: string) {
const path = label === "css" ? "/language/css/css.worker.js" : "/editor/editor.worker.js";
return new URL(BASE + path, baseUrl).toString();
}
};
getCurrentCss().then(css => {
const editor = monaco.editor.create(
document.getElementById("container")!,
{
value: css,
language: "css",
theme: getTheme(),
}
);
editor.onDidChangeModelContent(() =>
setCss(editor.getValue())
);
window.addEventListener("resize", () => {
// make monaco re-layout
editor.layout();
});
});
================================================
FILE: browser/monacoWin.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Vencord QuickCSS Editor</title>
<style>
html,
body,
#container {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
const script = document.createElement("script");
script.src = new URL("/vendor/monaco/index.js", baseUrl);
const style = document.createElement("link");
style.type = "text/css";
style.rel = "stylesheet";
style.href = new URL("/vendor/monaco/index.css", baseUrl);
document.body.append(style, script);
</script>
</body>
</html>
================================================
FILE: browser/patch-worker.js
================================================
/*
Copyright 2013 Rob Wu <gwnRob@gmail.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Target: Chrome 20+
// W3-compliant Worker proxy.
// This module replaces the global Worker object.
// When invoked, the default Worker object is called.
// If this call fails with SECURITY_ERR, the script is fetched
// using async XHR, and transparently proxies all calls and
// setters/getters to the new Worker object.
// Note: This script does not magically circumvent the Same origin policy.
(function () {
'use strict';
var Worker_ = window.Worker;
var URL = window.URL || window.webkitURL;
// Create dummy worker for the following purposes:
// 1. Don't override the global Worker object if the fallback isn't
// going to work (future API changes?)
// 2. Use it to trigger early validation of postMessage calls
// Note: Blob constructor is supported since Chrome 20, but since
// some of the used Chrome APIs are only supported as of Chrome 20,
// I don't bother adding a BlobBuilder fallback.
var dummyWorker = new Worker_(
URL.createObjectURL(new Blob([], { type: 'text/javascript' })));
window.Worker = function Worker(scriptURL) {
if (arguments.length === 0) {
throw new TypeError('Not enough arguments');
}
try {
return new Worker_(scriptURL);
} catch (e) {
if (e.code === 18/*DOMException.SECURITY_ERR*/) {
return new WorkerXHR(scriptURL);
} else {
throw e;
}
}
};
// Bind events and replay queued messages
function bindWorker(worker, workerURL) {
if (worker._terminated) {
return;
}
worker.Worker = new Worker_(workerURL);
worker.Worker.onerror = worker._onerror;
worker.Worker.onmessage = worker._onmessage;
var o;
while ((o = worker._replayQueue.shift())) {
worker.Worker[o.method].apply(worker.Worker, o.arguments);
}
while ((o = worker._messageQueue.shift())) {
worker.Worker.postMessage.apply(worker.Worker, o);
}
}
function WorkerXHR(scriptURL) {
var worker = this;
var x = new XMLHttpRequest();
x.responseType = 'blob';
x.onload = function () {
// http://stackoverflow.com/a/10372280/938089
var workerURL = URL.createObjectURL(x.response);
bindWorker(worker, workerURL);
};
x.open('GET', scriptURL);
x.send();
worker._replayQueue = [];
worker._messageQueue = [];
}
WorkerXHR.prototype = {
constructor: Worker_,
terminate: function () {
if (!this._terminated) {
this._terminated = true;
if (this.Worker)
this.Worker.terminate();
}
},
postMessage: function (message, transfer) {
if (!(this instanceof WorkerXHR))
throw new TypeError('Illegal invocation');
if (this.Worker) {
this.Worker.postMessage.apply(this.Worker, arguments);
} else {
// Trigger validation:
dummyWorker.postMessage(message);
// Alright, push the valid message to the queue.
this._messageQueue.push(arguments);
}
}
};
// Implement the EventTarget interface
[
'addEventListener',
'removeEventListener',
'dispatchEvent'
].forEach(function (method) {
WorkerXHR.prototype[method] = function () {
if (!(this instanceof WorkerXHR)) {
throw new TypeError('Illegal invocation');
}
if (this.Worker) {
this.Worker[method].apply(this.Worker, arguments);
} else {
this._replayQueue.push({ method: method, arguments: arguments });
}
};
});
Object.defineProperties(WorkerXHR.prototype, {
onmessage: {
get: function () { return this._onmessage || null; },
set: function (func) {
this._onmessage = typeof func === 'function' ? func : null;
}
},
onerror: {
get: function () { return this._onerror || null; },
set: function (func) {
this._onerror = typeof func === 'function' ? func : null;
}
}
});
})();
================================================
FILE: browser/userscript.meta.js
================================================
// ==UserScript==
// @name Vencord
// @description A Discord client mod - Web version
// @version %version%
// @author Vendicated (https://github.com/Vendicated)
// @namespace https://github.com/Vendicated/Vencord
// @supportURL https://github.com/Vendicated/Vencord
// @icon https://raw.githubusercontent.com/Vendicated/Vencord/refs/heads/main/browser/icon.png
// @license GPL-3.0
// @match *://*.discord.com/*
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @run-at document-start
// @compatible chrome Chrome + Tampermonkey or Violentmonkey
// @compatible firefox Firefox Tampermonkey
// @compatible opera Opera + Tampermonkey or Violentmonkey
// @compatible edge Edge + Tampermonkey or Violentmonkey
// @compatible safari Safari + Tampermonkey or Violentmonkey
// ==/UserScript==
// this UserScript DOES NOT work on Firefox with Violentmonkey or Greasemonkey due to a bug that makes it impossible
// to overwrite stuff on the window on sites that use CSP. Use Tampermonkey or use a chromium based browser
// https://github.com/violentmonkey/violentmonkey/issues/997
// this is a compiled and minified version of Vencord. For the source code, visit the GitHub repo
================================================
FILE: eslint.config.mjs
================================================
/*
* Vencord, a Discord client mod
* Copyright (c) 2023 Vendicated and contributors
* SPDX-License-Identifier: GPL-3.0-or-later
*/
import stylistic from "@stylistic/eslint-plugin";
import pathAlias from "eslint-plugin-path-alias";
import react from "eslint-plugin-react";
import header from "eslint-plugin-simple-header";
import simpleImportSort from "eslint-plugin-simple-import-sort";
import unusedImports from "eslint-plugin-unused-imports";
import tseslint from "typescript-eslint";
export default tseslint.config(
{ ignores: ["dist", "browser", "packages/vencord-types"] },
{
files: ["src/**/*.{tsx,ts,mts,mjs,js,jsx}", "eslint.config.mjs"],
settings: {
react: {
version: "18"
}
},
...react.configs.flat.recommended,
rules: {
...react.configs.flat.recommended.rules,
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"react/display-name": "off",
"react/no-unescaped-entities": "off",
}
},
{
files: ["src/**/*.{tsx,ts,mts,mjs,js,jsx}", "eslint.config.mjs"],
plugins: {
"simple-header": header,
"@stylistic": stylistic,
"@typescript-eslint": tseslint.plugin,
"simple-import-sort": simpleImportSort,
"unused-imports": unusedImports,
"path-alias": pathAlias
},
settings: {
"import/resolver": {
map: [
["@webpack", "./src/webpack"],
["@webpack/common", "./src/webpack/common"],
["@utils", "./src/utils"],
["@api", "./src/api"],
["@components", "./src/components"]
]
}
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
project: ["./tsconfig.json"],
tsconfigRootDir: import.meta.dirname
}
},
rules: {
/*
* Since it's only been a month and Vencord has already been stolen
* by random skids who rebranded it to "AlphaCord" and erased all license
* information
*/
"simple-header/header": [
"error",
{
"files": ["scripts/header-new.txt", "scripts/header-old.txt"],
"templates": { "author": [".*", "Vendicated and contributors"] }
}
],
// Style Rules
"@stylistic/jsx-quotes": ["error", "prefer-double"],
"@stylistic/quotes": ["error", "double", { "avoidEscape": true }],
"@stylistic/no-mixed-spaces-and-tabs": "error",
"@stylistic/arrow-parens": ["error", "as-needed"],
"@stylistic/eol-last": ["error", "always"],
"@stylistic/no-multi-spaces": "error",
"@stylistic/no-trailing-spaces": "error",
"@stylistic/no-whitespace-before-property": "error",
"@stylistic/semi": ["error", "always"],
"@stylistic/semi-style": ["error", "last"],
"@stylistic/space-in-parens": ["error", "never"],
"@stylistic/block-spacing": ["error", "always"],
"@stylistic/object-curly-spacing": ["error", "always"],
"@stylistic/spaced-comment": ["error", "always", { "markers": ["!"] }],
"@stylistic/no-extra-semi": "error",
// TS Rules
"@stylistic/function-call-spacing": ["error", "never"],
// ESLint Rules
"yoda": "error",
"eqeqeq": ["error", "always", { "null": "ignore" }],
"prefer-destructuring": ["error", {
"VariableDeclarator": { "array": false, "object": true },
"AssignmentExpression": { "array": false, "object": false }
}],
"operator-assignment": ["error", "always"],
"no-useless-computed-key": "error",
"no-unneeded-ternary": ["error", { "defaultAssignment": false }],
"no-invalid-regexp": "error",
"no-constant-condition": ["error", { "checkLoops": false }],
"no-duplicate-imports": "error",
"@typescript-eslint/dot-notation": [
"error",
{
"allowPrivateClassPropertyAccess": true,
"allowProtectedClassPropertyAccess": true
}
],
"no-useless-escape": [
"error",
{
"allowRegexCharacters": ["i"]
}
],
"no-fallthrough": "error",
"for-direction": "error",
"no-async-promise-executor": "error",
"no-cond-assign": "error",
"no-dupe-else-if": "error",
"no-duplicate-case": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-prototype-builtins": "error",
"no-regex-spaces": "error",
"no-shadow-restricted-names": "error",
"no-unexpected-multiline": "error",
"no-unsafe-optional-chaining": "error",
"no-useless-backreference": "error",
"use-isnan": "error",
"prefer-const": ["error", { destructuring: "all" }],
"prefer-spread": "error",
// Plugin Rules
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"unused-imports/no-unused-imports": "error",
"path-alias/no-relative": "error"
}
}
);
================================================
FILE: package.json
================================================
{
"name": "vencord",
"private": "true",
"version": "1.14.6",
"description": "The cutest Discord client mod",
"homepage": "https://github.com/Vendicated/Vencord#readme",
"bugs": {
"url": "https://github.com/Vendicated/Vencord/issues"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Vendicated/Vencord.git"
},
"license": "GPL-3.0-or-later",
"author": "Vendicated",
"scripts": {
"build": "node --require=./scripts/suppressExperimentalWarnings.js scripts/build/build.mjs",
"buildStandalone": "pnpm build --standalone",
"buildWeb": "node --require=./scripts/suppressExperimentalWarnings.js scripts/build/buildWeb.mjs",
"buildWebStandalone": "pnpm buildWeb --standalone",
"buildReporter": "pnpm buildWebStandalone --reporter --skip-extension",
"buildReporterDesktop": "pnpm build --reporter",
"watch": "pnpm build --watch",
"dev": "pnpm watch",
"watchWeb": "pnpm buildWeb --watch",
"generatePluginJson": "tsx scripts/generatePluginList.ts",
"generateTypes": "tspc --emitDeclarationOnly --declaration --outDir packages/vencord-types --allowJs false",
"inject": "node scripts/runInstaller.mjs -- --install",
"uninject": "node scripts/runInstaller.mjs -- --uninstall",
"lint": "eslint",
"lint-styles": "stylelint \"src/**/*.css\" --ignore-pattern src/userplugins",
"lint:fix": "pnpm lint --fix",
"test": "pnpm buildStandalone && pnpm testTsc && pnpm lint && pnpm lint-styles && pnpm generatePluginJson",
"testWeb": "pnpm lint && pnpm buildWeb && pnpm testTsc",
"testTsc": "tsc --noEmit"
},
"dependencies": {
"@intrnl/xxhash64": "^0.1.2",
"@vap/core": "0.0.12",
"@vap/shiki": "0.10.5",
"fflate": "^0.8.2",
"gifenc": "github:mattdesl/gifenc#64842fca317b112a8590f8fef2bf3825da8f6fe3",
"monaco-editor": "^0.54.0",
"nanoid": "^5.1.6",
"virtual-merge": "^1.0.1"
},
"devDependencies": {
"@stylistic/eslint-plugin": "^5.6.0",
"@types/chrome": "^0.1.30",
"@types/lodash": "^4.17.20",
"@types/node": "^24.10.1",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"@types/yazl": "^3.3.0",
"@vencord/discord-types": "link:packages/discord-types",
"diff": "^8.0.2",
"esbuild": "^0.27.0",
"eslint": "9.39.1",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-path-alias": "2.1.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-simple-header": "^1.2.1",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unused-imports": "^4.3.0",
"highlight.js": "11.11.1",
"html-minifier-terser": "^7.2.0",
"moment": "^2.22.2",
"p-limit": "^7.3.0",
"puppeteer-core": "^24.30.0",
"standalone-electron-types": "^34.2.0",
"stylelint": "^16.25.0",
"stylelint-config-standard": "^39.0.1",
"svgo": "^4.0.0",
"ts-patch": "^3.3.0",
"ts-pattern": "^5.6.0",
"tsx": "^4.20.6",
"type-fest": "^5.2.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.47.0",
"typescript-transform-paths": "^3.5.5",
"zip-local": "^0.3.5"
},
"packageManager": "pnpm@10.4.1",
"pnpm": {
"patchedDependencies": {
"eslint-plugin-path-alias@2.1.0": "patches/eslint-plugin-path-alias@2.1.0.patch"
},
"peerDependencyRules": {
"ignoreMissing": [
"eslint-plugin-import",
"eslint"
]
},
"allowedDeprecatedVersions": {
"source-map-resolve": "*",
"resolve-url": "*",
"source-map-url": "*",
"urix": "*",
"q": "*"
},
"onlyBuiltDependencies": [
"esbuild"
]
},
"engines": {
"node": ">=18"
}
}
================================================
FILE: packages/discord-types/.npmignore
================================================
node_modules
================================================
FILE: packages/discord-types/CONTRIBUTING.md
================================================
Hint: https://docs.discord.food is an incredible resource and allows you to copy paste complete enums and interfaces
================================================
FILE: packages/discord-types/LICENSE
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
================================================
FILE: packages/discord-types/README.md
================================================
# Discord Types
This package provides TypeScript types for the Webpack modules of Discord's web app.
While it was primarily created for Vencord, other client mods could also benefit from this, so it is published as a standalone package!
## Installation
```bash
npm install -D @vencord/discord-types
yarn add -D @vencord/discord-types
pnpm add -D @vencord/discord-types
```
## Example Usage
```ts
import type { UserStore } from "@vencord/discord-types";
const userStore: UserStore = findStore("UserStore"); // findStore is up to you to implement, this library only provides types and no runtime code
```
## Enums
This library also exports some const enums that you can use from Typescript code:
```ts
import { ApplicationCommandType } from "@vencord/discord-types/enums";
console.log(ApplicationCommandType.CHAT_INPUT); // 1
```
### License
This package is licensed under the [LGPL-3.0](./LICENSE) (or later) license.
A very short summary of the license is that you can use this package as a library in both open source and closed source projects,
similar to an MIT-licensed project.
However, if you modify the code of this package, you must release source code of your modified version under the same license.
### Credit
This package was inspired by Swishilicous' [discord-types](https://www.npmjs.com/package/discord-types) package.
================================================
FILE: packages/discord-types/enums/activity.ts
================================================
export const enum ActivityType {
PLAYING = 0,
STREAMING = 1,
LISTENING = 2,
WATCHING = 3,
CUSTOM_STATUS = 4,
COMPETING = 5,
HANG_STATUS = 6
}
export const enum ActivityFlags {
INSTANCE = 1 << 0,
JOIN = 1 << 1,
/** @deprecated */
SPECTATE = 1 << 2,
/** @deprecated */
JOIN_REQUEST = 1 << 3,
SYNC = 1 << 4,
PLAY = 1 << 5,
PARTY_PRIVACY_FRIENDS = 1 << 6,
PARTY_PRIVACY_VOICE_CHANNEL = 1 << 7,
EMBEDDED = 1 << 8,
CONTEXTLESS = 1 << 9
}
export const enum ActivityStatusDisplayType {
NAME = 0,
STATE = 1,
DETAILS = 2
}
================================================
FILE: packages/discord-types/enums/channel.ts
================================================
export const enum ChannelType {
GUILD_TEXT = 0,
DM = 1,
GUILD_VOICE = 2,
GROUP_DM = 3,
GUILD_CATEGORY = 4,
GUILD_ANNOUNCEMENT = 5,
ANNOUNCEMENT_THREAD = 10,
PUBLIC_THREAD = 11,
PRIVATE_THREAD = 12,
GUILD_STAGE_VOICE = 13,
GUILD_DIRECTORY = 14,
GUILD_FORUM = 15,
GUILD_MEDIA = 16
}
================================================
FILE: packages/discord-types/enums/commands.ts
================================================
export const enum ApplicationCommandOptionType {
SUB_COMMAND = 1,
SUB_COMMAND_GROUP = 2,
STRING = 3,
INTEGER = 4,
BOOLEAN = 5,
USER = 6,
CHANNEL = 7,
ROLE = 8,
MENTIONABLE = 9,
NUMBER = 10,
ATTACHMENT = 11,
}
export const enum ApplicationCommandInputType {
BUILT_IN = 0,
BUILT_IN_TEXT = 1,
BUILT_IN_INTEGRATION = 2,
BOT = 3,
PLACEHOLDER = 4,
}
export const enum ApplicationCommandType {
CHAT_INPUT = 1,
USER = 2,
MESSAGE = 3,
}
export const enum ApplicationIntegrationType {
GUILD_INSTALL = 0,
USER_INSTALL = 1
}
================================================
FILE: packages/discord-types/enums/index.ts
================================================
export * from "./activity";
export * from "./channel";
export * from "./commands";
export * from "./messages";
export * from "./misc";
export * from "./user";
================================================
FILE: packages/discord-types/enums/messages.ts
================================================
export const enum StickerType {
/** an official sticker in a pack */
STANDARD = 1,
/** a sticker uploaded to a guild for the guild's members */
GUILD = 2
}
export const enum StickerFormatType {
PNG = 1,
APNG = 2,
LOTTIE = 3,
GIF = 4
}
export const enum MessageType {
/**
* A default message (see below)
*
* Value: 0
* Name: DEFAULT
* Rendered Content: "{content}"
* Deletable: true
*/
DEFAULT = 0,
/**
* A message sent when a user is added to a group DM or thread
*
* Value: 1
* Name: RECIPIENT_ADD
* Rendered Content: "{author} added {mentions [0] } to the {group/thread}."
* Deletable: false
*/
RECIPIENT_ADD = 1,
/**
* A message sent when a user is removed from a group DM or thread
*
* Value: 2
* Name: RECIPIENT_REMOVE
* Rendered Content: "{author} removed {mentions [0] } from the {group/thread}."
* Deletable: false
*/
RECIPIENT_REMOVE = 2,
/**
* A message sent when a user creates a call in a private channel
*
* Value: 3
* Name: CALL
* Rendered Content: participated ? "{author} started a call{ended ? " that lasted {duration}" : " — Join the call"}." : "You missed a call from {author} that lasted {duration}."
* Deletable: false
*/
CALL = 3,
/**
* A message sent when a group DM or thread's name is changed
*
* Value: 4
* Name: CHANNEL_NAME_CHANGE
* Rendered Content: "{author} changed the {is_forum ? "post title" : "channel name"}: {content} "
* Deletable: false
*/
CHANNEL_NAME_CHANGE = 4,
/**
* A message sent when a group DM's icon is changed
*
* Value: 5
* Name: CHANNEL_ICON_CHANGE
* Rendered Content: "{author} changed the channel icon."
* Deletable: false
*/
CHANNEL_ICON_CHANGE = 5,
/**
* A message sent when a message is pinned in a channel
*
* Value: 6
* Name: CHANNEL_PINNED_MESSAGE
* Rendered Content: "{author} pinned a message to this channel."
* Deletable: true
*/
CHANNEL_PINNED_MESSAGE = 6,
/**
* A message sent when a user joins a guild
*
* Value: 7
* Name: USER_JOIN
* Rendered Content: See user join message type , obtained via the formula timestamp_ms % 13
* Deletable: true
*/
USER_JOIN = 7,
/**
* A message sent when a user subscribes to (boosts) a guild
*
* Value: 8
* Name: PREMIUM_GUILD_SUBSCRIPTION
* Rendered Content: "{author} just boosted the server{content ? " {content} times"}!"
* Deletable: true
*/
PREMIUM_GUILD_SUBSCRIPTION = 8,
/**
* A message sent when a user subscribes to (boosts) a guild to tier 1
*
* Value: 9
* Name: PREMIUM_GUILD_SUBSCRIPTION_TIER_1
* Rendered Content: "{author} just boosted the server{content ? " {content} times"}! {guild} has achieved Level 1! "
* Deletable: true
*/
PREMIUM_GUILD_SUBSCRIPTION_TIER_1 = 9,
/**
* A message sent when a user subscribes to (boosts) a guild to tier 2
*
* Value: 10
* Name: PREMIUM_GUILD_SUBSCRIPTION_TIER_2
* Rendered Content: "{author} just boosted the server{content ? " {content} times"}! {guild} has achieved Level 2! "
* Deletable: true
*/
PREMIUM_GUILD_SUBSCRIPTION_TIER_2 = 10,
/**
* A message sent when a user subscribes to (boosts) a guild to tier 3
*
* Value: 11
* Name: PREMIUM_GUILD_SUBSCRIPTION_TIER_3
* Rendered Content: "{author} just boosted the server{content ? " {content} times"}! {guild} has achieved Level 3! "
* Deletable: true
*/
PREMIUM_GUILD_SUBSCRIPTION_TIER_3 = 11,
/**
* A message sent when a news channel is followed
*
* Value: 12
* Name: CHANNEL_FOLLOW_ADD
* Rendered Content: "{author} has added {content} to this channel. Its most important updates will show up here."
* Deletable: true
*/
CHANNEL_FOLLOW_ADD = 12,
/**
* A message sent when a guild is disqualified from discovery
*
* Value: 14
* Name: GUILD_DISCOVERY_DISQUALIFIED
* Rendered Content: "This server has been removed from Server Discovery because it no longer passes all the requirements. Check Server Settings for more details."
* Deletable: true
*/
GUILD_DISCOVERY_DISQUALIFIED = 14,
/**
* A message sent when a guild requalifies for discovery
*
* Value: 15
* Name: GUILD_DISCOVERY_REQUALIFIED
* Rendered Content: "This server is eligible for Server Discovery again and has been automatically relisted!"
* Deletable: true
*/
GUILD_DISCOVERY_REQUALIFIED = 15,
/**
* A message sent when a guild has failed discovery requirements for a week
*
* Value: 16
* Name: GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING
* Rendered Content: "This server has failed Discovery activity requirements for 1 week. If this server fails for 4 weeks in a row, it will be automatically removed from Discovery."
* Deletable: true
*/
GUILD_DISCOVERY_GRACE_PERIOD_INITIAL_WARNING = 16,
/**
* A message sent when a guild has failed discovery requirements for 3 weeks
*
* Value: 17
* Name: GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING
* Rendered Content: "This server has failed Discovery activity requirements for 3 weeks in a row. If this server fails for 1 more week, it will be removed from Discovery."
* Deletable: true
*/
GUILD_DISCOVERY_GRACE_PERIOD_FINAL_WARNING = 17,
/**
* A message sent when a thread is created
*
* Value: 18
* Name: THREAD_CREATED
* Rendered Content: "{author} started a thread: {content} . See all threads."
* Deletable: true
*/
THREAD_CREATED = 18,
/**
* A message sent when a user replies to a message
*
* Value: 19
* Name: REPLY
* Rendered Content: "{content}"
* Deletable: true
*/
REPLY = 19,
/**
* A message sent when a user uses a slash command
*
* Value: 20
* Name: CHAT_INPUT_COMMAND
* Rendered Content: "{content}"
* Deletable: true
*/
CHAT_INPUT_COMMAND = 20,
/**
* A message sent when a thread starter message is added to a thread
*
* Value: 21
* Name: THREAD_STARTER_MESSAGE
* Rendered Content: "{referenced_message?.content}" ?? "Sorry, we couldn't load the first message in this thread"
* Deletable: false
*/
THREAD_STARTER_MESSAGE = 21,
/**
* A message sent to remind users to invite friends to a guild
*
* Value: 22
* Name: GUILD_INVITE_REMINDER
* Rendered Content: "Wondering who to invite?\nStart by inviting anyone who can help you build the server!"
* Deletable: true
*/
GUILD_INVITE_REMINDER = 22,
/**
* A message sent when a user uses a context menu command
*
* Value: 23
* Name: CONTEXT_MENU_COMMAND
* Rendered Content: "{content}"
* Deletable: true
*/
CONTEXT_MENU_COMMAND = 23,
/**
* A message sent when auto moderation takes an action
*
* Value: 24
* Name: AUTO_MODERATION_ACTION
* Rendered Content: Special embed rendered from embeds[0]
* Deletable: true 1
*/
AUTO_MODERATION_ACTION = 24,
/**
* A message sent when a user purchases or renews a role subscription
*
* Value: 25
* Name: ROLE_SUBSCRIPTION_PURCHASE
* Rendered Content: "{author} {is_renewal ? "renewed" : "joined"} {role_subscription.tier_name} and has been a subscriber of {guild} for {role_subscription.total_months_subscribed} month(?s)!"
* Deletable: true
*/
ROLE_SUBSCRIPTION_PURCHASE = 25,
/**
* A message sent when a user is upsold to a premium interaction
*
* Value: 26
* Name: INTERACTION_PREMIUM_UPSELL
* Rendered Content: "{content}"
* Deletable: true
*/
INTERACTION_PREMIUM_UPSELL = 26,
/**
* A message sent when a stage channel starts
*
* Value: 27
* Name: STAGE_START
* Rendered Content: "{author} started {content} "
* Deletable: true
*/
STAGE_START = 27,
/**
* A message sent when a stage channel ends
*
* Value: 28
* Name: STAGE_END
* Rendered Content: "{author} ended {content} "
* Deletable: true
*/
STAGE_END = 28,
/**
* A message sent when a user starts speaking in a stage channel
*
* Value: 29
* Name: STAGE_SPEAKER
* Rendered Content: "{author} is now a speaker."
* Deletable: true
*/
STAGE_SPEAKER = 29,
/**
* A message sent when a user raises their hand in a stage channel
*
* Value: 30
* Name: STAGE_RAISE_HAND
* Rendered Content: "{author} requested to speak."
* Deletable: true
*/
STAGE_RAISE_HAND = 30,
/**
* A message sent when a stage channel's topic is changed
*
* Value: 31
* Name: STAGE_TOPIC
* Rendered Content: "{author} changed the Stage topic: {content} "
* Deletable: true
*/
STAGE_TOPIC = 31,
/**
* A message sent when a user purchases an application premium subscription
*
* Value: 32
* Name: GUILD_APPLICATION_PREMIUM_SUBSCRIPTION
* Rendered Content: "{author} upgraded {application ?? "a deleted application"} to premium for this server!"
* Deletable: true
*/
GUILD_APPLICATION_PREMIUM_SUBSCRIPTION = 32,
/**
* A message sent when a user gifts a premium (Nitro) referral
*
* Value: 35
* Name: PREMIUM_REFERRAL
* Rendered Content: "{content}"
* Deletable: true
*/
PREMIUM_REFERRAL = 35,
/**
* A message sent when a user enabled lockdown for the guild
*
* Value: 36
* Name: GUILD_INCIDENT_ALERT_MODE_ENABLED
* Rendered Content: "{author} enabled security actions until {content}."
* Deletable: true
*/
GUILD_INCIDENT_ALERT_MODE_ENABLED = 36,
/**
* A message sent when a user disables lockdown for the guild
*
* Value: 37
* Name: GUILD_INCIDENT_ALERT_MODE_DISABLED
* Rendered Content: "{author} disabled security actions."
* Deletable: true
*/
GUILD_INCIDENT_ALERT_MODE_DISABLED = 37,
/**
* A message sent when a user reports a raid for the guild
*
* Value: 38
* Name: GUILD_INCIDENT_REPORT_RAID
* Rendered Content: "{author} reported a raid in {guild}."
* Deletable: true
*/
GUILD_INCIDENT_REPORT_RAID = 38,
/**
* A message sent when a user reports a false alarm for the guild
*
* Value: 39
* Name: GUILD_INCIDENT_REPORT_FALSE_ALARM
* Rendered Content: "{author} reported a false alarm in {guild}."
* Deletable: true
*/
GUILD_INCIDENT_REPORT_FALSE_ALARM = 39,
/**
* A message sent when no one sends a message in the current channel for 1 hour
*
* Value: 40
* Name: GUILD_DEADCHAT_REVIVE_PROMPT
* Rendered Content: "{content}"
* Deletable: true
*/
GUILD_DEADCHAT_REVIVE_PROMPT = 40,
/**
* A message sent when a user buys another user a gift
*
* Value: 41
* Name: CUSTOM_GIFT
* Rendered Content: Special embed rendered from embeds[0].url and gift_info
* Deletable: true
*/
CUSTOM_GIFT = 41,
/**
* Value: 42
* Name: GUILD_GAMING_STATS_PROMPT
* Rendered Content: "{content}"
* Deletable: true
*/
GUILD_GAMING_STATS_PROMPT = 42,
/**
* A message sent when a user purchases a guild product
*
* Value: 44
* Name: PURCHASE_NOTIFICATION
* Rendered Content: "{author} has purchased {purchase_notification.guild_product_purchase.product_name}!"
* Deletable: true
*/
PURCHASE_NOTIFICATION = 44,
/**
* A message sent when a poll is finalized
*
* Value: 46
* Name: POLL_RESULT
* Rendered Content: Special embed rendered from embeds[0]
* Deletable: true
*/
POLL_RESULT = 46,
/**
* A message sent by the Discord Updates account when a new changelog is posted
*
* Value: 47
* Name: CHANGELOG
* Rendered Content: "{content}"
* Deletable: true
*/
CHANGELOG = 47,
/**
* A message sent when a Nitro promotion is triggered
*
* Value: 48
* Name: NITRO_NOTIFICATION
* Rendered Content: Special embed rendered from content
* Deletable: true
*/
NITRO_NOTIFICATION = 48,
/**
* A message sent when a voice channel is linked to a lobby
*
* Value: 49
* Name: CHANNEL_LINKED_TO_LOBBY
* Rendered Content: "{content}"
* Deletable: true
*/
CHANNEL_LINKED_TO_LOBBY = 49,
/**
* A local-only ephemeral message sent when a user is prompted to gift Nitro to a friend on their friendship anniversary
*
* Value: 50
* Name: GIFTING_PROMPT
* Rendered Content: Special embed
* Deletable: true
*/
GIFTING_PROMPT = 50,
/**
* A local-only message sent when a user receives an in-game message NUX
*
* Value: 51
* Name: IN_GAME_MESSAGE_NUX
* Rendered Content: "{author} messaged you from {application.name}. In-game chat may not include rich messaging features such as images, polls, or apps. Learn More "
* Deletable: true
*/
IN_GAME_MESSAGE_NUX = 51,
/**
* A message sent when a user accepts a guild join request
*
* Value: 52
* Name: GUILD_JOIN_REQUEST_ACCEPT_NOTIFICATION 2
* Rendered Content: "{join_request.user}'s application to {content} was approved! Welcome!"
* Deletable: true
*/
GUILD_JOIN_REQUEST_ACCEPT_NOTIFICATION = 52,
/**
* A message sent when a user rejects a guild join request
*
* Value: 53
* Name: GUILD_JOIN_REQUEST_REJECT_NOTIFICATION 2
* Rendered Content: "{join_request.user}'s application to {content} was rejected."
* Deletable: true
*/
GUILD_JOIN_REQUEST_REJECT_NOTIFICATION = 53,
/**
* A message sent when a user withdraws a guild join request
*
* Value: 54
* Name: GUILD_JOIN_REQUEST_WITHDRAWN_NOTIFICATION 2
* Rendered Content: "{join_request.user}'s application to {content} has been withdrawn."
* Deletable: true
*/
GUILD_JOIN_REQUEST_WITHDRAWN_NOTIFICATION = 54,
/**
* A message sent when a user upgrades to HD streaming
*
* Value: 55
* Name: HD_STREAMING_UPGRADED
* Rendered Content: "{author} activated HD Splash Potion "
* Deletable: true
*/
HD_STREAMING_UPGRADED = 55,
/**
* A message sent when a user resolves a moderation report by deleting the offending message
*
* Value: 58
* Name: REPORT_TO_MOD_DELETED_MESSAGE
* Rendered Content: "{author} deleted the message"
* Deletable: true
*/
REPORT_TO_MOD_DELETED_MESSAGE = 58,
/**
* A message sent when a user resolves a moderation report by timing out the offending user
*
* Value: 59
* Name: REPORT_TO_MOD_TIMEOUT_USER
* Rendered Content: "{author} timed out {mentions [0] }"
* Deletable: true
*/
REPORT_TO_MOD_TIMEOUT_USER = 59,
/**
* A message sent when a user resolves a moderation report by kicking the offending user
*
* Value: 60
* Name: REPORT_TO_MOD_KICK_USER
* Rendered Content: "{author} kicked {mentions [0] }"
* Deletable: true
*/
REPORT_TO_MOD_KICK_USER = 60,
/**
* A message sent when a user resolves a moderation report by banning the offending user
*
* Value: 61
* Name: REPORT_TO_MOD_BAN_USER
* Rendered Content: "{author} banned {mentions [0] }"
* Deletable: true
*/
REPORT_TO_MOD_BAN_USER = 61,
/**
* A message sent when a user resolves a moderation report
*
* Value: 62
* Name: REPORT_TO_MOD_CLOSED_REPORT
* Rendered Content: "{author} resolved this flag"
* Deletable: true
*/
REPORT_TO_MOD_CLOSED_REPORT = 62,
/**
* A message sent when a user adds a new emoji to a guild
*
* Value: 63
* Name: EMOJI_ADDED
* Rendered Content: "{author} added a new emoji, {content} :{emoji.name}: "
* Deletable: true
*/
EMOJI_ADDED = 63,
}
export const enum MessageFlags {
/**
* Message has been published to subscribed channels (via Channel Following)
*
* Value: 1 << 0
*/
CROSSPOSTED = 1 << 0,
/**
* Message originated from a message in another channel (via Channel Following)
*/
IS_CROSSPOST = 1 << 1,
/**
* Embeds will not be included when serializing this message
*/
SUPPRESS_EMBEDS = 1 << 2,
/**
* Source message for this crosspost has been deleted (via Channel Following)
*/
SOURCE_MESSAGE_DELETED = 1 << 3,
/**
* Message came from the urgent message system
*/
URGENT = 1 << 4,
/**
* Message has an associated thread, with the same ID as the message
*/
HAS_THREAD = 1 << 5,
/**
* Message is only visible to the user who invoked the interaction
*/
EPHEMERAL = 1 << 6,
/**
* Message is an interaction response and the bot is "thinking"
*/
LOADING = 1 << 7,
/**
* Some roles were not mentioned and added to the thread
*/
FAILED_TO_MENTION_SOME_ROLES_IN_THREAD = 1 << 8,
/**
* Message is hidden from the guild's feed
*/
GUILD_FEED_HIDDEN = 1 << 9,
/**
* Message contains a link that impersonates Discord
*/
SHOULD_SHOW_LINK_NOT_DISCORD_WARNING = 1 << 10,
/**
* Message will not trigger push and desktop notifications
*/
SUPPRESS_NOTIFICATIONS = 1 << 12,
/**
* Message's audio attachment is rendered as a voice message
*/
IS_VOICE_MESSAGE = 1 << 13,
/**
* Message has a forwarded message snapshot attached
*/
HAS_SNAPSHOT = 1 << 14,
/**
* Message contains components from version 2 of the UI kit
*/
IS_COMPONENTS_V2 = 1 << 15,
/**
* Message was triggered by the social layer integration
*/
SENT_BY_SOCIAL_LAYER_INTEGRATION = 1 << 16,
}
================================================
FILE: packages/discord-types/enums/misc.ts
================================================
export const enum CloudUploadPlatform {
REACT_NATIVE = 0,
WEB = 1,
}
export const enum DraftType {
ChannelMessage = 0,
ThreadSettings = 1,
FirstThreadMessage = 2,
ApplicationLauncherCommand = 3,
Poll = 4,
SlashCommand = 5,
ForwardContextMessage = 6,
}
export const enum GuildScheduledEventStatus {
SCHEDULED = 1,
ACTIVE = 2,
COMPLETED = 3,
CANCELED = 4,
}
export const enum GuildScheduledEventEntityType {
STAGE_INSTANCE = 1,
VOICE = 2,
EXTERNAL = 3,
}
export const enum GuildScheduledEventPrivacyLevel {
GUILD_ONLY = 2,
}
export const enum ParticipantType {
STREAM = 0,
HIDDEN_STREAM = 1,
USER = 2,
ACTIVITY = 3,
}
export const enum RTCPlatform {
DESKTOP = 0,
MOBILE = 1,
XBOX = 2,
PLAYSTATION = 3,
}
export const enum VideoSourceType {
VIDEO = 0,
CAMERA_PREVIEW = 1,
}
export const enum EmojiIntention {
REACTION = 0,
STATUS = 1,
COMMUNITY_CONTENT = 2,
CHAT = 3,
GUILD_STICKER_RELATED_EMOJI = 4,
GUILD_ROLE_BENEFIT_EMOJI = 5,
SOUNDBOARD = 6,
VOICE_CHANNEL_TOPIC = 7,
GIFT = 8,
AUTO_SUGGESTION = 9,
POLLS = 10,
PROFILE = 11,
MESSAGE_CONFETTI = 12,
GUILD_PROFILE = 13,
CHANNEL_NAME = 14,
DEFAULT_REACT_EMOJI = 15,
}
export const enum LoadState {
NOT_LOADED = 0,
LOADING = 1,
LOADED = 2,
ERROR = 3,
}
export const enum ConnectionStatsFlags {
TRANSPORT = 1,
OUTBOUND = 2,
INBOUND = 4,
ALL = 7,
}
export const enum SpeakingFlags {
NONE = 0,
VOICE = 1,
SOUNDSHARE = 2,
PRIORITY = 4,
HIDDEN = 8,
}
export const enum GoLiveQualityMode {
AUTO = 1,
FULL = 2,
}
export const enum VoiceProcessingStateReason {
CPU_OVERUSE = 1,
FAILED = 2,
VAD_CPU_OVERUSE = 3,
INITIALIZED = 4,
}
================================================
FILE: packages/discord-types/enums/user.ts
================================================
export const enum RelationshipType {
NONE = 0,
FRIEND = 1,
BLOCKED = 2,
INCOMING_REQUEST = 3,
OUTGOING_REQUEST = 4,
IMPLICIT = 5,
SUGGESTION = 6
}
export enum GiftIntentType {
FRIEND_ANNIVERSARY = 0
}
export const enum ReadStateType {
CHANNEL = 0,
GUILD_EVENT = 1,
NOTIFICATION_CENTER = 2,
GUILD_HOME = 3,
GUILD_ONBOARDING_QUESTION = 4,
MESSAGE_REQUESTS = 5,
}
================================================
FILE: packages/discord-types/package.json
================================================
{
"name": "@vencord/discord-types",
"author": "Vencord Contributors",
"private": false,
"description": "Typescript definitions for the webpack modules of the Discord Web app",
"version": "1.0.0",
"license": "LGPL-3.0-or-later",
"types": "src/index.d.ts",
"type": "module",
"repository": {
"type": "git",
"url": "git+https://github.com/Vendicated/Vencord.git",
"directory": "packages/discord-types"
},
"dependencies": {
"moment": "^2.22.2",
"type-fest": "^4.41.0"
},
"peerDependencies": {
"@types/react": "^19.0.10"
}
}
================================================
FILE: packages/discord-types/src/common/Activity.d.ts
================================================
import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from "../../enums";
export interface ActivityAssets {
large_image?: string;
large_text?: string;
large_url?: string;
small_image?: string;
small_text?: string;
small_url?: string;
}
export interface ActivityButton {
label: string;
url: string;
}
export interface Activity {
name: string;
application_id: string;
type: ActivityType;
state?: string;
state_url?: string;
details?: string;
details_url?: string;
url?: string;
flags: ActivityFlags;
status_display_type?: ActivityStatusDisplayType;
timestamps?: {
start?: number;
end?: number;
};
assets?: ActivityAssets;
buttons?: string[];
metadata?: {
button_urls?: Array<string>;
};
party?: {
id?: string;
size?: [number, number];
};
}
export type OnlineStatus = "online" | "idle" | "dnd" | "invisible" | "offline" | "unknown" | "streaming";
================================================
FILE: packages/discord-types/src/common/Application.d.ts
================================================
import { Guild } from "./Guild";
import { User } from "./User";
export interface ApplicationExecutable {
os: "win32" | "darwin" | "linux";
name: string;
isLauncher: boolean;
}
export interface ApplicationThirdPartySku {
id: string;
sku: string;
distributor: string;
}
export interface ApplicationDeveloper {
id: string;
name: string;
}
export interface ApplicationInstallParams {
permissions: string | null;
scopes: string[];
}
export interface Application {
id: string;
name: string;
icon: string | null;
description: string;
type: number | null;
coverImage: string | null;
primarySkuId: string | undefined;
bot: User | null;
splash: string | undefined;
thirdPartySkus: ApplicationThirdPartySku[];
isMonetized: boolean;
isVerified: boolean;
roleConnectionsVerificationUrl: string | undefined;
parentId: string | undefined;
connectionEntrypointUrl: string | undefined;
overlay: boolean;
overlayWarn: boolean;
overlayCompatibilityHook: boolean;
overlayMethods: number;
hook: boolean;
aliases: string[];
publishers: ApplicationDeveloper[];
developers: ApplicationDeveloper[];
storeListingSkuId: string | undefined;
guildId: string | null;
guild: Guild | undefined;
executables: ApplicationExecutable[];
hashes: string[];
eulaId: string | undefined;
slug: string | undefined;
flags: number;
maxParticipants: number | undefined;
tags: string[];
embeddedActivityConfig: Record<string, unknown> | undefined;
team: ApplicationTeam | undefined;
integrationTypesConfig: Record<string, Record<string, unknown>>;
storefront_available: boolean;
termsOfServiceUrl: string | undefined;
privacyPolicyUrl: string | undefined;
isDiscoverable: boolean;
customInstallUrl: string | undefined;
installParams: ApplicationInstallParams | undefined;
directoryEntry: Record<string, unknown> | undefined;
categories: string[] | undefined;
linkedGames: string[] | undefined;
deepLinkUri: string | undefined;
}
export interface ApplicationTeam {
id: string;
name: string;
icon: string | null;
members: ApplicationTeamMember[];
ownerUserId: string;
}
export interface ApplicationTeamMember {
user: User;
teamId: string;
membershipState: number;
permissions: string[];
role: string;
}
================================================
FILE: packages/discord-types/src/common/Channel.d.ts
================================================
import { DiscordRecord } from "./Record";
export class Channel extends DiscordRecord {
constructor(channel: object);
application_id: number | undefined;
bitrate: number;
defaultAutoArchiveDuration: number | undefined;
flags: number;
guild_id: string;
icon: string;
id: string;
lastMessageId: string;
lastPinTimestamp: string | undefined;
member: unknown;
memberCount: number | undefined;
memberIdsPreview: string[] | undefined;
memberListId: unknown;
messageCount: number | undefined;
name: string;
nicks: Record<string, unknown>;
nsfw: boolean;
originChannelId: unknown;
ownerId: string;
parent_id: string;
permissionOverwrites: {
[role: string]: {
id: string;
type: number;
deny: bigint;
allow: bigint;
};
};
position: number;
rateLimitPerUser: number;
rawRecipients: {
id: string;
avatar: string;
username: string;
public_flags: number;
discriminator: string;
}[];
recipients: string[];
rtcRegion: string;
threadMetadata: {
locked: boolean;
archived: boolean;
invitable: boolean;
createTimestamp: string | undefined;
autoArchiveDuration: number;
archiveTimestamp: string | undefined;
};
topic: string;
type: number;
userLimit: number;
videoQualityMode: undefined;
get accessPermissions(): bigint;
get lastActiveTimestamp(): number;
computeLurkerPermissionsAllowList(): unknown;
getApplicationId(): unknown;
getGuildId(): string;
getRecipientId(): unknown;
hasFlag(flag: number): boolean;
isActiveThread(): boolean;
isArchivedThread(): boolean;
isCategory(): boolean;
isDM(): boolean;
isDirectory(): boolean;
isForumChannel(): boolean;
isGroupDM(): boolean;
isGuildStageVoice(): boolean;
isGuildVoice(): boolean;
isListenModeCapable(): boolean;
isManaged(): boolean;
isMultiUserDM(): boolean;
isNSFW(): boolean;
isOwner(): boolean;
isPrivate(): boolean;
isSystemDM(): boolean;
isThread(): boolean;
isVocal(): boolean;
}
================================================
FILE: packages/discord-types/src/common/Guild.d.ts
================================================
import { Role } from './Role';
import { DiscordRecord } from './Record';
// copy(Object.keys(findByProps("CREATOR_MONETIZABLE")).map(JSON.stringify).join("|"))
export type GuildFeatures =
"INVITE_SPLASH" | "VIP_REGIONS" | "VANITY_URL" | "MORE_EMOJI" | "MORE_STICKERS" | "MORE_SOUNDBOARD" | "VERIFIED" | "COMMERCE" | "DISCOVERABLE" | "COMMUNITY" | "FEATURABLE" | "NEWS" | "HUB" | "PARTNERED" | "ANIMATED_ICON" | "BANNER" | "ENABLED_DISCOVERABLE_BEFORE" | "WELCOME_SCREEN_ENABLED" | "MEMBER_VERIFICATION_GATE_ENABLED" | "PREVIEW_ENABLED" | "ROLE_SUBSCRIPTIONS_ENABLED" | "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE" | "CREATOR_MONETIZABLE" | "CREATOR_MONETIZABLE_PROVISIONAL" | "CREATOR_MONETIZABLE_WHITEGLOVE" | "CREATOR_MONETIZABLE_DISABLED" | "CREATOR_MONETIZABLE_RESTRICTED" | "CREATOR_STORE_PAGE" | "CREATOR_MONETIZABLE_PENDING_NEW_OWNER_ONBOARDING" | "PRODUCTS_AVAILABLE_FOR_PURCHASE" | "GUILD_WEB_PAGE_VANITY_URL" | "THREADS_ENABLED" | "THREADS_ENABLED_TESTING" | "NEW_THREAD_PERMISSIONS" | "ROLE_ICONS" | "TEXT_IN_STAGE_ENABLED" | "TEXT_IN_VOICE_ENABLED" | "HAS_DIRECTORY_ENTRY" | "ANIMATED_BANNER" | "LINKED_TO_HUB" | "EXPOSED_TO_ACTIVITIES_WTP_EXPERIMENT" | "GUILD_HOME_DEPRECATION_OVERRIDE" | "GUILD_HOME_TEST" | "GUILD_HOME_OVERRIDE" | "GUILD_ONBOARDING" | "GUILD_ONBOARDING_EVER_ENABLED" | "GUILD_ONBOARDING_HAS_PROMPTS" | "GUILD_SERVER_GUIDE" | "INTERNAL_EMPLOYEE_ONLY" | "AUTO_MODERATION" | "INVITES_DISABLED" | "BURST_REACTIONS" | "SOUNDBOARD" | "SHARD" | "ACTIVITY_FEED_ENABLED_BY_USER" | "ACTIVITY_FEED_DISABLED_BY_USER" | "SUMMARIES_ENABLED_GA" | "LEADERBOARD_ENABLED" | "SUMMARIES_ENABLED_BY_USER" | "SUMMARIES_OPT_OUT_EXPERIENCE" | "CHANNEL_ICON_EMOJIS_GENERATED" | "NON_COMMUNITY_RAID_ALERTS" | "RAID_ALERTS_DISABLED" | "AUTOMOD_TRIGGER_USER_PROFILE" | "ENABLED_MODERATION_EXPERIENCE_FOR_NON_COMMUNITY" | "GUILD_PRODUCTS_ALLOW_ARCHIVED_FILE" | "CLAN" | "MEMBER_VERIFICATION_MANUAL_APPROVAL" | "FORWARDING_DISABLED" | "MEMBER_VERIFICATION_ROLLOUT_TEST" | "AUDIO_BITRATE_128_KBPS" | "AUDIO_BITRATE_256_KBPS" | "AUDIO_BITRATE_384_KBPS" | "VIDEO_BITRATE_ENHANCED" | "MAX_FILE_SIZE_50_MB" | "MAX_FILE_SIZE_100_MB" | "GUILD_TAGS" | "ENHANCED_ROLE_COLORS" | "PREMIUM_TIER_3_OVERRIDE" | "REPORT_TO_MOD_PILOT" | "TIERLESS_BOOSTING_SYSTEM_MESSAGE";
export type GuildPremiumFeatures =
"ANIMATED_ICON" | "STAGE_CHANNEL_VIEWERS_150" | "ROLE_ICONS" | "GUILD_TAGS" | "BANNER" | "MAX_FILE_SIZE_50_MB" | "VIDEO_QUALITY_720_60FPS" | "STAGE_CHANNEL_VIEWERS_50" | "VIDEO_QUALITY_1080_60FPS" | "MAX_FILE_SIZE_100_MB" | "VANITY_URL" | "VIDEO_BITRATE_ENHANCED" | "STAGE_CHANNEL_VIEWERS_300" | "AUDIO_BITRATE_128_KBPS" | "ANIMATED_BANNER" | "TIERLESS_BOOSTING" | "ENHANCED_ROLE_COLORS" | "INVITE_SPLASH" | "AUDIO_BITRATE_256_KBPS" | "AUDIO_BITRATE_384_KBPS";
export class Guild extends DiscordRecord {
constructor(guild: object);
afkChannelId: string | undefined;
afkTimeout: number;
applicationCommandCounts: {
0: number;
1: number;
2: number;
};
application_id: unknown;
banner: string | undefined;
defaultMessageNotifications: number;
description: string | undefined;
discoverySplash: string | undefined;
explicitContentFilter: number;
features: Set<GuildFeatures>;
homeHeader: string | undefined;
hubType: unknown;
icon: string | undefined;
id: string;
joinedAt: Date;
latestOnboardingQuestionId: string | undefined;
maxMembers: number;
maxStageVideoChannelUsers: number;
maxVideoChannelUsers: number;
mfaLevel: number;
moderatorReporting: unknown;
name: string;
nsfwLevel: number;
ownerConfiguredContentLevel: number;
ownerId: string;
preferredLocale: string;
premiumFeatures: {
additionalEmojiSlots: number;
additionalSoundSlots: number;
additionalStickerSlots: number;
features: Array<GuildPremiumFeatures>;
};
premiumProgressBarEnabled: boolean;
premiumSubscriberCount: number;
premiumTier: 0 | 1 | 2 | 3;
profile: {
badge: string | undefined;
tag: string | undefined;
} | undefined;
publicUpdatesChannelId: string | undefined;
roles: Record<string, Role>;
rulesChannelId: string | undefined;
safetyAlertsChannelId: string | undefined;
splash: string | undefined;
systemChannelFlags: number;
systemChannelId: string | undefined;
vanityURLCode: string | undefined;
verificationLevel: number;
}
================================================
FILE: packages/discord-types/src/common/GuildMember.d.ts
================================================
export interface GuildMember {
avatar: string | undefined;
avatarDecoration: string | undefined;
banner: string | undefined;
bio: string;
colorRoleId: string | undefined;
colorString: string;
colorStrings: {
primaryColor: string | undefined;
secondaryColor: string | undefined;
tertiaryColor: string | undefined;
};
communicationDisabledUntil: string | undefined;
flags: number;
fullProfileLoadedTimestamp: number;
guildId: string;
highestRoleId: string;
hoistRoleId: string;
iconRoleId: string;
isPending: boolean | undefined;
joinedAt: string | undefined;
nick: string | undefined;
premiumSince: string | undefined;
roles: string[];
userId: string;
}
================================================
FILE: packages/discord-types/src/common/Record.d.ts
================================================
type Updater = (value: any) => any;
/**
* Common Record class extended by various Discord data structures, like User, Channel, Guild, etc.
*/
export class DiscordRecord {
toJS(): Record<string, any>;
set(key: string, value: any): this;
merge(data: Record<string, any>): this;
update(key: string, defaultValueOrUpdater: Updater | any, updater?: Updater): this;
}
================================================
FILE: packages/discord-types/src/common/Role.d.ts
================================================
export interface Role {
color: number;
colorString: string | undefined;
colorStrings: {
primaryColor: string | undefined;
secondaryColor: string | undefined;
tertiaryColor: string | undefined;
};
colors: {
primary_color: number | undefined;
secondary_color: number | undefined;
tertiary_color: number | undefined;
};
flags: number;
hoist: boolean;
icon: string | undefined;
id: string;
managed: boolean;
mentionable: boolean;
name: string;
originalPosition: number;
permissions: bigint;
position: number;
/**
* probably incomplete
*/
tags: {
bot_id: string;
integration_id: string;
premium_subscriber: unknown;
} | undefined;
unicodeEmoji: string | undefined;
}
================================================
FILE: packages/discord-types/src/common/User.d.ts
================================================
// TODO: a lot of optional params can also be null, not just undef
import { DiscordRecord } from "./Record";
export class User extends DiscordRecord {
constructor(user: object);
accentColor: number;
avatar: string;
banner: string | null | undefined;
bio: string;
bot: boolean;
desktop: boolean;
discriminator: string;
email: string | undefined;
flags: number;
globalName: string | undefined;
guildMemberAvatars: Record<string, string>;
id: string;
mfaEnabled: boolean;
mobile: boolean;
nsfwAllowed: boolean | undefined;
phone: string | undefined;
premiumType: number | undefined;
premiumUsageFlags: number;
publicFlags: number;
purchasedFlags: number;
system: boolean;
username: string;
verified: boolean;
get createdAt(): Date;
get hasPremiumPerks(): boolean;
get tag(): string;
get usernameNormalized(): string;
addGuildAvatarHash(guildId: string, avatarHash: string): User;
getAvatarSource(guildId: string, canAnimate?: boolean): { uri: string; };
getAvatarURL(guildId?: string | null, t?: unknown, canAnimate?: boolean): string;
hasAvatarForGuild(guildId: string): boolean;
hasDisabledPremium(): boolean;
hasFlag(flag: number): boolean;
hasFreePremium(): boolean;
hasHadSKU(e: unknown): boolean;
hasPremiumUsageFlag(flag: number): boolean;
hasPurchasedFlag(flag: number): boolean;
hasUrgentMessages(): boolean;
isClaimed(): boolean;
isLocalBot(): boolean;
isNonUserBot(): boolean;
isPhoneVerified(): boolean;
isStaff(): boolean;
isSystemUser(): boolean;
isVerifiedBot(): boolean;
removeGuildAvatarHash(guildId: string): User;
toString(): string;
}
export interface UserJSON {
avatar: string;
avatarDecoration: unknown | undefined;
discriminator: string;
id: string;
publicFlags: number;
username: string;
}
================================================
FILE: packages/discord-types/src/common/index.d.ts
================================================
export * from "./Activity";
export * from "./Application";
export * from "./Channel";
export * from "./Guild";
export * from "./GuildMember";
export * from "./messages";
export * from "./Role";
export * from "./User";
export * from "./Record";
================================================
FILE: packages/discord-types/src/common/messages/Commands.d.ts
================================================
import { Channel } from "../Channel";
import { Guild } from "../Guild";
import { Promisable } from "type-fest";
import { ApplicationCommandInputType, ApplicationCommandOptionType, ApplicationCommandType } from "../../../enums";
export interface CommandContext {
channel: Channel;
guild?: Guild;
}
export interface CommandOption {
name: string;
displayName?: string;
type: ApplicationCommandOptionType;
description: string;
displayDescription?: string;
required?: boolean;
options?: CommandOption[];
choices?: Array<ChoicesOption>;
}
export interface ChoicesOption {
label: string;
value: string;
name: string;
displayName?: string;
}
export interface CommandReturnValue {
content: string;
// TODO: implement
// cancel?: boolean;
}
export interface CommandArgument {
type: ApplicationCommandOptionType;
name: string;
value: string;
focused: undefined;
options: CommandArgument[];
}
export interface Command {
id?: string;
applicationId?: string;
type?: ApplicationCommandType;
inputType?: ApplicationCommandInputType;
plugin?: string;
name: string;
untranslatedName?: string;
displayName?: string;
description: string;
untranslatedDescription?: string;
displayDescription?: string;
options?: CommandOption[];
predicate?(ctx: CommandContext): boolean;
execute(args: CommandArgument[], ctx: CommandContext): Promisable<void | CommandReturnValue>;
}
================================================
FILE: packages/discord-types/src/common/messages/Embed.d.ts
================================================
export interface Embed {
author?: {
name: string;
url: string;
iconURL: string | undefined;
iconProxyURL: string | undefined;
};
color: string;
fields: [];
id: string;
image?: {
height: number;
width: number;
url: string;
proxyURL: string;
};
provider?: {
name: string;
url: string | undefined;
};
rawDescription: string;
rawTitle: string;
referenceId: unknown;
timestamp: string;
thumbnail?: {
height: number;
proxyURL: string | undefined;
url: string;
width: number;
};
type: string;
url: string | undefined;
video?: {
height: number;
width: number;
url: string;
proxyURL: string | undefined;
};
}
export interface EmbedJSON {
author?: {
name: string;
url: string;
icon_url: string;
proxy_icon_url: string;
};
title: string;
color: string;
description: string;
type: string;
url: string | undefined;
provider?: {
name: string;
url: string;
};
timestamp: string;
thumbnail?: {
height: number;
width: number;
url: string;
proxy_url: string | undefined;
};
video?: {
height: number;
width: number;
url: string;
proxy_url: string | undefined;
};
}
================================================
FILE: packages/discord-types/src/common/messages/Emoji.d.ts
================================================
/** Union type for both custom (guild) emojis and unicode emojis. */
export type Emoji = CustomEmoji | UnicodeEmoji;
/**
* Custom emoji uploaded to a guild.
*/
export interface CustomEmoji {
/** Discriminator for custom emojis. */
type: 1;
/** Whether the emoji is animated (GIF). */
animated: boolean;
/** Whether the emoji is available for use. */
available: boolean;
/** Guild id this emoji belongs to. */
guildId: string;
/** Unique emoji id (snowflake). */
id: string;
/** Whether the emoji is managed by an integration (e.g. Twitch). */
managed: boolean;
/** Emoji name without colons. */
name: string;
/** Original name before any modifications. */
originalName?: string;
/** Whether the emoji requires colons to use. */
require_colons: boolean;
/** Role ids that can use this emoji (empty array means everyone). */
roles: string[];
/** Version number, incremented when emoji is updated. */
version?: number;
}
/**
* Built-in unicode emoji.
*/
export interface UnicodeEmoji {
/** Discriminator for unicode emojis. */
type: 0;
/** Skin tone variant emojis keyed by diversity surrogate code (e.g. "1f3fb" for light skin). */
diversityChildren: Record<string, UnicodeEmoji>;
/** Raw emoji data from Discord's emoji dataset. */
emojiObject: EmojiObject;
/** Index position in the emoji list. */
index: number;
/** Unicode surrogate pair(s) for this emoji. */
surrogates: string;
/** Unique name identifier for this emoji. */
uniqueName: string;
/** Whether to render using sprite sheet. */
useSpriteSheet: boolean;
/** Original name if renamed in context. */
originalName?: string;
/** Emoji id when used in custom emoji context. */
id?: string;
/** Guild id when used in guild context. */
guildId?: string;
/** Formatted string of all emoji names. */
get allNamesString(): string;
/** Always false for unicode emojis. */
get animated(): false;
/** Default skin tone variant or undefined if no diversity. */
get defaultDiversityChild(): UnicodeEmoji | undefined;
/** Whether this emoji supports skin tone modifiers. */
get hasDiversity(): boolean | undefined;
/** Whether this emoji is a skin tone variant of another. */
get hasDiversityParent(): boolean | undefined;
/** Whether this emoji supports multiple diversity modifiers (e.g. handshake with two skin tones). */
get hasMultiDiversity(): boolean | undefined;
/** Whether this emoji is a multi-diversity variant of another. */
get hasMultiDiversityParent(): boolean | undefined;
/** Always true for unicode emojis. */
get managed(): true;
/** Primary emoji name. */
get name(): string;
/** All names/aliases for this emoji. */
get names(): string[];
/** Surrogate sequence with optional diversity modifier. */
get optionallyDiverseSequence(): string | undefined;
/** Unicode version when this emoji was added. */
get unicodeVersion(): number;
/** CDN url for emoji image. */
get url(): string;
/**
* Iterates over all diversity variants of this emoji.
* @param callback Function called for each diversity variant.
*/
forEachDiversity(callback: (emoji: UnicodeEmoji) => void): void;
/**
* Iterates over all names/aliases of this emoji.
* @param callback Function called for each name.
*/
forEachName(callback: (name: string) => void): void;
}
/**
* Raw emoji data from Discord's emoji dataset.
*/
export interface EmojiObject {
/** All names/aliases for this emoji. */
names: string[];
/** Unicode surrogate pair(s). */
surrogates: string;
/** Unicode version when this emoji was added. */
unicodeVersion: number;
/** Index in the sprite sheet for rendering. */
spriteIndex?: number;
/** Whether this emoji supports multiple skin tone modifiers. */
hasMultiDiversity?: boolean;
/** Whether this emoji is a diversity variant with a multi-diversity parent. */
hasMultiDiversityParent?: boolean;
/** Skin tone modifier codes for this variant (e.g. ["1f3fb"] or ["1f3fb", "1f3fc"]). */
diversity?: string[];
/** Sprite indices of diversity children for parent emojis. */
diversityChildren?: number[];
}
================================================
FILE: packages/discord-types/src/common/messages/Message.d.ts
================================================
import { CommandOption } from './Commands';
import { User, UserJSON } from '../User';
import { Embed, EmbedJSON } from './Embed';
import { DiscordRecord } from "../Record";
import { ApplicationIntegrationType, MessageFlags, MessageType, StickerFormatType } from "../../../enums";
/*
* TODO: looks like discord has moved over to Date instead of Moment;
*/
export class Message extends DiscordRecord {
constructor(message: object);
activity: unknown;
application: unknown;
applicationId: string | unknown;
attachments: MessageAttachment[];
author: User;
blocked: boolean;
bot: boolean;
call: {
duration: moment.Duration;
endedTimestamp: moment.Moment;
participants: string[];
};
channel_id: string;
/**
* NOTE: not fully typed
*/
codedLinks: {
code?: string;
type: string;
}[];
colorString: unknown;
components: unknown[];
content: string;
customRenderedContent: unknown;
editedTimestamp: Date;
embeds: Embed[];
flags: MessageFlags;
giftCodes: string[];
id: string;
interaction: {
id: string;
name: string;
type: number;
user: User;
}[] | undefined;
interactionData: {
application_command: {
application_id: string;
default_member_permissions: unknown;
default_permission: boolean;
description: string;
dm_permission: unknown;
id: string;
name: string;
options: CommandOption[];
permissions: unknown[];
type: number;
version: string;
};
attachments: MessageAttachment[];
guild_id: string | undefined;
id: string;
name: string;
options: {
focused: unknown;
name: string;
type: number;
value: string;
}[];
type: number;
version: string;
}[];
interactionMetadata?: {
id: string;
type: number;
name?: string;
command_type?: number;
ephemerality_reason?: number;
user: User;
authorizing_integration_owners: Record<ApplicationIntegrationType, string>;
original_response_message_id?: string;
interacted_message_id?: string;
target_user?: User;
target_message_id?: string;
};
interactionError: unknown[];
isSearchHit: boolean;
loggingName: unknown;
mentionChannels: string[];
mentionEveryone: boolean;
mentionRoles: string[];
mentioned: boolean;
mentions: string[];
messageReference: {
guild_id?: string;
channel_id: string;
message_id: string;
} | undefined;
messageSnapshots: {
message: Message;
}[];
nick: unknown; // probably a string
nonce: string | undefined;
pinned: boolean;
reactions: MessageReaction[];
state: string;
stickerItems: {
format_type: StickerFormatType;
id: string;
name: string;
}[];
stickers: unknown[];
timestamp: moment.Moment;
tts: boolean;
type: MessageType;
webhookId: string | undefined;
/**
* Doesn't actually update the original message; it just returns a new message instance with the added reaction.
*/
addReaction(emoji: ReactionEmoji, fromCurrentUser: boolean): Message;
/**
* Searches each reaction and if the provided string has an index above -1 it'll return the reaction object.
*/
getReaction(name: string): MessageReaction;
/**
* Doesn't actually update the original message; it just returns the message instance without the reaction searched with the provided emoji object.
*/
removeReactionsForEmoji(emoji: ReactionEmoji): Message;
/**
* Doesn't actually update the original message; it just returns the message instance without the reaction.
*/
removeReaction(emoji: ReactionEmoji, fromCurrentUser: boolean): Message;
getChannelId(): string;
hasFlag(flag: MessageFlags): boolean;
isCommandType(): boolean;
isEdited(): boolean;
isSystemDM(): boolean;
/** Vencord added */
deleted?: boolean;
}
/** A smaller Message object found in FluxDispatcher and elsewhere. */
export interface MessageJSON {
attachments: MessageAttachment[];
author: UserJSON;
channel_id: string;
components: unknown[];
content: string;
edited_timestamp: string;
embeds: EmbedJSON[];
flags: number;
guild_id: string | undefined;
id: string;
loggingName: unknown;
member: {
avatar: string | undefined;
communication_disabled_until: string | undefined;
deaf: boolean;
hoisted_role: string | undefined;
is_pending: boolean;
joined_at: string;
mute: boolean;
nick: string | boolean;
pending: boolean;
premium_since: string | undefined;
roles: string[];
} | undefined;
mention_everyone: boolean;
mention_roles: string[];
mentions: UserJSON[];
message_reference: {
guild_id?: string;
channel_id: string;
message_id: string;
} | undefined;
nonce: string | undefined;
pinned: boolean;
referenced_message: MessageJSON | undefined;
state: string;
timestamp: string;
tts: boolean;
type: number;
}
export interface MessageAttachment {
filename: string;
id: string;
proxy_url: string;
size: number;
spoiler: boolean;
url: string;
content_type?: string;
width?: number;
height?: number;
}
export interface ReactionEmoji {
id: string | undefined;
name: string;
animated: boolean;
}
export interface MessageReaction {
count: number;
emoji: ReactionEmoji;
me: boolean;
}
// Object.keys(findByProps("REPLYABLE")).map(JSON.stringify).join("|")
export type MessageTypeSets = Record<
"UNDELETABLE" | "GUILD_DISCOVERY_STATUS" | "USER_MESSAGE" | "NOTIFIABLE_SYSTEM_MESSAGE" | "REPLYABLE" | "FORWARDABLE" | "REFERENCED_MESSAGE_AVAILABLE" | "AVAILABLE_IN_GUILD_FEED" | "DEADCHAT_PROMPTS" | "NON_COLLAPSIBLE" | "NON_PARSED" | "AUTOMOD_INCIDENT_ACTIONS" | "SELF_MENTIONABLE_SYSTEM" | "SCHEDULABLE",
Set<MessageType>
>;
================================================
FILE: packages/discord-types/src/common/messages/Sticker.d.ts
================================================
import { StickerFormatType, StickerType } from "../../../enums";
interface BaseSticker {
asset: string;
available: boolean;
description: string;
format_type: StickerFormatType;
id: string;
name: string;
sort_value?: number;
/** a comma separated string */
tags: string;
}
export interface PackSticker extends BaseSticker {
pack_id: string;
type: StickerType.STANDARD;
}
export interface GuildSticker extends BaseSticker {
guild_id: string;
type: StickerType.GUILD;
}
export type Sticker = PackSticker | GuildSticker;
export interface PremiumStickerPack {
banner_asset_id?: string;
cover_sticker_id?: string;
description: string;
id: string;
name: string;
sku_id: string;
stickers: PackSticker[];
}
================================================
FILE: packages/discord-types/src/common/messages/index.d.ts
================================================
export * from "./Commands";
export * from "./Message";
export * from "./Embed";
export * from "./Emoji";
export * from "./Sticker";
================================================
FILE: packages/discord-types/src/components.d.ts
================================================
import type { ComponentClass, ComponentPropsWithRef, ComponentType, CSSProperties, FunctionComponent, HtmlHTMLAttributes, HTMLProps, JSX, KeyboardEvent, MouseEvent, PointerEvent, PropsWithChildren, ReactNode, Ref, RefObject } from "react";
// #region Old compability
export type HeadingTag = `h${1 | 2 | 3 | 4 | 5 | 6}`;
export type Margins = Record<"marginTop16" | "marginTop8" | "marginBottom8" | "marginTop20" | "marginBottom20", string>;
// copy(find(m => Array.isArray(m) && m.includes("heading-sm/normal")).map(JSON.stringify).join("|"))
export type TextVariant = "heading-sm/normal" | "heading-sm/medium" | "heading-sm/semibold" | "heading-sm/bold" | "heading-sm/extrabold" | "heading-md/normal" | "heading-md/medium" | "heading-md/semibold" | "heading-md/bold" | "heading-md/extrabold" | "heading-lg/normal" | "heading-lg/medium" | "heading-lg/semibold" | "heading-lg/bold" | "heading-lg/extrabold" | "heading-xl/normal" | "heading-xl/medium" | "heading-xl/semibold" | "heading-xl/bold" | "heading-xl/extrabold" | "heading-xxl/normal" | "heading-xxl/medium" | "heading-xxl/semibold" | "heading-xxl/bold" | "heading-xxl/extrabold" | "text-xxs/normal" | "text-xxs/medium" | "text-xxs/semibold" | "text-xxs/bold" | "text-xs/normal" | "text-xs/medium" | "text-xs/semibold" | "text-xs/bold" | "text-sm/normal" | "text-sm/medium" | "text-sm/semibold" | "text-sm/bold" | "text-md/normal" | "text-md/medium" | "text-md/semibold" | "text-md/bold" | "text-lg/normal" | "text-lg/medium" | "text-lg/semibold" | "text-lg/bold";
export type TextProps = PropsWithChildren<HtmlHTMLAttributes<HTMLDivElement> & {
variant?: TextVariant;
tag?: "div" | "span" | "p" | "strong" | HeadingTag;
}>;
export type Text = ComponentType<TextProps>;
export interface ButtonProps extends PropsWithChildren<Omit<HTMLProps<HTMLButtonElement>, "size">> {
/** Button.Looks.FILLED */
look?: string;
/** Button.Colors.BRAND */
color?: string;
/** Button.Sizes.MEDIUM */
size?: string;
className?: string;
}
export type Button = ComponentType<ButtonProps> & {
Colors: Record<"BRAND" | "RED" | "GREEN" | "PRIMARY" | "LINK" | "WHITE" | "TRANSPARENT" | "CUSTOM", string>;
Looks: Record<"FILLED" | "LINK", string>;
Sizes: Record<"NONE" | "SMALL" | "MEDIUM" | "LARGE" | "XLARGE" | "MIN", string>;
};
// #endregion
export interface TooltipChildrenProps {
onClick(): void;
onMouseEnter(): void;
onMouseLeave(): void;
onContextMenu(): void;
onFocus(): void;
onBlur(): void;
"aria-label"?: string;
}
export interface TooltipProps {
text: ReactNode | ComponentType;
children: FunctionComponent<TooltipChildrenProps>;
"aria-label"?: string;
allowOverflow?: boolean;
forceOpen?: boolean;
hide?: boolean;
hideOnClick?: boolean;
shouldShow?: boolean;
spacing?: number;
/** Tooltip.Colors.BLACK */
color?: string;
/** TooltipPositions.TOP */
position?: PopoutPosition;
tooltipClassName?: string;
tooltipContentClassName?: string;
}
export type Tooltip = ComponentType<TooltipProps> & {
Colors: Record<"BLACK" | "BRAND" | "CUSTOM" | "GREEN" | "GREY" | "PRIMARY" | "RED" | "YELLOW", string>;
};
export type TooltipPositions = Record<"BOTTOM" | "CENTER" | "LEFT" | "RIGHT" | "TOP" | "WINDOW_CENTER", string>;
export type TooltipContainer = ComponentType<PropsWithChildren<{
text: ReactNode;
element?: "div" | "span";
"aria-label"?: string | false;
delay?: number;
/** Tooltip.Colors.BLACK */
color?: string;
/** TooltipPositions.TOP */
position?: PopoutPosition;
spacing?: number;
className?: string;
tooltipClassName?: string | null;
tooltipContentClassName?: string | null;
allowOverflow?: boolean;
forceOpen?: boolean;
hideOnClick?: boolean;
disableTooltipPointerEvents?: boolean;
}>>;
export type Card = ComponentType<PropsWithChildren<HTMLProps<HTMLDivElement> & {
editable?: boolean;
outline?: boolean;
/** Card.Types.PRIMARY */
type?: string;
}>> & {
Types: Record<"BRAND" | "CUSTOM" | "DANGER" | "PRIMARY" | "SUCCESS" | "WARNING", string>;
};
export type ComboboxPopout = ComponentType<PropsWithChildren<{
value: Set<any>;
placeholder: string;
children(query: string): ReactNode[];
onChange(value: any): void;
itemToString?: (item: any) => string;
onClose?(): void;
className?: string;
listClassName?: string;
autoFocus?: boolean;
multiSelect?: boolean;
maxVisibleItems?: number;
showScrollbar?: boolean;
}>>;
export type CheckboxAligns = {
CENTER: "center";
TOP: "top";
};
export type CheckboxTypes = {
DEFAULT: "default";
INVERTED: "inverted";
GHOST: "ghost";
ROW: "row";
};
export type Checkbox = ComponentType<PropsWithChildren<{
value: boolean;
onChange(event: PointerEvent, value: boolean): void;
align?: "center" | "top";
disabled?: boolean;
displayOnly?: boolean;
readOnly?: boolean;
reverse?: boolean;
shape?: string;
size?: number;
type?: "default" | "inverted" | "ghost" | "row";
}>> & {
Shapes: Record<"BOX" | "ROUND" | "SMALL_BOX", string>;
Aligns: CheckboxAligns;
Types: CheckboxTypes;
};
export type Timestamp = ComponentType<PropsWithChildren<{
timestamp: Date;
isEdited?: boolean;
className?: string;
id?: string;
cozyAlt?: boolean;
compact?: boolean;
isInline?: boolean;
isVisibleOnlyOnHover?: boolean;
}>>;
export type TextInput = ComponentType<PropsWithChildren<{
name?: string;
onChange?(value: string, name?: string): void;
placeholder?: string;
editable?: boolean;
/** defaults to 999. Pass null to disable this default */
maxLength?: number | null;
error?: string;
inputClassName?: string;
inputPrefix?: string;
inputRef?: Ref<HTMLInputElement>;
prefixElement?: ReactNode;
focusProps?: any;
/** TextInput.Sizes.DEFAULT */
size?: string;
} & Omit<HTMLProps<HTMLInputElement>, "onChange" | "maxLength">>> & {
Sizes: Record<"DEFAULT" | "MINI", string>;
};
// FIXME: this is wrong, it's not actually just HTMLTextAreaElement
export type TextArea = ComponentType<Omit<HTMLProps<HTMLTextAreaElement>, "onChange"> & {
onChange(v: string): void;
inputRef?: Ref<HTMLTextAreaElement>;
}>;
interface SelectOption {
disabled?: boolean;
value: any;
label: string;
key?: React.Key;
default?: boolean;
}
export type Select = ComponentType<PropsWithChildren<{
placeholder?: string;
options: ReadonlyArray<SelectOption>; // TODO
/**
* - 0 ~ Filled
* - 1 ~ Custom
*/
look?: 0 | 1;
className?: string;
popoutClassName?: string;
popoutPosition?: PopoutPosition;
optionClassName?: string;
autoFocus?: boolean;
isDisabled?: boolean;
clearable?: boolean;
closeOnSelect?: boolean;
hideIcon?: boolean;
select(value: any): void;
isSelected(value: any): boolean;
serialize(value: any): string;
clear?(): void;
maxVisibleItems?: number;
popoutWidth?: number;
onClose?(): void;
onOpen?(): void;
renderOptionLabel?(option: SelectOption): ReactNode;
/** discord stupid this gets all options instead of one yeah */
renderOptionValue?(option: SelectOption[]): ReactNode;
"aria-label"?: boolean;
"aria-labelledby"?: boolean;
}>>;
export type SearchableSelect = ComponentType<PropsWithChildren<{
placeholder?: string;
options: ReadonlyArray<SelectOption>; // TODO
value?: any;
/**
* - 0 ~ Filled
* - 1 ~ Custom
*/
look?: 0 | 1;
className?: string;
popoutClassName?: string;
wrapperClassName?: string;
popoutPosition?: PopoutPosition;
optionClassName?: string;
autoFocus?: boolean;
isDisabled?: boolean;
clearable?: boolean;
closeOnSelect?: boolean;
clearOnSelect?: boolean;
multi?: boolean;
onChange(value: any): void;
onSearchChange?(value: string): void;
onClose?(): void;
onOpen?(): void;
onBlur?(): void;
renderOptionPrefix?(option: SelectOption): ReactNode;
renderOptionSuffix?(option: SelectOption): ReactNode;
filter?(option: SelectOption[], query: string): SelectOption[];
centerCaret?: boolean;
debounceTime?: number;
maxVisibleItems?: number;
popoutWidth?: number;
"aria-labelledby"?: boolean;
}>>;
export type Slider = ComponentClass<PropsWithChildren<{
initialValue: number;
defaultValue?: number;
keyboardStep?: number;
maxValue?: number;
minValue?: number;
markers?: number[];
stickToMarkers?: boolean;
/** 0 above, 1 below */
markerPosition?: 0 | 1;
orientation?: "horizontal" | "vertical";
getAriaValueText?(currentValue: number): string;
renderMarker?(marker: number): ReactNode;
onMarkerRender?(marker: number): ReactNode;
onValueRender?(value: number): ReactNode;
onValueChange?(value: number): void;
asValueChanges?(value: number): void;
className?: string;
disabled?: boolean;
handleSize?: number;
mini?: boolean;
hideBubble?: boolean;
fillStyles?: CSSProperties;
barStyles?: CSSProperties;
grabberStyles?: CSSProperties;
grabberClassName?: string;
barClassName?: string;
"aria-hidden"?: boolean;
"aria-label"?: string;
"aria-labelledby"?: string;
"aria-describedby"?: string;
}>>;
declare enum PopoutAnimation {
NONE = "1",
TRANSLATE = "2",
SCALE = "3",
FADE = "4"
}
type PopoutPosition = "top" | "bottom" | "left" | "right" | "center" | "window_center";
export type Popout = ComponentType<{
children(
thing: {
"aria-controls": string;
"aria-expanded": boolean;
onClick(event: MouseEvent<HTMLElement>): void;
onKeyDown(event: KeyboardEvent<HTMLElement>): void;
onMouseDown(event: MouseEvent<HTMLElement>): void;
},
data: {
isShown: boolean;
position: PopoutPosition;
}
): ReactNode;
shouldShow?: boolean;
targetElementRef: RefObject<any>;
renderPopout(args: {
closePopout(): void;
isPositioned: boolean;
nudge: number;
position: PopoutPosition;
setPopoutRef(ref: any): void;
updatePosition(): void;
}): ReactNode;
onRequestOpen?(): void;
onRequestClose?(): void;
/** "center" and others */
align?: "left" | "right" | "center";
/** Popout.Animation */
animation?: PopoutAnimation;
autoInvert?: boolean;
nudgeAlignIntoViewport?: boolean;
/** "bottom" and others */
position?: PopoutPosition;
positionKey?: string;
spacing?: number;
}> & {
Animation: typeof PopoutAnimation;
};
export type Dialog = ComponentType<JSX.IntrinsicElements["div"]>;
type Resolve = (data: { theme: "light" | "dark", saturation: number; }) => {
hex(): string;
hsl(): string;
int(): number;
spring(): string;
};
export type useToken = (color: {
css: string;
resolve: Resolve;
}) => ReturnType<Resolve>;
export type Paginator = ComponentType<{
currentPage: number;
maxVisiblePages: number;
pageSize: number;
totalCount: number;
onPageChange?(page: number): void;
hideMaxPage?: boolean;
}>;
export type MaskedLink = ComponentType<PropsWithChildren<{
href: string;
rel?: string;
target?: string;
title?: string,
className?: string;
tabIndex?: number;
onClick?(): void;
trusted?: boolean;
messageId?: string;
channelId?: string;
}>>;
export interface ScrollerBaseProps {
className?: string;
style?: CSSProperties;
dir?: "ltr";
paddingFix?: boolean;
onClose?(): void;
onScroll?(): void;
}
export type ScrollerThin = ComponentType<PropsWithChildren<ScrollerBaseProps & {
orientation?: "horizontal" | "vertical" | "auto";
fade?: boolean;
}>>;
interface BaseListItem {
anchorId: any;
listIndex: number;
offsetTop: number;
section: number;
}
interface ListSection extends BaseListItem {
type: "section";
}
interface ListRow extends BaseListItem {
type: "row";
row: number;
rowIndex: number;
}
export type ListScrollerThin = ComponentType<ScrollerBaseProps & {
sections: number[];
renderSection?: (item: ListSection) => React.ReactNode;
renderRow: (item: ListRow) => React.ReactNode;
renderFooter?: (item: any) => React.ReactNode;
renderSidebar?: (listVisible: boolean, sidebarVisible: boolean) => React.ReactNode;
wrapSection?: (section: number, children: React.ReactNode) => React.ReactNode;
sectionHeight: number;
rowHeight: number;
footerHeight?: number;
sidebarHeight?: number;
chunkSize?: number;
paddingTop?: number;
paddingBottom?: number;
fade?: boolean;
onResize?: Function;
getAnchorId?: any;
innerTag?: string;
innerId?: string;
innerClassName?: string;
innerRole?: string;
innerAriaLabel?: string;
// Yes, Discord uses this casing
innerAriaMultiselectable?: boolean;
innerAriaOrientation?: "vertical" | "horizontal";
}>;
export type Clickable = <T extends "a" | "div" | "span" | "li" = "div">(props: PropsWithChildren<ComponentPropsWithRef<T>> & {
tag?: T;
}) => ReactNode;
export type Avatar = ComponentType<PropsWithChildren<{
className?: string;
src?: string;
size?: "SIZE_16" | "SIZE_20" | "SIZE_24" | "SIZE_32" | "SIZE_40" | "SIZE_48" | "SIZE_56" | "SIZE_80" | "SIZE_120";
statusColor?: string;
statusTooltip?: string;
statusBackdropColor?: string;
isMobile?: boolean;
isTyping?: boolean;
isSpeaking?: boolean;
typingIndicatorRef?: unknown;
"aria-hidden"?: boolean;
"aria-label"?: string;
}>>;
type FocusLock = ComponentType<PropsWithChildren<{
containerRef: Ref<HTMLElement>;
}>>;
export type Icon = ComponentType<JSX.IntrinsicElements["svg"] & {
size?: string;
colorClass?: string;
} & Record<string, any>>;
export type ColorPicker = ComponentType<{
color: number | null;
showEyeDropper?: boolean;
suggestedColors?: string[];
label?: ReactNode;
onChange(value: number | null): void;
}>;
================================================
FILE: packages/discord-types/src/flux.d.ts
================================================
import { FluxStore } from "./stores/FluxStore";
export class FluxEmitter {
constructor();
changeSentinel: number;
changedStores: Set<FluxStore>;
isBatchEmitting: boolean;
isDispatching: boolean;
isPaused: boolean;
pauseTimer: NodeJS.Timeout | null;
reactChangedStores: Set<FluxStore>;
batched(batch: (...args: any[]) => void): void;
destroy(): void;
emit(): void;
emitNonReactOnce(): void;
emitReactOnce(): void;
getChangeSentinel(): number;
getIsPaused(): boolean;
injectBatchEmitChanges(batch: (...args: any[]) => void): void;
markChanged(store: FluxStore): void;
pause(): void;
resume(): void;
}
export interface Flux {
Store: typeof FluxStore;
Emitter: FluxEmitter;
}
================================================
FILE: packages/discord-types/src/fluxEvents.d.ts
================================================
/*
function makeFluxEventList() {
// prefill MESSAGE_CREATE so that typescript infers this is a String Set
// without explicitly typing so that this function is also valid javascript
const events = new Set(["MESSAGE_CREATE"]);
const { nodes } = Vencord.Webpack.Common.FluxDispatcher._actionHandlers._dependencyGraph;
for (const nodeId in nodes) {
for (const event in nodes[nodeId].actionHandler) {
events.add(event);
}
}
for (const event in Vencord.Webpack.Common.FluxDispatcher._subscriptions) {
events.add(event);
}
return Array.from(events, e => JSON.stringify(e)).sort().join("|");
}
copy(makeFluxEventList())
*/
export type FluxEvents = "ACCESSIBILITY_COLORBLIND_TOGGLE" | "ACCESSIBILITY_DARK_SIDEBAR_TOGGLE" | "ACCESSIBILITY_DESATURATE_ROLES_TOGGLE" | "ACCESSIBILITY_FORCED_COLORS_MODAL_SEEN" | "ACCESSIBILITY_KEYBOARD_MODE_DISABLE" | "ACCESSIBILITY_KEYBOARD_MODE_ENABLE" | "ACCESSIBILITY_LOW_CONTRAST_TOGGLE" | "ACCESSIBILITY_RESET_TO_DEFAULT" | "ACCESSIBILITY_SET_ALWAYS_SHOW_LINK_DECORATIONS" | "ACCESSIBILITY_SET_CONTRAST" | "ACCESSIBILITY_SET_FONT_SIZE" | "ACCESSIBILITY_SET_MESSAGE_GROUP_SPACING" | "ACCESSIBILITY_SET_PREFERS_REDUCED_MOTION" | "ACCESSIBILITY_SET_ROLE_STYLE" | "ACCESSIBILITY_SET_SATURATION" | "ACCESSIBILITY_SET_SYNC_FORCED_COLORS" | "ACCESSIBILITY_SET_ZOOM" | "ACCESSIBILITY_SUBMIT_BUTTON_TOGGLE" | "ACCESSIBILITY_SYNC_PROFILE_THEME_WITH_USER_THEME_TOGGLE" | "ACCESSIBILITY_SYSTEM_COLOR_PREFERENCES_CHANGED" | "ACCESSIBILITY_SYSTEM_PREFERS_CONTRAST_CHANGED" | "ACCESSIBILITY_SYSTEM_PREFERS_CROSSFADES_CHANGED" | "ACCESSIBILITY_SYSTEM_PREFERS_REDUCED_MOTION_CHANGED" | "ACKNOWLEDGE_CHANNEL_SAFETY_WARNING_TOOLTIP" | "ACK_APPROVED_GUILD_JOIN_REQUEST" | "ACTIVE_AV_ERRORS_CHANGED" | "ACTIVE_BOGO_PROMOTION_FETCH" | "ACTIVE_BOGO_PROMOTION_FETCH_FAIL" | "ACTIVE_BOGO_PROMOTION_FETCH_SUCCESS" | "ACTIVE_CHANNELS_FETCH_FAILURE" | "ACTIVE_CHANNELS_FETCH_START" | "ACTIVE_CHANNELS_FETCH_SUCCESS" | "ACTIVE_OUTBOUND_PROMOTIONS_FETCH" | "ACTIVE_OUTBOUND_PROMOTIONS_FETCH_FAIL" | "ACTIVE_OUTBOUND_PROMOTIONS_FETCH_SUCCESS" | "ACTIVITY_INVITE_EDUCATION_DISMISS" | "ACTIVITY_INVITE_MODAL_CLOSE" | "ACTIVITY_INVITE_MODAL_OPEN" | "ACTIVITY_INVITE_MODAL_QUERY" | "ACTIVITY_INVITE_MODAL_SEND" | "ACTIVITY_JOIN" | "ACTIVITY_JOIN_FAILED" | "ACTIVITY_JOIN_LOADING" | "ACTIVITY_LAUNCH_FAIL" | "ACTIVITY_LAYOUT_MODE_UPDATE" | "ACTIVITY_METADATA_UPDATE" | "ACTIVITY_PLAY" | "ACTIVITY_POPOUT_WINDOW_OPEN" | "ACTIVITY_SCREEN_ORIENTATION_UPDATE" | "ACTIVITY_START" | "ACTIVITY_SYNC" | "ACTIVITY_SYNC_STOP" | "ACTIVITY_UPDATE_FAIL" | "ACTIVITY_UPDATE_START" | "ACTIVITY_UPDATE_SUCCESS" | "ADD_STICKER_PREVIEW" | "ADMIN_ONBOARDING_GUIDE_HIDE" | "ADYEN_CASH_APP_PAY_SUBMIT_SUCCESS" | "ADYEN_CREATE_CASH_APP_PAY_COMPONENT_SUCCESS" | "ADYEN_CREATE_CLIENT_SUCCESS" | "ADYEN_TEARDOWN_CLIENT" | "AFK" | "AGE_GATE_FAILURE_MODAL_OPEN" | "AGE_GATE_LOGOUT_UNDERAGE_NEW_USER" | "AGE_GATE_MODAL_CLOSE" | "AGE_GATE_MODAL_OPEN" | "AGE_GATE_SUCCESS_MODAL_OPEN" | "APEX_EXPERIMENT_CLEAR_SERVER_ASSIGNMENTS" | "APEX_EXPERIMENT_OVERRIDE_CLEAR" | "APEX_EXPERIMENT_OVERRIDE_CREATE" | "APEX_EXPERIMENT_OVERRIDE_DELETE" | "APPLICATIONS_FETCH" | "APPLICATIONS_FETCH_FAIL" | "APPLICATIONS_FETCH_SUCCESS" | "APPLICATION_ACTIVITY_STATISTICS_FETCH_FAIL" | "APPLICATION_ACTIVITY_STATISTICS_FETCH_START" | "APPLICATION_ACTIVITY_STATISTICS_FETCH_SUCCESS" | "APPLICATION_ASSETS_FETCH" | "APPLICATION_ASSETS_FETCH_SUCCESS" | "APPLICATION_ASSETS_UPDATE" | "APPLICATION_BRANCHES_FETCH_FAIL" | "APPLICATION_BRANCHES_FETCH_SUCCESS" | "APPLICATION_BUILD_FETCH_START" | "APPLICATION_BUILD_FETCH_SUCCESS" | "APPLICATION_BUILD_NOT_FOUND" | "APPLICATION_BUILD_SIZE_FETCH_FAIL" | "APPLICATION_BUILD_SIZE_FETCH_START" | "APPLICATION_BUILD_SIZE_FETCH_SUCCESS" | "APPLICATION_COMMAND_AUTOCOMPLETE_REQUEST" | "APPLICATION_COMMAND_AUTOCOMPLETE_RESPONSE" | "APPLICATION_COMMAND_EXECUTE_BAD_VERSION" | "APPLICATION_COMMAND_INDEX_FETCH_FAILURE" | "APPLICATION_COMMAND_INDEX_FETCH_REQUEST" | "APPLICATION_COMMAND_INDEX_FETCH_SUCCESS" | "APPLICATION_COMMAND_SET_ACTIVE_COMMAND" | "APPLICATION_COMMAND_SET_PREFERRED_COMMAND" | "APPLICATION_COMMAND_UPDATE_CHANNEL_STATE" | "APPLICATION_COMMAND_UPDATE_OPTIONS" | "APPLICATION_COMMAND_USED" | "APPLICATION_DIRECTORY_FETCH_APPLICATION" | "APPLICATION_DIRECTORY_FETCH_APPLICATION_FAILURE" | "APPLICATION_DIRECTORY_FETCH_APPLICATION_SUCCESS" | "APPLICATION_DIRECTORY_FETCH_CATEGORIES_SUCCESS" | "APPLICATION_DIRECTORY_FETCH_COLLECTIONS" | "APPLICATION_DIRECTORY_FETCH_COLLECTIONS_FAILURE" | "APPLICATION_DIRECTORY_FETCH_COLLECTIONS_SUCCESS" | "APPLICATION_DIRECTORY_FETCH_SEARCH" | "APPLICATION_DIRECTORY_FETCH_SEARCH_FAILURE" | "APPLICATION_DIRECTORY_FETCH_SEARCH_SUCCESS" | "APPLICATION_DIRECTORY_FETCH_SIMILAR_APPLICATIONS" | "APPLICATION_DIRECTORY_FETCH_SIMILAR_APPLICATIONS_FAILURE" | "APPLICATION_DIRECTORY_FETCH_SIMILAR_APPLICATIONS_SUCCESS" | "APPLICATION_FETCH" | "APPLICATION_FETCH_FAIL" | "APPLICATION_FETCH_SUCCESS" | "APPLICATION_STORE_ACCEPT_EULA" | "APPLICATION_STORE_ACCEPT_STORE_TERMS" | "APPLICATION_STORE_CLEAR_DATA" | "APPLICATION_STORE_DIRECTORY_LAYOUT_FETCHING" | "APPLICATION_STORE_DIRECTORY_LAYOUT_FETCH_FAILED" | "APPLICATION_STORE_DIRECTORY_LAYOUT_FETCH_SUCCESS" | "APPLICATION_STORE_LOCATION_CHANGE" | "APPLICATION_STORE_MATURE_AGREE" | "APPLICATION_STORE_RESET_NAVIGATION" | "APPLICATION_SUBSCRIPTIONS_CHANNEL_NOTICE_DISMISSED" | "APPLICATION_SUBSCRIPTIONS_FETCH_ENTITLEMENTS" | "APPLICATION_SUBSCRIPTIONS_FETCH_ENTITLEMENTS_FAILURE" | "APPLICATION_SUBSCRIPTIONS_FETCH_ENTITLEMENTS_SUCCESS" | "APPLICATION_SUBSCRIPTIONS_FETCH_LISTINGS" | "APPLICATION_SUBSCRIPTIONS_FETCH_LISTINGS_FAILURE" | "APPLICATION_SUBSCRIPTIONS_FETCH_LISTINGS_SUCCESS" | "APPLICATION_SUBSCRIPTIONS_FETCH_LISTING_FOR_PLAN_SUCCESS" | "APPLICATION_UPDATE" | "APPLIED_BOOSTS_COOLDOWN_FETCH_SUCCESS" | "APPLIED_GUILD_BOOST_COUNT_RESET" | "APPLIED_GUILD_BOOST_COUNT_UPDATE" | "APP_DM_OPEN" | "APP_ICON_EDITOR_RESET" | "APP_ICON_TRACK_IMPRESSION" | "APP_ICON_UPDATED" | "APP_LAUNCHER_ADD_FAILED_APP_DM_LOAD" | "APP_LAUNCHER_DISMISS" | "APP_LAUNCHER_REMOVE_FAILED_APP_DM_LOAD" | "APP_LAUNCHER_SET_ACTIVE_COMMAND" | "APP_LAUNCHER_SHOW" | "APP_RECOMMENDATIONS_FETCH_RECOMMENDATIONS" | "APP_RECOMMENDATIONS_FETCH_RECOMMENDATIONS_FAILURE" | "APP_RECOMMENDATIONS_FETCH_RECOMMENDATIONS_SUCCESS" | "APP_STATE_UPDATE" | "APP_VIEW_SET_HOME_LINK" | "AUDIO_INPUT_DETECTED" | "AUDIO_RESET" | "AUDIO_SET_ACTIVE_INPUT_PROFILE" | "AUDIO_SET_ATTENUATION" | "AUDIO_SET_AUTOMATIC_GAIN_CONTROL" | "AUDIO_SET_BYPASS_SYSTEM_INPUT_PROCESSING" | "AUDIO_SET_DEBUG_LOGGING" | "AUDIO_SET_DISPLAY_SILENCE_WARNING" | "AUDIO_SET_ECHO_CANCELLATION" | "AUDIO_SET_INPUT_DEVICE" | "AUDIO_SET_INPUT_VOLUME" | "AUDIO_SET_KRISP_MODEL_OVERRIDE" | "AUDIO_SET_KRISP_SUPPRESSION_LEVEL" | "AUDIO_SET_LOCAL_PAN" | "AUDIO_SET_LOCAL_VIDEO_DISABLED" | "AUDIO_SET_LOCAL_VOLUME" | "AUDIO_SET_LOOPBACK" | "AUDIO_SET_MODE" | "AUDIO_SET_NOISE_CANCELLATION" | "AUDIO_SET_NOISE_SUPPRESSION" | "AUDIO_SET_OUTPUT_DEVICE" | "AUDIO_SET_OUTPUT_VOLUME" | "AUDIO_SET_QOS" | "AUDIO_SET_SELF_MUTE" | "AUDIO_SET_SIDECHAIN_COMPRESSION" | "AUDIO_SET_SIDECHAIN_COMPRESSION_STRENGTH" | "AUDIO_SET_SUBSYSTEM" | "AUDIO_SET_TEMPORARY_SELF_MUTE" | "AUDIO_TOGGLE_LOCAL_MUTE" | "AUDIO_TOGGLE_LOCAL_SOUNDBOARD_MUTE" | "AUDIO_TOGGLE_SELF_DEAF" | "AUDIO_TOGGLE_SELF_MUTE" | "AUDIO_VOLUME_CHANGE" | "AUDIT_LOG_FETCH_FAIL" | "AUDIT_LOG_FETCH_NEXT_PAGE_FAIL" | "AUDIT_LOG_FETCH_NEXT_PAGE_START" | "AUDIT_LOG_FETCH_NEXT_PAGE_SUCCESS" | "AUDIT_LOG_FETCH_START" | "AUDIT_LOG_FETCH_SUCCESS" | "AUDIT_LOG_FILTER_BY_ACTION" | "AUDIT_LOG_FILTER_BY_TARGET" | "AUDIT_LOG_FILTER_BY_USER" | "AUTHENTICATOR_CREATE" | "AUTHENTICATOR_DELETE" | "AUTHENTICATOR_UPDATE" | "AUTH_INVITE_UPDATE" | "AUTH_SESSION_CHANGE" | "AUTO_MODERATION_MENTION_RAID_DETECTION" | "AUTO_MODERATION_MENTION_RAID_NOTICE_DISMISS" | "AUTO_UPDATER_QUIT_AND_INSTALL" | "BACKGROUND_SYNC" | "BACKGROUND_SYNC_CHANNEL_MESSAGES" | "BASIC_GUILD_FETCH" | "BASIC_GUILD_FETCH_FAILURE" | "BASIC_GUILD_FETCH_SUCCESS" | "BILLING_CREATE_REFERRAL_SUCCESS" | "BILLING_IP_COUNTRY_CODE_FAILURE" | "BILLING_IP_COUNTRY_CODE_FETCH_START" | "BILLING_IP_LOCATION_FAILURE" | "BILLING_IP_LOCATION_FETCH_START" | "BILLING_LOCALIZED_PRICING_PROMO_FAILURE" | "BILLING_MOST_RECENT_SUBSCRIPTION_FETCH_SUCCESS" | "BILLING_NITRO_AFFINITY_FETCHED" | "BILLING_NITRO_AFFINITY_FETCH_SUCCEEDED" | "BILLING_PAYMENTS_FETCH_SUCCESS" | "BILLING_PAYMENT_FETCH_SUCCESS" | "BILLING_PAYMENT_SOURCES_FETCH_FAIL" | "BILLING_PAYMENT_SOURCES_FETCH_START" | "BILLING_PAYMENT_SOURCES_FETCH_SUCCESS" | "BILLING_PAYMENT_SOURCE_CREATE_FAIL" | "BILLING_PAYMENT_SOURCE_CREATE_START" | "BILLING_PAYMENT_SOURCE_CREATE_SUCCESS" | "BILLING_PAYMENT_SOURCE_FETCH_SUCCESS" | "BILLING_PAYMENT_SOURCE_REMOVE_CLEAR_ERROR" | "BILLING_PAYMENT_SOURCE_REMOVE_FAIL" | "BILLING_PAYMENT_SOURCE_REMOVE_START" | "BILLING_PAYMENT_SOURCE_REMOVE_SUCCESS" | "BILLING_PAYMENT_SOURCE_UPDATE_CLEAR_ERROR" | "BILLING_PAYMENT_SOURCE_UPDATE_FAIL" | "BILLING_PAYMENT_SOURCE_UPDATE_START" | "BILLING_PAYMENT_SOURCE_UPDATE_SUCCESS" | "BILLING_POPUP_BRIDGE_CALLBACK" | "BILLING_POPUP_BRIDGE_STATE_UPDATE" | "BILLING_PREVIOUS_PREMIUM_SUBSCRIPTION_FETCH_SUCCESS" | "BILLING_PURCHASE_TOKEN_AUTH_CLEAR_STATE" | "BILLING_REFERRALS_REMAINING_FETCH_FAIL" | "BILLING_REFERRALS_REMAINING_FETCH_START" | "BILLING_REFERRALS_REMAINING_FETCH_SUCCESS" | "BILLING_REFERRAL_RESOLVE_FAIL" | "BILLING_REFERRAL_RESOLVE_SUCCESS" | "BILLING_REFERRAL_TRIAL_OFFER_UPDATE" | "BILLING_SET_IP_COUNTRY_CODE" | "BILLING_SET_IP_LOCATION" | "BILLING_SET_LOCALIZED_PRICING_PROMO" | "BILLING_SUBSCRIPTION_CANCEL_FAIL" | "BILLING_SUBSCRIPTION_CANCEL_START" | "BILLING_SUBSCRIPTION_CANCEL_SUCCESS" | "BILLING_SUBSCRIPTION_FETCH_FAIL" | "BILLING_SUBSCRIPTION_FETCH_START" | "BILLING_SUBSCRIPTION_FETCH_SUCCESS" | "BILLING_SUBSCRIPTION_RESET" | "BILLING_SUBSCRIPTION_REWARD_ELIGIBILITY_FETCH_FAILURE" | "BILLING_SUBSCRIPTION_REWARD_ELIGIBILITY_FETCH_START" | "BILLING_SUBSCRIPTION_REWARD_ELIGIBILITY_FETCH_SUCCESS" | "BILLING_SUBSCRIPTION_UPDATE_FAIL" | "BILLING_SUBSCRIPTION_UPDATE_START" | "BILLING_SUBSCRIPTION_UPDATE_SUCCESS" | "BILLING_USER_OFFER_ACKNOWLEDGED_SUCCESS" | "BILLING_USER_OFFER_FETCH_FAIL" | "BILLING_USER_OFFER_FETCH_START" | "BILLING_USER_OFFER_FETCH_SUCCESS" | "BILLING_USER_TRIAL_OFFER_ACKNOWLEDGED_SUCCESS" | "BILLING_USER_TRIAL_OFFER_FETCH_SUCCESS" | "BOOSTED_GUILD_GRACE_PERIOD_NOTICE_DISMISS" | "BRAINTREE_CREATE_CLIENT_SUCCESS" | "BRAINTREE_CREATE_PAYPAL_CLIENT_SUCCESS" | "BRAINTREE_CREATE_VENMO_CLIENT_SUCCESS" | "BRAINTREE_TEARDOWN_PAYPAL_CLIENT" | "BRAINTREE_TEARDOWN_VENMO_CLIENT" | "BRAINTREE_TOKENIZE_PAYPAL_FAIL" | "BRAINTREE_TOKENIZE_PAYPAL_START" | "BRAINTREE_TOKENIZE_PAYPAL_SUCCESS" | "BRAINTREE_TOKENIZE_VENMO_FAIL" | "BRAINTREE_TOKENIZE_VENMO_START" | "BRAINTREE_TOKENIZE_VENMO_SUCCESS" | "BROWSER_HANDOFF_BEGIN" | "BROWSER_HANDOFF_FROM_APP" | "BROWSER_HANDOFF_SET_USER" | "BROWSER_HANDOFF_UNAVAILABLE" | "BUILD_OVERRIDE_RESOLVED" | "BULK_ACK" | "BULK_CLEAR_RECENTS" | "BURST_REACTION_ANIMATION_ADD" | "BURST_REACTION_EFFECT_CLEAR" | "BURST_REACTION_EFFECT_PLAY" | "BURST_REACTION_PICKER_ANIMATION_ADD" | "BURST_REACTION_PICKER_ANIMATION_CLEAR" | "CACHED_EMOJIS_LOADED" | "CACHED_STICKERS_LOADED" | "CACHE_LOADED" | "CACHE_LOADED_LAZY" | "CACHE_LOADED_LAZY_NO_CACHE" | "CALL_CHAT_TOASTS_SET_ENABLED" | "CALL_CONNECT" | "CALL_CONNECT_MULTIPLE" | "CALL_CREATE" | "CALL_DELETE" | "CALL_ENQUEUE_RING" | "CALL_UPDATE" | "CANDIDATE_GAMES_CHANGE" | "CATEGORY_COLLAPSE" | "CATEGORY_COLLAPSE_ALL" | "CATEGORY_EXPAND" | "CATEGORY_EXPAND_ALL" | "CERTIFIED_DEVICES_SET" | "CHANGE_LOG_FETCH_FAILED" | "CHANGE_LOG_FETCH_SUCCESS" | "CHANGE_LOG_LOCK" | "CHANGE_LOG_MARK_SEEN" | "CHANGE_LOG_RESOLVED" | "CHANGE_LOG_SET_CONFIG" | "CHANGE_LOG_SET_OVERRIDE" | "CHANGE_LOG_UNLOCK" | "CHANNEL_ACK" | "CHANNEL_CALL_POPOUT_WINDOW_OPEN" | "CHANNEL_COLLAPSE" | "CHANNEL_CREATE" | "CHANNEL_DELETE" | "CHANNEL_FOLLOWER_CREATED" | "CHANNEL_FOLLOWER_STATS_FETCH_FAILURE" | "CHANNEL_FOLLOWER_STATS_FETCH_SUCCESS" | "CHANNEL_FOLLOWING_PUBLISH_BUMP_DISMISSED" | "CHANNEL_FOLLOWING_PUBLISH_BUMP_HIDE_PERMANENTLY" | "CHANNEL_LOCAL_ACK" | "CHANNEL_MEMBER_COUNT_UPDATE" | "CHANNEL_MUTE_EXPIRED" | "CHANNEL_PERMISSIONS_DELETE_OVERWRITE_SUCCESS" | "CHANNEL_PERMISSIONS_PUT_OVERWRITE_SUCCESS" | "CHANNEL_PINS_ACK" | "CHANNEL_PINS_UPDATE" | "CHANNEL_PRELOAD" | "CHANNEL_RECIPIENT_ADD" | "CHANNEL_RECIPIENT_REMOVE" | "CHANNEL_RTC_ACTIVE_CHANNELS" | "CHANNEL_RTC_JUMP_TO_VOICE_CHANNEL_MESSAGE" | "CHANNEL_RTC_SELECT_PARTICIPANT" | "CHANNEL_RTC_UPDATE_CHAT_OPEN" | "CHANNEL_RTC_UPDATE_LAYOUT" | "CHANNEL_RTC_UPDATE_PARTCIPANTS_LIST_OPEN" | "CHANNEL_RTC_UPDATE_PARTICIPANTS_OPEN" | "CHANNEL_RTC_UPDATE_STAGE_STREAM_SIZE" | "CHANNEL_RTC_UPDATE_STAGE_VIDEO_LIMIT_BOOST_UPSELL_DISMISSED" | "CHANNEL_RTC_UPDATE_VOICE_PARTICIPANTS_HIDDEN" | "CHANNEL_SAFETY_WARNING_FEEDBACK" | "CHANNEL_SELECT" | "CHANNEL_SETTINGS_CLOSE" | "CHANNEL_SETTINGS_INIT" | "CHANNEL_SETTINGS_LOADED_INVITES" | "CHANNEL_SETTINGS_OVERWRITE_SELECT" | "CHANNEL_SETTINGS_PERMISSIONS_INIT" | "CHANNEL_SETTINGS_PERMISSIONS_SAVE_SUCCESS" | "CHANNEL_SETTINGS_PERMISSIONS_SELECT_PERMISSION" | "CHANNEL_SETTINGS_PERMISSIONS_SET_ADVANCED_MODE" | "CHANNEL_SETTINGS_PERMISSIONS_SUBMITTING" | "CHANNEL_SETTINGS_PERMISSIONS_UPDATE_PERMISSION" | "CHANNEL_SETTINGS_SET_SECTION" | "CHANNEL_SETTINGS_SUBMIT" | "CHANNEL_SETTINGS_SUBMIT_FAILURE" | "CHANNEL_SETTINGS_SUBMIT_SUCCESS" | "CHANNEL_SETTINGS_UPDATE" | "CHANNEL_STATUSES" | "CHANNEL_TOGGLE_MEMBERS_SECTION" | "CHANNEL_TOGGLE_SUMMARIES_SECTION" | "CHANNEL_UPDATES" | "CHECKING_FOR_UPDATES" | "CHECKOUT_RECOVERY_STATUS_FETCH" | "CHECKOUT_RECOVERY_STATUS_FETCH_FAILURE" | "CHECKOUT_RECOVERY_STATUS_FETCH_SUCCESS" | "CHECK_LAUNCHABLE_GAME" | "CLEAR_CACHES" | "CLEAR_CHANNEL_SAFETY_WARNINGS" | "CLEAR_CONSUMED_ENTITLEMENT" | "CLEAR_CONVERSATION_SUMMARIES" | "CLEAR_INTERACTION_MODAL_STATE" | "CLEAR_LAST_SESSION_VOICE_CHANNEL_ID" | "CLEAR_MENTIONS" | "CLEAR_MESSAGES" | "CLEAR_OLDEST_UNREAD_MESSAGE" | "CLEAR_PENDING_CHANNEL_AND_ROLE_UPDATES" | "CLEAR_REMOTE_DISCONNECT_VOICE_CHANNEL_ID" | "CLEAR_STICKER_PREVIEW" | "CLEAR_THEME_OVERRIDE" | "CLEAR_VIDEO_STREAM_READY_TIMEOUT" | "CLICKER_GAME_ADD_POINTS" | "CLICKER_GAME_PURCHASE_ITEM" | "CLICKER_GAME_PURCHASE_ITEM_UPGRADE" | "CLICKER_GAME_REDEEM_PRIZE_FAIL" | "CLICKER_GAME_REDEEM_PRIZE_START" | "CLICKER_GAME_REDEEM_PRIZE_SUCCESS" | "CLICKER_GAME_RESET" | "CLICKER_GAME_SET_MUTED" | "CLICKER_GAME_SET_VOLUME" | "CLICKER_GAME_UNLOCK_ACHIEVEMENT" | "CLICKER_GAME_UPDATE_ITEM_METADATA" | "CLIENT_THEMES_EDITOR_CLOSE" | "CLIPS_ALLOW_VOICE_RECORDING_UPDATE" | "CLIPS_CLASSIFY_HARDWARE" | "CLIPS_CLEAR_CLIPS_SESSION" | "CLIPS_CLEAR_NEW_CLIP_IDS" | "CLIPS_DELETE_CLIP" | "CLIPS_DISMISS_EDUCATION" | "CLIPS_INIT" | "CLIPS_INIT_FAILURE" | "CLIPS_LOAD_DIRECTORY_SUCCESS" | "CLIPS_RESTART" | "CLIPS_SAVE_ANIMATION_END" | "CLIPS_SAVE_CLIP" | "CLIPS_SAVE_CLIP_ERROR" | "CLIPS_SAVE_CLIP_PLACEHOLDER" | "CLIPS_SAVE_CLIP_PLACEHOLDER_ERROR" | "CLIPS_SAVE_CLIP_START" | "CLIPS_SETTINGS_UPDATE" | "CLIPS_SHOW_CALL_WARNING" | "CLIPS_UPDATE_METADATA" | "CLOSE_AGE_VERIFICATION_MODAL" | "CLOSE_SUSPENDED_USER" | "COLLECTIBLES_CATEGORIES_FETCH" | "COLLECTIBLES_CATEGORIES_FETCH_FAILURE" | "COLLECTIBLES_CATEGORIES_FETCH_SUCCESS" | "COLLECTIBLES_CLAIM" | "COLLECTIBLES_CLAIM_FAILURE" | "COLLECTIBLES_CLAIM_SUCCESS" | "COLLECTIBLES_MARKETING_FETCH" | "COLLECTIBLES_MARKETING_FETCH_SUCCESS" | "COLLECTIBLES_PRODUCT_DETAILS_OPEN" | "COLLECTIBLES_PRODUCT_FETCH" | "COLLECTIBLES_PRODUCT_FETCH_FAILURE" | "COLLECTIBLES_PRODUCT_FETCH_SUCCESS" | "COLLECTIBLES_PURCHASES_FETCH" | "COLLECTIBLES_PURCHASES_FETCH_FAILURE" | "COLLECTIBLES_PURCHASES_FETCH_SUCCESS" | "COLLECTIBLES_SET_SHOP_HOME_CONFIG_OVERRIDE" | "COLLECTIBLES_SHOP_CLOSE" | "COLLECTIBLES_SHOP_HOME_FETCH" | "COLLECTIBLES_SHOP_HOME_FETCH_FAILURE" | "COLLECTIBLES_SHOP_HOME_FETCH_SUCCESS" | "COLLECTIBLES_SHOP_OPEN" | "COLLECTIBLES_SKIP_NUM_CATEGORIES" | "COMMANDS_MIGRATION_NOTICE_DISMISSED" | "COMMANDS_MIGRATION_OVERVIEW_TOOLTIP_DISMISSED" | "COMMANDS_MIGRATION_TOGGLE_TOOLTIP_DISMISSED" | "COMMANDS_MIGRATION_UPDATE_SUCCESS" | "COMPLETE_NEW_MEMBER_ACTION" | "CONNECTED_DEVICE_DONT_SWITCH" | "CONNECTED_DEVICE_IGNORE" | "CONNECTED_DEVICE_NEVER_SHOW_MODAL" | "CONNECTED_DEVICE_SWITCH" | "CONNECTIONS_GRID_MODAL_HIDE" | "CONNECTIONS_GRID_MODAL_SHOW" | "CONNECTION_CLOSED" | "CONNECTION_OPEN" | "CONNECTION_OPEN_STATE_UPDATE" | "CONNECTION_OPEN_SUPPLEMENTAL" | "CONNECTION_RESUMED" | "CONSOLE_COMMAND_UPDATE" | "CONSUMABLES_CLEAR_ERROR" | "CONSUMABLES_ENTITLEMENT_FETCH_COMPLETED" | "CONSUMABLES_ENTITLEMENT_FETCH_FAILED" | "CONSUMABLES_ENTITLEMENT_FETCH_STARTED" | "CONSUMABLES_PRICE_FETCH_FAILED" | "CONSUMABLES_PRICE_FETCH_STARTED" | "CONSUMABLES_PRICE_FETCH_SUCCEEDED" | "CONTENT_INVENTORY_CLEAR_DELETE_HISTORY_ERROR" | "CONTENT_INVENTORY_CLEAR_FEED" | "CONTENT_INVENTORY_DEBUG_CLEAR_IMPRESSIONS" | "CONTENT_INVENTORY_DEBUG_LOG_IMPRESSIONS" | "CONTENT_INVENTORY_DEBUG_TOGGLE_FAST_IMPRESSION_CAPPING" | "CONTENT_INVENTORY_DEBUG_TOGGLE_IMPRESSION_CAPPING" | "CONTENT_INVENTORY_DELETE_OUTBOX_ENTRY_FAILURE" | "CONTENT_INVENTORY_DELETE_OUTBOX_ENTRY_START" | "CONTENT_INVENTORY_DELETE_OUTBOX_ENTRY_SUCCESS" | "CONTENT_INVENTORY_FETCH_OUTBOX_FAILURE" | "CONTENT_INVENTORY_FETCH_OUTBOX_START" | "CONTENT_INVENTORY_FETCH_OUTBOX_SUCCESS" | "CONTENT_INVENTORY_FORCE_SHOW_GAME_SHARING" | "CONTENT_INVENTORY_INBOX_STALE" | "CONTENT_INVENTORY_MANUAL_REFRESH" | "CONTENT_INVENTORY_SET_FEED" | "CONTENT_INVENTORY_SET_FEED_STATE" | "CONTENT_INVENTORY_SET_FILTERS" | "CONTENT_INVENTORY_TOGGLE_FEED_HIDDEN" | "CONTENT_INVENTORY_TRACK_ITEM_IMPRESSIONS" | "CONTEXT_MENU_CLOSE" | "CONTEXT_MENU_OPEN" | "CONVERSATION_SUMMARY_UPDATE" | "CREATE_PENDING_REPLY" | "CREATE_PENDING_SCHEDULED_MESSAGE" | "CREATE_REFERRALS_SUCCESS" | "CREATE_SHALLOW_PENDING_REPLY" | "CREATOR_MONETIZATION_NAG_ACTIVATE_ELIGIBLITY_FETCH_SUCCESS" | "CREATOR_MONETIZATION_PRICE_TIERS_FETCH" | "CREATOR_MONETIZATION_PRICE_TIERS_FETCH_FAILURE" | "CREATOR_MONETIZATION_PRICE_TIERS_FETCH_SUCCESS" | "CURRENT_BUILD_OVERRIDE_RESOLVED" | "CURRENT_USER_UPDATE" | "CUSTOM_ACTIVITY_LINK_FETCH_SUCCESS" | "DCF_DAILY_CAP_OVERRIDE" | "DCF_EVENT_LOGGED" | "DCF_HANDLE_DC_DISMISSED" | "DCF_HANDLE_DC_SHOWN" | "DCF_NEW_USER_MIN_AGE_REQUIRED_OVERRIDE" | "DCF_OVERRIDE_LAST_DC_DISMISSED" | "DCF_RESET" | "DECAY_READ_STATES" | "DELETED_ENTITY_IDS" | "DELETE_PENDING_REPLY" | "DELETE_PENDING_SCHEDULED_MESSAGE" | "DELETE_SUMMARY" | "DETECTABLE_GAME_SUPPLEMENTAL_FETCH" | "DETECTABLE_GAME_SUPPLEMENTAL_FETCH_FAILURE" | "DETECTABLE_GAME_SUPPLEMENTAL_FETCH_SUCCESS" | "DETECTED_OFF_PLATFORM_PREMIUM_PERKS_DISMISS" | "DEVELOPER_ACTIVITY_SHELF_FETCH_FAIL" | "DEVELOPER_ACTIVITY_SHELF_FETCH_START" | "DEVELOPER_ACTIVITY_SHELF_FETCH_SUCCESS" | "DEVELOPER_ACTIVITY_SHELF_MARK_ACTIVITY_USED" | "DEVELOPER_ACTIVITY_SHELF_SET_ACTIVITY_URL_OVERRIDE" | "DEVELOPER_ACTIVITY_SHELF_TOGGLE_USE_ACTIVITY_URL_OVERRIDE" | "DEVELOPER_ACTIVITY_SHELF_UPDATE_FILTER" | "DEVELOPER_OPTIONS_UPDATE_SETTINGS" | "DEVELOPER_TEST_MODE_AUTHORIZATION_FAIL" | "DEVELOPER_TEST_MODE_AUTHORIZATION_START" | "DEVELOPER_TEST_MODE_AUTHORIZATION_SUCCESS" | "DEVELOPER_TEST_MODE_RESET" | "DEVELOPER_TEST_MODE_RESET_ERROR" | "DEV_TOOLS_DESIGN_TOGGLE_SET" | "DEV_TOOLS_DESIGN_TOGGLE_WEB_SET" | "DEV_TOOLS_DEV_SETTING_SET" | "DEV_TOOLS_FRIENDS_LIST_GIFT_INTENTS_SHOWN_RESET" | "DEV_TOOLS_FRIENDS_TAB_BADGE_COOLDOWN_RESET" | "DEV_TOOLS_GIFT_MESSAGE_COOLDOWN_RESET" | "DEV_TOOLS_SETTINGS_UPDATE" | "DEV_TOOLS_SET_FRIEND_ANNIVERSARY_COUNT" | "DISABLE_AUTOMATIC_ACK" | "DISCOVER_CHECKLIST_FETCH_FAILURE" | "DISCOVER_CHECKLIST_FETCH_START" | "DISCOVER_CHECKLIST_FETCH_SUCCESS" | "DISMISS_CHANNEL_SAFETY_WARNINGS" | "DISMISS_FAVORITE_SUGGESTION" | "DISMISS_MEDIA_POST_SHARE_PROMPT" | "DISPATCH_APPLICATION_ADD_TO_INSTALLATIONS" | "DISPATCH_APPLICATION_CANCEL" | "DISPATCH_APPLICATION_ERROR" | "DISPATCH_APPLICATION_INSTALL" | "DISPATCH_APPLICATION_INSTALL_SCRIPTS_PROGRESS_UPDATE" | "DISPATCH_APPLICATION_LAUNCH_SETUP_COMPLETE" | "DISPATCH_APPLICATION_LAUNCH_SETUP_START" | "DISPATCH_APPLICATION_MOVE_UP" | "DISPATCH_APPLICATION_REMOVE_FINISHED" | "DISPATCH_APPLICATION_REPAIR" | "DISPATCH_APPLICATION_STATE_UPDATE" | "DISPATCH_APPLICATION_UNINSTALL" | "DISPATCH_APPLICATION_UPDATE" | "DISPLAYED_INVITE_SHOW" | "DOMAIN_MIGRATION_FAILURE" | "DOMAIN_MIGRATION_SKIP" | "DOMAIN_MIGRATION_START" | "DRAFT_CHANGE" | "DRAFT_CLEAR" | "DRAFT_SAVE" | "EMAIL_SETTINGS_FETCH_SUCCESS" | "EMAIL_SETTINGS_UPDATE" | "EMAIL_SETTINGS_UPDATE_SUCCESS" |
gitextract_c3tzg39v/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── blank.yml │ │ ├── bug_report.yml │ │ └── config.yml │ └── workflows/ │ ├── build.yml │ ├── codeberg-mirror.yml │ ├── publish.yml │ ├── reportBrokenPlugins.yml │ └── test.yml ├── .gitignore ├── .npmrc ├── .stylelintrc.json ├── .vscode/ │ ├── extensions.json │ ├── launch.json │ ├── settings.json │ └── tasks.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── browser/ │ ├── GMPolyfill.js │ ├── Vencord.ts │ ├── VencordNativeStub.ts │ ├── background.js │ ├── content.js │ ├── manifest.json │ ├── manifestv2.json │ ├── modifyResponseHeaders.json │ ├── monaco.ts │ ├── monacoWin.html │ ├── patch-worker.js │ └── userscript.meta.js ├── eslint.config.mjs ├── package.json ├── packages/ │ ├── discord-types/ │ │ ├── .npmignore │ │ ├── CONTRIBUTING.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── enums/ │ │ │ ├── activity.ts │ │ │ ├── channel.ts │ │ │ ├── commands.ts │ │ │ ├── index.ts │ │ │ ├── messages.ts │ │ │ ├── misc.ts │ │ │ └── user.ts │ │ ├── package.json │ │ ├── src/ │ │ │ ├── common/ │ │ │ │ ├── Activity.d.ts │ │ │ │ ├── Application.d.ts │ │ │ │ ├── Channel.d.ts │ │ │ │ ├── Guild.d.ts │ │ │ │ ├── GuildMember.d.ts │ │ │ │ ├── Record.d.ts │ │ │ │ ├── Role.d.ts │ │ │ │ ├── User.d.ts │ │ │ │ ├── index.d.ts │ │ │ │ └── messages/ │ │ │ │ ├── Commands.d.ts │ │ │ │ ├── Embed.d.ts │ │ │ │ ├── Emoji.d.ts │ │ │ │ ├── Message.d.ts │ │ │ │ ├── Sticker.d.ts │ │ │ │ └── index.d.ts │ │ │ ├── components.d.ts │ │ │ ├── flux.d.ts │ │ │ ├── fluxEvents.d.ts │ │ │ ├── index.d.ts │ │ │ ├── menu.d.ts │ │ │ ├── modules/ │ │ │ │ ├── CloudUpload.d.ts │ │ │ │ └── index.d.ts │ │ │ ├── stores/ │ │ │ │ ├── AccessibilityStore.d.ts │ │ │ │ ├── ActiveJoinedThreadsStore.d.ts │ │ │ │ ├── ApplicationStore.d.ts │ │ │ │ ├── AuthenticationStore.d.ts │ │ │ │ ├── CallStore.d.ts │ │ │ │ ├── ChannelRTCStore.d.ts │ │ │ │ ├── ChannelStore.d.ts │ │ │ │ ├── DraftStore.d.ts │ │ │ │ ├── EmojiStore.d.ts │ │ │ │ ├── FluxStore.d.ts │ │ │ │ ├── FriendsStore.d.ts │ │ │ │ ├── GuildChannelStore.d.ts │ │ │ │ ├── GuildMemberCountStore.d.ts │ │ │ │ ├── GuildMemberStore.d.ts │ │ │ │ ├── GuildRoleStore.d.ts │ │ │ │ ├── GuildScheduledEventStore.d.ts │ │ │ │ ├── GuildStore.d.ts │ │ │ │ ├── InstantInviteStore.d.ts │ │ │ │ ├── InviteStore.d.ts │ │ │ │ ├── LocaleStore.d.ts │ │ │ │ ├── MediaEngineStore.d.ts │ │ │ │ ├── MessageStore.d.ts │ │ │ │ ├── NotificationSettingsStore.d.ts │ │ │ │ ├── OverridePremiumTypeStore.d.ts │ │ │ │ ├── PendingReplyStore.d.ts │ │ │ │ ├── PermissionStore.d.ts │ │ │ │ ├── PopoutWindowStore.d.ts │ │ │ │ ├── PresenceStore.d.ts │ │ │ │ ├── RTCConnectionStore.d.ts │ │ │ │ ├── ReadStateStore.d.ts │ │ │ │ ├── RelationshipStore.d.ts │ │ │ │ ├── RunningGameStore.d.ts │ │ │ │ ├── SelectedChannelStore.d.ts │ │ │ │ ├── SelectedGuildStore.d.ts │ │ │ │ ├── SoundboardStore.d.ts │ │ │ │ ├── SpellCheckStore.d.ts │ │ │ │ ├── SpotifyStore.d.ts │ │ │ │ ├── StickersStore.d.ts │ │ │ │ ├── StreamerModeStore.d.ts │ │ │ │ ├── ThemeStore.d.ts │ │ │ │ ├── TypingStore.d.ts │ │ │ │ ├── UploadAttachmentStore.d.ts │ │ │ │ ├── UserGuildSettingsStore.d.ts │ │ │ │ ├── UserProfileStore.d.ts │ │ │ │ ├── UserSettingsProtoStore.d.ts │ │ │ │ ├── UserStore.d.ts │ │ │ │ ├── VoiceStateStore.d.ts │ │ │ │ ├── WindowStore.d.ts │ │ │ │ └── index.d.ts │ │ │ └── utils.d.ts │ │ └── webpack/ │ │ └── index.d.ts │ └── vencord-types/ │ ├── .gitignore │ ├── .npmignore │ ├── HOW2PUB.md │ ├── README.md │ ├── globals.d.ts │ ├── index.d.ts │ ├── package.json │ └── prepare.ts ├── patches/ │ └── eslint-plugin-path-alias@2.1.0.patch ├── pnpm-workspace.yaml ├── scripts/ │ ├── build/ │ │ ├── build.mjs │ │ ├── buildWeb.mjs │ │ ├── common.mjs │ │ ├── inject/ │ │ │ └── react.mjs │ │ └── module/ │ │ └── style.js │ ├── checkNodeVersion.js │ ├── generatePluginList.ts │ ├── generateReport.ts │ ├── header-new.txt │ ├── header-old.txt │ ├── runInstaller.mjs │ ├── suppressExperimentalWarnings.js │ └── utils.mjs ├── src/ │ ├── Vencord.ts │ ├── VencordNative.ts │ ├── api/ │ │ ├── Badges.ts │ │ ├── ChatButton.css │ │ ├── ChatButtons.tsx │ │ ├── Commands/ │ │ │ ├── commandHelpers.ts │ │ │ ├── index.ts │ │ │ └── types.ts │ │ ├── ContextMenu.ts │ │ ├── DataStore/ │ │ │ ├── LICENSE │ │ │ └── index.ts │ │ ├── MemberListDecorators.tsx │ │ ├── MessageAccessories.tsx │ │ ├── MessageDecorations.tsx │ │ ├── MessageEvents.ts │ │ ├── MessagePopover.tsx │ │ ├── MessageUpdater.ts │ │ ├── Notices.tsx │ │ ├── Notifications/ │ │ │ ├── NotificationComponent.tsx │ │ │ ├── Notifications.tsx │ │ │ ├── index.ts │ │ │ ├── notificationLog.tsx │ │ │ └── styles.css │ │ ├── PluginManager.ts │ │ ├── ServerList.tsx │ │ ├── Settings.ts │ │ ├── SettingsSync/ │ │ │ ├── cloudSetup.tsx │ │ │ ├── cloudSync.ts │ │ │ └── offline.ts │ │ ├── Styles.ts │ │ ├── Themes.ts │ │ ├── UserSettings.ts │ │ └── index.ts │ ├── components/ │ │ ├── BaseText.css │ │ ├── BaseText.tsx │ │ ├── Button.css │ │ ├── Button.tsx │ │ ├── Card.css │ │ ├── Card.tsx │ │ ├── CheckedTextInput.tsx │ │ ├── CodeBlock.tsx │ │ ├── Divider.css │ │ ├── Divider.tsx │ │ ├── ErrorBoundary.tsx │ │ ├── ErrorCard.css │ │ ├── ErrorCard.tsx │ │ ├── ExpandableCard.css │ │ ├── ExpandableCard.tsx │ │ ├── Flex.tsx │ │ ├── FormSwitch.css │ │ ├── FormSwitch.tsx │ │ ├── Grid.tsx │ │ ├── Heading.css │ │ ├── Heading.tsx │ │ ├── Heart.tsx │ │ ├── Icons.tsx │ │ ├── Link.tsx │ │ ├── Paragraph.tsx │ │ ├── Span.tsx │ │ ├── Switch.css │ │ ├── Switch.tsx │ │ ├── TooltipContainer.tsx │ │ ├── TooltipFallback.tsx │ │ ├── handleComponentFailed.ts │ │ ├── iconStyles.css │ │ ├── index.ts │ │ ├── margins.ts │ │ └── settings/ │ │ ├── AddonCard.css │ │ ├── AddonCard.tsx │ │ ├── DonateButton.tsx │ │ ├── PluginBadge.tsx │ │ ├── QuickAction.css │ │ ├── QuickAction.tsx │ │ ├── SpecialCard.css │ │ ├── SpecialCard.tsx │ │ ├── index.ts │ │ └── tabs/ │ │ ├── BaseTab.tsx │ │ ├── index.ts │ │ ├── patchHelper/ │ │ │ ├── FullPatchInput.tsx │ │ │ ├── PatchPreview.tsx │ │ │ ├── ReplacementInput.tsx │ │ │ └── index.tsx │ │ ├── plugins/ │ │ │ ├── ContributorModal.css │ │ │ ├── ContributorModal.tsx │ │ │ ├── LinkIconButton.css │ │ │ ├── LinkIconButton.tsx │ │ │ ├── PluginCard.tsx │ │ │ ├── PluginModal.css │ │ │ ├── PluginModal.tsx │ │ │ ├── UIElements.css │ │ │ ├── UIElements.tsx │ │ │ ├── components/ │ │ │ │ ├── BooleanSetting.tsx │ │ │ │ ├── Common.tsx │ │ │ │ ├── ComponentSetting.tsx │ │ │ │ ├── NumberSetting.tsx │ │ │ │ ├── SelectSetting.tsx │ │ │ │ ├── SliderSetting.tsx │ │ │ │ ├── TextSetting.tsx │ │ │ │ ├── index.ts │ │ │ │ └── styles.css │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── styles.css │ │ ├── sync/ │ │ │ ├── BackupAndRestoreTab.tsx │ │ │ └── CloudTab.tsx │ │ ├── themes/ │ │ │ ├── CspErrorCard.tsx │ │ │ ├── LocalThemesTab.tsx │ │ │ ├── OnlineThemesTab.tsx │ │ │ ├── ThemeCard.tsx │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── updater/ │ │ │ ├── Components.tsx │ │ │ ├── index.tsx │ │ │ └── runWithDispatch.tsx │ │ └── vencord/ │ │ ├── DonateButton.tsx │ │ ├── MacVibrancySettings.tsx │ │ ├── NotificationSettings.tsx │ │ └── index.tsx │ ├── debug/ │ │ ├── Tracer.ts │ │ ├── loadLazyChunks.ts │ │ └── runReporter.ts │ ├── globals.d.ts │ ├── main/ │ │ ├── csp/ │ │ │ ├── index.ts │ │ │ └── manager.ts │ │ ├── index.ts │ │ ├── ipcMain.ts │ │ ├── ipcPlugins.ts │ │ ├── monacoWin.html │ │ ├── patchWin32Updater.ts │ │ ├── patcher.ts │ │ ├── settings.ts │ │ ├── themes/ │ │ │ ├── LICENSE │ │ │ └── index.ts │ │ ├── updater/ │ │ │ ├── common.ts │ │ │ ├── git.ts │ │ │ ├── http.ts │ │ │ └── index.ts │ │ └── utils/ │ │ ├── constants.ts │ │ ├── crxToZip.ts │ │ ├── extensions.ts │ │ ├── externalLinks.ts │ │ └── http.ts │ ├── modules.d.ts │ ├── nativeModules.d.ts │ ├── plugins/ │ │ ├── _api/ │ │ │ ├── badges/ │ │ │ │ ├── fixDiscordBadgePadding.css │ │ │ │ └── index.tsx │ │ │ ├── chatButtons.ts │ │ │ ├── commands.ts │ │ │ ├── contextMenu.ts │ │ │ ├── dynamicImageModalApi.ts │ │ │ ├── memberListDecorators/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.css │ │ │ ├── menuItemDemangler.ts │ │ │ ├── messageAccessories.ts │ │ │ ├── messageDecorations/ │ │ │ │ ├── index.tsx │ │ │ │ └── style.css │ │ │ ├── messageEvents.ts │ │ │ ├── messagePopover.ts │ │ │ ├── messageUpdater.ts │ │ │ ├── notices.ts │ │ │ ├── serverList.ts │ │ │ └── userSettings.ts │ │ ├── _core/ │ │ │ ├── noTrack.ts │ │ │ ├── settings.tsx │ │ │ └── supportHelper.tsx │ │ ├── accountPanelServerProfile/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── alwaysAnimate/ │ │ │ └── index.ts │ │ ├── alwaysExpandRoles/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── alwaysTrust/ │ │ │ └── index.ts │ │ ├── anonymiseFileNames/ │ │ │ └── index.tsx │ │ ├── appleMusic.desktop/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── native.ts │ │ ├── arRPC.web/ │ │ │ └── index.tsx │ │ ├── autoDndWhilePlaying.discordDesktop/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── betterFolders/ │ │ │ ├── FolderSideBar.tsx │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── betterGifAltText/ │ │ │ └── index.ts │ │ ├── betterGifPicker/ │ │ │ └── index.ts │ │ ├── betterNotes/ │ │ │ └── index.tsx │ │ ├── betterRoleContext/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── betterRoleDot/ │ │ │ └── index.ts │ │ ├── betterSessions/ │ │ │ ├── README.md │ │ │ ├── components/ │ │ │ │ ├── RenameButton.tsx │ │ │ │ ├── RenameModal.tsx │ │ │ │ └── icons.tsx │ │ │ ├── index.tsx │ │ │ ├── styles.css │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── betterSettings/ │ │ │ ├── README.md │ │ │ ├── fullHeightContext.css │ │ │ └── index.tsx │ │ ├── betterUploadButton/ │ │ │ └── index.ts │ │ ├── biggerStreamPreview/ │ │ │ ├── index.tsx │ │ │ └── webpack/ │ │ │ ├── stores.ts │ │ │ └── types/ │ │ │ └── stores.ts │ │ ├── blurNsfw/ │ │ │ └── index.ts │ │ ├── callTimer/ │ │ │ ├── alignedChatInputFix.css │ │ │ └── index.tsx │ │ ├── clearURLs/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── clientTheme/ │ │ │ ├── README.md │ │ │ ├── clientTheme.css │ │ │ ├── components/ │ │ │ │ └── Settings.tsx │ │ │ ├── index.tsx │ │ │ └── utils/ │ │ │ ├── colorUtils.ts │ │ │ └── styleUtils.ts │ │ ├── colorSighted/ │ │ │ └── index.ts │ │ ├── consoleJanitor/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── consoleShortcuts/ │ │ │ ├── index.ts │ │ │ └── native.ts │ │ ├── copyEmojiMarkdown/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── copyFileContents/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── copyStickerLinks/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── copyUserURLs/ │ │ │ └── index.tsx │ │ ├── crashHandler/ │ │ │ └── index.ts │ │ ├── ctrlEnterSend/ │ │ │ └── index.ts │ │ ├── customCommands/ │ │ │ ├── CreateTagModal.tsx │ │ │ ├── SettingsTagList.tsx │ │ │ ├── index.ts │ │ │ ├── settings.ts │ │ │ └── styles.css │ │ ├── customIdle/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── customRPC/ │ │ │ ├── README.md │ │ │ ├── RpcSettings.tsx │ │ │ ├── index.tsx │ │ │ └── settings.css │ │ ├── dearrow/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── decor/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ ├── lib/ │ │ │ │ ├── api.ts │ │ │ │ ├── constants.ts │ │ │ │ ├── stores/ │ │ │ │ │ ├── AuthorizationStore.tsx │ │ │ │ │ ├── CurrentUserDecorationsStore.ts │ │ │ │ │ └── UsersDecorationsStore.ts │ │ │ │ └── utils/ │ │ │ │ └── decoration.ts │ │ │ ├── settings.tsx │ │ │ └── ui/ │ │ │ ├── components/ │ │ │ │ ├── DecorDecorationGridDecoration.tsx │ │ │ │ ├── DecorSection.tsx │ │ │ │ ├── DecorationContextMenu.tsx │ │ │ │ ├── DecorationGridCreate.tsx │ │ │ │ ├── DecorationGridNone.tsx │ │ │ │ ├── Grid.tsx │ │ │ │ ├── SectionedGridList.tsx │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── modals/ │ │ │ │ ├── ChangeDecorationModal.tsx │ │ │ │ ├── CreateDecorationModal.tsx │ │ │ │ └── GuidelinesModal.tsx │ │ │ └── styles.css │ │ ├── devCompanion.dev/ │ │ │ └── index.tsx │ │ ├── disableCallIdle/ │ │ │ └── index.ts │ │ ├── dontRoundMyTimestamps/ │ │ │ └── index.ts │ │ ├── experiments/ │ │ │ ├── hideBugReport.css │ │ │ └── index.tsx │ │ ├── expressionCloner/ │ │ │ └── index.tsx │ │ ├── f8break/ │ │ │ └── index.ts │ │ ├── fakeNitro/ │ │ │ └── index.tsx │ │ ├── fakeProfileThemes/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── favEmojiFirst/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── favGifSearch/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── fixCodeblockGap/ │ │ │ └── index.ts │ │ ├── fixImagesQuality/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── fixSpotifyEmbeds.desktop/ │ │ │ ├── index.tsx │ │ │ └── native.ts │ │ ├── fixYoutubeEmbeds.desktop/ │ │ │ ├── README.md │ │ │ ├── index.ts │ │ │ └── native.ts │ │ ├── forceOwnerCrown/ │ │ │ └── index.ts │ │ ├── friendInvites/ │ │ │ └── index.ts │ │ ├── friendsSince/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── fullSearchContext/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── fullUserInChatbox/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── gameActivityToggle/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── gifPaste/ │ │ │ └── index.ts │ │ ├── greetStickerPicker/ │ │ │ └── index.tsx │ │ ├── hideAttachments/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── iLoveSpam/ │ │ │ └── index.ts │ │ ├── ignoreActivities/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── imageFilename/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── imageLink/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── imageZoom/ │ │ │ ├── README.md │ │ │ ├── components/ │ │ │ │ └── Magnifier.tsx │ │ │ ├── constants.ts │ │ │ ├── index.tsx │ │ │ ├── styles.css │ │ │ └── utils/ │ │ │ └── waitFor.ts │ │ ├── implicitRelationships/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── ircColors/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── keepCurrentChannel/ │ │ │ └── index.ts │ │ ├── lastfmRichPresence/ │ │ │ └── index.tsx │ │ ├── loadingQuotes/ │ │ │ ├── index.ts │ │ │ └── quotes.txt │ │ ├── memberCount/ │ │ │ ├── CircleIcon.tsx │ │ │ ├── MemberCount.tsx │ │ │ ├── OnlineMemberCountStore.ts │ │ │ ├── VoiceIcon.tsx │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── mentionAvatars/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── messageClickActions/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── messageLatency/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── messageLinkEmbeds/ │ │ │ └── index.tsx │ │ ├── messageLogger/ │ │ │ ├── HistoryModal.tsx │ │ │ ├── deleteStyleOverlay.css │ │ │ ├── deleteStyleText.css │ │ │ ├── index.tsx │ │ │ └── messageLogger.css │ │ ├── moreQuickReactions/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── mutualGroupDMs/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── newGuildSettings/ │ │ │ └── index.tsx │ │ ├── noBlockedMessages/ │ │ │ └── index.ts │ │ ├── noDeepLinks.web/ │ │ │ └── index.ts │ │ ├── noDefaultHangStatus/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── noDevtoolsWarning/ │ │ │ └── index.ts │ │ ├── noF1/ │ │ │ └── index.ts │ │ ├── noMaskedUrlPaste/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── noMosaic/ │ │ │ └── index.ts │ │ ├── noOnboardingDelay/ │ │ │ └── index.ts │ │ ├── noPendingCount/ │ │ │ └── index.ts │ │ ├── noProfileThemes/ │ │ │ └── index.ts │ │ ├── noReplyMention/ │ │ │ └── index.tsx │ │ ├── noServerEmojis/ │ │ │ └── index.ts │ │ ├── noSystemBadge.discordDesktop/ │ │ │ └── index.ts │ │ ├── noTypingAnimation/ │ │ │ └── index.ts │ │ ├── noUnblockToJump/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── notificationVolume/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── onePingPerDM/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── oneko/ │ │ │ └── index.ts │ │ ├── openInApp/ │ │ │ ├── README.md │ │ │ ├── index.ts │ │ │ └── native.ts │ │ ├── overrideForumDefaults/ │ │ │ └── index.tsx │ │ ├── pauseInvitesForever/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── permissionFreeWill/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── permissionsViewer/ │ │ │ ├── components/ │ │ │ │ ├── RolesAndUsersPermissions.tsx │ │ │ │ ├── UserPermissions.tsx │ │ │ │ └── icons.tsx │ │ │ ├── index.tsx │ │ │ ├── styles.css │ │ │ └── utils.ts │ │ ├── petpet/ │ │ │ └── index.ts │ │ ├── pictureInPicture/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── pinDms/ │ │ │ ├── components/ │ │ │ │ ├── CreateCategoryModal.tsx │ │ │ │ └── contextMenu.tsx │ │ │ ├── constants.ts │ │ │ ├── data.ts │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── plainFolderIcon/ │ │ │ ├── index.ts │ │ │ └── style.css │ │ ├── platformIndicators/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── previewMessage/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── quickMention/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── quickReply/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── reactErrorDecoder/ │ │ │ └── index.ts │ │ ├── readAllNotificationsButton/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── relationshipNotifier/ │ │ │ ├── functions.ts │ │ │ ├── index.ts │ │ │ ├── settings.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── replaceGoogleSearch/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── replyTimestamp/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── revealAllSpoilers/ │ │ │ └── index.ts │ │ ├── reverseImageSearch/ │ │ │ └── index.tsx │ │ ├── reviewDB/ │ │ │ ├── auth.tsx │ │ │ ├── components/ │ │ │ │ ├── BlockedUserModal.tsx │ │ │ │ ├── MessageButton.tsx │ │ │ │ ├── ReviewBadge.tsx │ │ │ │ ├── ReviewComponent.tsx │ │ │ │ ├── ReviewModal.tsx │ │ │ │ └── ReviewsView.tsx │ │ │ ├── entities.ts │ │ │ ├── index.tsx │ │ │ ├── reviewDbApi.ts │ │ │ ├── settings.tsx │ │ │ ├── style.css │ │ │ └── utils.tsx │ │ ├── roleColorEverywhere/ │ │ │ └── index.tsx │ │ ├── secretRingTone/ │ │ │ └── index.ts │ │ ├── seeSummaries/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── sendTimestamps/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── serverInfo/ │ │ │ ├── GuildInfoModal.tsx │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── serverListIndicators/ │ │ │ └── index.tsx │ │ ├── shikiCodeblocks.desktop/ │ │ │ ├── api/ │ │ │ │ ├── languages.ts │ │ │ │ ├── shiki.ts │ │ │ │ └── themes.ts │ │ │ ├── components/ │ │ │ │ ├── ButtonRow.tsx │ │ │ │ ├── Code.tsx │ │ │ │ ├── CopyButton.tsx │ │ │ │ ├── Header.tsx │ │ │ │ └── Highlighter.tsx │ │ │ ├── devicon.css │ │ │ ├── hooks/ │ │ │ │ ├── useCopyCooldown.ts │ │ │ │ ├── useShikiSettings.ts │ │ │ │ └── useTheme.ts │ │ │ ├── index.ts │ │ │ ├── previewExample.tsx │ │ │ ├── settings.ts │ │ │ ├── shiki.css │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── color.ts │ │ │ ├── createStyle.ts │ │ │ └── misc.ts │ │ ├── showAllMessageButtons/ │ │ │ └── index.ts │ │ ├── showConnections/ │ │ │ ├── VerifiedIcon.tsx │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── showHiddenChannels/ │ │ │ ├── components/ │ │ │ │ └── HiddenChannelLockScreen.tsx │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── showHiddenThings/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── showMeYourName/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── showTimeoutDuration/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── silentMessageToggle/ │ │ │ └── index.tsx │ │ ├── silentTyping/ │ │ │ └── index.tsx │ │ ├── sortFriendRequests/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── spotifyControls/ │ │ │ ├── PlayerComponent.tsx │ │ │ ├── SeekBar.ts │ │ │ ├── SpotifyStore.ts │ │ │ ├── hoverOnly.css │ │ │ ├── index.tsx │ │ │ └── spotifyStyles.css │ │ ├── spotifyCrack/ │ │ │ └── index.ts │ │ ├── spotifyShareCommands/ │ │ │ └── index.ts │ │ ├── startupTimings/ │ │ │ ├── StartupTimingPage.tsx │ │ │ └── index.tsx │ │ ├── stickerPaste/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── streamerModeOnStream/ │ │ │ └── index.ts │ │ ├── superReactionTweaks/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── textReplace/ │ │ │ ├── index.tsx │ │ │ └── styles.css │ │ ├── themeAttributes/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── translate/ │ │ │ ├── TranslateIcon.tsx │ │ │ ├── TranslateModal.tsx │ │ │ ├── TranslationAccessory.tsx │ │ │ ├── index.tsx │ │ │ ├── languages.ts │ │ │ ├── native.ts │ │ │ ├── settings.ts │ │ │ ├── styles.css │ │ │ └── utils.ts │ │ ├── typingIndicator/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── typingTweaks/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── unindent/ │ │ │ └── index.ts │ │ ├── unlockedAvatarZoom/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── unsuppressEmbeds/ │ │ │ └── index.tsx │ │ ├── userMessagesPronouns/ │ │ │ ├── PronounsChatComponent.tsx │ │ │ ├── README.md │ │ │ ├── index.ts │ │ │ ├── settings.ts │ │ │ └── utils.ts │ │ ├── userVoiceShow/ │ │ │ ├── README.md │ │ │ ├── components.tsx │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── usrbg/ │ │ │ └── index.tsx │ │ ├── validReply/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── validUser/ │ │ │ └── index.tsx │ │ ├── vcDoubleClick/ │ │ │ └── index.ts │ │ ├── vcNarrator/ │ │ │ ├── VoiceSetting.tsx │ │ │ ├── index.tsx │ │ │ └── settings.ts │ │ ├── vencordToolbox/ │ │ │ ├── index.tsx │ │ │ ├── menu.tsx │ │ │ └── styles.css │ │ ├── viewIcons/ │ │ │ └── index.tsx │ │ ├── viewRaw/ │ │ │ └── index.tsx │ │ ├── voiceDownload/ │ │ │ ├── index.tsx │ │ │ └── style.css │ │ ├── voiceMessages/ │ │ │ ├── DesktopRecorder.tsx │ │ │ ├── VoicePreview.tsx │ │ │ ├── WebRecorder.tsx │ │ │ ├── index.tsx │ │ │ ├── native.ts │ │ │ ├── settings.ts │ │ │ └── styles.css │ │ ├── volumeBooster/ │ │ │ ├── README.md │ │ │ └── index.ts │ │ ├── webContextMenus.web/ │ │ │ └── index.ts │ │ ├── webKeybinds.web/ │ │ │ └── index.ts │ │ ├── webScreenShareFixes.web/ │ │ │ └── index.ts │ │ ├── whoReacted/ │ │ │ ├── README.md │ │ │ └── index.tsx │ │ ├── xsOverlay/ │ │ │ ├── README.md │ │ │ ├── index.tsx │ │ │ └── native.ts │ │ └── youtubeAdblock.desktop/ │ │ ├── README.md │ │ ├── adguard.js │ │ ├── index.ts │ │ └── native.ts │ ├── preload.ts │ ├── shared/ │ │ ├── IpcEvents.ts │ │ ├── SettingsStore.ts │ │ ├── debounce.ts │ │ ├── onceDefined.ts │ │ └── vencordUserAgent.ts │ ├── utils/ │ │ ├── ChangeList.ts │ │ ├── Logger.ts │ │ ├── Queue.ts │ │ ├── apng.ts │ │ ├── clipboard.ts │ │ ├── constants.ts │ │ ├── cspViolations.ts │ │ ├── css.ts │ │ ├── dependencies.ts │ │ ├── discord.tsx │ │ ├── guards.ts │ │ ├── index.ts │ │ ├── intlHash.ts │ │ ├── lazy.ts │ │ ├── lazyReact.tsx │ │ ├── localStorage.ts │ │ ├── margins.ts │ │ ├── mergeDefaults.ts │ │ ├── misc.ts │ │ ├── modal.tsx │ │ ├── native.ts │ │ ├── onlyOnce.ts │ │ ├── patches.ts │ │ ├── react.tsx │ │ ├── text.ts │ │ ├── types.ts │ │ ├── updater.ts │ │ ├── web-metadata.ts │ │ └── web.ts │ └── webpack/ │ ├── common/ │ │ ├── components.ts │ │ ├── index.ts │ │ ├── internal.tsx │ │ ├── menu.ts │ │ ├── react.ts │ │ ├── stores.ts │ │ ├── userSettings.ts │ │ └── utils.ts │ ├── index.ts │ ├── patchWebpack.ts │ ├── types.ts │ └── webpack.ts └── tsconfig.json
SYMBOL INDEX (2204 symbols across 463 files)
FILE: browser/GMPolyfill.js
function parseHeaders (line 19) | function parseHeaders(headers) {
function blobTo (line 36) | function blobTo(to, blob) {
function GM_fetch (line 47) | function GM_fetch(url, opt) {
FILE: browser/VencordNativeStub.ts
method addChangeListener (line 85) | addChangeListener(cb) {
method openEditor (line 90) | async openEditor() {
FILE: browser/background.js
function removeFirst (line 6) | function removeFirst(arr, predicate) {
FILE: browser/monaco.ts
constant BASE (line 18) | const BASE = "/vendor/monaco/vs";
method getWorkerUrl (line 21) | getWorkerUrl(_moduleId: unknown, label: string) {
FILE: browser/patch-worker.js
function bindWorker (line 53) | function bindWorker(worker, workerURL) {
function WorkerXHR (line 68) | function WorkerXHR(scriptURL) {
FILE: packages/discord-types/enums/activity.ts
type ActivityType (line 1) | const enum ActivityType {
type ActivityFlags (line 11) | const enum ActivityFlags {
type ActivityStatusDisplayType (line 26) | const enum ActivityStatusDisplayType {
FILE: packages/discord-types/enums/channel.ts
type ChannelType (line 1) | const enum ChannelType {
FILE: packages/discord-types/enums/commands.ts
type ApplicationCommandOptionType (line 1) | const enum ApplicationCommandOptionType {
type ApplicationCommandInputType (line 15) | const enum ApplicationCommandInputType {
type ApplicationCommandType (line 23) | const enum ApplicationCommandType {
type ApplicationIntegrationType (line 29) | const enum ApplicationIntegrationType {
FILE: packages/discord-types/enums/messages.ts
type StickerType (line 1) | const enum StickerType {
type StickerFormatType (line 8) | const enum StickerFormatType {
type MessageType (line 15) | const enum MessageType {
type MessageFlags (line 529) | const enum MessageFlags {
FILE: packages/discord-types/enums/misc.ts
type CloudUploadPlatform (line 1) | const enum CloudUploadPlatform {
type DraftType (line 6) | const enum DraftType {
type GuildScheduledEventStatus (line 16) | const enum GuildScheduledEventStatus {
type GuildScheduledEventEntityType (line 23) | const enum GuildScheduledEventEntityType {
type GuildScheduledEventPrivacyLevel (line 29) | const enum GuildScheduledEventPrivacyLevel {
type ParticipantType (line 33) | const enum ParticipantType {
type RTCPlatform (line 40) | const enum RTCPlatform {
type VideoSourceType (line 47) | const enum VideoSourceType {
type EmojiIntention (line 52) | const enum EmojiIntention {
type LoadState (line 71) | const enum LoadState {
type ConnectionStatsFlags (line 78) | const enum ConnectionStatsFlags {
type SpeakingFlags (line 85) | const enum SpeakingFlags {
type GoLiveQualityMode (line 93) | const enum GoLiveQualityMode {
type VoiceProcessingStateReason (line 98) | const enum VoiceProcessingStateReason {
FILE: packages/discord-types/enums/user.ts
type RelationshipType (line 1) | const enum RelationshipType {
type GiftIntentType (line 11) | enum GiftIntentType {
type ReadStateType (line 15) | const enum ReadStateType {
FILE: packages/discord-types/src/common/Activity.d.ts
type ActivityAssets (line 3) | interface ActivityAssets {
type ActivityButton (line 12) | interface ActivityButton {
type Activity (line 17) | interface Activity {
type OnlineStatus (line 43) | type OnlineStatus = "online" | "idle" | "dnd" | "invisible" | "offline" ...
FILE: packages/discord-types/src/common/Application.d.ts
type ApplicationExecutable (line 4) | interface ApplicationExecutable {
type ApplicationThirdPartySku (line 10) | interface ApplicationThirdPartySku {
type ApplicationDeveloper (line 16) | interface ApplicationDeveloper {
type ApplicationInstallParams (line 21) | interface ApplicationInstallParams {
type Application (line 26) | interface Application {
type ApplicationTeam (line 75) | interface ApplicationTeam {
type ApplicationTeamMember (line 83) | interface ApplicationTeamMember {
FILE: packages/discord-types/src/common/Channel.d.ts
class Channel (line 3) | class Channel extends DiscordRecord {
FILE: packages/discord-types/src/common/Guild.d.ts
type GuildFeatures (line 5) | type GuildFeatures =
type GuildPremiumFeatures (line 7) | type GuildPremiumFeatures =
class Guild (line 10) | class Guild extends DiscordRecord {
FILE: packages/discord-types/src/common/GuildMember.d.ts
type GuildMember (line 1) | interface GuildMember {
FILE: packages/discord-types/src/common/Record.d.ts
type Updater (line 1) | type Updater = (value: any) => any;
class DiscordRecord (line 6) | class DiscordRecord {
FILE: packages/discord-types/src/common/Role.d.ts
type Role (line 1) | interface Role {
FILE: packages/discord-types/src/common/User.d.ts
class User (line 5) | class User extends DiscordRecord {
type UserJSON (line 58) | interface UserJSON {
FILE: packages/discord-types/src/common/messages/Commands.d.ts
type CommandContext (line 6) | interface CommandContext {
type CommandOption (line 11) | interface CommandOption {
type ChoicesOption (line 22) | interface ChoicesOption {
type CommandReturnValue (line 29) | interface CommandReturnValue {
type CommandArgument (line 35) | interface CommandArgument {
type Command (line 43) | interface Command {
FILE: packages/discord-types/src/common/messages/Embed.d.ts
type Embed (line 1) | interface Embed {
type EmbedJSON (line 41) | interface EmbedJSON {
FILE: packages/discord-types/src/common/messages/Emoji.d.ts
type Emoji (line 2) | type Emoji = CustomEmoji | UnicodeEmoji;
type CustomEmoji (line 7) | interface CustomEmoji {
type UnicodeEmoji (line 35) | interface UnicodeEmoji {
type EmojiObject (line 97) | interface EmojiObject {
FILE: packages/discord-types/src/common/messages/Message.d.ts
class Message (line 10) | class Message extends DiscordRecord {
type MessageJSON (line 147) | interface MessageJSON {
type MessageAttachment (line 189) | interface MessageAttachment {
type ReactionEmoji (line 201) | interface ReactionEmoji {
type MessageReaction (line 207) | interface MessageReaction {
type MessageTypeSets (line 214) | type MessageTypeSets = Record<
FILE: packages/discord-types/src/common/messages/Sticker.d.ts
type BaseSticker (line 3) | interface BaseSticker {
type PackSticker (line 15) | interface PackSticker extends BaseSticker {
type GuildSticker (line 20) | interface GuildSticker extends BaseSticker {
type Sticker (line 25) | type Sticker = PackSticker | GuildSticker;
type PremiumStickerPack (line 27) | interface PremiumStickerPack {
FILE: packages/discord-types/src/components.d.ts
type HeadingTag (line 6) | type HeadingTag = `h${1 | 2 | 3 | 4 | 5 | 6}`;
type Margins (line 7) | type Margins = Record<"marginTop16" | "marginTop8" | "marginBottom8" | "...
type TextVariant (line 10) | type TextVariant = "heading-sm/normal" | "heading-sm/medium" | "heading-...
type TextProps (line 12) | type TextProps = PropsWithChildren<HtmlHTMLAttributes<HTMLDivElement> & {
type Text (line 17) | type Text = ComponentType<TextProps>;
type ButtonProps (line 19) | interface ButtonProps extends PropsWithChildren<Omit<HTMLProps<HTMLButto...
type Button (line 30) | type Button = ComponentType<ButtonProps> & {
type TooltipChildrenProps (line 38) | interface TooltipChildrenProps {
type TooltipProps (line 48) | interface TooltipProps {
type Tooltip (line 69) | type Tooltip = ComponentType<TooltipProps> & {
type TooltipPositions (line 73) | type TooltipPositions = Record<"BOTTOM" | "CENTER" | "LEFT" | "RIGHT" | ...
type TooltipContainer (line 75) | type TooltipContainer = ComponentType<PropsWithChildren<{
type Card (line 97) | type Card = ComponentType<PropsWithChildren<HTMLProps<HTMLDivElement> & {
type ComboboxPopout (line 106) | type ComboboxPopout = ComponentType<PropsWithChildren<{
type CheckboxAligns (line 125) | type CheckboxAligns = {
type CheckboxTypes (line 130) | type CheckboxTypes = {
type Checkbox (line 137) | type Checkbox = ComponentType<PropsWithChildren<{
type Timestamp (line 155) | type Timestamp = ComponentType<PropsWithChildren<{
type TextInput (line 168) | type TextInput = ComponentType<PropsWithChildren<{
type TextArea (line 191) | type TextArea = ComponentType<Omit<HTMLProps<HTMLTextAreaElement>, "onCh...
type SelectOption (line 196) | interface SelectOption {
type Select (line 204) | type Select = ComponentType<PropsWithChildren<{
type SearchableSelect (line 243) | type SearchableSelect = ComponentType<PropsWithChildren<{
type Slider (line 286) | type Slider = ComponentClass<PropsWithChildren<{
type PopoutAnimation (line 324) | enum PopoutAnimation {
type PopoutPosition (line 331) | type PopoutPosition = "top" | "bottom" | "left" | "right" | "center" | "...
type Popout (line 333) | type Popout = ComponentType<{
type Dialog (line 375) | type Dialog = ComponentType<JSX.IntrinsicElements["div"]>;
type Resolve (line 377) | type Resolve = (data: { theme: "light" | "dark", saturation: number; }) ...
type useToken (line 384) | type useToken = (color: {
type Paginator (line 389) | type Paginator = ComponentType<{
type MaskedLink (line 399) | type MaskedLink = ComponentType<PropsWithChildren<{
type ScrollerBaseProps (line 412) | interface ScrollerBaseProps {
type ScrollerThin (line 421) | type ScrollerThin = ComponentType<PropsWithChildren<ScrollerBaseProps & {
type BaseListItem (line 426) | interface BaseListItem {
type ListSection (line 432) | interface ListSection extends BaseListItem {
type ListRow (line 435) | interface ListRow extends BaseListItem {
type ListScrollerThin (line 441) | type ListScrollerThin = ComponentType<ScrollerBaseProps & {
type Clickable (line 472) | type Clickable = <T extends "a" | "div" | "span" | "li" = "div">(props: ...
type Avatar (line 476) | type Avatar = ComponentType<PropsWithChildren<{
type FocusLock (line 496) | type FocusLock = ComponentType<PropsWithChildren<{
type Icon (line 500) | type Icon = ComponentType<JSX.IntrinsicElements["svg"] & {
type ColorPicker (line 505) | type ColorPicker = ComponentType<{
FILE: packages/discord-types/src/flux.d.ts
class FluxEmitter (line 3) | class FluxEmitter {
type Flux (line 27) | interface Flux {
FILE: packages/discord-types/src/fluxEvents.d.ts
type FluxEvents (line 22) | type FluxEvents = "ACCESSIBILITY_COLORBLIND_TOGGLE" | "ACCESSIBILITY_DAR...
FILE: packages/discord-types/src/menu.d.ts
type RC (line 3) | type RC<C> = ComponentType<PropsWithChildren<C & Record<string, any>>>;
type Menu (line 5) | interface Menu {
type ContextMenuApi (line 66) | interface ContextMenuApi {
FILE: packages/discord-types/src/modules/CloudUpload.d.ts
type BaseUploadItem (line 4) | interface BaseUploadItem {
type ReactNativeUploadItem (line 12) | interface ReactNativeUploadItem extends BaseUploadItem {
type WebUploadItem (line 22) | interface WebUploadItem extends BaseUploadItem {
type CloudUploadItem (line 27) | type CloudUploadItem = ReactNativeUploadItem | WebUploadItem;
class CloudUpload (line 29) | class CloudUpload extends EventEmitter {
FILE: packages/discord-types/src/stores/AccessibilityStore.d.ts
type ReducedMotionPreference (line 3) | type ReducedMotionPreference = "auto" | "reduce" | "no-preference";
type ForcedColorsPreference (line 4) | type ForcedColorsPreference = "none" | "active";
type ContrastPreference (line 5) | type ContrastPreference = "no-preference" | "more" | "less" | "custom";
type RoleStyle (line 6) | type RoleStyle = "username" | "dot" | "hidden";
type AccessibilityState (line 8) | interface AccessibilityState {
class AccessibilityStore (line 36) | class AccessibilityStore extends FluxStore {
FILE: packages/discord-types/src/stores/ActiveJoinedThreadsStore.d.ts
type ThreadJoined (line 3) | interface ThreadJoined {
type ThreadsForParent (line 8) | type ThreadsForParent = Record<string, ThreadJoined>;
type ThreadsForGuild (line 9) | type ThreadsForGuild = Record<string, ThreadsForParent>;
type AllActiveJoinedThreads (line 10) | type AllActiveJoinedThreads = Record<string, ThreadsForGuild>;
type NewThreadCounts (line 12) | interface NewThreadCounts {
class ActiveJoinedThreadsStore (line 16) | class ActiveJoinedThreadsStore extends FluxStore {
FILE: packages/discord-types/src/stores/ApplicationStore.d.ts
type ApplicationStoreState (line 3) | interface ApplicationStoreState {
type ApplicationUsage (line 7) | interface ApplicationUsage {
class ApplicationStore (line 12) | class ApplicationStore extends FluxStore {
FILE: packages/discord-types/src/stores/AuthenticationStore.d.ts
class AuthenticationStore (line 3) | class AuthenticationStore extends FluxStore {
FILE: packages/discord-types/src/stores/CallStore.d.ts
type Call (line 3) | interface Call {
type CallStoreState (line 12) | interface CallStoreState {
class CallStore (line 17) | class CallStore extends FluxStore {
FILE: packages/discord-types/src/stores/ChannelRTCStore.d.ts
type RTCLayout (line 4) | type RTCLayout = "normal" | "minimum" | "no-chat" | "full-screen" | "hav...
type RTCMode (line 5) | type RTCMode = "video" | "voice";
type RTCLayoutContext (line 6) | type RTCLayoutContext = "OVERLAY" | "APP" | "POPOUT" | "CALL_TILE_POPOUT";
type ParticipantFilterType (line 7) | type ParticipantFilterType = "VIDEO" | "STREAM" | "FILTERED" | "SPEAKING...
type StreamResolution (line 9) | interface StreamResolution {
type Stream (line 14) | interface Stream {
type BaseParticipant (line 21) | interface BaseParticipant {
type UserParticipant (line 27) | interface UserParticipant extends BaseParticipant {
type StreamParticipant (line 46) | interface StreamParticipant extends BaseParticipant {
type ActivityParticipant (line 57) | interface ActivityParticipant extends BaseParticipant {
type Participant (line 67) | type Participant = UserParticipant | StreamParticipant | ActivityPartici...
type SelectedParticipantStats (line 69) | interface SelectedParticipantStats {
type ChannelRTCState (line 75) | interface ChannelRTCState {
class ChannelRTCStore (line 79) | class ChannelRTCStore extends FluxStore {
FILE: packages/discord-types/src/stores/ChannelStore.d.ts
class ChannelStore (line 3) | class ChannelStore extends FluxStore {
FILE: packages/discord-types/src/stores/DraftStore.d.ts
type Draft (line 4) | interface Draft {
type ThreadSettingsDraft (line 9) | interface ThreadSettingsDraft {
type ChannelDrafts (line 18) | type ChannelDrafts = {
type UserDrafts (line 24) | type UserDrafts = Partial<Record<string, ChannelDrafts>>;
type DraftState (line 25) | type DraftState = Partial<Record<string, UserDrafts>>;
class DraftStore (line 27) | class DraftStore extends FluxStore {
FILE: packages/discord-types/src/stores/EmojiStore.d.ts
type EmojiCategory (line 5) | type EmojiCategory =
type EmojiUsageRecord (line 22) | interface EmojiUsageRecord {
type TrackOptions (line 36) | interface TrackOptions {
type EmojiFrecency (line 47) | interface EmojiFrecency {
type GuildEmojis (line 131) | interface GuildEmojis {
type Emoticon (line 174) | interface Emoticon {
type PendingUsage (line 186) | interface PendingUsage {
type EmojiStoreState (line 196) | interface EmojiStoreState {
type DisambiguatedEmojiContext (line 209) | interface DisambiguatedEmojiContext {
type EmojiSearchOptions (line 324) | interface EmojiSearchOptions {
type EmojiSearchResults (line 348) | interface EmojiSearchResults {
type TopEmojisMetadata (line 358) | interface TopEmojisMetadata {
class EmojiStore (line 369) | class EmojiStore extends FluxStore {
FILE: packages/discord-types/src/stores/FluxStore.d.ts
type Callback (line 3) | type Callback = () => void;
type SyncCallback (line 4) | type SyncCallback = () => boolean | void;
type FluxEvent (line 15) | type FluxEvent = any;
type ActionHandler (line 17) | type ActionHandler = (event: FluxEvent) => void;
type ActionHandlers (line 19) | type ActionHandlers = Partial<Record<FluxEvents, ActionHandler>>;
class FluxStore (line 25) | class FluxStore {
FILE: packages/discord-types/src/stores/FriendsStore.d.ts
type FriendsSection (line 4) | type FriendsSection = "ADD_FRIEND" | "ALL" | "ONLINE" | "PENDING" | "PEN...
type StatusType (line 6) | type StatusType = "online" | "offline" | "idle" | "dnd" | "invisible" | ...
type ApplicationStream (line 8) | interface ApplicationStream {
type FriendsRow (line 15) | interface FriendsRow {
type RelationshipCounts (line 41) | interface RelationshipCounts {
type FriendsRows (line 50) | interface FriendsRows {
type FriendsState (line 59) | interface FriendsState {
class FriendsStore (line 65) | class FriendsStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildChannelStore.d.ts
type ChannelWithComparator (line 4) | interface ChannelWithComparator {
type GuildChannels (line 9) | interface GuildChannels {
type ChannelNameDisambiguation (line 17) | interface ChannelNameDisambiguation {
class GuildChannelStore (line 22) | class GuildChannelStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildMemberCountStore.d.ts
class GuildMemberCountStore (line 3) | class GuildMemberCountStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildMemberStore.d.ts
type PendingRoleUpdates (line 3) | interface PendingRoleUpdates {
class GuildMemberStore (line 8) | class GuildMemberStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildRoleStore.d.ts
class GuildRoleStore (line 3) | class GuildRoleStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildScheduledEventStore.d.ts
type GuildScheduledEventEntityMetadata (line 4) | interface GuildScheduledEventEntityMetadata {
type GuildScheduledEventRecurrenceRule (line 8) | interface GuildScheduledEventRecurrenceRule {
type GuildScheduledEvent (line 21) | interface GuildScheduledEvent {
type GuildScheduledEventRsvp (line 43) | interface GuildScheduledEventRsvp {
type GuildScheduledEventUsers (line 49) | interface GuildScheduledEventUsers {
class GuildScheduledEventStore (line 54) | class GuildScheduledEventStore extends FluxStore {
FILE: packages/discord-types/src/stores/GuildStore.d.ts
class GuildStore (line 3) | class GuildStore extends FluxStore {
FILE: packages/discord-types/src/stores/InstantInviteStore.d.ts
type FriendInvite (line 4) | interface FriendInvite extends Invite {
class InstantInviteStore (line 12) | class InstantInviteStore extends FluxStore {
FILE: packages/discord-types/src/stores/InviteStore.d.ts
type Invite (line 3) | interface Invite {
class InviteStore (line 20) | class InviteStore extends FluxStore {
FILE: packages/discord-types/src/stores/LocaleStore.d.ts
class LocaleStore (line 3) | class LocaleStore extends FluxStore {
FILE: packages/discord-types/src/stores/MediaEngineStore.d.ts
type MediaEngineContextType (line 4) | type MediaEngineContextType = "default" | "stream";
type DeviceType (line 7) | type DeviceType = "audioinput" | "audiooutput" | "videoinput";
type VoiceMode (line 10) | type VoiceMode = "PUSH_TO_TALK" | "VOICE_ACTIVITY";
type ConnectionState (line 13) | type ConnectionState =
type VideoToggleState (line 22) | type VideoToggleState =
type VideoQualityOverride (line 33) | type VideoQualityOverride = "no_override" | "high" | "low";
type AudioSubsystem (line 36) | type AudioSubsystem = "legacy" | "standard" | "experimental" | "automatic";
type MediaType (line 39) | type MediaType = "audio" | "video" | "screen" | "test";
type KeyframeIntervalMode (line 42) | type KeyframeIntervalMode = "fixed" | "source";
type BandwidthEstimationType (line 45) | type BandwidthEstimationType = "remb";
type MediaEngineType (line 48) | type MediaEngineType = "NATIVE" | "WEBRTC" | "DUMMY";
type DesktopSourceType (line 51) | type DesktopSourceType = "WINDOW" | "SCREEN";
type HdrCaptureMode (line 54) | type HdrCaptureMode = "never" | "always" | "auto";
type InputProfile (line 57) | type InputProfile = "DEFAULT" | "CUSTOM";
type MediaEngineFeature (line 60) | type MediaEngineFeature =
type MediaEngineEvent (line 124) | type MediaEngineEvent =
type AudioDevice (line 154) | interface AudioDevice {
type VideoDevice (line 178) | interface VideoDevice {
type ClipsQuality (line 202) | interface ClipsQuality {
type DesktopDescription (line 212) | interface DesktopDescription {
type ClipsSource (line 234) | interface ClipsSource {
type DesktopSource (line 244) | interface DesktopSource {
type GoLiveQuality (line 258) | interface GoLiveQuality {
type GoLiveSource (line 268) | interface GoLiveSource {
type VideoStreamParameter (line 278) | interface VideoStreamParameter {
type LocalPan (line 290) | interface LocalPan {
type ModeOptions (line 300) | interface ModeOptions {
type LoopbackOptions (line 324) | interface LoopbackOptions {
type ScreenPreview (line 338) | interface ScreenPreview {
type WindowPreview (line 350) | interface WindowPreview {
type NoiseCancellationStats (line 362) | interface NoiseCancellationStats {
type MLSSigningKey (line 374) | interface MLSSigningKey {
type CodecInfo (line 384) | interface CodecInfo {
type ClipMetadata (line 396) | interface ClipMetadata {
type SavedClip (line 406) | interface SavedClip {
type Screenshot (line 416) | interface Screenshot {
type MediaFilterSettings (line 424) | interface MediaFilterSettings {
type AudioRecordingOptions (line 436) | interface AudioRecordingOptions {
type RawSamplesOptions (line 446) | interface RawSamplesOptions {
type ConnectionOptions (line 456) | interface ConnectionOptions {
type ReplayConnectionOptions (line 468) | interface ReplayConnectionOptions {
type VideoInputInitializationInfo (line 476) | interface VideoInputInitializationInfo {
type AudioInputInitializationInfo (line 490) | interface AudioInputInitializationInfo {
type VideoCodecErrorInfo (line 500) | interface VideoCodecErrorInfo {
type ConnectionCodec (line 514) | interface ConnectionCodec {
type ConnectionTransportOptions (line 528) | interface ConnectionTransportOptions {
type InputModeOptions (line 552) | interface InputModeOptions {
type GoLiveSourceOptions (line 572) | interface GoLiveSourceOptions {
type StreamParameter (line 584) | interface StreamParameter {
type AutomaticGainControlConfig (line 600) | interface AutomaticGainControlConfig {
type MediaEngineConnection (line 626) | interface MediaEngineConnection {
type MediaEngine (line 1419) | interface MediaEngine {
type MediaEngineSettings (line 2004) | interface MediaEngineSettings {
type MediaEngineState (line 2094) | interface MediaEngineState {
type Shortcut (line 2118) | interface Shortcut {
class MediaEngineStore (line 2130) | class MediaEngineStore extends FluxStore {
FILE: packages/discord-types/src/stores/MessageStore.d.ts
type JumpType (line 3) | type JumpType = "ANIMATED" | "INSTANT";
type MessageCache (line 5) | interface MessageCache {
type ChannelMessages (line 12) | interface ChannelMessages {
class MessageStore (line 39) | class MessageStore extends FluxStore {
FILE: packages/discord-types/src/stores/NotificationSettingsStore.d.ts
type DesktopNotificationType (line 3) | type DesktopNotificationType = "ALL" | "ONLY_MENTIONS" | "NEVER";
type TTSNotificationType (line 4) | type TTSNotificationType = "ALL" | "ONLY_MENTIONS" | "NEVER";
type NotificationSettingsState (line 6) | interface NotificationSettingsState {
class NotificationSettingsStore (line 16) | class NotificationSettingsStore extends FluxStore {
FILE: packages/discord-types/src/stores/OverridePremiumTypeStore.d.ts
type OverridePremiumTypeState (line 3) | interface OverridePremiumTypeState {
class OverridePremiumTypeStore (line 9) | class OverridePremiumTypeStore extends FluxStore {
FILE: packages/discord-types/src/stores/PendingReplyStore.d.ts
type PendingReply (line 4) | interface PendingReply {
class PendingReplyStore (line 11) | class PendingReplyStore extends FluxStore {
FILE: packages/discord-types/src/stores/PermissionStore.d.ts
type GuildPermissionProps (line 3) | interface GuildPermissionProps {
type PartialChannelContext (line 21) | interface PartialChannelContext {
type PartialGuildContext (line 25) | interface PartialGuildContext {
type PartialContext (line 29) | type PartialContext = PartialChannelContext | PartialGuildContext;
type PartialChannel (line 31) | type PartialChannel = Channel | { id: string; };
type PartialGuild (line 32) | type PartialGuild = Guild | { id: string; };
class PermissionStore (line 34) | class PermissionStore extends FluxStore {
FILE: packages/discord-types/src/stores/PopoutWindowStore.d.ts
type PopoutWindowKey (line 7) | type PopoutWindowKey =
type PopoutWindowEventType (line 21) | type PopoutWindowEventType = "loaded" | "unloaded";
type PopoutWindowState (line 27) | interface PopoutWindowState {
type BrowserWindowFeatures (line 44) | interface BrowserWindowFeatures {
class PopoutWindowStore (line 100) | class PopoutWindowStore extends FluxStore {
type PopoutActions (line 191) | interface PopoutActions {
FILE: packages/discord-types/src/stores/PresenceStore.d.ts
type UserAndActivity (line 4) | interface UserAndActivity {
type DiscordPlatform (line 9) | type DiscordPlatform = "desktop" | "mobile" | "web" | "embedded" | "vr";
type PresenceStoreState (line 11) | interface PresenceStoreState {
class PresenceStore (line 22) | class PresenceStore extends FluxStore {
FILE: packages/discord-types/src/stores/RTCConnectionStore.d.ts
type RTCConnectionState (line 3) | type RTCConnectionState =
type RTCConnectionQuality (line 15) | type RTCConnectionQuality = "unknown" | "bad" | "average" | "fine";
type LastRTCConnectionState (line 17) | interface LastRTCConnectionState {
type RTCConnectionPacketStats (line 28) | interface RTCConnectionPacketStats {
type VoiceStateStats (line 34) | interface VoiceStateStats {
type SecureFramesState (line 38) | interface SecureFramesState {
type SecureFramesRosterMapEntry (line 42) | interface SecureFramesRosterMapEntry {
class RTCConnectionStore (line 47) | class RTCConnectionStore extends FluxStore {
FILE: packages/discord-types/src/stores/ReadStateStore.d.ts
type GuildChannelUnreadState (line 4) | interface GuildChannelUnreadState {
type ReadStateSnapshot (line 10) | interface ReadStateSnapshot {
type SerializedReadState (line 18) | interface SerializedReadState {
class ReadStateStore (line 34) | class ReadStateStore extends FluxStore {
FILE: packages/discord-types/src/stores/RelationshipStore.d.ts
class RelationshipStore (line 4) | class RelationshipStore extends FluxStore {
FILE: packages/discord-types/src/stores/RunningGameStore.d.ts
type RunningGame (line 3) | interface RunningGame {
type GameOverlayStatus (line 19) | interface GameOverlayStatus {
type SystemServiceStatus (line 24) | interface SystemServiceStatus {
class RunningGameStore (line 28) | class RunningGameStore extends FluxStore {
FILE: packages/discord-types/src/stores/SelectedChannelStore.d.ts
type ChannelFollowingDestination (line 3) | interface ChannelFollowingDestination {
class SelectedChannelStore (line 8) | class SelectedChannelStore extends FluxStore {
FILE: packages/discord-types/src/stores/SelectedGuildStore.d.ts
type SelectedGuildState (line 3) | interface SelectedGuildState {
class SelectedGuildStore (line 9) | class SelectedGuildStore extends FluxStore {
FILE: packages/discord-types/src/stores/SoundboardStore.d.ts
type SoundboardSound (line 3) | interface SoundboardSound {
type TopSoundForGuild (line 14) | interface TopSoundForGuild {
type SoundboardOverlayState (line 19) | interface SoundboardOverlayState {
class SoundboardStore (line 25) | class SoundboardStore extends FluxStore {
FILE: packages/discord-types/src/stores/SpellCheckStore.d.ts
class SpellCheckStore (line 3) | class SpellCheckStore extends FluxStore {
FILE: packages/discord-types/src/stores/SpotifyStore.d.ts
type SpotifyDevice (line 3) | interface SpotifyDevice {
type SpotifySocket (line 14) | interface SpotifySocket {
type SpotifySocketAndDevice (line 22) | interface SpotifySocketAndDevice {
type SpotifyArtist (line 27) | interface SpotifyArtist {
type SpotifyImage (line 32) | interface SpotifyImage {
type SpotifyAlbum (line 38) | interface SpotifyAlbum {
type SpotifyTrack (line 45) | interface SpotifyTrack {
type SpotifyPlayerState (line 55) | interface SpotifyPlayerState {
type SpotifyActivity (line 61) | interface SpotifyActivity {
type SpotifySyncingWith (line 87) | interface SpotifySyncingWith {
class SpotifyStore (line 94) | class SpotifyStore extends FluxStore {
FILE: packages/discord-types/src/stores/StickersStore.d.ts
type StickerGuildMap (line 3) | type StickerGuildMap = Map<string, GuildSticker[]>;
type StickerPackMap (line 4) | type StickerPackMap = Map<string, Sticker[]>;
class StickersStore (line 6) | class StickersStore extends FluxStore {
FILE: packages/discord-types/src/stores/StreamerModeStore.d.ts
type StreamerModeSettings (line 3) | interface StreamerModeSettings {
class StreamerModeStore (line 13) | class StreamerModeStore extends FluxStore {
FILE: packages/discord-types/src/stores/ThemeStore.d.ts
type ThemePreference (line 3) | type ThemePreference = "dark" | "light" | "unknown";
type SystemTheme (line 4) | type SystemTheme = "dark" | "light";
type Theme (line 5) | type Theme = "light" | "dark" | "darker" | "midnight";
type ThemeState (line 7) | interface ThemeState {
class ThemeStore (line 13) | class ThemeStore extends FluxStore {
FILE: packages/discord-types/src/stores/TypingStore.d.ts
class TypingStore (line 3) | class TypingStore extends FluxStore {
FILE: packages/discord-types/src/stores/UploadAttachmentStore.d.ts
class UploadAttachmentStore (line 4) | class UploadAttachmentStore extends FluxStore {
FILE: packages/discord-types/src/stores/UserGuildSettingsStore.d.ts
type MuteConfig (line 3) | interface MuteConfig {
type ChannelOverride (line 8) | interface ChannelOverride {
type GuildSettings (line 17) | interface GuildSettings {
type AccountNotificationSettings (line 33) | interface AccountNotificationSettings {
type UserGuildSettingsState (line 37) | interface UserGuildSettingsState {
class UserGuildSettingsStore (line 41) | class UserGuildSettingsStore extends FluxStore {
FILE: packages/discord-types/src/stores/UserProfileStore.d.ts
type MutualFriend (line 4) | interface MutualFriend {
type MutualGuild (line 19) | interface MutualGuild {
type ProfileBadge (line 31) | interface ProfileBadge {
type ConnectedAccount (line 38) | interface ConnectedAccount {
type ProfileApplication (line 53) | interface ProfileApplication {
type UserProfileBase (line 66) | interface UserProfileBase extends Pick<User, "banner"> {
type ApplicationRoleConnection (line 84) | interface ApplicationRoleConnection {
type UserProfile (line 92) | interface UserProfile extends UserProfileBase, Pick<User, "premiumType"> {
type ApplicationWidgetConfig (line 104) | interface ApplicationWidgetConfig {
type WishlistSettings (line 109) | interface WishlistSettings {
class UserProfileStore (line 113) | class UserProfileStore extends FluxStore {
FILE: packages/discord-types/src/stores/UserSettingsProtoStore.d.ts
type GuildFolder (line 3) | interface GuildFolder {
type GuildProto (line 10) | interface GuildProto {
type UserSettingsVersions (line 23) | interface UserSettingsVersions {
type InboxSettings (line 29) | interface InboxSettings {
type GuildsSettings (line 34) | interface GuildsSettings {
type UserContentSettings (line 38) | interface UserContentSettings {
type VoiceAndVideoSettings (line 48) | interface VoiceAndVideoSettings {
type TextAndImagesSettings (line 59) | interface TextAndImagesSettings {
type NotificationsSettings (line 85) | interface NotificationsSettings {
type PrivacySettings (line 97) | interface PrivacySettings {
type GameLibrarySettings (line 119) | interface GameLibrarySettings {
type StatusSettings (line 123) | interface StatusSettings {
type LocalizationSettings (line 130) | interface LocalizationSettings {
type AppearanceSettings (line 135) | interface AppearanceSettings {
type GuildFoldersSettings (line 147) | interface GuildFoldersSettings {
type AudioContextSettings (line 152) | interface AudioContextSettings {
type ClipsSettings (line 158) | interface ClipsSettings {
type InAppFeedbackSettings (line 162) | interface InAppFeedbackSettings {
type UserSettings (line 167) | interface UserSettings {
type FrecencySettings (line 188) | interface FrecencySettings {
type ProtoState (line 204) | interface ProtoState {
class UserSettingsProtoStore (line 209) | class UserSettingsProtoStore extends FluxStore {
FILE: packages/discord-types/src/stores/UserStore.d.ts
type UserStoreSnapshot (line 4) | interface UserStoreSnapshot {
class UserStore (line 13) | class UserStore extends FluxStore {
FILE: packages/discord-types/src/stores/VoiceStateStore.d.ts
type UserVoiceStateRecords (line 4) | type UserVoiceStateRecords = Record<string, VoiceState>;
type VoiceStates (line 5) | type VoiceStates = Record<string, UserVoiceStateRecords>;
type VoiceState (line 7) | interface VoiceState extends DiscordRecord {
class VoiceStateStore (line 25) | class VoiceStateStore extends FluxStore {
FILE: packages/discord-types/src/stores/WindowStore.d.ts
type WindowSize (line 3) | interface WindowSize {
class WindowStore (line 8) | class WindowStore extends FluxStore {
FILE: packages/discord-types/src/stores/index.d.ts
type useStateFromStores (line 61) | type useStateFromStores = <T>(
FILE: packages/discord-types/src/utils.d.ts
type FluxEventsAutoComplete (line 9) | type FluxEventsAutoComplete = LiteralUnion<FluxEvents, string>;
type FluxDispatcher (line 11) | interface FluxDispatcher {
type Parser (line 21) | type Parser = Record<
type Alerts (line 34) | interface Alerts {
type SnowflakeUtils (line 52) | interface SnowflakeUtils {
type RestRequestData (line 60) | interface RestRequestData {
type RestAPI (line 68) | type RestAPI = Record<"del" | "get" | "patch" | "post" | "put", (data: R...
type Permissions (line 70) | type Permissions = "CREATE_INSTANT_INVITE"
type PermissionsBits (line 118) | type PermissionsBits = Record<Permissions, bigint>;
type MessageSnapshot (line 120) | interface MessageSnapshot {
type Locale (line 124) | interface Locale {
type LocaleInfo (line 130) | interface LocaleInfo {
type Clipboard (line 138) | interface Clipboard {
type NavigationRouter (line 143) | interface NavigationRouter {
type ChannelRouter (line 150) | interface ChannelRouter {
type IconUtils (line 155) | interface IconUtils {
type Constants (line 199) | interface Constants {
type ActiveView (line 205) | type ActiveView = LiteralUnion<"emoji" | "gif" | "sticker" | "soundboard...
type ExpressionPickerStoreState (line 207) | interface ExpressionPickerStoreState extends Record<PropertyKey, any> {
type ExpressionPickerStore (line 216) | interface ExpressionPickerStore {
type UserNameUtilsTagInclude (line 229) | type UserNameUtilsTagInclude = LiteralUnion<"auto" | "always" | "never",...
type UserNameUtilsTagOptions (line 230) | interface UserNameUtilsTagOptions {
type UsernameUtils (line 237) | interface UsernameUtils {
class DisplayProfile (line 251) | class DisplayProfile {
type DisplayProfileUtils (line 285) | interface DisplayProfileUtils {
type DateUtils (line 290) | interface DateUtils {
type CommandOptions (line 297) | interface CommandOptions {
FILE: packages/discord-types/webpack/index.d.ts
type ModuleExports (line 7) | type ModuleExports = any;
type Module (line 9) | type Module = {
type ModuleFactory (line 16) | type ModuleFactory = (this: ModuleExports, module: Module, exports: Modu...
type AsyncModulePromise (line 19) | type AsyncModulePromise = Promise<ModuleExports> & {
type AsyncModuleBody (line 25) | type AsyncModuleBody = (
type EnsureChunkHandlers (line 31) | type EnsureChunkHandlers = {
type PrefetchChunkHandlers (line 56) | type PrefetchChunkHandlers = {
type ScriptLoadDone (line 64) | type ScriptLoadDone = (event: Event) => void;
type OnChunksLoaded (line 66) | type OnChunksLoaded = ((this: WebpackRequire, result: any, chunkIds: Pro...
type WebpackRequire (line 71) | type WebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & {
FILE: packages/vencord-types/prepare.ts
function copyDtsFiles (line 31) | function copyDtsFiles(from: string, to: string) {
FILE: scripts/build/buildWeb.mjs
function globDir (line 122) | async function globDir(dir) {
function loadDir (line 139) | async function loadDir(dir, basePath = "") {
function buildExtension (line 147) | async function buildExtension(target, files) {
FILE: scripts/build/common.mjs
constant VERSION (line 39) | const VERSION = PackageJSON.version;
constant BUILD_TIMESTAMP (line 41) | const BUILD_TIMESTAMP = Number(process.env.SOURCE_DATE_EPOCH) || Date.no...
constant IS_DEV (line 44) | const IS_DEV = watch || process.argv.includes("--dev");
constant IS_REPORTER (line 45) | const IS_REPORTER = process.argv.includes("--reporter");
constant IS_ANTI_CRASH_TEST (line 46) | const IS_ANTI_CRASH_TEST = process.argv.includes("--anti-crash-test");
constant IS_STANDALONE (line 47) | const IS_STANDALONE = process.argv.includes("--standalone");
constant IS_UPDATER_DISABLED (line 49) | const IS_UPDATER_DISABLED = process.argv.includes("--disable-updater");
function stringifyValues (line 65) | function stringifyValues(obj) {
function buildOrWatchAll (line 75) | async function buildOrWatchAll(buildConfigs) {
function resolvePluginName (line 94) | async function resolvePluginName(base, dirent) {
function exists (line 115) | async function exists(path) {
method setup (line 127) | setup(build) {
FILE: scripts/generatePluginList.ts
type Dev (line 27) | interface Dev {
type PluginData (line 32) | interface PluginData {
function getName (line 48) | function getName(node: NamedDeclaration) {
function hasName (line 52) | function hasName(node: NamedDeclaration, name: string) {
function getObjectProp (line 56) | function getObjectProp(node: ObjectLiteralExpression, name: string) {
function parseDevs (line 62) | function parseDevs() {
function parseFile (line 93) | async function parseFile(fileName: string) {
function getEntryPoint (line 186) | async function getEntryPoint(dir: string, dirent: Dirent) {
function isPluginFile (line 201) | function isPluginFile({ name }: { name: string; }) {
FILE: scripts/generateReport.ts
constant CANARY (line 35) | const CANARY = process.env.USE_CANARY === "true";
function maybeGetError (line 51) | async function maybeGetError(handle: JSHandle): Promise<string | undefin...
type PatchInfo (line 57) | interface PatchInfo {
constant IGNORED_DISCORD_ERRORS (line 77) | const IGNORED_DISCORD_ERRORS = [
function toCodeBlock (line 86) | function toCodeBlock(s: string, indentation = 0, isDiscord = false) {
function printReport (line 93) | async function printReport() {
function getText (line 227) | async function getText(skipFirst = true) {
FILE: scripts/runInstaller.mjs
constant BASE_URL (line 28) | const BASE_URL = "https://github.com/Vencord/Installer/releases/latest/d...
constant INSTALLER_PATH_DARWIN (line 29) | const INSTALLER_PATH_DARWIN = "VencordInstaller.app/Contents/MacOS/Venco...
constant BASE_DIR (line 31) | const BASE_DIR = join(dirname(fileURLToPath(import.meta.url)), "..");
constant FILE_DIR (line 32) | const FILE_DIR = join(BASE_DIR, "dist", "Installer");
constant ETAG_FILE (line 33) | const ETAG_FILE = join(FILE_DIR, "etag.txt");
function getFilename (line 35) | function getFilename() {
function ensureBinary (line 48) | async function ensureBinary() {
FILE: scripts/utils.mjs
function getPluginTarget (line 23) | function getPluginTarget(filePath) {
FILE: src/Vencord.ts
function syncSettings (line 54) | async function syncSettings() {
function runUpdateCheck (line 111) | async function runUpdateCheck() {
function init (line 151) | async function init() {
FILE: src/VencordNative.ts
function invoke (line 15) | function invoke<T = any>(event: IpcEvents, ...args: any[]) {
function sendSync (line 19) | function sendSync<T = any>(event: IpcEvents, ...args: any[]) {
method addChangeListener (line 66) | addChangeListener(cb: (newCss: string) => void) {
method addThemeChangeListener (line 70) | addThemeChangeListener(cb: () => void) {
FILE: src/api/Badges.ts
type BadgePosition (line 23) | const enum BadgePosition {
type ProfileBadge (line 28) | interface ProfileBadge {
function addProfileBadge (line 62) | function addProfileBadge(badge: ProfileBadge) {
function removeProfileBadge (line 71) | function removeProfileBadge(badge: ProfileBadge) {
function _getBadges (line 79) | function _getBadges(args: BadgeUserArgs) {
type BadgeUserArgs (line 114) | interface BadgeUserArgs {
FILE: src/api/ChatButtons.tsx
type ChatBarProps (line 24) | interface ChatBarProps {
type ChatBarButtonFactory (line 82) | type ChatBarButtonFactory = (props: ChatBarProps & { isMainChat: boolean...
type ChatBarButtonData (line 83) | type ChatBarButtonData = {
function VencordChatBarButtons (line 98) | function VencordChatBarButtons(props: ChatBarProps) {
function _injectButtons (line 115) | function _injectButtons(buttons: ReactNode[], props: ChatBarProps) {
type ChatBarButtonProps (line 128) | interface ChatBarButtonProps {
FILE: src/api/Commands/commandHelpers.ts
function generateId (line 27) | function generateId() {
function sendBotMessage (line 37) | function sendBotMessage(channelId: string, message: PartialDeep<Message>...
function findOption (line 54) | function findOption(args: CommandArgument[], name: string, fallbackValue...
FILE: src/api/Commands/index.ts
constant BUILT_IN (line 29) | let BUILT_IN: VencordCommand[];
function prepareOption (line 96) | function prepareOption<O extends CommandOption | VencordCommand>(opt: O)...
function registerSubCommands (line 113) | function registerSubCommands(cmd: VencordCommand, plugin: string) {
function registerCommand (line 136) | function registerCommand<C extends VencordCommand>(command: C, plugin: s...
function unregisterCommand (line 169) | function unregisterCommand(name: string) {
FILE: src/api/Commands/types.ts
type VencordCommand (line 10) | interface VencordCommand extends Command {
FILE: src/api/ContextMenu.ts
type NavContextMenuPatchCallback (line 27) | type NavContextMenuPatchCallback = (children: Array<ReactElement<any> | ...
type GlobalContextMenuPatchCallback (line 33) | type GlobalContextMenuPatchCallback = (navId: string, children: Array<Re...
function addContextMenuPatch (line 45) | function addContextMenuPatch(navId: string | Array<string>, patch: NavCo...
function addGlobalContextMenuPatch (line 62) | function addGlobalContextMenuPatch(patch: GlobalContextMenuPatchCallback) {
function removeContextMenuPatch (line 72) | function removeContextMenuPatch<T extends string | Array<string>>(navId:...
function removeGlobalContextMenuPatch (line 85) | function removeGlobalContextMenuPatch(patch: GlobalContextMenuPatchCallb...
function findGroupChildrenByChildId (line 95) | function findGroupChildrenByChildId(id: string | string[], children: Arr...
type ContextMenuProps (line 124) | interface ContextMenuProps {
function _usePatchContextMenu (line 133) | function _usePatchContextMenu(props: ContextMenuProps) {
function cloneMenuChildren (line 165) | function cloneMenuChildren(obj: ReactElement<any> | Array<ReactElement<a...
FILE: src/api/DataStore/index.ts
function promisifyRequest (line 21) | function promisifyRequest<T = undefined>(
function createStore (line 32) | function createStore(dbName: string, storeName: string): UseStore {
type UseStore (line 43) | type UseStore = <T>(
function defaultGetStore (line 50) | function defaultGetStore() {
function get (line 63) | function get<T = any>(
function set (line 77) | function set(
function setMany (line 95) | function setMany(
function getMany (line 111) | function getMany<T = any>(
function update (line 127) | function update<T = any>(
function del (line 157) | function del(
function delMany (line 173) | function delMany(
function clear (line 188) | function clear(customStore = defaultGetStore()): Promise<void> {
function eachCursor (line 195) | function eachCursor(
function keys (line 212) | function keys<KeyType extends IDBValidKey>(
function values (line 236) | function values<T = any>(customStore = defaultGetStore()): Promise<T[]> {
function entries (line 256) | function entries<KeyType extends IDBValidKey, ValueType = any>(
FILE: src/api/MemberListDecorators.tsx
type DecoratorProps (line 23) | interface DecoratorProps {
type MemberListDecoratorFactory (line 32) | type MemberListDecoratorFactory = (props: DecoratorProps) => JSX.Element...
type OnlyIn (line 33) | type OnlyIn = "guilds" | "dms";
function addMemberListDecorator (line 37) | function addMemberListDecorator(identifier: string, render: MemberListDe...
function removeMemberListDecorator (line 41) | function removeMemberListDecorator(identifier: string) {
function __getDecorators (line 45) | function __getDecorators(props: DecoratorProps, type: "guild" | "dm"): J...
FILE: src/api/MessageAccessories.tsx
type MessageAccessoryFactory (line 22) | type MessageAccessoryFactory = (props: Record<string, any>) => ReactNode;
type MessageAccessory (line 23) | type MessageAccessory = {
function addMessageAccessory (line 30) | function addMessageAccessory(
function removeMessageAccessory (line 41) | function removeMessageAccessory(identifier: string) {
function _modifyAccessories (line 45) | function _modifyAccessories(
FILE: src/api/MessageDecorations.tsx
type MessageDecorationProps (line 23) | interface MessageDecorationProps {
type MessageDecorationFactory (line 49) | type MessageDecorationFactory = (props: MessageDecorationProps) => JSX.E...
function addMessageDecoration (line 53) | function addMessageDecoration(identifier: string, decoration: MessageDec...
function removeMessageDecoration (line 57) | function removeMessageDecoration(identifier: string) {
function __addDecorationsToMessage (line 61) | function __addDecorationsToMessage(props: MessageDecorationProps): JSX.E...
FILE: src/api/MessageEvents.ts
type MessageObject (line 26) | interface MessageObject {
type MessageReplyOptions (line 33) | interface MessageReplyOptions {
type MessageOptions (line 41) | interface MessageOptions {
type MessageSendListener (line 51) | type MessageSendListener = (channelId: string, messageObj: MessageObject...
type MessageEditListener (line 52) | type MessageEditListener = (channelId: string, messageId: string, messag...
function _handlePreSend (line 57) | async function _handlePreSend(channelId: string, messageObj: MessageObje...
function _handlePreEdit (line 72) | async function _handlePreEdit(channelId: string, messageId: string, mess...
function addMessagePreSendListener (line 89) | function addMessagePreSendListener(listener: MessageSendListener) {
function addMessagePreEditListener (line 96) | function addMessagePreEditListener(listener: MessageEditListener) {
function removeMessagePreSendListener (line 100) | function removeMessagePreSendListener(listener: MessageSendListener) {
function removeMessagePreEditListener (line 103) | function removeMessagePreEditListener(listener: MessageEditListener) {
type MessageClickListener (line 109) | type MessageClickListener = (message: Message, channel: Channel, event: ...
function _handleClick (line 113) | function _handleClick(message: Message, channel: Channel, event: MouseEv...
function addMessageClickListener (line 125) | function addMessageClickListener(listener: MessageClickListener) {
function removeMessageClickListener (line 130) | function removeMessageClickListener(listener: MessageClickListener) {
FILE: src/api/MessagePopover.tsx
type MessagePopoverButtonItem (line 29) | interface MessagePopoverButtonItem {
type MessagePopoverButtonFactory (line 39) | type MessagePopoverButtonFactory = (message: Message) => MessagePopoverB...
type MessagePopoverButtonData (line 40) | type MessagePopoverButtonData = {
function addMessagePopoverButton (line 55) | function addMessagePopoverButton(
function removeMessagePopoverButton (line 63) | function removeMessagePopoverButton(identifier: string) {
function VencordPopoverButtons (line 67) | function VencordPopoverButtons(props: { Component: React.ComponentType<M...
function _buildPopoverElements (line 94) | function _buildPopoverElements(
FILE: src/api/MessageUpdater.ts
function updateMessage (line 16) | function updateMessage(channelId: string, messageId: string, fields?: Pa...
FILE: src/api/Notices.tsx
function popNotice (line 30) | function popNotice() {
function nextNotice (line 34) | function nextNotice() {
function showNotice (line 42) | function showNotice(message: ReactNode, buttonText: string, onOkClick: (...
FILE: src/api/Notifications/Notifications.tsx
function getRoot (line 33) | function getRoot() {
type NotificationData (line 43) | interface NotificationData {
function _showNotification (line 66) | function _showNotification(notification: NotificationData, id: number) {
function shouldBeNative (line 79) | function shouldBeNative() {
function requestPermission (line 88) | async function requestPermission() {
function showNotification (line 95) | async function showNotification(data: NotificationData) {
FILE: src/api/Notifications/notificationLog.tsx
type PersistentNotificationData (line 33) | interface PersistentNotificationData extends Pick<NotificationData, "tit...
constant KEY (line 38) | const KEY = "notification-log";
function persistNotification (line 48) | async function persistNotification(notification: NotificationData) {
function deleteNotification (line 78) | async function deleteNotification(timestamp: number) {
function useLogs (line 88) | function useLogs() {
function NotificationEntry (line 104) | function NotificationEntry({ data }: { data: PersistentNotificationData;...
function NotificationLog (line 130) | function NotificationLog({ log, pending }: { log: PersistentNotification...
function LogModal (line 153) | function LogModal({ modalProps, close }: { modalProps: ModalProps; close...
function openNotificationLogModal (line 198) | function openNotificationLogModal() {
FILE: src/api/PluginManager.ts
function isPluginEnabled (line 51) | function isPluginEnabled(p: string) {
function addPatch (line 59) | function addPatch(newPatch: Omit<Patch, "plugin">, pluginName: string, p...
function isReporterTestable (line 88) | function isReporterTestable(p: Plugin, part: ReporterTestable) {
function pluginRequiresRestart (line 94) | function pluginRequiresRestart(p: Plugin) {
function startDependenciesRecursive (line 112) | function startDependenciesRecursive(p: Plugin) {
function subscribePluginFluxEvents (line 140) | function subscribePluginFluxEvents(p: Plugin, fluxDispatcher: typeof Flu...
function unsubscribePluginFluxEvents (line 162) | function unsubscribePluginFluxEvents(p: Plugin, fluxDispatcher: typeof F...
function subscribeAllPluginsFluxEvents (line 173) | function subscribeAllPluginsFluxEvents(fluxDispatcher: typeof FluxDispat...
FILE: src/api/ServerList.tsx
type ServerListRenderPosition (line 22) | const enum ServerListRenderPosition {
function getRenderFunctions (line 30) | function getRenderFunctions(position: ServerListRenderPosition) {
function addServerListElement (line 34) | function addServerListElement(position: ServerListRenderPosition, render...
function removeServerListElement (line 38) | function removeServerListElement(position: ServerListRenderPosition, ren...
FILE: src/api/Settings.ts
type SettingsPluginUiElement (line 29) | interface SettingsPluginUiElement {
type SettingsPluginUiElements (line 35) | type SettingsPluginUiElements = {
type Settings (line 40) | interface Settings {
method getDefaultValue (line 135) | getDefaultValue({
function useSettings (line 203) | function useSettings(paths?: UseSettings<Settings>[]) {
function migratePluginSettings (line 232) | function migratePluginSettings(name: string, ...oldNames: string[]) {
function migratePluginSetting (line 247) | function migratePluginSetting(pluginName: string, oldSetting: string, ne...
function definePluginSettings (line 258) | function definePluginSettings<
type UseSettings (line 289) | type UseSettings<T extends object> = ResolveUseSettings<T>[keyof T];
type ResolveUseSettings (line 291) | type ResolveUseSettings<T extends object> = {
FILE: src/api/SettingsSync/cloudSetup.tsx
function checkCloudUrlCsp (line 20) | async function checkCloudUrlCsp() {
function getAuthorization (line 49) | async function getAuthorization() {
function setAuthorization (line 71) | async function setAuthorization(secret: string) {
function deauthorizeCloud (line 79) | async function deauthorizeCloud() {
function authorizeCloud (line 87) | async function authorizeCloud() {
function getCloudAuth (line 154) | async function getCloudAuth() {
FILE: src/api/SettingsSync/cloudSync.ts
function shouldCloudSync (line 19) | function shouldCloudSync(direction: "push" | "pull") {
function putCloudSettings (line 25) | async function putCloudSettings(manual?: boolean) {
function getCloudSettings (line 75) | async function getCloudSettings(shouldNotify = true, force = false) {
function deleteCloudSettings (line 168) | async function deleteCloudSettings() {
function eraseAllCloudData (line 203) | async function eraseAllCloudData() {
FILE: src/api/SettingsSync/offline.ts
function isSafeObject (line 27) | function isSafeObject(obj: any) {
function importSettings (line 42) | async function importSettings(data: string) {
function exportSettings (line 61) | async function exportSettings({ minify }: { minify?: boolean; } = {}) {
function downloadSettingsBackup (line 67) | async function downloadSettingsBackup() {
function uploadSettingsBackup (line 79) | async function uploadSettingsBackup(showToast = true): Promise<void> {
FILE: src/api/Styles.ts
type Style (line 27) | interface Style {
function initStyles (line 53) | function initStyles() {
function requireStyle (line 87) | function requireStyle(name: string) {
function enableStyle (line 103) | function enableStyle(name: string) {
function disableStyle (line 124) | function disableStyle(name: string) {
FILE: src/api/Themes.ts
function toggle (line 29) | async function toggle(isEnabled: boolean) {
function initThemes (line 45) | async function initThemes() {
function applyToPopout (line 84) | function applyToPopout(popoutWindow: Window | undefined, key: string) {
function updatePopoutWindows (line 96) | function updatePopoutWindows() {
function initQuickCssThemeStore (line 127) | function initQuickCssThemeStore(themeStore: ThemeStore) {
FILE: src/api/UserSettings.ts
type UserSettingDefinition (line 25) | interface UserSettingDefinition<T> {
function getUserSetting (line 61) | function getUserSetting<T = any>(group: string, name: string): UserSetti...
function getUserSettingLazy (line 81) | function getUserSettingLazy<T = any>(group: string, name: string) {
FILE: src/components/BaseText.tsx
function generateTextCss (line 37) | function generateTextCss() {
type TextSize (line 51) | type TextSize = keyof typeof Sizes;
type TextWeight (line 52) | type TextWeight = keyof typeof Weights;
type TextTag (line 53) | type TextTag = "div" | "span" | "p" | `h${1 | 2 | 3 | 4 | 5 | 6}`;
type BaseTextProps (line 55) | type BaseTextProps<Tag extends TextTag = "div"> = ComponentPropsWithoutR...
function BaseText (line 62) | function BaseText<T extends TextTag = "div">(props: BaseTextProps<T>): R...
FILE: src/components/Button.tsx
type ButtonVariant (line 20) | type ButtonVariant =
type ButtonSize (line 22) | type ButtonSize = "min" | "xs" | "small" | "medium" | "iconOnly";
type ButtonProps (line 24) | type ButtonProps = ComponentPropsWithRef<"button"> & {
type LinkButtonProps (line 29) | type LinkButtonProps = ComponentPropsWithRef<"a"> & {
function Button (line 34) | function Button({ variant = "primary", size = "medium", children, classN...
function LinkButton (line 43) | function LinkButton({ variant = "link", size = "medium", className, chil...
type TextButtonVariant (line 52) | type TextButtonVariant = "primary" | "secondary" | "danger" | "link";
type TextButtonProps (line 54) | type TextButtonProps = ComponentPropsWithRef<"button"> & {
function TextButton (line 58) | function TextButton({ variant = "primary", className, ...restProps }: Te...
FILE: src/components/Card.tsx
type CardProps (line 15) | interface CardProps extends ComponentPropsWithRef<"div"> {
function Card (line 21) | function Card({ variant = "normal", defaultPadding, children, className,...
FILE: src/components/CheckedTextInput.tsx
type TextInputProps (line 21) | interface TextInputProps {
function CheckedTextInput (line 42) | function CheckedTextInput({ value: initialValue, onChange, validate }: T...
FILE: src/components/CodeBlock.tsx
function CodeBlock (line 15) | function CodeBlock(props: { content?: string, lang: string; }) {
function InlineCode (line 26) | function InlineCode({ children }: { children: React.ReactNode; }) {
FILE: src/components/Divider.tsx
type DividerProps (line 12) | type DividerProps = ComponentPropsWithoutRef<"hr">;
function Divider (line 14) | function Divider({ className, ...restProps }: DividerProps) {
FILE: src/components/ErrorBoundary.tsx
type Props (line 27) | interface Props<T = any> {
constant NO_ERROR (line 45) | const NO_ERROR = {};
method getDerivedStateFromError (line 59) | static getDerivedStateFromError(error: any) {
method componentDidCatch (line 74) | componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
method isNoop (line 79) | get isNoop() {
method render (line 84) | render() {
FILE: src/components/ErrorCard.tsx
function ErrorCard (line 24) | function ErrorCard(props: React.PropsWithChildren<HTMLProps<HTMLDivEleme...
FILE: src/components/ExpandableCard.tsx
type ExpandableSectionProps (line 16) | type ExpandableSectionProps = PropsWithChildren<{
function ExpandableSection (line 25) | function ExpandableSection({ children, renderContent: Content, className...
FILE: src/components/Flex.tsx
type FlexProps (line 21) | interface FlexProps extends HTMLAttributes<HTMLDivElement> {
function Flex (line 29) | function Flex({ flexDirection, gap = "1em", justifyContent, alignItems, ...
FILE: src/components/FormSwitch.tsx
type FormSwitchProps (line 16) | interface FormSwitchProps {
function FormSwitch (line 27) | function FormSwitch({ onChange, title, value, description, disabled, cla...
function FormSwitchCompat (line 45) | function FormSwitchCompat({ note, children, ...restProps }: PropsWithChi...
FILE: src/components/Grid.tsx
type Props (line 9) | interface Props {
function Grid (line 15) | function Grid(props: Props & JSX.IntrinsicElements["div"]) {
FILE: src/components/Heading.tsx
type HeadingTag (line 12) | type HeadingTag = `h${1 | 2 | 3 | 4 | 5 | 6}`;
type HeadingProps (line 14) | type HeadingProps<Tag extends HeadingTag> = ComponentPropsWithoutRef<Tag...
function Heading (line 23) | function Heading<T extends HeadingTag>(props: HeadingProps<T>) {
function HeadingPrimary (line 38) | function HeadingPrimary({ children, ...restProps }: HeadingProps<"h2">) {
function HeadingSecondary (line 46) | function HeadingSecondary({ children, ...restProps }: HeadingProps<"h3">) {
function HeadingTertiary (line 54) | function HeadingTertiary({ children, ...restProps }: HeadingProps<"h4">) {
FILE: src/components/Heart.tsx
function Heart (line 22) | function Heart(props: SVGProps<SVGSVGElement>) {
FILE: src/components/Icons.tsx
type BaseIconProps (line 25) | interface BaseIconProps extends IconProps {
type IconProps (line 29) | type IconProps = JSX.IntrinsicElements["svg"];
function Icon (line 31) | function Icon({ height = 24, width = 24, className, children, viewBox, ....
function LinkIcon (line 49) | function LinkIcon({ height = 24, width = 24, className }: IconProps) {
function CopyIcon (line 68) | function CopyIcon(props: IconProps) {
function OpenExternalIcon (line 87) | function OpenExternalIcon(props: IconProps) {
function ImageIcon (line 100) | function ImageIcon(props: IconProps) {
function InfoIcon (line 112) | function InfoIcon(props: IconProps) {
function OwnerCrownIcon (line 128) | function OwnerCrownIcon(props: IconProps) {
function ScreenshareIcon (line 150) | function ScreenshareIcon(props: IconProps) {
function ImageVisible (line 165) | function ImageVisible(props: IconProps) {
function ImageInvisible (line 177) | function ImageInvisible(props: IconProps) {
function Microphone (line 189) | function Microphone(props: IconProps) {
function CogWheel (line 202) | function CogWheel(props: IconProps) {
function ReplyIcon (line 219) | function ReplyIcon(props: IconProps) {
function DeleteIcon (line 234) | function DeleteIcon(props: IconProps) {
function PlusIcon (line 253) | function PlusIcon(props: IconProps) {
function NoEntrySignIcon (line 269) | function NoEntrySignIcon(props: IconProps) {
function SafetyIcon (line 288) | function SafetyIcon(props: IconProps) {
function NotesIcon (line 306) | function NotesIcon(props: IconProps) {
function FolderIcon (line 327) | function FolderIcon(props: IconProps) {
function LogIcon (line 342) | function LogIcon(props: IconProps) {
function RestartIcon (line 359) | function RestartIcon(props: IconProps) {
function PaintbrushIcon (line 374) | function PaintbrushIcon(props: IconProps) {
function PencilIcon (line 391) | function PencilIcon(props: IconProps) {
function GithubIcon (line 406) | function GithubIcon(props: IconProps) {
function WebsiteIcon (line 420) | function WebsiteIcon(props: IconProps) {
function PlaceholderIcon (line 437) | function PlaceholderIcon(props: IconProps) {
function MainSettingsIcon (line 448) | function MainSettingsIcon(props: IconProps) {
function PluginsIcon (line 462) | function PluginsIcon(props: IconProps) {
function CloudIcon (line 476) | function CloudIcon(props: IconProps) {
function BackupRestoreIcon (line 490) | function BackupRestoreIcon(props: IconProps) {
function UpdaterIcon (line 504) | function UpdaterIcon(props: IconProps) {
function PatchHelperIcon (line 518) | function PatchHelperIcon(props: IconProps) {
function VesktopSettingsIcon (line 532) | function VesktopSettingsIcon(props: IconProps) {
function CloudDownloadIcon (line 546) | function CloudDownloadIcon(props: IconProps) {
function CloudUploadIcon (line 560) | function CloudUploadIcon(props: IconProps) {
function ClockIcon (line 574) | function ClockIcon(props: IconProps) {
function DownArrow (line 590) | function DownArrow(props: IconProps) {
function RightArrow (line 604) | function RightArrow(props: IconProps) {
FILE: src/components/Link.tsx
type Props (line 21) | interface Props extends React.DetailedHTMLProps<React.AnchorHTMLAttribut...
function Link (line 25) | function Link(props: React.PropsWithChildren<Props>) {
FILE: src/components/Paragraph.tsx
type ParagraphProps (line 9) | type ParagraphProps = BaseTextProps<"p">;
function Paragraph (line 11) | function Paragraph({ children, ...restProps }: ParagraphProps) {
FILE: src/components/Span.tsx
type SpanProps (line 9) | type SpanProps = BaseTextProps<"span">;
function Span (line 11) | function Span({ children, ...restProps }: SpanProps) {
FILE: src/components/Switch.tsx
constant SWITCH_ON (line 28) | const SWITCH_ON = "var(--brand-500)";
constant SWITCH_OFF (line 29) | const SWITCH_OFF = "var(--primary-400)";
type SwitchProps (line 31) | interface SwitchProps {
function Switch (line 37) | function Switch({ checked, onChange, disabled }: SwitchProps) {
FILE: src/components/TooltipContainer.tsx
function TooltipContainer (line 10) | function TooltipContainer({ children, ...props }: Omit<TooltipProps, "ch...
FILE: src/components/handleComponentFailed.ts
function handleComponentFailed (line 21) | function handleComponentFailed() {
FILE: src/components/margins.ts
type MarginDirection (line 26) | type MarginDirection = (typeof Directions)[number];
type MarginSize (line 27) | type MarginSize = (typeof Sizes)[number];
function generateMarginCss (line 31) | function generateMarginCss() {
FILE: src/components/settings/AddonCard.tsx
type Props (line 29) | interface Props {
function AddonCard (line 44) | function AddonCard({ disabled, isNew, name, infoButton, footer, author, ...
FILE: src/components/settings/DonateButton.tsx
function DonateButton (line 23) | function DonateButton({
FILE: src/components/settings/PluginBadge.tsx
function AddonBadge (line 19) | function AddonBadge({ text, color }) {
FILE: src/components/settings/QuickAction.tsx
type QuickActionProps (line 15) | interface QuickActionProps {
function QuickAction (line 22) | function QuickAction(props: QuickActionProps) {
function QuickActionCard (line 33) | function QuickActionCard(props: PropsWithChildren) {
FILE: src/components/settings/SpecialCard.tsx
type StyledCardProps (line 29) | interface StyledCardProps {
function SpecialCard (line 40) | function SpecialCard({ title, subtitle, description, cardImage, backgrou...
FILE: src/components/settings/tabs/BaseTab.tsx
function SettingsTab (line 25) | function SettingsTab({ children }: PropsWithChildren) {
function wrapTab (line 33) | function wrapTab(component: ComponentType<any>, tab: string) {
function openSettingsTabModal (line 43) | function openSettingsTabModal(Tab: ComponentType<any>) {
FILE: src/components/settings/tabs/patchHelper/FullPatchInput.tsx
type FullPatchInputProps (line 11) | interface FullPatchInputProps {
function FullPatchInput (line 18) | function FullPatchInput({ setFind, setParsedFind, setMatch, setReplaceme...
FILE: src/components/settings/tabs/patchHelper/PatchPreview.tsx
type PatchPreviewProps (line 19) | interface PatchPreviewProps {
function makeDiff (line 26) | function makeDiff(original: string, patched: string, match: RegExpMatchA...
function Match (line 43) | function Match({ matchResult }: { matchResult: RegExpMatchArray | null; ...
function Diff (line 63) | function Diff({ diff }: { diff: Change[] | null; }) {
function PatchPreview (line 92) | function PatchPreview({ module, match, replacement, setReplacementError ...
FILE: src/components/settings/tabs/patchHelper/ReplacementInput.tsx
function ReplacementInput (line 21) | function ReplacementInput({ replacement, setReplacement, replacementErro...
FILE: src/components/settings/tabs/patchHelper/index.tsx
function PatchHelper (line 49) | function PatchHelper() {
FILE: src/components/settings/tabs/plugins/ContributorModal.tsx
function openContributorModal (line 27) | function openContributorModal(user: User) {
function ContributorModal (line 39) | function ContributorModal({ user }: { user: User; }) {
FILE: src/components/settings/tabs/plugins/LinkIconButton.tsx
function GithubLinkIcon (line 13) | function GithubLinkIcon() {
function WebsiteLinkIcon (line 18) | function WebsiteLinkIcon() {
type Props (line 23) | interface Props {
function LinkIcon (line 28) | function LinkIcon({ text, href, Icon }: Props & { Icon: React.ComponentT...
FILE: src/components/settings/tabs/plugins/PluginCard.tsx
type PluginCardProps (line 19) | interface PluginCardProps extends React.HTMLProps<HTMLDivElement> {
function PluginCard (line 26) | function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, o...
FILE: src/components/settings/tabs/plugins/PluginModal.tsx
type PluginModalProps (line 49) | interface PluginModalProps extends ModalProps {
function makeDummyUser (line 54) | function makeDummyUser(user: { username: string; id?: string; avatar?: s...
function PluginModal (line 71) | function PluginModal({ plugin, onRestartNeeded, onClose, transitionState...
function openPluginModal (line 226) | function openPluginModal(plugin: Plugin, onRestartNeeded?: (pluginName: ...
FILE: src/components/settings/tabs/plugins/UIElements.tsx
function UIElementsButton (line 27) | function UIElementsButton() {
function Section (line 51) | function Section(props: {
function UIElementsModal (line 93) | function UIElementsModal(props: ModalProps) {
FILE: src/components/settings/tabs/plugins/components/BooleanSetting.tsx
function BooleanSetting (line 25) | function BooleanSetting({ option, pluginSettings, definedSettings, id, o...
FILE: src/components/settings/tabs/plugins/components/Common.tsx
type SettingBaseProps (line 16) | interface SettingBaseProps<T> {
type SettingProps (line 27) | type SettingProps<T extends PluginOptionBase> = SettingBaseProps<T>;
type ComponentSettingProps (line 28) | type ComponentSettingProps<T extends Omit<PluginOptionBase, "description...
function resolveError (line 30) | function resolveError(isValidResult: boolean | string) {
type SettingsSectionProps (line 36) | interface SettingsSectionProps extends PropsWithChildren {
function SettingsSection (line 44) | function SettingsSection({ tag: Tag = "div", name, description, error, i...
FILE: src/components/settings/tabs/plugins/components/ComponentSetting.tsx
function ComponentSetting (line 23) | function ComponentSetting({ option, onChange }: ComponentSettingProps<Pl...
FILE: src/components/settings/tabs/plugins/components/NumberSetting.tsx
constant MAX_SAFE_NUMBER (line 24) | const MAX_SAFE_NUMBER = BigInt(Number.MAX_SAFE_INTEGER);
function NumberSetting (line 26) | function NumberSetting({ option, pluginSettings, definedSettings, id, on...
FILE: src/components/settings/tabs/plugins/components/SelectSetting.tsx
function SelectSetting (line 24) | function SelectSetting({ option, pluginSettings, definedSettings, onChan...
FILE: src/components/settings/tabs/plugins/components/SliderSetting.tsx
function SliderSetting (line 24) | function SliderSetting({ option, pluginSettings, definedSettings, id, on...
FILE: src/components/settings/tabs/plugins/components/TextSetting.tsx
function TextSetting (line 24) | function TextSetting({ option, pluginSettings, definedSettings, id, onCh...
FILE: src/components/settings/tabs/plugins/index.tsx
function ReloadRequiredCard (line 48) | function ReloadRequiredCard({ required }: { required: boolean; }) {
type SearchStatus (line 74) | const enum SearchStatus {
function ExcludedPluginsList (line 83) | function ExcludedPluginsList({ search }: { search: string; }) {
function PluginSettings (line 116) | function PluginSettings() {
function makeDependencyList (line 324) | function makeDependencyList(deps: string[]) {
FILE: src/components/settings/tabs/sync/BackupAndRestoreTab.tsx
function BackupAndRestoreTab (line 28) | function BackupAndRestoreTab() {
FILE: src/components/settings/tabs/sync/CloudTab.tsx
function validateUrl (line 40) | function validateUrl(url: string) {
function ButtonWithIcon (line 60) | function ButtonWithIcon({ children, Icon, className, ...buttonProps }: B...
function CloudSetupSection (line 69) | function CloudSetupSection() {
function SettingsSyncSection (line 127) | function SettingsSyncSection() {
function ResetSection (line 211) | function ResetSection() {
function CloudTab (line 247) | function CloudTab() {
FILE: src/components/settings/tabs/themes/CspErrorCard.tsx
function CspErrorCard (line 17) | function CspErrorCard() {
FILE: src/components/settings/tabs/themes/LocalThemesTab.tsx
type FileInput (line 26) | type FileInput = ComponentType<{
function onLocalThemeChange (line 36) | function onLocalThemeChange(fileName: string, value: boolean) {
function onFileUpload (line 45) | async function onFileUpload(e: SyntheticEvent<HTMLInputElement>) {
function LocalThemesTab (line 70) | function LocalThemesTab() {
FILE: src/components/settings/tabs/themes/OnlineThemesTab.tsx
function OnlineThemesTab (line 12) | function OnlineThemesTab() {
FILE: src/components/settings/tabs/themes/ThemeCard.tsx
type ThemeCardProps (line 15) | interface ThemeCardProps {
function ThemeCard (line 22) | function ThemeCard({ theme, enabled, onChange, onDelete }: ThemeCardProp...
FILE: src/components/settings/tabs/themes/index.tsx
type ThemeTab (line 31) | const enum ThemeTab {
function ThemesTab (line 36) | function ThemesTab() {
function UserscriptThemesTab (line 70) | function UserscriptThemesTab() {
FILE: src/components/settings/tabs/updater/Components.tsx
type CommonProps (line 19) | interface CommonProps {
function HashLink (line 24) | function HashLink({ repo, hash, disabled = false }: { repo: string, hash...
function Changes (line 32) | function Changes({ updates, repo, repoPending }: CommonProps & { updates...
function Newer (line 59) | function Newer(props: CommonProps) {
function Updatable (line 70) | function Updatable(props: CommonProps) {
FILE: src/components/settings/tabs/updater/index.tsx
function VesktopSection (line 39) | function VesktopSection() {
function Updater (line 67) | function Updater() {
FILE: src/components/settings/tabs/updater/runWithDispatch.tsx
function getErrorMessage (line 11) | function getErrorMessage(e: any) {
function runWithDispatch (line 25) | function runWithDispatch(dispatch: React.Dispatch<React.SetStateAction<b...
FILE: src/components/settings/tabs/vencord/DonateButton.tsx
function DonateButtonComponent (line 17) | function DonateButtonComponent() {
FILE: src/components/settings/tabs/vencord/MacVibrancySettings.tsx
function VibrancySettings (line 13) | function VibrancySettings() {
FILE: src/components/settings/tabs/vencord/NotificationSettings.tsx
function NotificationSection (line 16) | function NotificationSection() {
function openNotificationSettingsModal (line 36) | function openNotificationSettingsModal() {
function NotificationSettings (line 51) | function NotificationSettings() {
FILE: src/components/settings/tabs/vencord/index.tsx
constant DEFAULT_DONATE_IMAGE (line 40) | const DEFAULT_DONATE_IMAGE = "https://cdn.discordapp.com/emojis/10265330...
constant SHIGGY_DONATE_IMAGE (line 41) | const SHIGGY_DONATE_IMAGE = "https://media.discordapp.net/stickers/10399...
constant VENNIE_DONATOR_IMAGE (line 42) | const VENNIE_DONATOR_IMAGE = "https://cdn.discordapp.com/emojis/12381206...
constant COZY_CONTRIB_IMAGE (line 43) | const COZY_CONTRIB_IMAGE = "https://cdn.discordapp.com/emojis/1026533070...
constant DONOR_BACKGROUND_IMAGE (line 44) | const DONOR_BACKGROUND_IMAGE = "https://media.discordapp.net/stickers/13...
constant CONTRIB_BACKGROUND_IMAGE (line 45) | const CONTRIB_BACKGROUND_IMAGE = "https://media.discordapp.net/stickers/...
type KeysOfType (line 47) | type KeysOfType<Object, Type> = {
function Switches (line 51) | function Switches() {
function VencordSettings (line 127) | function VencordSettings() {
FILE: src/debug/Tracer.ts
type Func (line 48) | type Func = (...args: any[]) => any;
type TraceNameMapper (line 49) | type TraceNameMapper<F extends Func> = (...args: Parameters<F>) => string;
function noopTracerWithResults (line 51) | function noopTracerWithResults<F extends Func>(name: string, f: F, mappe...
function noopTracer (line 57) | function noopTracer<F extends Func>(name: string, f: F, mapper?: TraceNa...
FILE: src/debug/loadLazyChunks.ts
function getWebpackChunkMap (line 15) | function getWebpackChunkMap() {
function loadLazyChunks (line 33) | async function loadLazyChunks() {
FILE: src/debug/runReporter.ts
function runReporter (line 14) | async function runReporter() {
FILE: src/globals.d.ts
type Window (line 64) | interface Window extends Record<PropertyKey, any> { }
FILE: src/main/csp/index.ts
type PolicyMap (line 10) | type PolicyMap = Record<string, string[]>;
function initCsp (line 132) | function initCsp() {
FILE: src/main/csp/manager.ts
type CspRequestResult (line 13) | type CspRequestResult = "invalid" | "cancelled" | "unchecked" | "ok" | "...
function registerCspIpcHandlers (line 15) | function registerCspIpcHandlers() {
function validate (line 21) | function validate(url: string, directives: string[]) {
function getMessage (line 36) | function getMessage(url: string, directives: string[], callerName: strin...
function addCspRule (line 71) | async function addCspRule(_: IpcMainInvokeEvent, url: string, directives...
function removeCspRule (line 105) | function removeCspRule(_: IpcMainInvokeEvent, domain: string) {
function isDomainAllowed (line 114) | function isDomainAllowed(_: IpcMainInvokeEvent, url: string, directives:...
FILE: src/main/ipcMain.ts
constant RENDERER_CSS_PATH (line 36) | const RENDERER_CSS_PATH = join(__dirname, IS_VESKTOP ? "vencordDesktopRe...
function ensureSafePath (line 42) | function ensureSafePath(basePath: string, path: string) {
function readCss (line 49) | function readCss() {
function listThemes (line 53) | async function listThemes(): Promise<UserThemeHeader[]> {
function getThemeData (line 70) | function getThemeData(fileName: string) {
FILE: src/main/ipcPlugins.ts
type PluginIpcMappings (line 25) | type PluginIpcMappings = typeof PluginIpcMappings;
FILE: src/main/patchWin32Updater.ts
function isNewer (line 23) | function isNewer($new: string, old: string) {
function patchLatest (line 34) | function patchLatest() {
FILE: src/main/patcher.ts
class BrowserWindow (line 69) | class BrowserWindow extends electron.BrowserWindow {
method constructor (line 70) | constructor(options: BrowserWindowConstructorOptions) {
FILE: src/main/settings.ts
function readSettings (line 18) | function readSettings<T = object>(name: string, file: string): Partial<T> {
type NativeSettings (line 45) | interface NativeSettings {
FILE: src/main/themes/index.ts
type UserThemeHeader (line 24) | interface UserThemeHeader {
function makeHeader (line 36) | function makeHeader(fileName: string, opts: Partial<UserThemeHeader> = {...
function stripBOM (line 50) | function stripBOM(fileContent: string) {
function getThemeInfo (line 57) | function getThemeInfo(css: string, fileName: string): UserThemeHeader {
FILE: src/main/updater/common.ts
constant VENCORD_FILES (line 19) | const VENCORD_FILES = [
function serializeErrors (line 26) | function serializeErrors(func: (...args: any[]) => any) {
FILE: src/main/updater/git.ts
constant VENCORD_SRC_DIR (line 27) | const VENCORD_SRC_DIR = join(__dirname, "..");
function git (line 35) | function git(...args: string[]) {
function getRepo (line 42) | async function getRepo() {
function calculateGitChanges (line 49) | async function calculateGitChanges() {
function pull (line 69) | async function pull() {
function build (line 74) | async function build() {
FILE: src/main/updater/http.ts
constant API_BASE (line 31) | const API_BASE = `https://api.github.com/repos/${gitRemote}`;
function githubGet (line 34) | async function githubGet<T = any>(endpoint: string) {
function calculateGitChanges (line 45) | async function calculateGitChanges() {
function fetchUpdates (line 59) | async function fetchUpdates() {
function applyUpdates (line 75) | async function applyUpdates() {
FILE: src/main/utils/constants.ts
constant DATA_DIR (line 22) | const DATA_DIR = process.env.VENCORD_USER_DATA_DIR ?? (
constant SETTINGS_DIR (line 27) | const SETTINGS_DIR = join(DATA_DIR, "settings");
constant THEMES_DIR (line 28) | const THEMES_DIR = join(DATA_DIR, "themes");
constant QUICK_CSS_PATH (line 29) | const QUICK_CSS_PATH = join(SETTINGS_DIR, "quickCss.css");
constant SETTINGS_FILE (line 30) | const SETTINGS_FILE = join(SETTINGS_DIR, "settings.json");
constant NATIVE_SETTINGS_FILE (line 31) | const NATIVE_SETTINGS_FILE = join(SETTINGS_DIR, "native-settings.json");
constant ALLOWED_PROTOCOLS (line 32) | const ALLOWED_PROTOCOLS = [
constant IS_VANILLA (line 42) | const IS_VANILLA = /* @__PURE__ */ process.argv.includes("--vanilla");
FILE: src/main/utils/crxToZip.ts
function crxToZip (line 11) | function crxToZip(buf: Buffer) {
FILE: src/main/utils/extensions.ts
function extract (line 31) | async function extract(data: Buffer, outDir: string) {
function installExt (line 64) | async function installExt(id: string) {
FILE: src/main/utils/externalLinks.ts
function makeLinksOpenExternally (line 21) | function makeLinksOpenExternally(win: BrowserWindow) {
FILE: src/main/utils/http.ts
type Url (line 23) | type Url = string | URL;
function checkedFetch (line 25) | async function checkedFetch(url: Url, options?: RequestInit) {
function fetchJson (line 49) | async function fetchJson<T = any>(url: Url, options?: RequestInit) {
function fetchBuffer (line 54) | async function fetchBuffer(url: Url, options?: RequestInit) {
function downloadToFile (line 61) | async function downloadToFile(url: Url, path: string, options?: RequestI...
FILE: src/plugins/_api/badges/index.tsx
constant CONTRIBUTOR_BADGE (line 36) | const CONTRIBUTOR_BADGE = "https://cdn.discordapp.com/emojis/10920897991...
function loadBadges (line 48) | async function loadBadges(noCache = false) {
function BadgeContextMenu (line 59) | function BadgeContextMenu({ badge }: { badge: ProfileBadge & BadgeUserAr...
method DonorBadges (line 118) | get DonorBadges() {
method "Refetch Badges" (line 123) | async "Refetch Badges"() {
method start (line 135) | async start() {
method stop (line 142) | async stop() {
method getBadges (line 146) | getBadges(profile: { userId: string; guildId: string; }) {
method getBadgeMouseEventHandlers (line 163) | getBadgeMouseEventHandlers(badge: ProfileBadge & BadgeUserArgs) {
method getDonorBadges (line 176) | getDonorBadges(userId: string) {
FILE: src/plugins/_core/noTrack.ts
method TRACK (line 78) | TRACK(event) {
method start (line 84) | start() {
FILE: src/plugins/_core/settings.tsx
type SectionTypes (line 45) | type SectionTypes = typeof FallbackSectionTypes;
type SettingsLocation (line 47) | type SettingsLocation =
type SettingsLayoutNode (line 55) | interface SettingsLayoutNode {
type EntryOptions (line 68) | interface EntryOptions {
type SettingsLayoutBuilder (line 75) | interface SettingsLayoutBuilder {
method buildEntry (line 154) | buildEntry(options: EntryOptions): SettingsLayoutNode {
method getSettingsSectionMappings (line 182) | getSettingsSectionMappings() {
method buildLayout (line 186) | buildLayout(originalLayoutBuilder: SettingsLayoutBuilder) {
method electronVersion (line 292) | get electronVersion() {
method chromiumVersion (line 296) | get chromiumVersion() {
method additionalInfo (line 307) | get additionalInfo() {
method getInfoRows (line 315) | getInfoRows() {
method getInfoString (line 326) | getInfoString() {
method makeInfoElements (line 330) | makeInfoElements(Component: ComponentType<PropsWithChildren>, props: Pro...
FILE: src/plugins/_core/supportHelper.tsx
function forceUpdate (line 64) | async function forceUpdate() {
function generateDebugInfoMessage (line 74) | async function generateDebugInfoMessage() {
function generatePluginList (line 114) | function generatePluginList() {
method CHANNEL_SELECT (line 172) | async CHANNEL_SELECT({ channelId }) {
method renderMessageAccessory (line 237) | renderMessageAccessory(props) {
FILE: src/plugins/accountPanelServerProfile/index.tsx
type UserProfileProps (line 16) | interface UserProfileProps {
method accountPanelRef (line 89) | get accountPanelRef() {
method grabRef (line 93) | grabRef(ref: React.RefObject<HTMLDivElement>) {
method openAccountPanelContextMenu (line 98) | openAccountPanelContextMenu(event: React.UIEvent) {
method onPopoutClose (line 102) | onPopoutClose() {
FILE: src/plugins/anonymiseFileNames/index.tsx
type Methods (line 29) | const enum Methods {
constant ANONYMISE_UPLOAD_SYMBOL (line 35) | const ANONYMISE_UPLOAD_SYMBOL = Symbol("vcAnonymise");
function onToggleAnonymise (line 95) | function onToggleAnonymise() {
method anonymise (line 113) | anonymise(upload: CloudUpload) {
FILE: src/plugins/appleMusic.desktop/index.tsx
type TrackData (line 16) | interface TrackData {
type AssetImageType (line 31) | const enum AssetImageType {
function setActivity (line 39) | function setActivity(activity: Activity | null) {
function customFormat (line 137) | function customFormat(formatStr: string, data: TrackData) {
function getImageAsset (line 144) | function getImageAsset(type: AssetImageType, data: TrackData) {
method settingsAboutComponent (line 161) | settingsAboutComponent() {
method start (line 172) | start() {
method stop (line 177) | stop() {
method updatePresence (line 182) | updatePresence() {
method getActivity (line 186) | async getActivity(): Promise<Activity | null> {
FILE: src/plugins/appleMusic.desktop/native.ts
function applescript (line 15) | async function applescript(cmds: string[]) {
type RemoteData (line 20) | interface RemoteData {
function fetchRemoteData (line 29) | async function fetchRemoteData({ id, name, artist, album }: { id: string...
function fetchTrackData (line 78) | async function fetchTrackData(): Promise<TrackData | null> {
FILE: src/plugins/arRPC.web/index.tsx
function lookupAsset (line 28) | async function lookupAsset(applicationId: string, key: string): Promise<...
function lookupApp (line 33) | async function lookupApp(applicationId: string): Promise<string> {
method handleEvent (line 56) | async handleEvent(e: MessageEvent<any>) {
method start (line 76) | async start() {
method stop (line 102) | stop() {
FILE: src/plugins/autoDndWhilePlaying.discordDesktop/index.ts
method RUNNING_GAMES_CHANGE (line 48) | RUNNING_GAMES_CHANGE({ games }) {
FILE: src/plugins/betterFolders/FolderSideBar.tsx
function getExpandedFolderIds (line 28) | function getExpandedFolderIds() {
FILE: src/plugins/betterFolders/index.tsx
type FolderIconDisplay (line 32) | enum FolderIconDisplay {
function getGuildFolder (line 45) | function getGuildFolder(id: string) {
function closeFolders (line 49) | function closeFolders() {
function filterTreeWithTargetNode (line 55) | function filterTreeWithTargetNode(children: any, predicate: (node: any) ...
constant IS_BETTER_FOLDERS_VAR (line 133) | const IS_BETTER_FOLDERS_VAR = "typeof isBetterFolders!=='undefined'?isBe...
constant BETTER_FOLDERS_EXPANDED_IDS_VAR (line 134) | const BETTER_FOLDERS_EXPANDED_IDS_VAR = "typeof betterFoldersExpandedIds...
constant GRID_STYLE_NAME (line 135) | const GRID_STYLE_NAME = "vc-betterFolders-sidebar-grid";
method CHANNEL_SELECT (line 278) | CHANNEL_SELECT(data) {
method TOGGLE_GUILD_FOLDER_EXPAND (line 296) | TOGGLE_GUILD_FOLDER_EXPAND(data) {
method LOGOUT (line 313) | LOGOUT() {
method wrapGuildNodeComponent (line 322) | wrapGuildNodeComponent(node: any, originalComponent: () => ReactNode, is...
method makeGuildsBarGuildListFilter (line 338) | makeGuildsBarGuildListFilter(isBetterFolders: boolean) {
method makeGuildsBarSidebarFilter (line 359) | makeGuildsBarSidebarFilter(isBetterFolders: boolean) {
method shouldShowFolderIconAndBackground (line 374) | shouldShowFolderIconAndBackground(isBetterFolders: boolean, expandedFold...
method shouldShowTransition (line 391) | shouldShowTransition(props: any) {
method shouldRenderContents (line 398) | shouldRenderContents(props: any, isExpanded: boolean) {
FILE: src/plugins/betterGifAltText/index.ts
method altify (line 47) | altify(props: any) {
FILE: src/plugins/betterNotes/index.tsx
method noSpellCheck (line 74) | get noSpellCheck() {
FILE: src/plugins/betterRoleContext/index.tsx
function PencilIcon (line 21) | function PencilIcon() {
function AppearanceIcon (line 35) | function AppearanceIcon() {
method start (line 73) | start() {
method "dev-context" (line 79) | "dev-context"(children, { id }: { id: string; }) {
FILE: src/plugins/betterRoleDot/index.ts
method copyToClipBoard (line 87) | copyToClipBoard(color: string) {
FILE: src/plugins/betterSessions/components/RenameButton.tsx
function RenameButton (line 13) | function RenameButton({ session, state }: { session: SessionInfo["sessio...
FILE: src/plugins/betterSessions/components/RenameModal.tsx
function RenameModal (line 25) | function RenameModal({ props, session, state }: { props: ModalProps, ses...
FILE: src/plugins/betterSessions/index.tsx
method checkNewSessions (line 164) | async checkNewSessions() {
method USER_SETTINGS_ACCOUNT_RESET_AND_CLOSE_FORM (line 185) | USER_SETTINGS_ACCOUNT_RESET_AND_CLOSE_FORM() {
method start (line 210) | async start() {
method stop (line 219) | stop() {
FILE: src/plugins/betterSessions/types.ts
type SessionInfo (line 19) | interface SessionInfo {
type Session (line 32) | type Session = SessionInfo["session"];
FILE: src/plugins/betterSessions/utils.ts
function getDefaultName (line 29) | function getDefaultName(clientInfo: SessionInfo["session"]["client_info"...
function saveSessionsToDataStore (line 33) | function saveSessionsToDataStore() {
function fetchNamesFromDataStore (line 37) | async function fetchNamesFromDataStore() {
function GetOsColor (line 44) | function GetOsColor(os: string) {
function GetPlatformIcon (line 61) | function GetPlatformIcon(platform: string) {
FILE: src/plugins/betterSettings/index.tsx
type LayerProps (line 44) | interface LayerProps extends HTMLAttributes<HTMLDivElement> {
function Layer (line 49) | function Layer({ mode, baseLayer = false, ...props }: LayerProps) {
method start (line 83) | start() {
method stop (line 88) | stop() {
method Layer (line 168) | Layer(props: LayerProps) {
method transformSettingsEntries (line 179) | transformSettingsEntries(list) {
FILE: src/plugins/betterUploadButton/index.ts
method getOverrides (line 38) | getOverrides(props: any, onClick: any, onDoubleClick: any) {
FILE: src/plugins/biggerStreamPreview/index.tsx
type UserContextProps (line 30) | interface UserContextProps {
type StreamContextProps (line 43) | interface StreamContextProps {
FILE: src/plugins/biggerStreamPreview/webpack/types/stores.ts
type ApplicationStreamPreviewStore (line 21) | interface ApplicationStreamPreviewStore extends FluxStore {
type ApplicationStream (line 27) | interface ApplicationStream {
type Stream (line 34) | interface Stream extends ApplicationStream {
type RTCStream (line 38) | interface RTCStream {
type StreamMetadata (line 44) | interface StreamMetadata {
type StreamingStoreState (line 50) | interface StreamingStoreState {
type ApplicationStreamingStore (line 60) | interface ApplicationStreamingStore extends FluxStore {
FILE: src/plugins/blurNsfw/index.ts
function setCss (line 27) | function setCss() {
method start (line 67) | start() {
method stop (line 73) | stop() {
FILE: src/plugins/callTimer/index.tsx
function formatDuration (line 28) | function formatDuration(ms: number) {
method renderTimer (line 87) | renderTimer(channelId: string) {
method Timer (line 93) | Timer({ channelId }: { channelId: string; }) {
FILE: src/plugins/clearURLs/index.ts
constant CLEAR_URLS_JSON_URL (line 25) | const CLEAR_URLS_JSON_URL = "https://raw.githubusercontent.com/ClearURLs...
type Provider (line 27) | interface Provider {
type ClearUrlsData (line 38) | interface ClearUrlsData {
type RuleSet (line 42) | interface RuleSet {
method start (line 57) | async start() {
method stop (line 61) | stop() {
method onBeforeMessageSend (line 65) | onBeforeMessageSend(_, msg) {
method onBeforeMessageEdit (line 69) | onBeforeMessageEdit(_cid, _mid, msg) {
method createRules (line 73) | async createRules() {
method replacer (line 96) | replacer(match: string) {
method cleanMessage (line 137) | cleanMessage(msg: MessageObject) {
FILE: src/plugins/clientTheme/components/Settings.tsx
function onPickColor (line 29) | function onPickColor(color: number) {
function setDiscordTheme (line 36) | function setDiscordTheme(theme: string) {
function ThemeSettingsComponent (line 40) | function ThemeSettingsComponent() {
function ResetThemeColorComponent (line 97) | function ResetThemeColorComponent() {
FILE: src/plugins/clientTheme/utils/colorUtils.ts
function hexToHSL (line 8) | function hexToHSL(hexCode: string) {
function relativeLuminance (line 55) | function relativeLuminance(hexCode: string) {
FILE: src/plugins/clientTheme/utils/styleUtils.ts
constant VARS_STYLE_ID (line 11) | const VARS_STYLE_ID = "vc-clientTheme-vars";
constant OVERRIDES_STYLE_ID (line 12) | const OVERRIDES_STYLE_ID = "vc-clientTheme-overrides";
type StyleId (line 13) | type StyleId = typeof VARS_STYLE_ID | typeof OVERRIDES_STYLE_ID;
function createOrUpdateThemeColorVars (line 17) | function createOrUpdateThemeColorVars(color: string) {
function startClientTheme (line 27) | async function startClientTheme(color: string) {
function disableClientTheme (line 32) | function disableClientTheme() {
function getOrCreateStyle (line 39) | function getOrCreateStyle(styleId: StyleId) {
function createOrUpdateStyle (line 46) | function createOrUpdateStyle(styleId: StyleId, css: string) {
function getDiscordStyles (line 54) | async function getDiscordStyles(): Promise<string> {
constant VISUAL_REFRESH_COLORS_VARIABLES_REGEX (line 67) | const VISUAL_REFRESH_COLORS_VARIABLES_REGEX = /(--neutral-\d{1,3}?-hsl):...
function createColorsOverrides (line 69) | function createColorsOverrides(styles: string) {
function generateNewColorVars (line 85) | function generateNewColorVars(colorsLightess: Record<string, number>, ba...
FILE: src/plugins/consoleJanitor/index.tsx
type AllowLevels (line 30) | interface AllowLevels {
type AllowLevelSettingProps (line 39) | interface AllowLevelSettingProps {
function AllowLevelSetting (line 43) | function AllowLevelSetting({ settingKey }: AllowLevelSettingProps) {
method onChange (line 88) | onChange(newVal: string) {
method start (line 114) | start() {
method shouldLog (line 122) | shouldLog(logger: string, level: keyof AllowLevels) {
FILE: src/plugins/consoleShortcuts/index.ts
function makeShortcuts (line 58) | function makeShortcuts() {
function loadAndCacheShortcut (line 200) | function loadAndCacheShortcut(key: string, val: any, forceLoad: boolean) {
method start (line 261) | start() {
method eagerLoad (line 289) | async eagerLoad(forceLoad: boolean) {
method stop (line 303) | stop() {
FILE: src/plugins/consoleShortcuts/native.ts
function initDevtoolsOpenEagerLoad (line 9) | function initDevtoolsOpenEagerLoad(e: IpcMainInvokeEvent) {
FILE: src/plugins/copyEmojiMarkdown/index.tsx
type Emoji (line 16) | interface Emoji {
type Target (line 22) | interface Target {
function getEmojiMarkdown (line 27) | function getEmojiMarkdown(target: Target, copyUnicode: boolean): string {
method "expression-picker" (line 58) | "expression-picker"(children, { target }: { target: Target; }) {
FILE: src/plugins/copyStickerLinks/index.tsx
type PartialSticker (line 30) | type PartialSticker = Pick<Sticker, "id" | "format_type">;
function getUrl (line 32) | function getUrl(data: PartialSticker): string {
function buildMenuItem (line 39) | function buildMenuItem(sticker: PartialSticker, addBottomSeparator: bool...
FILE: src/plugins/copyUserURLs/index.tsx
type UserContextProps (line 27) | interface UserContextProps {
FILE: src/plugins/crashHandler/index.ts
method handleCrash (line 78) | handleCrash(_this: any, errorState: any) {
method handlePreventCrash (line 131) | handlePreventCrash(_this: any) {
FILE: src/plugins/ctrlEnterSend/index.ts
method shouldSubmit (line 59) | shouldSubmit(event: KeyboardEvent, codeblock: boolean): boolean {
FILE: src/plugins/customCommands/CreateTagModal.tsx
function openCreateTagModal (line 23) | function openCreateTagModal(initialValue: Tag = { name: "", message: "" ...
constant EXAMPLE_RESPONSE (line 29) | const EXAMPLE_RESPONSE = "Hello {{user}}! I am feeling {{mood = great}}.";
function Modal (line 31) | function Modal({ initialValue, modalProps }: { initialValue: Tag; modalP...
FILE: src/plugins/customCommands/SettingsTagList.tsx
function SettingsTagList (line 18) | function SettingsTagList() {
FILE: src/plugins/customCommands/index.ts
function parseTagArguments (line 34) | function parseTagArguments(message: string) {
function registerTagCommand (line 49) | function registerTagCommand(tag: Tag) {
method start (line 98) | async start() {
method execute (line 137) | async execute(args, ctx) {
FILE: src/plugins/customCommands/settings.ts
type Tag (line 25) | interface Tag {
function getTags (line 30) | function getTags() {
function getTag (line 34) | function getTag(name: string) {
function addTag (line 38) | function addTag(tag: Tag) {
function removeTag (line 45) | function removeTag(name: string) {
FILE: src/plugins/customIdle/index.ts
method handleOnline (line 54) | handleOnline() {
method getIdleTimeout (line 78) | getIdleTimeout() { // milliseconds, default is 6e5
FILE: src/plugins/customRPC/RpcSettings.tsx
type SettingsKey (line 22) | type SettingsKey = keyof typeof settings.store;
type TextOption (line 24) | interface TextOption<T> {
type SelectOption (line 32) | interface SelectOption<T> {
function isAppIdValid (line 47) | function isAppIdValid(value: string) {
function isStreamLinkDisabled (line 57) | function isStreamLinkDisabled() {
function isStreamLinkValid (line 61) | function isStreamLinkValid(value: string) {
function parseNumber (line 67) | function parseNumber(value: string) {
function isNumberValid (line 71) | function isNumberValid(value: number) {
function isUrlValid (line 77) | function isUrlValid(value: string) {
function isImageKeyValid (line 82) | function isImageKeyValid(value: string) {
function PairSetting (line 89) | function PairSetting<T>(props: { data: [TextOption<T>, TextOption<T>]; }) {
function SingleSetting (line 100) | function SingleSetting<T>({ settingsKey, label, disabled, isValid, trans...
function SelectSetting (line 133) | function SelectSetting<T>({ settingsKey, label, options, disabled }: Sel...
function RPCSettings (line 151) | function RPCSettings() {
FILE: src/plugins/customRPC/index.tsx
function getApplicationAsset (line 43) | async function getApplicationAsset(key: string): Promise<string> {
type TimestampMode (line 47) | const enum TimestampMode {
function createActivity (line 85) | async function createActivity(): Promise<Activity | undefined> {
function setRpc (line 203) | async function setRpc(disable?: boolean) {
FILE: src/plugins/dearrow/index.tsx
type Props (line 17) | interface Props {
type ReplaceElements (line 38) | const enum ReplaceElements {
function embedDidMount (line 46) | async function embedDidMount(this: Component<Props>) {
function DearrowButton (line 90) | function DearrowButton({ component }: { component: Component<Props>; }) {
method renderButton (line 178) | renderButton(component: Component<Props>) {
FILE: src/plugins/decor/index.tsx
type AvatarDecoration (line 22) | interface AvatarDecoration {
method DecorationGridItem (line 132) | set DecorationGridItem(e: any) {
method DecorationGridDecoration (line 136) | set DecorationGridDecoration(e: any) {
method start (line 145) | async start() {
method getDecorAvatarDecorationURL (line 149) | getDecorAvatarDecorationURL({ avatarDecoration, canAnimate }: { avatarDe...
FILE: src/plugins/decor/lib/api.ts
type Preset (line 10) | interface Preset {
type Decoration (line 18) | interface Decoration {
type NewDecoration (line 27) | interface NewDecoration {
function fetchApi (line 32) | async function fetchApi(url: RequestInfo, options?: RequestInit) {
FILE: src/plugins/decor/lib/constants.ts
constant BASE_URL (line 7) | const BASE_URL = "https://decor.fieryflames.dev";
constant API_URL (line 8) | const API_URL = BASE_URL + "/api";
constant AUTHORIZE_URL (line 9) | const AUTHORIZE_URL = API_URL + "/authorize";
constant CDN_URL (line 10) | const CDN_URL = "https://ugc.decor.fieryflames.dev";
constant CLIENT_ID (line 11) | const CLIENT_ID = "1096966363416899624";
constant SKU_ID (line 12) | const SKU_ID = "100101099111114";
constant RAW_SKU_ID (line 13) | const RAW_SKU_ID = "11497119";
constant GUILD_ID (line 14) | const GUILD_ID = "1096357702931841148";
constant INVITE_KEY (line 15) | const INVITE_KEY = "dXp2SdxDcP";
constant DECORATION_FETCH_COOLDOWN (line 16) | const DECORATION_FETCH_COOLDOWN = 1000 * 60 * 60 * 4;
FILE: src/plugins/decor/lib/stores/AuthorizationStore.tsx
type AuthorizationState (line 14) | interface AuthorizationState {
method getItem (line 25) | async getItem(name: string): Promise<string | null> {
method setItem (line 28) | async setItem(name: string, value: string): Promise<void> {
method removeItem (line 31) | async removeItem(name: string): Promise<void> {
method authorize (line 52) | async authorize() {
FILE: src/plugins/decor/lib/stores/CurrentUserDecorationsStore.ts
type UserDecorationsState (line 14) | interface UserDecorationsState {
method fetch (line 27) | async fetch() {
method create (line 33) | async create(newDecoration: NewDecoration) {
method delete (line 37) | async delete(decoration: Decoration | string) {
method select (line 49) | async select(decoration: Decoration | null) {
FILE: src/plugins/decor/lib/stores/UsersDecorationsStore.ts
type UserDecorationData (line 15) | interface UserDecorationData {
type UsersDecorationsState (line 20) | interface UsersDecorationsState {
method fetch (line 55) | async fetch(userId: string, force: boolean = false) {
method fetchMany (line 66) | async fetchMany(userIds) {
method get (line 84) | get(userId: string) { return get().usersDecorations.get(userId); }
method getAsset (line 85) | getAsset(userId: string) { return get().usersDecorations.get(userId)?.as...
method has (line 86) | has(userId: string) { return get().usersDecorations.has(userId); }
method set (line 87) | set(userId: string, decoration: string | null) {
function useUserDecorAvatarDecoration (line 96) | function useUserDecorAvatarDecoration(user?: User): AvatarDecoration | n...
FILE: src/plugins/decor/lib/utils/decoration.ts
function decorationToAsset (line 11) | function decorationToAsset(decoration: Decoration) {
function decorationToAvatarDecoration (line 15) | function decorationToAvatarDecoration(decoration: Decoration): AvatarDec...
FILE: src/plugins/decor/settings.tsx
method component (line 21) | component() {
FILE: src/plugins/decor/ui/components/DecorDecorationGridDecoration.tsx
type DecorDecorationGridDecorationProps (line 15) | interface DecorDecorationGridDecorationProps extends HTMLProps<HTMLDivEl...
function DecorDecorationGridDecoration (line 21) | function DecorDecorationGridDecoration(props: DecorDecorationGridDecorat...
FILE: src/plugins/decor/ui/components/DecorSection.tsx
type DecorSectionProps (line 18) | interface DecorSectionProps {
function DecorSection (line 24) | function DecorSection({ hideTitle = false, hideDivider = false, noMargin...
FILE: src/plugins/decor/ui/components/DecorationContextMenu.tsx
function DecorationContextMenu (line 14) | function DecorationContextMenu({ decoration }: { decoration: Decoration;...
FILE: src/plugins/decor/ui/components/DecorationGridCreate.tsx
type DecorationGridCreateProps (line 14) | type DecorationGridCreateProps = HTMLProps<HTMLDivElement> & {
function DecorationGridCreate (line 18) | function DecorationGridCreate(props: DecorationGridCreateProps) {
FILE: src/plugins/decor/ui/components/DecorationGridNone.tsx
type DecorationGridNoneProps (line 14) | type DecorationGridNoneProps = HTMLProps<HTMLDivElement> & {
function DecorationGridNone (line 19) | function DecorationGridNone(props: DecorationGridNoneProps) {
FILE: src/plugins/decor/ui/components/Grid.tsx
type GridProps (line 11) | interface GridProps<ItemT> {
function Grid (line 18) | function Grid<ItemT,>({ renderItem, getItemKey, itemKeyPrefix: ikp, item...
FILE: src/plugins/decor/ui/components/SectionedGridList.tsx
type Section (line 17) | type Section<SectionT, ItemT> = SectionT & {
type SectionedGridListProps (line 21) | interface SectionedGridListProps<ItemT, SectionT, SectionU = Section<Sec...
function SectionedGridList (line 27) | function SectionedGridList<ItemT, SectionU,>(props: SectionedGridListPro...
FILE: src/plugins/decor/ui/components/index.ts
type DecorationGridItemComponent (line 11) | type DecorationGridItemComponent = ComponentType<PropsWithChildren<HTMLP...
type DecorationGridDecorationComponent (line 21) | type DecorationGridDecorationComponent = React.ComponentType<HTMLProps<H...
FILE: src/plugins/decor/ui/modals/ChangeDecorationModal.tsx
function usePresets (line 32) | function usePresets() {
type Section (line 38) | interface Section {
type SectionHeaderProps (line 46) | interface SectionHeaderProps {
function SectionHeader (line 52) | function SectionHeader({ section }: SectionHeaderProps) {
function ChangeDecorationModal (line 93) | function ChangeDecorationModal(props: ModalProps) {
FILE: src/plugins/decor/ui/modals/CreateDecorationModal.tsx
function useObjectURL (line 26) | function useObjectURL(object: Blob | MediaSource | null) {
function CreateDecorationModal (line 44) | function CreateDecorationModal(props: ModalProps) {
FILE: src/plugins/decor/ui/modals/GuidelinesModal.tsx
function GuidelinesModal (line 16) | function GuidelinesModal(props: ModalProps) {
FILE: src/plugins/devCompanion.dev/index.tsx
constant PORT (line 27) | const PORT = 8485;
type Node (line 33) | type Node = StringNode | RegexNode | FunctionNode;
type StringNode (line 35) | interface StringNode {
type RegexNode (line 40) | interface RegexNode {
type FunctionNode (line 48) | interface FunctionNode {
type PatchData (line 53) | interface PatchData {
type FindData (line 61) | interface FindData {
function parseNode (line 74) | function parseNode(node: Node) {
function initWs (line 90) | function initWs(isManual = false) {
method "Reconnect" (line 254) | "Reconnect"() {
method start (line 260) | start() {
method stop (line 264) | stop() {
FILE: src/plugins/disableCallIdle/index.ts
method noop (line 43) | noop() { }
FILE: src/plugins/dontRoundMyTimestamps/index.ts
method start (line 28) | start() {
method stop (line 32) | stop() {
FILE: src/plugins/expressionCloner/index.tsx
type Sticker (line 38) | interface Sticker extends GuildSticker {
type Emoji (line 42) | interface Emoji {
type Data (line 49) | type Data = Emoji | Sticker;
constant MAX_EMOJI_SIZE_BYTES (line 65) | const MAX_EMOJI_SIZE_BYTES = 256 * 1024;
constant MAX_STICKER_SIZE_BYTES (line 66) | const MAX_STICKER_SIZE_BYTES = 512 * 1024;
function getGuildMaxStickerSlots (line 68) | function getGuildMaxStickerSlots(guild: Guild) {
function getUrl (line 75) | function getUrl(data: Data, size: number) {
function fetchSticker (line 82) | async function fetchSticker(id: string) {
function cloneSticker (line 98) | async function cloneSticker(guildId: string, sticker: Sticker) {
function cloneEmoji (line 120) | async function cloneEmoji(guildId: string, emoji: Emoji) {
function getGuildCandidates (line 136) | function getGuildCandidates(data: Data) {
function fetchBlob (line 167) | async function fetchBlob(data: Data) {
function doClone (line 186) | async function doClone(guildId: string, data: Sticker | Emoji) {
function CloneModal (line 221) | function CloneModal({ data }: { data: Sticker | Emoji; }) {
function buildMenuItem (line 319) | function buildMenuItem(type: "Emoji" | "Sticker", fetchData: () => Promi...
function isGifUrl (line 356) | function isGifUrl(url: string) {
FILE: src/plugins/f8break/index.ts
method start (line 27) | start() {
method stop (line 31) | stop() {
method event (line 35) | event(e: KeyboardEvent) {
FILE: src/plugins/fakeNitro/index.tsx
constant BINARY_READ_OPTIONS (line 33) | const BINARY_READ_OPTIONS = findByPropsLazy("readerFactory");
function searchProtoClassField (line 35) | function searchProtoClassField(localName: string, protoClass: any) {
type EmojiIntentions (line 49) | const enum EmojiIntentions {
constant IS_BYPASSEABLE_INTENTION (line 64) | const IS_BYPASSEABLE_INTENTION = `[${EmojiIntentions.CHAT},${EmojiIntent...
type FakeNoticeType (line 66) | const enum FakeNoticeType {
function hasPermission (line 141) | function hasPermission(channelId: string, permission: bigint) {
function makeBypassPatches (line 154) | function makeBypassPatches(): Omit<Patch, "plugin"> {
method guildId (line 376) | get guildId() {
method canUseEmotes (line 380) | get canUseEmotes() {
method canUseStickers (line 384) | get canUseStickers() {
method handleProtoChange (line 388) | handleProtoChange(proto: any, user: any) {
method handleGradientThemeSelect (line 412) | handleGradientThemeSelect(backgroundGradientPresetId: number | undefined...
method trimContent (line 449) | trimContent(content: Array<any>) {
method clearEmptyArrayItems (line 470) | clearEmptyArrayItems(array: Array<any>) {
method ensureChildrenIsArray (line 474) | ensureChildrenIsArray(child: ReactElement<any>) {
method patchFakeNitroEmojisOrRemoveStickersLinks (line 478) | patchFakeNitroEmojisOrRemoveStickersLinks(content: Array<any>, inline: b...
method patchFakeNitroStickers (line 581) | patchFakeNitroStickers(stickers: Array<any>, message: Message) {
method shouldIgnoreEmbed (line 628) | shouldIgnoreEmbed(embed: Message["embeds"][number], message: Message) {
method filterAttachments (line 666) | filterAttachments(attachments: Message["attachments"]) {
method shouldKeepEmojiLink (line 680) | shouldKeepEmojiLink(link: any) {
method addFakeNotice (line 684) | addFakeNotice(type: FakeNoticeType, node: Array<ReactNode>, fake: boolea...
method getStickerLink (line 703) | getStickerLink({ format_type, id }: Sticker) {
method sendAnimatedSticker (line 708) | async sendAnimatedSticker(stickerLink: string, stickerId: string, channe...
method canUseEmote (line 765) | canUseEmote(e: Emoji, channelId: string) {
method start (line 783) | start() {
method stop (line 936) | stop() {
FILE: src/plugins/fakeProfileThemes/index.tsx
type Colors (line 37) | interface Colors {
function encode (line 42) | function encode(primary: number, accent: number): string {
function decode (line 55) | function decode(bio: string): Array<number> | null {
type ProfileModalProps (line 91) | interface ProfileModalProps {
function SettingsAboutComponentWrapper (line 104) | function SettingsAboutComponentWrapper() {
function SettingsAboutComponent (line 110) | function SettingsAboutComponent() {
method colorDecodeHook (line 220) | colorDecodeHook(user: UserProfile) {
FILE: src/plugins/favEmojiFirst/index.ts
type EmojiAutocompleteState (line 24) | interface EmojiAutocompleteState {
method sortEmojis (line 68) | sortEmojis({ query }: EmojiAutocompleteState) {
FILE: src/plugins/favGifSearch/index.tsx
type SearchBarComponentProps (line 25) | interface SearchBarComponentProps {
type TSearchBarComponent (line 36) | type TSearchBarComponent =
type Gif (line 39) | interface Gif {
type Instance (line 48) | interface Instance {
method renderSearchBar (line 114) | renderSearchBar(instance: Instance, SearchBarComponent: TSearchBarCompon...
method getFav (line 123) | getFav(favorites: Gif[]) {
function SearchBar (line 133) | function SearchBar({ instance, SearchBarComponent }: { instance: Instanc...
function getTargetString (line 198) | function getTargetString(urlStr: string) {
function fuzzySearch (line 226) | function fuzzySearch(searchQuery: string, searchString: string) {
FILE: src/plugins/fixImagesQuality/index.tsx
method settingsAboutComponent (line 40) | settingsAboutComponent() {
method getSrc (line 63) | getSrc(props: { src: string; width: number; height: number; contentType:...
FILE: src/plugins/fixSpotifyEmbeds.desktop/native.ts
function cleanUpAndGetSpotifyFrames (line 13) | function cleanUpAndGetSpotifyFrames() {
FILE: src/plugins/forceOwnerCrown/index.ts
method isGuildOwner (line 37) | isGuildOwner(props: { user: User, channel: Channel, isOwner: boolean, gu...
FILE: src/plugins/fullSearchContext/index.tsx
type CopyIdMenuItemProps (line 31) | interface CopyIdMenuItemProps {
function MessageMenu (line 39) | function MessageMenu({ message, channel, onHeightUpdate }) {
type MessageActionsProps (line 66) | interface MessageActionsProps {
method handleContextMenu (line 94) | handleContextMenu(event: React.MouseEvent, message: Message) {
FILE: src/plugins/fullUserInChatbox/index.tsx
type UserMentionComponentProps (line 16) | interface UserMentionComponentProps {
FILE: src/plugins/gameActivityToggle/index.tsx
method hidden (line 48) | get hidden() {
function Icon (line 54) | function Icon() {
function GameActivityToggleButton (line 85) | function GameActivityToggleButton(props: { nameplate?: any; }) {
method toolboxActions (line 123) | toolboxActions() {
FILE: src/plugins/gifPaste/index.ts
method handleSelect (line 37) | handleSelect(gif?: { url: string; }) {
FILE: src/plugins/greetStickerPicker/index.tsx
type GreetMode (line 26) | enum GreetMode {
constant WELCOME_STICKERS (line 45) | const WELCOME_STICKERS = findLazy(m => Array.isArray(m) && m[0]?.name ==...
function greet (line 47) | function greet(channel: Channel, message: Message, stickers: string[]) {
function GreetMenu (line 71) | function GreetMenu({ channel, message }: { message: Message, channel: Ch...
method pickSticker (line 170) | pickSticker(
FILE: src/plugins/hideAttachments/index.tsx
constant KEY (line 31) | const KEY = "HideAttachments_HiddenIds";
function getHiddenMessages (line 35) | async function getHiddenMessages() {
function toggleHide (line 46) | async function toggleHide(channelId: string, messageId: string) {
method render (line 71) | render(msg) {
method renderMessageAccessory (line 86) | renderMessageAccessory({ message }) {
method start (line 96) | async start() {
method stop (line 100) | stop() {
method shouldHide (line 104) | shouldHide(messageId: string) {
FILE: src/plugins/ignoreActivities/index.tsx
type ActivitiesTypes (line 16) | const enum ActivitiesTypes {
type IgnoredActivity (line 21) | interface IgnoredActivity {
type FilterMode (line 27) | const enum FilterMode {
function ToggleIcon (line 34) | function ToggleIcon(activity: IgnoredActivity, tooltipText: string, path...
function ToggleActivityComponent (line 59) | function ToggleActivityComponent(activity: IgnoredActivity, isPlaying = ...
function handleActivityToggle (line 67) | function handleActivityToggle(e: React.MouseEvent<HTMLButtonElement, Mou...
function recalculateActivities (line 75) | function recalculateActivities() {
function ImportCustomRPCComponent (line 79) | function ImportCustomRPCComponent() {
function IdsListComponent (line 106) | function IdsListComponent(props: { setValue: (value: string) => void; }) {
method onChange (line 168) | onChange(newValue: string) {
function isActivityTypeIgnored (line 212) | function isActivityTypeIgnored(type: number, id?: string) {
method start (line 271) | async start() {
method isActivityNotIgnored (line 285) | isActivityNotIgnored(props: { type: number; application_id?: string; nam...
method renderToggleGameActivityButton (line 300) | renderToggleGameActivityButton(props: { id?: string; name: string, exePa...
method renderToggleActivityButton (line 310) | renderToggleActivityButton(props: { id: string; name: string; }) {
FILE: src/plugins/imageFilename/index.ts
method getTitle (line 38) | getTitle(src: string) {
FILE: src/plugins/imageZoom/components/Magnifier.tsx
type Vec2 (line 26) | interface Vec2 {
type MagnifierProps (line 31) | interface MagnifierProps {
FILE: src/plugins/imageZoom/constants.ts
constant ELEMENT_ID (line 19) | const ELEMENT_ID = "vc-imgzoom-magnify-modal";
FILE: src/plugins/imageZoom/index.tsx
method makeProps (line 224) | makeProps(instance) {
method renderMagnifier (line 234) | renderMagnifier(instance) {
method updateMagnifier (line 248) | updateMagnifier(instance) {
method unMountMagnifier (line 253) | unMountMagnifier() {
method onMouseOver (line 259) | onMouseOver(instance) {
method onMouseOut (line 262) | onMouseOut(instance) {
method onMouseDown (line 265) | onMouseDown(e: React.MouseEvent, instance) {
method onMouseUp (line 269) | onMouseUp(instance) {
method start (line 273) | start() {
method stop (line 279) | stop() {
FILE: src/plugins/imageZoom/utils/waitFor.ts
function waitFor (line 19) | function waitFor(condition: () => boolean, cb: () => void) {
FILE: src/plugins/implicitRelationships/index.ts
method wrapSort (line 119) | wrapSort(comparator: Function, row: any) {
method fetchImplicitRelationships (line 125) | async fetchImplicitRelationships() {
method start (line 173) | start() {
FILE: src/plugins/ircColors/index.ts
function calculateNameColorForUser (line 26) | function calculateNameColorForUser(id?: string) {
method wrapMessageColorProps (line 84) | wrapMessageColorProps(colorProps: { colorString: string, colorStrings?: ...
method calculateNameColorForMessageContext (line 106) | calculateNameColorForMessageContext(context: any) {
method calculateNameColorForListContext (line 124) | calculateNameColorForListContext(context: any) {
FILE: src/plugins/keepCurrentChannel/index.ts
type LogoutEvent (line 24) | interface LogoutEvent {
type ChannelSelectEvent (line 29) | interface ChannelSelectEvent {
type PreviousChannel (line 35) | interface PreviousChannel {
method LOGOUT (line 59) | LOGOUT(e: LogoutEvent) {
method CONNECTION_OPEN (line 63) | CONNECTION_OPEN() {
method CHANNEL_SELECT (line 76) | async CHANNEL_SELECT({ guildId, channelId }: ChannelSelectEvent) {
method start (line 87) | async start() {
FILE: src/plugins/lastfmRichPresence/index.tsx
type TrackData (line 32) | interface TrackData {
type NameFormat (line 40) | const enum NameFormat {
constant API_KEY (line 50) | const API_KEY = "790c37d90400163a5a5fe00d6ca32ef0";
constant DISCORD_APP_ID (line 51) | const DISCORD_APP_ID = "1108588077900898414";
constant LASTFM_PLACEHOLDER_IMAGE_HASH (line 52) | const LASTFM_PLACEHOLDER_IMAGE_HASH = "2a96cbd8b46e442fc41c2b86b821562f";
function getApplicationAsset (line 56) | async function getApplicationAsset(key: string): Promise<string> {
function setActivity (line 60) | function setActivity(activity: Activity | null) {
method settingsAboutComponent (line 186) | settingsAboutComponent() {
method start (line 196) | start() {
method stop (line 201) | stop() {
method fetchTrackData (line 205) | async fetchTrackData(): Promise<TrackData | null> {
method updatePresence (line 247) | async updatePresence() {
method getLargeImage (line 251) | getLargeImage(track: TrackData): string | undefined {
method getActivity (line 259) | async getActivity(): Promise<Activity | null> {
FILE: src/plugins/loadingQuotes/index.ts
method mutateQuotes (line 81) | mutateQuotes(quotes: string[]) {
FILE: src/plugins/memberCount/CircleIcon.tsx
function CircleIcon (line 7) | function CircleIcon({ className }: { className?: string; }) {
FILE: src/plugins/memberCount/MemberCount.tsx
function MemberCount (line 16) | function MemberCount({ isTooltip, tooltipGuildId }: { isTooltip?: true; ...
FILE: src/plugins/memberCount/OnlineMemberCountStore.ts
class OnlineMemberCountStore (line 17) | class OnlineMemberCountStore extends Flux.Store {
method getCount (line 18) | getCount(guildId?: string) {
method _ensureCount (line 22) | async _ensureCount(guildId: string) {
method ensureCount (line 28) | ensureCount(guildId?: string) {
method GUILD_MEMBER_LIST_UPDATE (line 42) | GUILD_MEMBER_LIST_UPDATE({ guildId, groups }: { guildId: string, groups:...
method ONLINE_GUILD_MEMBER_COUNT_UPDATE (line 48) | ONLINE_GUILD_MEMBER_COUNT_UPDATE({ guildId, count }) {
FILE: src/plugins/memberCount/VoiceIcon.tsx
function VoiceIcon (line 7) | function VoiceIcon({ className }: { className?: string; }) {
FILE: src/plugins/mentionAvatars/index.tsx
function DefaultRoleIcon (line 24) | function DefaultRoleIcon() {
function getUsernameString (line 105) | function getUsernameString(username: string) {
FILE: src/plugins/messageClickActions/index.ts
method start (line 66) | start() {
method stop (line 72) | stop() {
method onMessageClick (line 78) | onMessageClick(msg, channel, event) {
FILE: src/plugins/messageLatency/index.tsx
type FillValue (line 15) | type FillValue = ("status-danger" | "status-warning" | "status-positive"...
type Fill (line 16) | type Fill = [FillValue, FillValue, FillValue];
type DiffKey (line 17) | type DiffKey = keyof Diff;
type Diff (line 19) | interface Diff {
constant DISCORD_KT_DELAY (line 27) | const DISCORD_KT_DELAY = 1471228928;
method stringDelta (line 67) | stringDelta(delta: number, showMillis: boolean) {
method latencyTooltipData (line 96) | latencyTooltipData(message: Message) {
method Tooltip (line 145) | Tooltip() {
method Icon (line 167) | Icon({ delta, fill, props }: {
FILE: src/plugins/messageLinkEmbeds/index.tsx
type Attachment (line 62) | interface Attachment {
type MessageEmbedProps (line 69) | interface MessageEmbedProps {
function fetchMessage (line 132) | async function fetchMessage(channelID: string, messageID: string) {
function getImages (line 162) | function getImages(message: Message): Attachment[] {
function noContent (line 189) | function noContent(attachments: number, embeds: number) {
function requiresRichEmbed (line 196) | function requiresRichEmbed(message: Message) {
function computeWidthAndHeight (line 204) | function computeWidthAndHeight(width: number, height: number) {
function withEmbeddedBy (line 217) | function withEmbeddedBy(message: Message, embeddedBy: string[]) {
function MessageEmbedAccessory (line 228) | function MessageEmbedAccessory({ message }: { message: Message; }) {
function getChannelLabelAndIconUrl (line 281) | function getChannelLabelAndIconUrl(channel: Channel) {
function ChannelMessageEmbedAccessory (line 287) | function ChannelMessageEmbedAccessory({ message, channel }: MessageEmbed...
function AutomodEmbedAccessory (line 322) | function AutomodEmbedAccessory(props: MessageEmbedProps): JSX.Element | ...
method start (line 375) | start() {
method stop (line 391) | stop() {
FILE: src/plugins/messageLogger/HistoryModal.tsx
function openHistoryModal (line 23) | function openHistoryModal(message: any) {
function HistoryModal (line 34) | function HistoryModal({ modalProps, message }: { modalProps: ModalProps;...
FILE: src/plugins/messageLogger/index.tsx
type MLMessage (line 39) | interface MLMessage extends Message {
function addDeleteStyle (line 47) | function addDeleteStyle() {
constant REMOVE_HISTORY_ID (line 57) | const REMOVE_HISTORY_ID = "ml-remove-history";
constant TOGGLE_DELETE_STYLE_ID (line 58) | const TOGGLE_DELETE_STYLE_ID = "ml-toggle-style";
function parseEditContent (line 132) | function parseEditContent(content: string, message: Message) {
method start (line 158) | start() {
method makeEdit (line 188) | makeEdit(newMessage: any, oldMessage: any): any {
method handleDelete (line 257) | handleDelete(cache: any, data: { ids: string[], id: string; mlDeleted?: ...
method shouldIgnore (line 290) | shouldIgnore(message: any, isEdit = false) {
method EditMarker (line 309) | EditMarker({ message, className, children, ...props }: any) {
FILE: src/plugins/moreQuickReactions/index.ts
method reactionCount (line 25) | get reactionCount() {
FILE: src/plugins/mutualGroupDMs/index.tsx
function getGroupDMName (line 40) | function getGroupDMName(channel: Channel) {
function getMutualGDMCountText (line 55) | function getMutualGDMCountText(user: User) {
function renderClickableGDMs (line 60) | function renderClickableGDMs(mutualDms: Channel[], onClose: () => void) {
constant IS_PATCHED (line 84) | const IS_PATCHED = Symbol("MutualGroupDMs.Patched");
method getMutualGroupDms (line 147) | getMutualGroupDms(userId: string) {
method pushSection (line 157) | pushSection(sections: any[], user: User) {
FILE: src/plugins/newGuildSettings/index.tsx
function applyDefaultSettings (line 97) | function applyDefaultSettings(guildId: string | null) {
method GUILD_JOIN_REQUEST_UPDATE (line 146) | GUILD_JOIN_REQUEST_UPDATE({ guildId, request, status }) {
FILE: src/plugins/noBlockedMessages/index.ts
type MessageDeleteProps (line 27) | interface MessageDeleteProps {
method shouldIgnoreMessage (line 80) | shouldIgnoreMessage(message: Message) {
method shouldHide (line 92) | shouldHide(props: MessageDeleteProps): boolean {
FILE: src/plugins/noPendingCount/index.ts
method getRealMessageRequestCount (line 96) | getRealMessageRequestCount() {
FILE: src/plugins/noReplyMention/index.tsx
method shouldMention (line 68) | shouldMention(message: Message, isHoldingShift: boolean) {
FILE: src/plugins/noServerEmojis/index.ts
method shouldSkip (line 41) | shouldSkip(channel: Channel | undefined | null, emoji: Emoji) {
FILE: src/plugins/onePingPerDM/index.ts
method isPrivateChannelRead (line 56) | isPrivateChannelRead(message: MessageJSON) {
FILE: src/plugins/oneko/index.ts
method start (line 28) | start() {
method stop (line 36) | stop() {
FILE: src/plugins/openInApp/index.ts
type URLReplacementRule (line 25) | interface URLReplacementRule {
method handleLink (line 119) | async handleLink(data: { href: string; }, event?: MouseEvent) {
method handleAccountView (line 153) | handleAccountView(e: MouseEvent, platformType: string, userId: string) {
FILE: src/plugins/openInApp/native.ts
function getRedirect (line 13) | function getRedirect(url: string) {
function resolveRedirect (line 27) | async function resolveRedirect(_: IpcMainInvokeEvent, url: string) {
FILE: src/plugins/pauseInvitesForever/index.tsx
function showDisableInvites (line 25) | function showDisableInvites(guildId: string) {
function disableInvites (line 35) | function disableInvites(guildId: string) {
FILE: src/plugins/permissionsViewer/components/RolesAndUsersPermissions.tsx
type PermissionType (line 33) | const enum PermissionType {
type RoleOrUserPermission (line 39) | interface RoleOrUserPermission {
type GetRoleIconData (line 47) | type GetRoleIconData = (role: Role, size: number) => { customIconSrc?: s...
function getRoleIconSrc (line 50) | function getRoleIconSrc(role: Role) {
function RolesAndUsersPermissionsComponent (line 58) | function RolesAndUsersPermissionsComponent({ permissions, guild, modalPr...
function RoleContextMenu (line 220) | function RoleContextMenu({ guild, roleId, onClose }: { guild: Guild; rol...
function UserContextMenu (line 261) | function UserContextMenu({ userId }: { userId: string; }) {
function openRolesAndUsersPermissionsModal (line 281) | function openRolesAndUsersPermissionsModal(permissions: Array<RoleOrUser...
FILE: src/plugins/permissionsViewer/components/UserPermissions.tsx
type UserPermission (line 31) | interface UserPermission {
type UserPermissions (line 38) | type UserPermissions = Array<UserPermission>;
type FakeRoleProps (line 43) | interface FakeRoleProps extends React.HTMLAttributes<HTMLDivElement> {
function FakeRole (line 48) | function FakeRole({ text, color, ...props }: FakeRoleProps) {
type GrantedByTooltipProps (line 69) | interface GrantedByTooltipProps {
function GrantedByTooltip (line 74) | function GrantedByTooltip({ roleName, roleColor }: GrantedByTooltipProps) {
function UserPermissionsComponent (line 83) | function UserPermissionsComponent({ guild, guildMember, closePopout }: {...
FILE: src/plugins/permissionsViewer/components/icons.tsx
function PermissionDeniedIcon (line 19) | function PermissionDeniedIcon() {
function PermissionAllowedIcon (line 32) | function PermissionAllowedIcon() {
function PermissionDefaultIcon (line 45) | function PermissionDefaultIcon() {
FILE: src/plugins/permissionsViewer/index.tsx
type PermissionsSortOrder (line 39) | const enum PermissionsSortOrder {
type MenuItemParentType (line 44) | const enum MenuItemParentType {
function MenuItem (line 61) | function MenuItem(guildId: string, id?: string, type?: MenuItemParentTyp...
function makeContextMenuPatch (line 127) | function makeContextMenuPatch(childId: string | string[], type?: MenuIte...
FILE: src/plugins/permissionsViewer/utils.ts
function getSortedRolesForMember (line 31) | function getSortedRolesForMember({ id: guildId }: Guild, member: GuildMe...
function sortUserRoles (line 38) | function sortUserRoles(roles: Role[]) {
function sortPermissionOverwrites (line 49) | function sortPermissionOverwrites<T extends { id: string; type: number; ...
FILE: src/plugins/petpet/index.ts
constant DEFAULT_DELAY (line 27) | const DEFAULT_DELAY = 20;
constant DEFAULT_RESOLUTION (line 28) | const DEFAULT_RESOLUTION = 128;
constant FRAMES (line 29) | const FRAMES = 10;
function loadImage (line 38) | function loadImage(source: File | string) {
function resolveImage (line 55) | async function resolveImage(options: CommandArgument[], ctx: CommandCont...
function rgb888_to_rgb565 (line 85) | function rgb888_to_rgb565(r: number, g: number, b: number): number {
function applyPaletteTransparent (line 89) | function applyPaletteTransparent(data: Uint8Array | Uint8ClampedArray, p...
FILE: src/plugins/pictureInPicture/index.tsx
function launchPiP (line 61) | function launchPiP() {
FILE: src/plugins/pinDms/components/CreateCategoryModal.tsx
type ColorPickerWithSwatchesProps (line 15) | interface ColorPickerWithSwatchesProps {
type Props (line 31) | interface Props {
function useCategory (line 37) | function useCategory(categoryId: string | null, initalChannelId: string ...
function NewCategoryModal (line 55) | function NewCategoryModal({ categoryId, modalProps, initialChannelId }: ...
FILE: src/plugins/pinDms/components/contextMenu.tsx
function createPinMenuItem (line 14) | function createPinMenuItem(channelId: string) {
FILE: src/plugins/pinDms/constants.ts
constant DEFAULT_CHUNK_SIZE (line 7) | const DEFAULT_CHUNK_SIZE = 256;
constant DEFAULT_COLOR (line 8) | const DEFAULT_COLOR = 10070709;
constant SWATCHES (line 10) | const SWATCHES = [
FILE: src/plugins/pinDms/data.ts
type Category (line 11) | interface Category {
function init (line 22) | async function init() {
function usePinnedDms (line 30) | function usePinnedDms() {
function getCategory (line 35) | function getCategory(id: string) {
function getCategoryByIndex (line 39) | function getCategoryByIndex(index: number) {
function createCategory (line 43) | function createCategory(category: Category) {
function addChannelToCategory (line 47) | function addChannelToCategory(channelId: string, categoryId: string) {
function removeChannelFromCategory (line 56) | function removeChannelFromCategory(channelId: string) {
function removeCategory (line 63) | function removeCategory(categoryId: string) {
function collapseCategory (line 70) | function collapseCategory(id: string, value = true) {
function isPinned (line 78) | function isPinned(id: string) {
function categoryLen (line 82) | function categoryLen() {
function getAllUncollapsedChannels (line 86) | function getAllUncollapsedChannels() {
function getSections (line 95) | function getSections() {
function swapElementsInArray (line 126) | function swapElementsInArray(array: any[], index1: number, index2: numbe...
function moveCategory (line 131) | function moveCategory(id: string, direction: -1 | 1) {
function moveChannel (line 138) | function moveChannel(channelId: string, direction: -1 | 1) {
FILE: src/plugins/pinDms/index.tsx
type ChannelComponentProps (line 23) | interface ChannelComponentProps {
type PinOrder (line 35) | const enum PinOrder {
method _instance (line 160) | set _instance(i: any) {
method makeProps (line 178) | makeProps(instance, { sections }: { sections: number[]; }) {
method makeSpanProps (line 195) | makeSpanProps() {
method getChunkSize (line 203) | getChunkSize() {
method isCategoryIndex (line 215) | isCategoryIndex(sectionIndex: number) {
method isChannelIndex (line 219) | isChannelIndex(sectionIndex: number, channelIndex: number) {
method collapseDMList (line 228) | collapseDMList() {
method isChannelHidden (line 232) | isChannelHidden(categoryIndex: number, channelIndex: number) {
method getScrollOffset (line 246) | getScrollOffset(channelId: string, rowHeight: number, padding: number, p...
method renderChannel (line 328) | renderChannel(sectionIndex: number, index: number, ChannelComponent: Rea...
method getChannel (line 346) | getChannel(sectionIndex: number, index: number, channels: Record<string,...
method getCategoryChannels (line 355) | getCategoryChannels(category: Category) {
FILE: src/plugins/platformIndicators/index.tsx
type Session (line 31) | interface Session {
function Icon (line 54) | function Icon(path: string, opts?: { viewBox?: string; width?: number; h...
function getPlatformTooltip (line 80) | function getPlatformTooltip(platform: DiscordPlatform): string {
function ensureOwnStatus (line 92) | function ensureOwnStatus(user: User) {
function getBadges (line 116) | function getBadges({ userId }: BadgeUserArgs): ProfileBadge[] {
method start (line 202) | start() {
method stop (line 209) | stop() {
FILE: src/plugins/quickMention/index.tsx
function Icon (line 24) | function Icon({ height = 24, width = 24, className = "icon" }: { height?...
method render (line 47) | render(msg) {
FILE: src/plugins/quickReply/index.ts
type MentionOptions (line 32) | const enum MentionOptions {
method start (line 65) | start() {
method stop (line 69) | stop() {
method DELETE_PENDING_REPLY (line 74) | DELETE_PENDING_REPLY() {
method MESSAGE_END_EDIT (line 77) | MESSAGE_END_EDIT() {
method CHANNEL_SELECT (line 80) | CHANNEL_SELECT() {
function onStartEdit (line 89) | function onStartEdit({ messageId, _isQuickEdit }: any) {
function onCreatePendingReply (line 94) | function onCreatePendingReply({ message, _isQuickReply }: { message: Mes...
function onKeydown (line 103) | function onKeydown(e: KeyboardEvent) {
function jumpIfOffScreen (line 116) | function jumpIfOffScreen(channelId: string, messageId: string) {
function getNextMessage (line 134) | function getNextMessage(isUp: boolean, isReply: boolean) {
function shouldMention (line 171) | function shouldMention(message: Message) {
function nextReply (line 184) | function nextReply(isUp: boolean) {
function nextEdit (line 214) | function nextEdit(isUp: boolean) {
FILE: src/plugins/reactErrorDecoder/index.ts
constant ERROR_CODES (line 23) | let ERROR_CODES: Record<string, string> | undefined;
method start (line 39) | async start() {
method stop (line 47) | stop() {
method decodeError (line 51) | decodeError(code: number, ...args: any) {
FILE: src/plugins/readAllNotificationsButton/index.tsx
function onClick (line 28) | function onClick() {
method start (line 74) | start() {
method stop (line 78) | stop() {
FILE: src/plugins/relationshipNotifier/functions.ts
function onRelationshipRemove (line 35) | async function onRelationshipRemove({ relationship: { type, id } }: Rela...
function onGuildDelete (line 65) | function onGuildDelete({ guild: { id, unavailable } }: GuildDelete) {
function onChannelDelete (line 82) | function onChannelDelete({ channel: { id, type } }: ChannelDelete) {
FILE: src/plugins/relationshipNotifier/index.ts
method RELATIONSHIP_REMOVE (line 63) | RELATIONSHIP_REMOVE(e) {
method start (line 70) | async start() {
FILE: src/plugins/relationshipNotifier/types.ts
type ChannelDelete (line 21) | interface ChannelDelete {
type GuildDelete (line 26) | interface GuildDelete {
type RelationshipRemove (line 34) | interface RelationshipRemove {
type SimpleGroupChannel (line 43) | interface SimpleGroupChannel {
type SimpleGuild (line 49) | interface SimpleGuild {
FILE: src/plugins/relationshipNotifier/utils.ts
function runMigrations (line 49) | async function runMigrations() {
function syncAndRunChecks (line 53) | async function syncAndRunChecks() {
function notify (line 113) | function notify(text: string, icon?: string, onClick?: () => void) {
function getGuild (line 125) | function getGuild(id: string) {
function deleteGuild (line 129) | function deleteGuild(id: string) {
function syncGuilds (line 134) | async function syncGuilds() {
function getGroup (line 149) | function getGroup(id: string) {
function deleteGroup (line 153) | function deleteGroup(id: string) {
function syncGroups (line 158) | async function syncGroups() {
function syncFriends (line 173) | async function syncFriends() {
FILE: src/plugins/replaceGoogleSearch/index.tsx
type ReplacementEngineValue (line 27) | const enum ReplacementEngineValue {
function search (line 54) | function search(src: string, engine: string) {
function makeSearchItem (line 58) | function makeSearchItem(src: string) {
FILE: src/plugins/replyTimestamp/index.tsx
function Sep (line 19) | function Sep(props: HTMLAttributes<HTMLElement>) {
type ReferencedMessageState (line 23) | const enum ReferencedMessageState {
type ReferencedMessage (line 29) | type ReferencedMessage = { state: ReferencedMessageState.LOADED; message...
function ReplyTimestamp (line 31) | function ReplyTimestamp({
FILE: src/plugins/revealAllSpoilers/index.ts
method reveal (line 41) | reveal(event: MouseEvent) {
FILE: src/plugins/reverseImageSearch/index.tsx
function search (line 36) | function search(src: string, engine: string) {
function makeSearchItem (line 40) | function makeSearchItem(src: string) {
FILE: src/plugins/reviewDB/auth.tsx
constant DATA_STORE_KEY (line 14) | const DATA_STORE_KEY = "rdb-auth";
function initAuth (line 18) | async function initAuth() {
function getAuth (line 22) | async function getAuth(): Promise<ReviewDBAuth | undefined> {
function getToken (line 27) | async function getToken() {
function updateAuth (line 32) | async function updateAuth(newAuth: ReviewDBAuth) {
function authorize (line 44) | function authorize(callback?: any) {
FILE: src/plugins/reviewDB/components/BlockedUserModal.tsx
function UnblockButton (line 16) | function UnblockButton(props: { onClick?(): void; }) {
function BlockedUser (line 35) | function BlockedUser({ user, isBusy, setIsBusy }: { user: ReviewDBUser; ...
function Modal (line 58) | function Modal() {
function openBlockModal (line 86) | function openBlockModal() {
FILE: src/plugins/reviewDB/components/MessageButton.tsx
function DeleteButton (line 26) | function DeleteButton({ onClick }: { onClick(): void; }) {
function ReportButton (line 43) | function ReportButton({ onClick }: { onClick(): void; }) {
function BlockButton (line 65) | function BlockButton({ onClick, isBlocked }: { onClick(): void; isBlocke...
FILE: src/plugins/reviewDB/components/ReviewBadge.tsx
function ReviewBadge (line 24) | function ReviewBadge(badge: Badge & { onClick?(): void; }) {
FILE: src/plugins/reviewDB/components/ReviewComponent.tsx
function ReviewComponent (line 41) | function ReviewComponent({ review, refetch, profileId }: { review: Revie...
FILE: src/plugins/reviewDB/components/ReviewModal.tsx
function Modal (line 31) | function Modal({ modalProps, modalKey, discordId, name, type }: { modalP...
function openReviewsModal (line 100) | function openReviewsModal(discordId: string, name: string, type: ReviewT...
FILE: src/plugins/reviewDB/components/ReviewsView.tsx
type UserProps (line 36) | interface UserProps {
type Props (line 41) | interface Props extends UserProps {
function ReviewsView (line 51) | function ReviewsView({
function ReviewList (line 101) | function ReviewList({ refetch, reviews, hideOwnReview, profileId, type }...
function ReviewsInputComponent (line 126) | function ReviewsInputComponent(
FILE: src/plugins/reviewDB/entities.ts
type UserType (line 19) | const enum UserType {
type ReviewType (line 25) | const enum ReviewType {
type NotificationType (line 32) | const enum NotificationType {
type ReviewDBAuth (line 39) | interface ReviewDBAuth {
type Badge (line 44) | interface Badge {
type BanInfo (line 52) | interface BanInfo {
type Notification (line 60) | interface Notification {
type ReviewDBUser (line 67) | interface ReviewDBUser {
type ReviewDBCurrentUser (line 76) | interface ReviewDBCurrentUser extends ReviewDBUser {
type ReviewAuthor (line 85) | interface ReviewAuthor {
type Review (line 93) | interface Review {
FILE: src/plugins/reviewDB/index.tsx
method start (line 107) | async start() {
FILE: src/plugins/reviewDB/reviewDbApi.ts
constant API_URL (line 26) | const API_URL = "https://manti.vendicated.dev/api/reviewdb";
constant REVIEWS_PER_PAGE (line 28) | const REVIEWS_PER_PAGE = 50;
type UserReviewsData (line 30) | interface UserReviewsData {
function rdbRequest (line 41) | async function rdbRequest(path: string, options: RequestInit = {}) {
function getReviews (line 51) | async function getReviews(id: string, { limit, offset = 0 }: { limit?: n...
function addReview (line 99) | async function addReview(review: any): Promise<UserReviewsData | null> {
function deleteReview (line 121) | async function deleteReview(id: number): Promise<UserReviewsData | null> {
function reportReview (line 138) | async function reportReview(id: number) {
function patchBlock (line 153) | async function patchBlock(action: "block" | "unblock", userId: string) {
function fetchBlocks (line 183) | async function fetchBlocks(): Promise<ReviewDBUser[]> {
function getCurrentUserInfo (line 195) | function getCurrentUserInfo(token: string): Promise<ReviewDBCurrentUser> {
function readNotification (line 201) | async function readNotification(id: number) {
FILE: src/plugins/reviewDB/utils.tsx
function canDeleteReview (line 27) | function canDeleteReview(profileId: string, review: Review) {
function canBlockReviewAuthor (line 36) | function canBlockReviewAuthor(profileId: string, review: Review) {
function canReportReview (line 41) | function canReportReview(review: Review) {
function showToast (line 45) | function showToast(message: string, type = Toasts.Type.MESSAGE) {
FILE: src/plugins/roleColorEverywhere/index.tsx
method getColorString (line 166) | getColorString(userId: string, channelOrGuildId: string) {
method getColorInt (line 179) | getColorInt(userId: string, channelOrGuildId: string) {
method getColorStyle (line 184) | getColorStyle(userId: string, channelOrGuildId: string) {
method useMessageColorsStyle (line 192) | useMessageColorsStyle(message: any) {
FILE: src/plugins/seeSummaries/index.tsx
type Summary (line 28) | interface Summary {
type ChannelSummaries (line 42) | interface ChannelSummaries {
method CONVERSATION_SUMMARY_UPDATE (line 74) | CONVERSATION_SUMMARY_UPDATE(data) {
method start (line 89) | async start() {
method shouldFetch (line 109) | shouldFetch(channelId: string) {
FILE: src/plugins/sendTimestamps/index.tsx
function parseTime (line 39) | function parseTime(time: string) {
type Format (line 52) | type Format = typeof Formats[number];
function PickerModal (line 56) | function PickerModal({ rootProps, close }: { rootProps: ModalProps, clos...
method onBeforeMessageSend (line 179) | onBeforeMessageSend(_, msg) {
method settingsAboutComponent (line 185) | settingsAboutComponent() {
FILE: src/plugins/serverInfo/GuildInfoModal.tsx
function openGuildInfoModal (line 23) | function openGuildInfoModal(guild: Guild) {
type Tabs (line 31) | const enum Tabs {
type GuildProps (line 38) | interface GuildProps {
type RelationshipProps (line 42) | interface RelationshipProps extends GuildProps {
function renderTimestamp (line 52) | function renderTimestamp(timestamp: number) {
function GuildInfoModal (line 58) | function GuildInfoModal({ guild }: GuildProps) {
function Owner (line 159) | function Owner(guildId: string, owner: User) {
function ServerInfoTab (line 188) | function ServerInfoTab({ guild }: GuildProps) {
function FriendsTab (line 218) | function FriendsTab({ guild, setCount }: RelationshipProps) {
function BlockedUsersTab (line 222) | function BlockedUsersTab({ guild, setCount }: RelationshipProps) {
function IgnoredUserTab (line 227) | function IgnoredUserTab({ guild, setCount }: RelationshipProps) {
function UserList (line 233) | function UserList(type: "friends" | "blocked" | "ignored", guild: Guild,...
FILE: src/plugins/serverListIndicators/index.tsx
type IndicatorType (line 27) | const enum IndicatorType {
function FriendsIndicator (line 35) | function FriendsIndicator() {
function ServersIndicator (line 67) | function ServersIndicator() {
method start (line 119) | start() {
method stop (line 123) | stop() {
FILE: src/plugins/shikiCodeblocks.desktop/api/languages.ts
constant JSON_REPO (line 23) | const JSON_REPO = "Vencord/ShikiPluginAssets";
constant JSON_REPO_COMMIT (line 24) | const JSON_REPO_COMMIT = "75d69df9fdf596a31eef8b7f6f891231a6feab44";
constant JSON_URL (line 25) | const JSON_URL = `https://cdn.jsdelivr.net/gh/${JSON_REPO}@${JSON_REPO_C...
type Language (line 28) | interface Language {
type LanguageJson (line 38) | interface LanguageJson {
function resolveLang (line 70) | function resolveLang(idOrAlias: string) {
FILE: src/plugins/shikiCodeblocks.desktop/api/shiki.ts
method destroy (line 112) | destroy() {
FILE: src/plugins/shikiCodeblocks.desktop/api/themes.ts
constant SHIKI_REPO (line 21) | const SHIKI_REPO = "shikijs/textmate-grammars-themes";
constant SHIKI_REPO_COMMIT (line 22) | const SHIKI_REPO_COMMIT = "bc5436518111d87ea58eb56d97b3f9bec30e6b83";
FILE: src/plugins/shikiCodeblocks.desktop/components/ButtonRow.tsx
type ButtonRowProps (line 23) | interface ButtonRowProps {
function ButtonRow (line 28) | function ButtonRow({ content, theme }: ButtonRowProps) {
FILE: src/plugins/shikiCodeblocks.desktop/components/Code.tsx
type CodeProps (line 26) | interface CodeProps {
FILE: src/plugins/shikiCodeblocks.desktop/components/CopyButton.tsx
type CopyButtonProps (line 21) | interface CopyButtonProps extends React.DetailedHTMLProps<React.ButtonHT...
function CopyButton (line 25) | function CopyButton({ content, ...props }: CopyButtonProps) {
FILE: src/plugins/shikiCodeblocks.desktop/components/Header.tsx
type HeaderProps (line 23) | interface HeaderProps {
function Header (line 29) | function Header({ langName, useDevIcon, shikiLang }: HeaderProps) {
FILE: src/plugins/shikiCodeblocks.desktop/components/Highlighter.tsx
type ThemeBase (line 33) | interface ThemeBase {
type HighlighterProps (line 40) | interface HighlighterProps {
FILE: src/plugins/shikiCodeblocks.desktop/hooks/useCopyCooldown.ts
function useCopyCooldown (line 22) | function useCopyCooldown(cooldown: number) {
FILE: src/plugins/shikiCodeblocks.desktop/hooks/useShikiSettings.ts
function useShikiSettings (line 23) | function useShikiSettings<F extends keyof ShikiSettings>(settingKeys: F[...
FILE: src/plugins/shikiCodeblocks.desktop/hooks/useTheme.ts
type Shiki (line 21) | type Shiki = typeof import("../api/shiki").shiki;
type ThemeState (line 22) | interface ThemeState {
function dispatchTheme (line 45) | function dispatchTheme(state: ThemeState) {
FILE: src/plugins/shikiCodeblocks.desktop/settings.ts
type ShikiSettings (line 32) | type ShikiSettings = typeof settings.store;
method disabled (line 110) | disabled() { return !!this.store.customTheme; }
method isValid (line 113) | isValid(value) {
FILE: src/plugins/shikiCodeblocks.desktop/types.ts
type ShikiSpec (line 27) | type ShikiSpec = {
type StyleSheets (line 49) | const enum StyleSheets {
type HljsSetting (line 54) | const enum HljsSetting {
type DeviconSetting (line 60) | const enum DeviconSetting {
FILE: src/plugins/shikiCodeblocks.desktop/utils/color.ts
function hex2Rgb (line 19) | function hex2Rgb(hex: string) {
FILE: src/plugins/shikiCodeblocks.desktop/utils/createStyle.ts
function setStyle (line 21) | function setStyle(css: string, id: string) {
function removeStyle (line 28) | function removeStyle(id: string) {
FILE: src/plugins/showConnections/VerifiedIcon.tsx
function VerifiedIcon (line 26) | function VerifiedIcon() {
FILE: src/plugins/showConnections/index.tsx
type Spacing (line 40) | const enum Spacing {
type ConnectionPlatform (line 65) | interface ConnectionPlatform {
function ConnectionsComponent (line 81) | function ConnectionsComponent({ id, theme }: { id: string, theme: string...
function CompactConnectionComponent (line 97) | function CompactConnectionComponent({ connection, theme }: { connection:...
FILE: src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx
type SortOrderTypes (line 33) | const enum SortOrderTypes {
type ForumLayoutTypes (line 38) | const enum ForumLayoutTypes {
type DefaultReaction (line 44) | interface DefaultReaction {
type Tag (line 49) | interface Tag {
type ExtendedChannel (line 57) | interface ExtendedChannel extends Channel {
type ChannelTypes (line 65) | const enum ChannelTypes {
type VideoQualityModes (line 73) | const enum VideoQualityModes {
type ChannelFlags (line 78) | const enum ChannelFlags {
function HiddenChannelLockScreen (line 118) | function HiddenChannelLockScreen({ channel }: { channel: ExtendedChannel...
FILE: src/plugins/showHiddenChannels/index.tsx
type ShowMode (line 37) | const enum ShowMode {
constant CONNECT (line 42) | const CONNECT = 1n << 20n;
function isUncategorized (line 67) | function isUncategorized(objChannel: { channel: Channel; comparator: num...
method swapViewChannelWithConnectPermission (line 482) | swapViewChannelWithConnectPermission(mergedPermissions: bigint, channel:...
method isHiddenChannel (line 491) | isHiddenChannel(channel: Channel & { channelId?: string; }, checkConnect...
method resolveGuildChannels (line 506) | resolveGuildChannels(channels: Record<string | number, Array<{ channel: ...
method makeAllowedRolesReduce (line 526) | makeAllowedRolesReduce(guildId: string) {
FILE: src/plugins/showHiddenThings/index.ts
method getHighestRole (line 90) | getHighestRole({ member }: { member: GuildMember; }, roles: Role[]): Rol...
FILE: src/plugins/showMeYourName/index.tsx
type UsernameProps (line 16) | interface UsernameProps {
FILE: src/plugins/showTimeoutDuration/index.tsx
type DisplayStyle (line 24) | const enum DisplayStyle {
function renderTimeout (line 40) | function renderTimeout(message: Message, inline: boolean) {
FILE: src/plugins/silentMessageToggle/index.tsx
method onChange (line 33) | onChange(newValue: boolean) {
function SilentMessageDisabledIcon (line 44) | function SilentMessageDisabledIcon() {
function setEnabledValue (line 74) | function setEnabledValue(value: boolean) {
FILE: src/plugins/silentTyping/index.tsx
function SilentTypingEnabledIcon (line 46) | function SilentTypingEnabledIcon() {
method startTyping (line 151) | async startTyping(channelId: string) {
FILE: src/plugins/sortFriendRequests/index.tsx
function getSince (line 39) | function getSince(user: User) {
method wrapSort (line 73) | wrapSort(comparator: Function, row: any) {
FILE: src/plugins/spotifyControls/PlayerComponent.tsx
function msToHuman (line 37) | function msToHuman(ms: number) {
function Svg (line 44) | function Svg(path: string, label: string) {
function Button (line 70) | function Button(props: React.ButtonHTMLAttributes<HTMLButtonElement>) {
function CopyContextMenu (line 81) | function CopyContextMenu({ name, type, path }: { type: string; name: str...
function Controls (line 110) | function Controls() {
function SpotifySeekBar (line 161) | function SpotifySeekBar() {
function AlbumContextMenu (line 219) | function AlbumContextMenu({ track }: { track: Track; }) {
function makeLinkProps (line 262) | function makeLinkProps(type: "Song" | "Artist" | "Album", condition: unk...
function Info (line 273) | function Info({ track }: { track: Track; }) {
function Player (line 351) | function Player() {
FILE: src/plugins/spotifyControls/SeekBar.ts
method getDerivedStateFromProps (line 16) | static getDerivedStateFromProps(props: any, state: any) {
FILE: src/plugins/spotifyControls/SpotifyStore.ts
type Track (line 25) | interface Track {
type PlayerState (line 48) | interface PlayerState {
type Device (line 63) | interface Device {
type Repeat (line 68) | type Repeat = "off" | "track" | "context";
class SpotifyStore (line 80) | class SpotifyStore extends Store {
method openExternal (line 93) | public openExternal(path: string) {
method position (line 102) | public get position(): number {
method position (line 110) | public set position(p: number) {
method prev (line 115) | prev() {
method next (line 119) | next() {
method setVolume (line 123) | setVolume(percent: number) {
method setPlaying (line 135) | setPlaying(playing: boolean) {
method setRepeat (line 139) | setRepeat(state: Repeat) {
method setShuffle (line 145) | setShuffle(state: boolean) {
method seek (line 154) | seek(ms: number) {
method _req (line 169) | _req(method: "post" | "get" | "put", route: string, data: any = {}) {
method SPOTIFY_PLAYER_STATE (line 182) | SPOTIFY_PLAYER_STATE(e: PlayerState) {
method SPOTIFY_SET_DEVICES (line 193) | SPOTIFY_SET_DEVICES({ devices }: { devices: Device[]; }) {
FILE: src/plugins/spotifyControls/index.tsx
function toggleHoverControls (line 28) | function toggleHoverControls(value: boolean) {
method PanelWrapper (line 96) | PanelWrapper({ VencordOriginal, ...props }) {
FILE: src/plugins/spotifyShareCommands/index.ts
type Album (line 27) | interface Album {
type Artist (line 37) | interface Artist {
type Track (line 48) | interface Track {
function makeCommand (line 59) | function makeCommand(name: string, formatUrl: (track: Track) => string):...
FILE: src/plugins/startupTimings/StartupTimingPage.tsx
type AppStartPerformance (line 24) | interface AppStartPerformance {
type LogGroup (line 32) | interface LogGroup {
type Log (line 40) | interface Log {
type TimerItemProps (line 50) | interface TimerItemProps extends Log {
function TimerItem (line 57) | function TimerItem({ emoji, prefix, log, delta, instance }: TimerItemPro...
type TimingSectionProps (line 68) | interface TimingSectionProps {
function TimingSection (line 74) | function TimingSection({ title, logs, traceEnd }: TimingSectionProps) {
type ServerTraceProps (line 113) | interface ServerTraceProps {
function ServerTrace (line 117) | function ServerTrace({ trace }: ServerTraceProps) {
function StartupTimingPage (line 134) | function StartupTimingPage() {
FILE: src/plugins/startupTimings/index.tsx
method start (line 30) | start() {
method stop (line 39) | stop() {
FILE: src/plugins/streamerModeOnStream/index.ts
type StreamEvent (line 23) | interface StreamEvent {
function toggleStreamerMode (line 27) | function toggleStreamerMode({ streamKey }: StreamEvent, value: boolean) {
FILE: src/plugins/superReactionTweaks/index.ts
method disabled (line 33) | disabled() { return this.store.unlimitedSuperReactionPlaying; }
method shouldPlayBurstReaction (line 73) | shouldPlayBurstReaction(playingCount: number) {
method shouldSuperReactByDefault (line 79) | get shouldSuperReactByDefault() {
FILE: src/plugins/textReplace/index.tsx
type Rule (line 37) | type Rule = Record<"find" | "replace" | "onlyIfIncludes" | "id", string>;
type TextReplaceProps (line 39) | interface TextReplaceProps {
function stringToRegex (line 88) | function stringToRegex(str: string) {
function renderFindError (line 102) | function renderFindError(find: string) {
function Input (line 115) | function Input({ initialValue, onChange, placeholder }: {
function TextRow (line 132) | function TextRow({ label, description, value, onChange }: { label: strin...
function TextReplace (line 149) | function TextReplace({ title, description, rulesArray, isRegex = false }...
function TextReplaceTesting (line 225) | function TextReplaceTesting() {
function applyRules (line 239) | function applyRules(content: string): string {
constant TEXT_REPLACE_RULES_CHANNEL_ID (line 267) | const TEXT_REPLACE_RULES_CHANNEL_ID = "1102784112584040479";
method start (line 276) | start() {
method onBeforeMessageSend (line 281) | onBeforeMessageSend(channelId, msg) {
FILE: src/plugins/themeAttributes/index.ts
method getAvatarStyles (line 60) | getAvatarStyles(src: string | null) {
method getMessageProps (line 71) | getMessageProps(props: { message: Message; }) {
FILE: src/plugins/translate/TranslateModal.tsx
function LanguageSelect (line 30) | function LanguageSelect({ settingsKey, includeAuto }: { settingsKey: typ...
function AutoTranslateToggle (line 61) | function AutoTranslateToggle() {
function TranslateModal (line 76) | function TranslateModal({ rootProps }: { rootProps: ModalProps; }) {
FILE: src/plugins/translate/TranslationAccessory.tsx
function handleTranslate (line 27) | function handleTranslate(messageId: string, data: TranslationValue) {
function Dismiss (line 31) | function Dismiss({ onDismiss }: { onDismiss: () => void; }) {
function TranslationAccessory (line 42) | function TranslationAccessory({ message }: { message: Message; }) {
FILE: src/plugins/translate/index.tsx
function getMessageContent (line 53) | function getMessageContent(message: Message) {
method render (line 84) | render(message: Message) {
method onBeforeMessageSend (line 101) | async onBeforeMessageSend(_, message) {
FILE: src/plugins/translate/languages.ts
type GoogleLanguage (line 34) | type GoogleLanguage = keyof typeof GoogleLanguages;
type DeeplLanguage (line 35) | type DeeplLanguage = keyof typeof DeeplLanguages;
function deeplLanguageToGoogleLanguage (line 305) | function deeplLanguageToGoogleLanguage(language: string) {
FILE: src/plugins/translate/native.ts
function makeDeeplTranslateRequest (line 9) | async function makeDeeplTranslateRequest(_: IpcMainInvokeEvent, pro: boo...
FILE: src/plugins/translate/settings.ts
function resetLanguageDefaults (line 80) | function resetLanguageDefaults() {
FILE: src/plugins/translate/utils.ts
type GoogleData (line 31) | interface GoogleData {
type DeeplData (line 36) | interface DeeplData {
type TranslationValue (line 43) | interface TranslationValue {
function translate (line 52) | async function translate(kind: "received" | "sent", text: string): Promi...
function googleTranslate (line 76) | async function googleTranslate(text: string, sourceLang: string, targetL...
function fallbackToGoogle (line 101) | function fallbackToGoogle(text: string, sourceLang: string, targetLang: ...
function deeplTranslate (line 113) | async function deeplTranslate(text: string, sourceLang: string, targetLa...
FILE: src/plugins/typingIndicator/index.tsx
type IndicatorMode (line 32) | const enum IndicatorMode {
function getDisplayName (line 37) | function getDisplayName(guildId: string, userId: string) {
function TypingIndicator (line 42) | function TypingIndicator({ channelId, guildId }: { channelId: string; gu...
FILE: src/plugins/typingTweaks/index.tsx
type TypingUserProps (line 64) | interface TypingUserProps {
method useTypingUsers (line 134) | useTypingUsers(channel: Channel | undefined): User[] {
FILE: src/plugins/unindent/index.ts
method unindent (line 38) | unindent(str: string) {
method unindentMsg (line 48) | unindentMsg(msg: MessageObject) {
method onBeforeMessageSend (line 58) | onBeforeMessageSend(_, msg) {
method onBeforeMessageEdit (line 62) | onBeforeMessageEdit(_cid, _mid, msg) {
FILE: src/plugins/unsuppressEmbeds/index.tsx
constant EMBED_SUPPRESSED (line 27) | const EMBED_SUPPRESSED = 1 << 2;
FILE: src/plugins/userMessagesPronouns/PronounsChatComponent.tsx
constant AUTO_MODERATION_ACTION (line 33) | const AUTO_MODERATION_ACTION = 24;
function shouldShow (line 35) | function shouldShow(message: Message): boolean {
function PronounsChatComponent (line 44) | function PronounsChatComponent({ message }: { message: Message; }) {
FILE: src/plugins/userMessagesPronouns/settings.ts
type PronounsFormat (line 22) | const enum PronounsFormat {
FILE: src/plugins/userMessagesPronouns/utils.ts
function useDiscordPronouns (line 24) | function useDiscordPronouns(id: string, useGlobalProfile: boolean = fals...
function useFormattedPronouns (line 32) | function useFormattedPronouns(id: string, useGlobalProfile: boolean = fa...
FILE: src/plugins/userVoiceShow/components.tsx
type IconProps (line 23) | type IconProps = Omit<React.ComponentPropsWithoutRef<"div">, "children">...
function Icon (line 27) | function Icon(props: PropsWithChildren<IconProps>) {
function SpeakerIcon (line 51) | function SpeakerIcon(props: IconProps) {
function LockedSpeakerIcon (line 60) | function LockedSpeakerIcon(props: IconProps) {
function MutedIcon (line 69) | function MutedIcon(props: IconProps) {
function DeafIcon (line 77) | function DeafIcon(props: IconProps) {
type VoiceChannelTooltipProps (line 85) | interface VoiceChannelTooltipProps {
function VoiceChannelTooltip (line 90) | function VoiceChannelTooltip({ channel, isLocked }: VoiceChannelTooltipP...
type VoiceChannelIndicatorProps (line 116) | interface VoiceChannelIndicatorProps {
function onClick (line 144) | function onClick(e: React.MouseEvent) {
FILE: src/plugins/userVoiceShow/index.tsx
method start (line 97) | start() {
method stop (line 106) | stop() {
FILE: src/plugins/usrbg/index.tsx
constant API_URL (line 24) | const API_URL = "https://usrbg.is-hardly.online/users";
type UsrbgApiReturn (line 26) | interface UsrbgApiReturn {
method getVoiceBackgroundStyles (line 94) | getVoiceBackgroundStyles({ className, participantUserId }: any) {
method patchBannerUrl (line 107) | patchBannerUrl({ displayProfile }: any) {
method userHasBackground (line 112) | userHasBackground(userId: string) {
method getImageUrl (line 116) | getImageUrl(userId: string): string | null {
method start (line 124) | async start() {
FILE: src/plugins/validReply/index.ts
type ReferencedMessageState (line 13) | const enum ReferencedMessageState {
type Reply (line 19) | interface Reply {
method setReplyStore (line 62) | setReplyStore(store: any) {
method fetchReply (line 66) | async fetchReply(reply: Reply) {
FILE: src/plugins/validUser/index.tsx
method staff (line 37) | get staff() { return this.discord_employee; }
type MentionProps (line 51) | interface MentionProps {
function getUser (line 67) | async function getUser(id: string) {
function MentionWrapper (line 109) | function MentionWrapper({ data, UserMention, RoleMention, parse, props }...
method renderMention (line 200) | renderMention(RoleMention, UserMention, data, parse, props) {
FILE: src/plugins/vcDoubleClick/index.ts
method shouldRunOnClick (line 60) | shouldRunOnClick(e: MouseEvent, { channelId }) {
method schedule (line 66) | schedule(cb: () => void, e: any) {
FILE: src/plugins/vcNarrator/VoiceSetting.tsx
function groupBy (line 13) | function groupBy<T extends object, K extends PropertyKey>(arr: T[], fn: ...
type PickerProps (line 22) | interface PickerProps {
function SimplePicker (line 27) | function SimplePicker({ voice, voices }: PickerProps) {
function ComplexPicker (line 48) | function ComplexPicker({ voice, voices }: PickerProps) {
function VoiceSetting (line 105) | function VoiceSetting() {
function VoiceSettingSection (line 119) | function VoiceSettingSection() {
FILE: src/plugins/vcNarrator/index.tsx
type VoiceStateChangeEvent (line 30) | interface VoiceStateChangeEvent {
function speak (line 45) | function speak(text: string) {
function clean (line 58) | function clean(str: string) {
function formatText (line 69) | function formatText(str: string, user: string, channel: string, displayN...
function getTypeAndChannelId (line 89) | function getTypeAndChannelId({ channelId, oldChannelId }: VoiceStateChan...
function playSample (line 142) | function playSample(type: string) {
method VOICE_STATE_UPDATES (line 164) | VOICE_STATE_UPDATES({ voiceStates }: { voiceStates: VoiceStateChangeEven...
method AUDIO_TOGGLE_SELF_MUTE (line 195) | AUDIO_TOGGLE_SELF_MUTE() {
method AUDIO_TOGGLE_SELF_DEAF (line 204) | AUDIO_TOGGLE_SELF_DEAF() {
method start (line 214) | start() {
method settingsAboutComponent (line 224) | settingsAboutComponent() {
FILE: src/plugins/vcNarrator/settings.ts
function getCurrentVoice (line 15) | function getCurrentVoice(voices = window.speechSynthesis?.getVoices()) {
method default (line 34) | get default() {
FILE: src/plugins/vencordToolbox/index.tsx
function Icon (line 41) | function Icon({ isShown }: { isShown: boolean; }) {
function VencordPopoutButton (line 52) | function VencordPopoutButton() {
method TrailingWrapper (line 97) | TrailingWrapper({ children }: PropsWithChildren) {
FILE: src/plugins/vencordToolbox/menu.tsx
function buildPluginMenu (line 19) | function buildPluginMenu() {
function buildPluginMenuEntries (line 38) | function buildPluginMenuEntries(includeEmpty = false) {
function buildThemeMenu (line 187) | function buildThemeMenu() {
function buildThemeMenuEntries (line 199) | function buildThemeMenuEntries() {
function buildCustomPluginEntries (line 246) | function buildCustomPluginEntries() {
function renderPopout (line 299) | function renderPopout(onClose: () => void) {
FILE: src/plugins/viewIcons/index.tsx
type UserContextProps (line 29) | interface UserContextProps {
type GuildContextProps (line 35) | interface GuildContextProps {
type GroupDMContextProps (line 39) | interface GroupDMContextProps {
function openImage (line 73) | function openImage(url: string, width: number, height?: number) {
FILE: src/plugins/viewRaw/index.tsx
function sortObject (line 50) | function sortObject<T extends object>(obj: T): T {
function cleanMessage (line 54) | function cleanMessage(msg: Message) {
function openViewRawModal (line 73) | function openViewRawModal(json: string, type: string, msgContent?: strin...
function openViewRawModalMessage (line 112) | function openViewRawModalMessage(msg: Message) {
function MakeContextCallback (line 130) | function MakeContextCallback(name: "Guild" | "Role" | "User" | "Channel"...
method render (line 193) | render(msg) {
FILE: src/plugins/voiceDownload/index.tsx
method renderDownload (line 26) | renderDownload(src: string) {
FILE: src/plugins/voiceMessages/DesktopRecorder.tsx
function toggleRecording (line 35) | function toggleRecording() {
FILE: src/plugins/voiceMessages/VoicePreview.tsx
type VoiceMessageProps (line 24) | interface VoiceMessageProps {
type VoicePreviewOptions (line 30) | type VoicePreviewOptions = {
FILE: src/plugins/voiceMessages/WebRecorder.tsx
function toggleRecording (line 35) | function toggleRecording() {
FILE: src/plugins/voiceMessages/index.tsx
type VoiceRecorder (line 47) | type VoiceRecorder = ComponentType<{
type AudioMetadata (line 81) | type AudioMetadata = {
constant EMPTY_META (line 85) | const EMPTY_META: AudioMetadata = {
function sendAudio (line 90) | function sendAudio(blob: Blob, meta: AudioMetadata) {
function useObjectUrl (line 127) | function useObjectUrl() {
function Modal (line 138) | function Modal({ modalProps }: { modalProps: ModalProps; }) {
FILE: src/plugins/voiceMessages/native.ts
function readRecording (line 11) | async function readRecording(_, filePath: string) {
FILE: src/plugins/volumeBooster/index.ts
type StreamData (line 33) | interface StreamData {
method patchVolume (line 129) | patchVolume(data: StreamData) {
FILE: src/plugins/webContextMenus.web/index.ts
function fetchImage (line 32) | async function fetchImage(url: string) {
constant MEDIA_PROXY_URL (line 56) | const MEDIA_PROXY_URL = "https://media.discordapp.net";
constant CDN_URL (line 57) | const CDN_URL = "cdn.discordapp.com";
function fixImageUrl (line 59) | function fixImageUrl(urlString: string) {
method start (line 87) | start() {
method stop (line 95) | stop() {
method copyImage (line 253) | async copyImage(url: string) {
method saveImage (line 285) | async saveImage(url: string) {
method copy (line 297) | copy() {
method cut (line 304) | cut() {
method paste (line 309) | async paste() {
FILE: src/plugins/webKeybinds.web/index.ts
method onKey (line 32) | onKey(e: KeyboardEvent) {
method start (line 69) | start() {
method stop (line 73) | stop() {
FILE: src/plugins/whoReacted/index.tsx
function fetchReactions (line 32) | function fetchReactions(msg: Message, emoji: ReactionEmoji, type: number) {
function getReactionsWithQueue (line 63) | function getReactionsWithQueue(msg: Message, e: ReactionEmoji, type: num...
function handleClickAvatar (line 74) | function handleClickAvatar(event: React.UIEvent<HTMLElement, Event>) {
method setScrollObj (line 108) | setScrollObj(scroll: any) {
method renderUsers (line 112) | renderUsers(props: RootObject) {
method UsersComponent (line 120) | UsersComponent({ message, emoji, type }: RootObject) {
method reactions (line 160) | set reactions(value: any) {
type ReactionCacheEntry (line 165) | interface ReactionCacheEntry {
type RootObject (line 170) | interface RootObject {
FILE: src/plugins/xsOverlay/index.tsx
type Message (line 17) | interface Message {
type Mention (line 41) | interface Mention {
type Sticker (line 51) | interface Sticker {
type Call (line 62) | interface Call {
type ApiObject (line 70) | interface ApiObject {
type NotificationObject (line 78) | interface NotificationObject {
method onChange (line 100) | async onChange() {
function start (line 176) | async function start() {
method CALL_UPDATE (line 197) | CALL_UPDATE({ call }: { call: Call; }) {
method MESSAGE_CREATE (line 203) | MESSAGE_CREATE({ message, optimistic }: { message: Message; optimistic: ...
method stop (line 302) | stop() {
function shouldIgnoreForChannelType (line 315) | function shouldIgnoreForChannelType(channel: Channel) {
function sendMsgNotif (line 321) | function sendMsgNotif(titleString: string, content: string, message: Mes...
function sendOtherNotif (line 347) | function sendOtherNotif(content: string, titleString: string) {
function sendToOverlay (line 364) | async function sendToOverlay(notif: NotificationObject) {
function shouldNotify (line 380) | function shouldNotify(message: Message, channel: string) {
function calculateHeight (line 387) | function calculateHeight(content: string) {
function calculateTimeout (line 394) | function calculateTimeout(content: string) {
FILE: src/plugins/xsOverlay/native.ts
function sendToOverlay (line 11) | function sendToOverlay(_, data: any) {
FILE: src/plugins/youtubeAdblock.desktop/adguard.js
method apply (line 196) | async apply(...args) {
FILE: src/shared/IpcEvents.ts
type IpcEvents (line 19) | const enum IpcEvents {
FILE: src/shared/SettingsStore.ts
constant SYM_IS_PROXY (line 9) | const SYM_IS_PROXY = Symbol("SettingsStore.isProxy");
constant SYM_GET_RAW_TARGET (line 10) | const SYM_GET_RAW_TARGET = Symbol("SettingsStore.getRawTarget");
type ResolvePropDeep (line 13) | type ResolvePropDeep<T, P> =
type SettingsStoreOptions (line 26) | interface SettingsStoreOptions {
type SettingsStore (line 37) | interface SettingsStore<T extends object> extends SettingsStoreOptions { }
method get (line 58) | get(target, key: any, receiver) {
method set (line 92) | set(target, key: string, value) {
method deleteProperty (line 117) | deleteProperty(target, key: string) {
method constructor (line 146) | public constructor(plain: T, options: SettingsStoreOptions = {}) {
method makeProxy (line 152) | private makeProxy(object: any, root: T = object, path = "") {
method notifyPrefixListeners (line 161) | private notifyPrefixListeners(pathString: string, pathElements: string...
method notifyListeners (line 168) | private notifyListeners(pathStr: string, value: any, root: T) {
method setData (line 199) | public setData(value: T, pathToNotify?: string) {
method addGlobalChangeListener (line 232) | public addGlobalChangeListener(cb: (data: any, path: string) => void) {
method addChangeListener (line 248) | public addChangeListener<P extends LiteralUnion<keyof T, string>>(
method addPrefixChangeListener (line 265) | public addPrefixChangeListener<P extends string>(prefix: P, cb: (data:...
method removeGlobalChangeListener (line 275) | public removeGlobalChangeListener(cb: (data: any, path: string) => voi...
method removeChangeListener (line 283) | public removeChangeListener(path: LiteralUnion<keyof T, string>, cb: (...
method removePrefixChangeListener (line 295) | public removePrefixChangeListener(prefix: string, cb: (data: any, path...
method markAsChanged (line 306) | public markAsChanged() {
type ProxyContext (line 39) | interface ProxyContext<T extends object = any> {
class SettingsStore (line 48) | class SettingsStore<T extends object> {
method get (line 58) | get(target, key: any, receiver) {
method set (line 92) | set(target, key: string, value) {
method deleteProperty (line 117) | deleteProperty(target, key: string) {
method constructor (line 146) | public constructor(plain: T, options: SettingsStoreOptions = {}) {
method makeProxy (line 152) | private makeProxy(object: any, root: T = object, path = "") {
method notifyPrefixListeners (line 161) | private notifyPrefixListeners(pathString: string, pathElements: string...
method notifyListeners (line 168) | private notifyListeners(pathStr: string, value: any, root: T) {
method setData (line 199) | public setData(value: T, pathToNotify?: string) {
method addGlobalChangeListener (line 232) | public addGlobalChangeListener(cb: (data: any, path: string) => void) {
method addChangeListener (line 248) | public addChangeListener<P extends LiteralUnion<keyof T, string>>(
method addPrefixChangeListener (line 265) | public addPrefixChangeListener<P extends string>(prefix: P, cb: (data:...
method removeGlobalChangeListener (line 275) | public removeGlobalChangeListener(cb: (data: any, path: string) => voi...
method removeChangeListener (line 283) | public removeChangeListener(path: LiteralUnion<keyof T, string>, cb: (...
method removePrefixChangeListener (line 295) | public removePrefixChangeListener(prefix: string, cb: (data: any, path...
method markAsChanged (line 306) | public markAsChanged() {
FILE: src/shared/debounce.ts
function debounce (line 26) | function debounce<T extends Function>(func: T, delay = 300): T {
FILE: src/shared/onceDefined.ts
function onceDefined (line 30) | function onceDefined<T extends object, P extends LiteralUnion<keyof T, P...
FILE: src/shared/vencordUserAgent.ts
constant VENCORD_USER_AGENT (line 12) | const VENCORD_USER_AGENT = `Vencord/${gitHash}${gitRemote ? ` (https://g...
FILE: src/utils/ChangeList.ts
class ChangeList (line 19) | class ChangeList<T>{
method changeCount (line 22) | public get changeCount() {
method hasChanges (line 26) | public get hasChanges() {
method handleChange (line 30) | public handleChange(item: T) {
method add (line 35) | public add(item: T) {
method remove (line 39) | public remove(item: T) {
method getChanges (line 43) | public getChanges() {
method map (line 47) | public map<R>(mapper: (v: T, idx: number, arr: T[]) => R): R[] {
FILE: src/utils/Logger.ts
class Logger (line 19) | class Logger {
method makeTitle (line 28) | static makeTitle(color: string, title: string): [string, ...string[]] {
method constructor (line 32) | constructor(public name: string, public color: string = "white") { }
method _log (line 34) | private _log(level: "log" | "error" | "warn" | "info" | "debug", level...
method log (line 49) | public log(...args: any[]) {
method info (line 53) | public info(...args: any[]) {
method error (line 57) | public error(...args: any[]) {
method errorCustomFmt (line 61) | public errorCustomFmt(fmt: string, ...args: any[]) {
method warn (line 65) | public warn(...args: any[]) {
method debug (line 69) | public debug(...args: any[]) {
FILE: src/utils/Queue.ts
class Queue (line 25) | class Queue {
method constructor (line 30) | constructor(public readonly maxSize = Infinity) { }
method next (line 36) | private next() {
method run (line 46) | private run() {
method push (line 56) | push<T>(func: () => Promisable<T>) {
method unshift (line 69) | unshift<T>(func: () => Promisable<T>) {
method size (line 80) | get size() {
FILE: src/utils/apng.ts
type ApngDisposeOp (line 12) | const enum ApngDisposeOp {
type ApngBlendOp (line 28) | const enum ApngBlendOp {
type Frame (line 33) | interface Frame {
class Animation (line 45) | class Animation {
type U8Arr (line 54) | type U8Arr = Uint8Array<ArrayBuffer>;
function crc32 (line 64) | function crc32(bytes: U8Arr, start: number = 0, length?: number): number {
constant PNG_SIGNATURE_BYTES (line 74) | const PNG_SIGNATURE_BYTES = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d...
function parseAPNG (line 76) | function parseAPNG(buffer: ArrayBuffer): Promise<Animation> {
function parseChunks (line 197) | function parseChunks(bytes: U8Arr, callback: (type: string, bytes: U8Arr...
function readDWord (line 210) | function readDWord(bytes: U8Arr, off: number): number {
function readWord (line 218) | function readWord(bytes: U8Arr, off: number): number {
function readByte (line 224) | function readByte(bytes: U8Arr, off: number): number {
function subBuffer (line 228) | function subBuffer(bytes: U8Arr, start: number, length: number): U8Arr {
function readString (line 234) | function readString(bytes: U8Arr, off: number, length: number): string {
function makeDWordArray (line 239) | function makeDWordArray(x: number): number[] {
function makeStringArray (line 243) | function makeStringArray(x: string): number[] {
function makeChunkBytes (line 249) | function makeChunkBytes(type: string, dataBytes: U8Arr): U8Arr {
FILE: src/utils/clipboard.ts
function copyToClipboard (line 7) | function copyToClipboard(text: string): Promise<void> {
FILE: src/utils/constants.ts
constant REACT_GLOBAL (line 19) | const REACT_GLOBAL = "Vencord.Webpack.Common.React";
constant VENBOT_USER_ID (line 20) | const VENBOT_USER_ID = "1017176847865352332";
constant VENCORD_GUILD_ID (line 21) | const VENCORD_GUILD_ID = "1015060230222131221";
constant DONOR_ROLE_ID (line 22) | const DONOR_ROLE_ID = "1042507929485586532";
constant CONTRIB_ROLE_ID (line 23) | const CONTRIB_ROLE_ID = "1026534353167208489";
constant REGULAR_ROLE_ID (line 24) | const REGULAR_ROLE_ID = "1026504932959977532";
constant SUPPORT_CHANNEL_ID (line 25) | const SUPPORT_CHANNEL_ID = "1026515880080842772";
constant SUPPORT_CATEGORY_ID (line 26) | const SUPPORT_CATEGORY_ID = "1108135649699180705";
constant KNOWN_ISSUES_CHANNEL_ID (line 27) | const KNOWN_ISSUES_CHANNEL_ID = "1222936386626129920";
constant IS_WINDOWS (line 30) | const IS_WINDOWS = platform.startsWith("win");
constant IS_MAC (line 31) | const IS_MAC = platform.startsWith("mac");
constant IS_LINUX (line 32) | const IS_LINUX = platform.startsWith("linux");
constant IS_MOBILE (line 35) | const IS_MOBILE = navigator.userAgent.includes("Mobi");
type Dev (line 37) | interface Dev {
FILE: src/utils/cspViolations.ts
function useCspErrors (line 24) | function useCspErrors() {
FILE: src/utils/css.ts
function createAndAppendStyle (line 7) | function createAndAppendStyle(id: string, target: HTMLElement) {
type ClassNameFactoryArg (line 16) | type ClassNameFactoryArg = string | string[] | Record<string, unknown> |...
FILE: src/utils/discord.tsx
function getIntlMessage (line 36) | function getIntlMessage(key: string, values?: Record<PropertyKey, any>):...
function getIntlMessageFromHash (line 45) | function getIntlMessageFromHash(hashedKey: string, values?: Record<Prope...
function openInviteModal (line 59) | async function openInviteModal(code: string) {
function getCurrentChannel (line 86) | function getCurrentChannel(): Channel | undefined {
function getCurrentGuild (line 90) | function getCurrentGuild(): Guild | undefined {
function openPrivateChannel (line 94) | function openPrivateChannel(userId: string) {
type Theme (line 98) | const enum Theme {
function getTheme (line 103) | function getTheme(): Theme {
function insertTextIntoChatInputBox (line 111) | function insertTextIntoChatInputBox(text: string) {
function copyWithToast (line 118) | async function copyWithToast(text: string, toastMessage = "Copied to cli...
type MessageOptions (line 127) | interface MessageOptions {
function sendMessage (line 150) | function sendMessage(
function openImageModal (line 170) | function openImageModal(item: Except<MediaModalItem, "type">, mediaModal...
function openUserProfile (line 181) | async function openUserProfile(id: string) {
type FetchUserProfileOptions (line 197) | interface FetchUserProfileOptions {
function fetchUserProfile (line 208) | async function fetchUserProfile(id: string, options?: FetchUserProfileOp...
function getUniqueUsername (line 235) | function getUniqueUsername(user: User) {
function getGuildAcronym (line 240) | function getGuildAcronym(guild: Guild): string {
function hasGuildFeature (line 247) | function hasGuildFeature(guild: Guild, feature: GuildFeatures): boolean {
FILE: src/utils/guards.ts
function isTruthy (line 19) | function isTruthy<T>(item: T): item is Exclude<T, 0 | "" | false | null ...
function isNonNullish (line 23) | function isNonNullish<T>(item: T): item is Exclude<T, null | undefined> {
FILE: src/utils/intlHash.ts
constant BASE64_TABLE (line 13) | const BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx...
constant IS_BIG_ENDIAN (line 14) | const IS_BIG_ENDIAN = (() => {
function numberToBytes (line 20) | function numberToBytes(number: number | bigint) {
function runtimeHashMessageKey (line 41) | function runtimeHashMessageKey(key: string): string {
FILE: src/utils/lazy.ts
function makeLazy (line 19) | function makeLazy<T>(factory: () => T, attempts = 5): () => T {
constant SYM_LAZY_GET (line 38) | const SYM_LAZY_GET = Symbol.for("vencord.lazy.get");
constant SYM_LAZY_CACHED (line 39) | const SYM_LAZY_CACHED = Symbol.for("vencord.lazy.cached");
function proxyLazy (line 88) | function proxyLazy<T>(factory: () => T, attempts = 5, isChild = false): T {
FILE: src/utils/lazyReact.tsx
type LazyComponentWrapper (line 13) | type LazyComponentWrapper<ComponentType> = ComponentType & { $$vencordGe...
function LazyComponent (line 21) | function LazyComponent<T extends object = any>(factory: () => ComponentT...
FILE: src/utils/mergeDefaults.ts
function mergeDefaults (line 13) | function mergeDefaults<T>(obj: T, defaults: T): T {
FILE: src/utils/misc.ts
function classes (line 25) | function classes(...classes: Array<string | null | undefined | false>) {
function sleep (line 32) | function sleep(ms: number): Promise<void> {
function isObject (line 39) | function isObject(obj: unknown): obj is object {
function isObjectEmpty (line 46) | function isObjectEmpty(obj: object) {
function parseUrl (line 57) | function parseUrl(urlString: string): URL | null {
function identity (line 74) | function identity<T>(value: T): T {
function pluralise (line 81) | function pluralise(amount: number, singular: string, plural = singular +...
function interpolateIfDefined (line 85) | function interpolateIfDefined(strings: TemplateStringsArray, ...args: an...
function tryOrElse (line 90) | function tryOrElse<T>(func: () => T, fallback: T): T {
FILE: src/utils/modal.tsx
type ModalSize (line 24) | const enum ModalSize {
type ModalTransitionState (line 31) | const enum ModalTransitionState {
type ModalProps (line 39) | interface ModalProps {
type ModalOptions (line 44) | interface ModalOptions {
type RenderFunction (line 50) | type RenderFunction = (props: ModalProps) => ReactNode | Promise<ReactNo...
type Modals (line 52) | interface Modals {
type MediaModalItem (line 119) | type MediaModalItem = {
type MediaModalProps (line 131) | type MediaModalProps = {
type ModalAPI (line 147) | interface ModalAPI {
FILE: src/utils/native.ts
function relaunch (line 19) | function relaunch() {
FILE: src/utils/onlyOnce.ts
function onlyOnce (line 19) | function onlyOnce<F extends Function>(f: F): F {
FILE: src/utils/patches.ts
function canonicalizeMatch (line 22) | function canonicalizeMatch<T extends RegExp | string>(match: T): T {
function canonicalizeReplace (line 54) | function canonicalizeReplace<T extends string | ReplaceFn>(replace: T, p...
function canonicalizeDescriptor (line 61) | function canonicalizeDescriptor<T>(descriptor: TypedPropertyDescriptor<T...
function canonicalizeReplacement (line 73) | function canonicalizeReplacement(replacement: Pick<PatchReplacement, "ma...
function canonicalizeFind (line 83) | function canonicalizeFind(patch: Patch) {
FILE: src/utils/react.tsx
function isPrimitiveReactNode (line 31) | function isPrimitiveReactNode(node: ReactNode): boolean {
type AwaiterRes (line 77) | type AwaiterRes<T> = [T, any, boolean];
type AwaiterOpts (line 78) | interface AwaiterOpts<T> {
function useAwaiter (line 92) | function useAwaiter<T>(factory: () => Promise<T>, providedOpts?: Awaiter...
function useForceUpdater (line 131) | function useForceUpdater(withDep?: true) {
type TimerOpts (line 136) | interface TimerOpts {
function useTimer (line 141) | function useTimer({ interval = 1000, deps = [] }: TimerOpts) {
function useCleanupEffect (line 157) | function useCleanupEffect(
FILE: src/utils/text.ts
type Units (line 40) | type Units = typeof units[number];
function getUnitStr (line 42) | function getUnitStr(unit: Units, isOne: boolean, short: boolean) {
function formatDuration (line 54) | function formatDuration(time: number, unit: Units, short: boolean = fals...
function humanFriendlyJoin (line 107) | function humanFriendlyJoin(elements: any[], mapper: (e: any) => string =...
function makeCodeblock (line 130) | function makeCodeblock(text: string, language?: string) {
function stripIndent (line 135) | function stripIndent(strings: TemplateStringsArray, ...values: any[]) {
constant ZWSP (line 145) | const ZWSP = "\u200b";
function toInlineCode (line 146) | function toInlineCode(s: string) {
FILE: src/utils/types.ts
function definePlugin (line 32) | function definePlugin<P extends PluginDef>(p: P & Record<PropertyKey, an...
function makeRange (line 36) | function makeRange(start: number, end: number, step = 1) {
type ReplaceFn (line 44) | type ReplaceFn = (match: string, ...groups: string[]) => string;
type PatchReplacement (line 46) | interface PatchReplacement {
type Patch (line 64) | interface Patch {
type PluginAuthor (line 87) | interface PluginAuthor {
type Plugin (line 92) | interface Plugin extends PluginDef {
type IconComponent (line 98) | type IconComponent = (props: IconProps & Record<string, any>) => ReactNode;
type IconProps (line 99) | type IconProps = { height?: number | string; width?: number | string; cl...
type PluginDef (line 100) | interface PluginDef {
type StartAt (line 212) | const enum StartAt {
type ReporterTestable (line 221) | const enum ReporterTestable {
function defineDefault (line 228) | function defineDefault<T = any>(value: T) {
type OptionType (line 232) | const enum OptionType {
type SettingsDefinition (line 243) | type SettingsDefinition = Record<string, PluginSettingDef>;
type SettingsChecks (line 244) | type SettingsChecks<D extends SettingsDefinition> = {
type PluginSettingDef (line 249) | type PluginSettingDef =
type PluginSettingCommon (line 260) | interface PluginSettingCommon {
type IsDisabled (line 279) | interface IsDisabled<D = unknown> {
type IsValid (line 286) | interface IsValid<T, D = unknown> {
type PluginSettingStringDef (line 293) | interface PluginSettingStringDef {
type PluginSettingNumberDef (line 299) | interface PluginSettingNumberDef {
type PluginSettingBigIntDef (line 303) | interface PluginSettingBigIntDef {
type PluginSettingBooleanDef (line 307) | interface PluginSettingBooleanDef {
type PluginSettingSelectDef (line 312) | interface PluginSettingSelectDef {
type PluginSettingSelectOption (line 317) | interface PluginSettingSelectOption {
type PluginSettingCustomDef (line 323) | interface PluginSettingCustomDef {
type PluginSettingSliderDef (line 328) | interface PluginSettingSliderDef {
type IPluginOptionComponentProps (line 344) | interface IPluginOptionComponentProps {
type PluginSettingComponentDef (line 357) | interface PluginSettingComponentDef {
type PluginSettingType (line 364) | type PluginSettingType<O extends PluginSettingDef> = O extends PluginSet...
type PluginSettingDefaultType (line 374) | type PluginSettingDefaultType<O extends PluginSettingDef> = O extends Pl...
type SettingsStore (line 378) | type SettingsStore<D extends SettingsDefinition> = {
type DefinedSettings (line 383) | interface DefinedSettings<
type PartialExcept (line 410) | type PartialExcept<T, R extends keyof T> = Partial<T> & Required<Pick<T,...
type IpcRes (line 412) | type IpcRes<V = any> = { ok: true; value: V; } | { ok: false, error: any...
type PluginOptionBase (line 418) | type PluginOptionBase = PluginSettingCommon & IsDisabled;
type PluginOptionsItem (line 419) | type PluginOptionsItem =
type PluginOptionString (line 427) | type PluginOptionString = PluginSettingStringDef & PluginSettingCommon &...
type PluginOptionNumber (line 428) | type PluginOptionNumber = (PluginSettingNumberDef | PluginSettingBigIntD...
type PluginOptionBoolean (line 429) | type PluginOptionBoolean = PluginSettingBooleanDef & PluginSettingCommon...
type PluginOptionSelect (line 430) | type PluginOptionSelect = PluginSettingSelectDef & PluginSettingCommon &...
type PluginOptionSlider (line 431) | type PluginOptionSlider = PluginSettingSliderDef & PluginSettingCommon &...
type PluginOptionComponent (line 432) | type PluginOptionComponent = PluginSettingComponentDef & Omit<PluginSett...
type PluginOptionCustom (line 433) | type PluginOptionCustom = PluginSettingCustomDef & Pick<PluginSettingCom...
type PluginNative (line 435) | type PluginNative<PluginExports extends Record<string, (event: Electron....
type AllOrNothing (line 442) | type AllOrNothing<T> = T | { [K in keyof T]?: never; };
FILE: src/utils/updater.ts
function Unwrap (line 31) | async function Unwrap<T>(p: Promise<IpcRes<T>>) {
function checkForUpdates (line 40) | async function checkForUpdates() {
function update (line 54) | async function update() {
function maybePromptToUpdate (line 70) | async function maybePromptToUpdate(confirmMessage: string, checkForDev =...
FILE: src/utils/web-metadata.ts
constant EXTENSION_VERSION (line 7) | let EXTENSION_VERSION: string;
constant EXTENSION_BASE_URL (line 8) | let EXTENSION_BASE_URL: string;
constant RENDERER_CSS_URL (line 9) | let RENDERER_CSS_URL: string;
FILE: src/utils/web.ts
function saveFile (line 23) | function saveFile(file: File) {
function chooseFile (line 41) | function chooseFile(mimeTypes: string) {
function getStylusWebStoreUrl (line 57) | function getStylusWebStoreUrl() {
FILE: src/webpack/common/internal.tsx
function waitForComponent (line 26) | function waitForComponent<T extends ComponentType<any> = ComponentType<a...
function waitForStore (line 50) | function waitForStore(name: string, cb: (v: any) => void) {
FILE: src/webpack/common/stores.ts
type GenericStore (line 26) | type GenericStore = t.FluxStore & Record<string, any>;
FILE: src/webpack/common/utils.ts
type ToastData (line 87) | interface ToastData {
type ToastOptions (line 97) | interface ToastOptions {
function showToast (line 131) | function showToast(message: string, type = ToastType.MESSAGE, options?: ...
FILE: src/webpack/patchWebpack.ts
constant SYM_IS_PROXIED_FACTORY (line 20) | const SYM_IS_PROXIED_FACTORY = Symbol("WebpackPatcher.isProxiedFactory");
constant SYM_ORIGINAL_FACTORY (line 21) | const SYM_ORIGINAL_FACTORY = Symbol("WebpackPatcher.originalFactory");
constant SYM_PATCHED_SOURCE (line 22) | const SYM_PATCHED_SOURCE = Symbol("WebpackPatcher.patchedSource");
constant SYM_PATCHED_BY (line 23) | const SYM_PATCHED_BY = Symbol("WebpackPatcher.patchedBy");
function matchBuildNumber (line 30) | function matchBuildNumber(factoryStr: string) {
function getFactoryPatchedSource (line 57) | function getFactoryPatchedSource(moduleId: PropertyKey, webpackRequire =...
function getFactoryPatchedBy (line 61) | function getFactoryPatchedBy(moduleId: PropertyKey, webpackRequire = wre...
method set (line 99) | set(this: AnyWebpackRequire, originalModules: AnyWebpackRequire["m"]) {
method apply (line 243) | apply(target, thisArg: unknown, argArray: Parameters<AnyModuleFactory>) {
method get (line 256) | get(target, p, receiver) {
function updateExistingOrProxyFactory (line 273) | function updateExistingOrProxyFactory(moduleFactories: AnyWebpackRequire...
function updateExistingFactory (line 294) | function updateExistingFactory(moduleFactories: AnyWebpackRequire["m"], ...
function defineInWebpackInstances (line 343) | function defineInWebpackInstances(moduleId: PropertyKey, factory: AnyMod...
function notifyFactoryListeners (line 355) | function notifyFactoryListeners(moduleId: PropertyKey, factory: AnyModul...
function runFactoryWithWrap (line 372) | function runFactoryWithWrap(patchedFactory: PatchedModuleFactory, thisAr...
function patchFactory (line 499) | function patchFactory(moduleId: PropertyKey, originalFactory: AnyModuleF...
function diffErroredPatch (line 643) | function diffErroredPatch(code: string, lastCode: string, match: RegExpM...
FILE: src/webpack/types.ts
type AnyWebpackRequire (line 11) | type AnyWebpackRequire = ((moduleId: PropertyKey) => ModuleExports) & Pa...
type AnyModuleFactory (line 17) | type AnyModuleFactory = ((this: ModuleExports, module: Module, exports: ...
type PatchedModuleFactory (line 22) | type PatchedModuleFactory = AnyModuleFactory & {
type MaybePatchedModuleFactory (line 28) | type MaybePatchedModuleFactory = PatchedModuleFactory | AnyModuleFactory;
FILE: src/webpack/webpack.ts
type FilterFn (line 44) | type FilterFn = (mod: any) => boolean;
type PropsFilter (line 46) | type PropsFilter = Array<string>;
type CodeFilter (line 47) | type CodeFilter = Array<string | RegExp>;
type StoreNameFilter (line 48) | type StoreNameFilter = string;
function makeClassNameRegex (line 57) | function makeClassNameRegex(className: string) {
type CallbackFn (line 112) | type CallbackFn = (module: ModuleExports, id: PropertyKey) => void;
type FactoryListernFn (line 113) | type FactoryListernFn = (factory: AnyModuleFactory, moduleId: PropertyKe...
function _initWebpack (line 119) | function _initWebpack(webpackRequire: WebpackRequire) {
constant PROXY_CHECK (line 134) | const PROXY_CHECK = "is this a proxy that returns values for any key?";
function shouldIgnoreValue (line 135) | function shouldIgnoreValue(value: any) {
function makePropertyNonEnumerable (line 153) | function makePropertyNonEnumerable(target: Record<PropertyKey, any>, key...
function _blacklistBadModules (line 163) | function _blacklistBadModules(requireCache: NonNullable<AnyWebpackRequir...
function handleModuleNotFound (line 216) | function handleModuleNotFound(method: string, ...filter: unknown[]) {
function findAll (line 259) | function findAll(filter: FilterFn, { topLevelOnly = false }: { topLevelO...
function findModuleFactory (line 385) | function findModuleFactory(...code: CodeFilter) {
function proxyLazyWebpack (line 406) | function proxyLazyWebpack<T = any>(factory: () => T, attempts?: number) {
function LazyComponentWebpack (line 420) | function LazyComponentWebpack<T extends object = any>(factory: () => any...
function findLazy (line 429) | function findLazy(filter: FilterFn) {
function findByProps (line 438) | function findByProps(...props: PropsFilter) {
function findByPropsLazy (line 448) | function findByPropsLazy(...props: PropsFilter) {
function findByCode (line 457) | function findByCode(...code: CodeFilter) {
function findByCodeLazy (line 467) | function findByCodeLazy(...code: CodeFilter) {
function populateFluxStoreMap (line 473) | function populateFluxStoreMap() {
function findStore (line 500) | function findStore(name: StoreNameFilter) {
function findStoreLazy (line 522) | function findStoreLazy(name: StoreNameFilter) {
function findComponentByCode (line 531) | function findComponentByCode(...code: CodeFilter) {
function findComponentLazy (line 541) | function findComponentLazy<T extends object = any>(filter: FilterFn) {
function findComponentByCodeLazy (line 556) | function findComponentByCodeLazy<T extends object = any>(...code: CodeFi...
function findExportedComponentLazy (line 570) | function findExportedComponentLazy<T extends object = any>(...props: Pro...
function mapMangledCssClasses (line 581) | function mapMangledCssClasses<S extends string>(mappedModule: object, cl...
function findCssClasses (line 596) | function findCssClasses<S extends string>(...classes: S[]): Record<S, st...
function findCssClassesLazy (line 609) | function findCssClassesLazy<S extends string>(...classes: S[]) {
function getAllPropertyNames (line 615) | function getAllPropertyNames(object: Record<PropertyKey, any>, includeNo...
function mapMangledModuleLazy (line 673) | function mapMangledModuleLazy<S extends string>(code: string | RegExp | ...
function extractAndLoadChunks (line 688) | async function extractAndLoadChunks(code: CodeFilter, matcher = DefaultE...
function extractAndLoadChunksLazy (line 763) | function extractAndLoadChunksLazy(code: CodeFilter, matcher = DefaultExt...
function waitFor (line 773) | function waitFor(filter: string | PropsFilter | FilterFn, callback: Call...
function search (line 800) | function search(...code: CodeFilter) {
function extract (line 824) | function extract(moduleId: PropertyKey) {
Condensed preview — 752 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,717K chars).
[
{
"path": ".editorconfig",
"chars": 229,
"preview": "# EditorConfig is awesome: https://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[*]\nindent_style = space\n"
},
{
"path": ".gitattributes",
"chars": 19,
"preview": "* text=auto eol=lf\n"
},
{
"path": ".github/ISSUE_TEMPLATE/blank.yml",
"chars": 935,
"preview": "name: Blank Issue\ndescription: Create a blank issue. ALWAYS FIRST USE OUR SUPPORT CHANNEL! ONLY USE THIS FORM IF YOU ARE"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2718,
"preview": "name: Bug/Crash Report\ndescription: Create a bug or crash report for Vencord. ALWAYS FIRST USE OUR SUPPORT CHANNEL! ONLY"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 319,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Vencord Support Server\n url: https://discord.gg/D9uwnFnqmd\n a"
},
{
"path": ".github/workflows/build.yml",
"chars": 2696,
"preview": "name: Build DevBuild\non:\n push:\n branches:\n - main\n paths:\n - .github/workflows/b"
},
{
"path": ".github/workflows/codeberg-mirror.yml",
"chars": 659,
"preview": "name: Sync to Codeberg\nconcurrency:\n group: ${{ github.ref }}\n cancel-in-progress: true\non:\n push:\n workflow"
},
{
"path": ".github/workflows/publish.yml",
"chars": 1521,
"preview": "name: Release Browser Extension\non:\n push:\n tags:\n - v*\n\njobs:\n Publish:\n if: github.repo"
},
{
"path": ".github/workflows/reportBrokenPlugins.yml",
"chars": 3020,
"preview": "name: Test Patches\non:\n workflow_dispatch:\n inputs:\n discord_branch:\n type: choice\n "
},
{
"path": ".github/workflows/test.yml",
"chars": 826,
"preview": "name: test\non:\n push:\n pull_request:\n branches:\n - main\n - dev\njobs:\n test:\n "
},
{
"path": ".gitignore",
"chars": 244,
"preview": "dist\nnode_modules\n\n*.exe\nvencord_installer\n\n.idea\n.DS_Store\n\nyarn.lock\nbun.lock\npackage-lock.json\n\n*.log\nnpm-debug.log*\n"
},
{
"path": ".npmrc",
"chars": 60,
"preview": "strict-peer-dependencies=false\npackage-manager-strict=false\n"
},
{
"path": ".stylelintrc.json",
"chars": 296,
"preview": "{\n \"extends\": \"stylelint-config-standard\",\n \"rules\": {\n \"selector-class-pattern\": [\n \"^[a-z][a-z"
},
{
"path": ".vscode/extensions.json",
"chars": 218,
"preview": "{\n \"recommendations\": [\n \"dbaeumer.vscode-eslint\",\n \"EditorConfig.EditorConfig\",\n \"GregorBiswang"
},
{
"path": ".vscode/launch.json",
"chars": 1217,
"preview": "{\n // this allows you to debug Vencord from VSCode.\n // How to use:\n // You need to run Discord via the command"
},
{
"path": ".vscode/settings.json",
"chars": 781,
"preview": "{\n \"editor.formatOnSave\": true,\n \"editor.codeActionsOnSave\": {\n \"source.fixAll.eslint\": \"explicit\"\n },\n "
},
{
"path": ".vscode/tasks.json",
"chars": 603,
"preview": "{\n // See https://go.microsoft.com/fwlink/?LinkId=733558\n // for the documentation about the tasks.json format\n "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 812,
"preview": "# Code of Conduct\n\nOur community is welcoming to everyone, regardless of their characteristics.\n\nAs such, we expect you "
},
{
"path": "CONTRIBUTING.md",
"chars": 3227,
"preview": "# Contributing to Vencord\n\nVencord is a community project and welcomes any kind of contribution from anyone!\n\nWe have de"
},
{
"path": "LICENSE",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 6813,
"preview": "# Vencord\n\n 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "browser/Vencord.ts",
"chars": 824,
"preview": "/*!\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pr"
},
{
"path": "browser/VencordNativeStub.ts",
"chars": 5414,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "browser/background.js",
"chars": 1295,
"preview": "/**\n * @template T\n * @param {T[]} arr\n * @param {(v: T) => boolean} predicate\n */\nfunction removeFirst(arr, predicate) "
},
{
"path": "browser/content.js",
"chars": 484,
"preview": "if (typeof browser === \"undefined\") {\n var browser = chrome;\n}\n\ndocument.addEventListener(\n \"DOMContentLoaded\",\n "
},
{
"path": "browser/manifest.json",
"chars": 1300,
"preview": "{\n \"manifest_version\": 3,\n \"minimum_chrome_version\": \"111\",\n\n \"name\": \"Vencord Web\",\n \"description\": \"The cu"
},
{
"path": "browser/manifestv2.json",
"chars": 1206,
"preview": "{\n \"manifest_version\": 2,\n \"minimum_chrome_version\": \"91\",\n\n \"name\": \"Vencord Web\",\n \"description\": \"The cut"
},
{
"path": "browser/modifyResponseHeaders.json",
"chars": 1005,
"preview": "[\n {\n \"id\": 1,\n \"action\": {\n \"type\": \"modifyHeaders\",\n \"responseHeaders\": [\n "
},
{
"path": "browser/monaco.ts",
"chars": 1112,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2023 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "browser/monacoWin.html",
"chars": 966,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>Vencord QuickCSS Editor</tit"
},
{
"path": "browser/patch-worker.js",
"chars": 4967,
"preview": "/*\nCopyright 2013 Rob Wu <gwnRob@gmail.com>\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not "
},
{
"path": "browser/userscript.meta.js",
"chars": 1303,
"preview": "// ==UserScript==\n// @name Vencord\n// @description A Discord client mod - Web version\n// @version "
},
{
"path": "eslint.config.mjs",
"chars": 5766,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2023 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "package.json",
"chars": 4064,
"preview": "{\n \"name\": \"vencord\",\n \"private\": \"true\",\n \"version\": \"1.14.6\",\n \"description\": \"The cutest Discord client m"
},
{
"path": "packages/discord-types/.npmignore",
"chars": 13,
"preview": "node_modules\n"
},
{
"path": "packages/discord-types/CONTRIBUTING.md",
"chars": 117,
"preview": "Hint: https://docs.discord.food is an incredible resource and allows you to copy paste complete enums and interfaces\n"
},
{
"path": "packages/discord-types/LICENSE",
"chars": 7652,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "packages/discord-types/README.md",
"chars": 1349,
"preview": "# Discord Types\n\nThis package provides TypeScript types for the Webpack modules of Discord's web app.\n\nWhile it was prim"
},
{
"path": "packages/discord-types/enums/activity.ts",
"chars": 603,
"preview": "export const enum ActivityType {\n PLAYING = 0,\n STREAMING = 1,\n LISTENING = 2,\n WATCHING = 3,\n CUSTOM_STA"
},
{
"path": "packages/discord-types/enums/channel.ts",
"chars": 333,
"preview": "export const enum ChannelType {\n GUILD_TEXT = 0,\n DM = 1,\n GUILD_VOICE = 2,\n GROUP_DM = 3,\n GUILD_CATEGOR"
},
{
"path": "packages/discord-types/enums/commands.ts",
"chars": 600,
"preview": "export const enum ApplicationCommandOptionType {\n SUB_COMMAND = 1,\n SUB_COMMAND_GROUP = 2,\n STRING = 3,\n INT"
},
{
"path": "packages/discord-types/enums/index.ts",
"chars": 159,
"preview": "export * from \"./activity\";\nexport * from \"./channel\";\nexport * from \"./commands\";\nexport * from \"./messages\";\nexport * "
},
{
"path": "packages/discord-types/enums/messages.ts",
"chars": 18288,
"preview": "export const enum StickerType {\n /** an official sticker in a pack */\n STANDARD = 1,\n /** a sticker uploaded to"
},
{
"path": "packages/discord-types/enums/misc.ts",
"chars": 1830,
"preview": "export const enum CloudUploadPlatform {\n REACT_NATIVE = 0,\n WEB = 1,\n}\n\nexport const enum DraftType {\n ChannelM"
},
{
"path": "packages/discord-types/enums/user.ts",
"chars": 419,
"preview": "export const enum RelationshipType {\n NONE = 0,\n FRIEND = 1,\n BLOCKED = 2,\n INCOMING_REQUEST = 3,\n OUTGOI"
},
{
"path": "packages/discord-types/package.json",
"chars": 623,
"preview": "{\n \"name\": \"@vencord/discord-types\",\n \"author\": \"Vencord Contributors\",\n \"private\": false,\n \"description\": \""
},
{
"path": "packages/discord-types/src/common/Activity.d.ts",
"chars": 1004,
"preview": "import { ActivityFlags, ActivityStatusDisplayType, ActivityType } from \"../../enums\";\n\nexport interface ActivityAssets {"
},
{
"path": "packages/discord-types/src/common/Application.d.ts",
"chars": 2426,
"preview": "import { Guild } from \"./Guild\";\nimport { User } from \"./User\";\n\nexport interface ApplicationExecutable {\n os: \"win32"
},
{
"path": "packages/discord-types/src/common/Channel.d.ts",
"chars": 2217,
"preview": "import { DiscordRecord } from \"./Record\";\n\nexport class Channel extends DiscordRecord {\n constructor(channel: object)"
},
{
"path": "packages/discord-types/src/common/Guild.d.ts",
"chars": 4454,
"preview": "import { Role } from './Role';\nimport { DiscordRecord } from './Record';\n\n// copy(Object.keys(findByProps(\"CREATOR_MONET"
},
{
"path": "packages/discord-types/src/common/GuildMember.d.ts",
"chars": 761,
"preview": "export interface GuildMember {\n avatar: string | undefined;\n avatarDecoration: string | undefined;\n banner: str"
},
{
"path": "packages/discord-types/src/common/Record.d.ts",
"chars": 382,
"preview": "type Updater = (value: any) => any;\n\n/**\n * Common Record class extended by various Discord data structures, like User, "
},
{
"path": "packages/discord-types/src/common/Role.d.ts",
"chars": 824,
"preview": "export interface Role {\n color: number;\n colorString: string | undefined;\n colorStrings: {\n primaryColor"
},
{
"path": "packages/discord-types/src/common/User.d.ts",
"chars": 1932,
"preview": "// TODO: a lot of optional params can also be null, not just undef\n\nimport { DiscordRecord } from \"./Record\";\n\nexport cl"
},
{
"path": "packages/discord-types/src/common/index.d.ts",
"chars": 244,
"preview": "export * from \"./Activity\";\nexport * from \"./Application\";\nexport * from \"./Channel\";\nexport * from \"./Guild\";\nexport * "
},
{
"path": "packages/discord-types/src/common/messages/Commands.d.ts",
"chars": 1499,
"preview": "import { Channel } from \"../Channel\";\nimport { Guild } from \"../Guild\";\nimport { Promisable } from \"type-fest\";\nimport {"
},
{
"path": "packages/discord-types/src/common/messages/Embed.d.ts",
"chars": 1435,
"preview": "export interface Embed {\n author?: {\n name: string;\n url: string;\n iconURL: string | undefined;\n"
},
{
"path": "packages/discord-types/src/common/messages/Emoji.d.ts",
"chars": 4348,
"preview": "/** Union type for both custom (guild) emojis and unicode emojis. */\nexport type Emoji = CustomEmoji | UnicodeEmoji;\n\n/*"
},
{
"path": "packages/discord-types/src/common/messages/Message.d.ts",
"chars": 6286,
"preview": "import { CommandOption } from './Commands';\nimport { User, UserJSON } from '../User';\nimport { Embed, EmbedJSON } from '"
},
{
"path": "packages/discord-types/src/common/messages/Sticker.d.ts",
"chars": 783,
"preview": "import { StickerFormatType, StickerType } from \"../../../enums\";\n\ninterface BaseSticker {\n asset: string;\n availab"
},
{
"path": "packages/discord-types/src/common/messages/index.d.ts",
"chars": 132,
"preview": "export * from \"./Commands\";\nexport * from \"./Message\";\nexport * from \"./Embed\";\nexport * from \"./Emoji\";\nexport * from \""
},
{
"path": "packages/discord-types/src/components.d.ts",
"chars": 14258,
"preview": "import type { ComponentClass, ComponentPropsWithRef, ComponentType, CSSProperties, FunctionComponent, HtmlHTMLAttributes"
},
{
"path": "packages/discord-types/src/flux.d.ts",
"chars": 760,
"preview": "import { FluxStore } from \"./stores/FluxStore\";\n\nexport class FluxEmitter {\n constructor();\n\n changeSentinel: numb"
},
{
"path": "packages/discord-types/src/fluxEvents.d.ts",
"chars": 67315,
"preview": "/*\nfunction makeFluxEventList() {\n // prefill MESSAGE_CREATE so that typescript infers this is a String Set\n // wi"
},
{
"path": "packages/discord-types/src/index.d.ts",
"chars": 251,
"preview": "export * from \"./common\";\nexport * from \"./components\";\nexport * from \"./flux\";\nexport * from \"./fluxEvents\";\nexport * f"
},
{
"path": "packages/discord-types/src/menu.d.ts",
"chars": 2113,
"preview": "import type { ComponentType, CSSProperties, ForwardRefRenderFunction, MouseEvent, PropsWithChildren, ReactNode, UIEvent "
},
{
"path": "packages/discord-types/src/modules/CloudUpload.d.ts",
"chars": 2004,
"preview": "import EventEmitter from \"events\";\nimport { CloudUploadPlatform } from \"../../enums\";\n\ninterface BaseUploadItem {\n pl"
},
{
"path": "packages/discord-types/src/modules/index.d.ts",
"chars": 31,
"preview": "export * from \"./CloudUpload\";\n"
},
{
"path": "packages/discord-types/src/stores/AccessibilityStore.d.ts",
"chars": 2755,
"preview": "import { FluxStore } from \"..\";\n\nexport type ReducedMotionPreference = \"auto\" | \"reduce\" | \"no-preference\";\nexport type "
},
{
"path": "packages/discord-types/src/stores/ActiveJoinedThreadsStore.d.ts",
"chars": 1770,
"preview": "import { Channel, FluxStore } from \"..\";\n\nexport interface ThreadJoined {\n channel: Channel;\n joinTimestamp: numbe"
},
{
"path": "packages/discord-types/src/stores/ApplicationStore.d.ts",
"chars": 897,
"preview": "import { Application, FluxStore } from \"..\";\n\nexport interface ApplicationStoreState {\n botUserIdToAppUsage: Record<s"
},
{
"path": "packages/discord-types/src/stores/AuthenticationStore.d.ts",
"chars": 328,
"preview": "import { FluxStore } from \"..\";\n\nexport class AuthenticationStore extends FluxStore {\n /**\n * Gets the id of the "
},
{
"path": "packages/discord-types/src/stores/CallStore.d.ts",
"chars": 648,
"preview": "import { FluxStore } from \"..\";\n\nexport interface Call {\n channelId: string;\n messageId: string | null;\n region"
},
{
"path": "packages/discord-types/src/stores/ChannelRTCStore.d.ts",
"chars": 3708,
"preview": "import { FluxStore, User, VoiceState } from \"..\";\nimport { ParticipantType, RTCPlatform } from \"../../enums\";\n\nexport ty"
},
{
"path": "packages/discord-types/src/stores/ChannelStore.d.ts",
"chars": 1213,
"preview": "import { Channel, FluxStore } from \"..\";\n\nexport class ChannelStore extends FluxStore {\n getChannel(channelId: string"
},
{
"path": "packages/discord-types/src/stores/DraftStore.d.ts",
"chars": 1027,
"preview": "import { FluxStore } from \"..\";\nimport { DraftType } from \"../../enums\";\n\nexport interface Draft {\n timestamp: number"
},
{
"path": "packages/discord-types/src/stores/EmojiStore.d.ts",
"chars": 16959,
"preview": "import { Channel, CustomEmoji, Emoji, FluxStore } from \"..\";\nimport { EmojiIntention, LoadState } from \"../../enums\";\n\n/"
},
{
"path": "packages/discord-types/src/stores/FluxStore.d.ts",
"chars": 3872,
"preview": "import { FluxDispatcher, FluxEvents } from \"..\";\n\ntype Callback = () => void;\ntype SyncCallback = () => boolean | void;\n"
},
{
"path": "packages/discord-types/src/stores/FriendsStore.d.ts",
"chars": 2109,
"preview": "import { Activity, FluxStore, Guild, User } from \"..\";\nimport { GiftIntentType, RelationshipType } from \"../../enums\";\n\n"
},
{
"path": "packages/discord-types/src/stores/GuildChannelStore.d.ts",
"chars": 1669,
"preview": "import { Channel, FluxStore, ThreadJoined } from \"..\";\nimport { ChannelType } from \"../../enums\";\n\nexport interface Chan"
},
{
"path": "packages/discord-types/src/stores/GuildMemberCountStore.d.ts",
"chars": 227,
"preview": "import { FluxStore } from \"..\";\n\nexport class GuildMemberCountStore extends FluxStore {\n getMemberCounts(): Record<st"
},
{
"path": "packages/discord-types/src/stores/GuildMemberStore.d.ts",
"chars": 1415,
"preview": "import { FluxStore, GuildMember } from \"..\";\n\nexport interface PendingRoleUpdates {\n added: string[];\n removed: st"
},
{
"path": "packages/discord-types/src/stores/GuildRoleStore.d.ts",
"chars": 560,
"preview": "import { FluxStore, Guild, Role } from \"..\";\n\nexport class GuildRoleStore extends FluxStore {\n getRolesSnapshot(guild"
},
{
"path": "packages/discord-types/src/stores/GuildScheduledEventStore.d.ts",
"chars": 2480,
"preview": "import { FluxStore } from \"..\";\nimport { GuildScheduledEventEntityType, GuildScheduledEventPrivacyLevel, GuildScheduledE"
},
{
"path": "packages/discord-types/src/stores/GuildStore.d.ts",
"chars": 253,
"preview": "import { Guild, FluxStore } from \"..\";\n\nexport class GuildStore extends FluxStore {\n getGuild(guildId: string): Guild"
},
{
"path": "packages/discord-types/src/stores/InstantInviteStore.d.ts",
"chars": 450,
"preview": "import { FluxStore } from \"..\";\nimport { Invite } from \"./InviteStore\";\n\nexport interface FriendInvite extends Invite {\n"
},
{
"path": "packages/discord-types/src/stores/InviteStore.d.ts",
"chars": 806,
"preview": "import { Channel, FluxStore, Guild, User } from \"..\";\n\nexport interface Invite {\n code: string;\n guild: Guild | nu"
},
{
"path": "packages/discord-types/src/stores/LocaleStore.d.ts",
"chars": 138,
"preview": "import { FluxStore } from \"..\";\n\nexport class LocaleStore extends FluxStore {\n get locale(): string;\n get systemLo"
},
{
"path": "packages/discord-types/src/stores/MediaEngineStore.d.ts",
"chars": 87402,
"preview": "import { FluxStore } from \"..\";\n\n/** Context for media engine settings. */\nexport type MediaEngineContextType = \"default"
},
{
"path": "packages/discord-types/src/stores/MessageStore.d.ts",
"chars": 1873,
"preview": "import { FluxStore, Message } from \"..\";\n\nexport type JumpType = \"ANIMATED\" | \"INSTANT\";\n\nexport interface MessageCache "
},
{
"path": "packages/discord-types/src/stores/NotificationSettingsStore.d.ts",
"chars": 907,
"preview": "import { FluxStore } from \"..\";\n\nexport type DesktopNotificationType = \"ALL\" | \"ONLY_MENTIONS\" | \"NEVER\";\nexport type TT"
},
{
"path": "packages/discord-types/src/stores/OverridePremiumTypeStore.d.ts",
"chars": 488,
"preview": "import { FluxStore } from \"..\";\n\nexport interface OverridePremiumTypeState {\n createdAtOverride: Date | undefined;\n "
},
{
"path": "packages/discord-types/src/stores/PendingReplyStore.d.ts",
"chars": 489,
"preview": "import { Channel, Message } from \"../common\";\nimport { FluxStore } from \"./FluxStore\";\n\nexport interface PendingReply {\n"
},
{
"path": "packages/discord-types/src/stores/PermissionStore.d.ts",
"chars": 2238,
"preview": "import { Channel, Guild, Role, FluxStore } from \"..\";\n\nexport interface GuildPermissionProps {\n canManageGuild: boole"
},
{
"path": "packages/discord-types/src/stores/PopoutWindowStore.d.ts",
"chars": 8640,
"preview": "import { FluxStore } from \"..\";\n\n/**\n * Known popout window key constants.\n * Used as the key parameter for PopoutWindow"
},
{
"path": "packages/discord-types/src/stores/PresenceStore.d.ts",
"chars": 1815,
"preview": "import { Activity, OnlineStatus } from \"../common\";\nimport { FluxStore } from \"./FluxStore\";\n\nexport interface UserAndAc"
},
{
"path": "packages/discord-types/src/stores/RTCConnectionStore.d.ts",
"chars": 2580,
"preview": "import { FluxStore } from \"..\";\n\nexport type RTCConnectionState =\n | \"DISCONNECTED\"\n | \"AWAITING_ENDPOINT\"\n | \""
},
{
"path": "packages/discord-types/src/stores/ReadStateStore.d.ts",
"chars": 2891,
"preview": "import { Channel, FluxStore } from \"..\";\nimport { ReadStateType } from \"../../enums\";\n\nexport interface GuildChannelUnre"
},
{
"path": "packages/discord-types/src/stores/RelationshipStore.d.ts",
"chars": 1400,
"preview": "import { FluxStore } from \"..\";\nimport { RelationshipType } from \"../../enums\";\n\nexport class RelationshipStore extends "
},
{
"path": "packages/discord-types/src/stores/RunningGameStore.d.ts",
"chars": 2156,
"preview": "import { FluxStore } from \"..\";\n\nexport interface RunningGame {\n id?: string;\n name: string;\n exePath: string;\n"
},
{
"path": "packages/discord-types/src/stores/SelectedChannelStore.d.ts",
"chars": 625,
"preview": "import { FluxStore } from \"..\";\n\nexport interface ChannelFollowingDestination {\n guildId?: string;\n channelId?: st"
},
{
"path": "packages/discord-types/src/stores/SelectedGuildStore.d.ts",
"chars": 459,
"preview": "import { FluxStore } from \"..\";\n\nexport interface SelectedGuildState {\n selectedGuildTimestampMillis: Record<string |"
},
{
"path": "packages/discord-types/src/stores/SoundboardStore.d.ts",
"chars": 1531,
"preview": "import { FluxStore } from \"..\";\n\nexport interface SoundboardSound {\n soundId: string;\n name: string;\n volume: n"
},
{
"path": "packages/discord-types/src/stores/SpellCheckStore.d.ts",
"chars": 153,
"preview": "import { FluxStore } from \"..\";\n\nexport class SpellCheckStore extends FluxStore {\n hasLearnedWord(word: string): bool"
},
{
"path": "packages/discord-types/src/stores/SpotifyStore.d.ts",
"chars": 2310,
"preview": "import { FluxStore } from \"..\";\n\nexport interface SpotifyDevice {\n id: string;\n is_active: boolean;\n is_private"
},
{
"path": "packages/discord-types/src/stores/StickersStore.d.ts",
"chars": 815,
"preview": "import { FluxStore, GuildSticker, PremiumStickerPack, Sticker } from \"..\";\n\nexport type StickerGuildMap = Map<string, Gu"
},
{
"path": "packages/discord-types/src/stores/StreamerModeStore.d.ts",
"chars": 705,
"preview": "import { FluxStore } from \"..\";\n\nexport interface StreamerModeSettings {\n enabled: boolean;\n autoToggle: boolean;\n"
},
{
"path": "packages/discord-types/src/stores/ThemeStore.d.ts",
"chars": 562,
"preview": "import { FluxStore } from \"..\";\n\nexport type ThemePreference = \"dark\" | \"light\" | \"unknown\";\nexport type SystemTheme = \""
},
{
"path": "packages/discord-types/src/stores/TypingStore.d.ts",
"chars": 265,
"preview": "import { FluxStore } from \"..\";\n\nexport class TypingStore extends FluxStore {\n /**\n * returns a map of user ids t"
},
{
"path": "packages/discord-types/src/stores/UploadAttachmentStore.d.ts",
"chars": 656,
"preview": "import { CloudUpload, FluxStore } from \"..\";\nimport { DraftType } from \"../../enums\";\n\nexport class UploadAttachmentStor"
},
{
"path": "packages/discord-types/src/stores/UserGuildSettingsStore.d.ts",
"chars": 3750,
"preview": "import { Channel, FluxStore } from \"..\";\n\nexport interface MuteConfig {\n selected_time_window: number;\n end_time: "
},
{
"path": "packages/discord-types/src/stores/UserProfileStore.d.ts",
"chars": 5583,
"preview": "import { FluxStore, Guild, User, Application, ApplicationInstallParams } from \"..\";\nimport { ApplicationIntegrationType "
},
{
"path": "packages/discord-types/src/stores/UserSettingsProtoStore.d.ts",
"chars": 6380,
"preview": "import { FluxStore } from \"..\";\n\nexport interface GuildFolder {\n guildIds: string[];\n folderId?: number;\n folde"
},
{
"path": "packages/discord-types/src/stores/UserStore.d.ts",
"chars": 1222,
"preview": "import { FluxStore, User } from \"..\";\n\n/** returned by takeSnapshot for persistence */\nexport interface UserStoreSnapsho"
},
{
"path": "packages/discord-types/src/stores/VoiceStateStore.d.ts",
"chars": 2047,
"preview": "import { DiscordRecord } from \"../common\";\nimport { FluxStore } from \"./FluxStore\";\n\nexport type UserVoiceStateRecords ="
},
{
"path": "packages/discord-types/src/stores/WindowStore.d.ts",
"chars": 851,
"preview": "import { FluxStore } from \"..\";\n\nexport interface WindowSize {\n width: number;\n height: number;\n}\n\nexport class Wi"
},
{
"path": "packages/discord-types/src/stores/index.d.ts",
"chars": 2528,
"preview": "// please keep in alphabetical order\nexport * from \"./AccessibilityStore\";\nexport * from \"./ActiveJoinedThreadsStore\";\ne"
},
{
"path": "packages/discord-types/src/utils.d.ts",
"chars": 10008,
"preview": "import { Channel, Guild, GuildMember, Message, User } from \".\";\nimport type { ReactNode } from \"react\";\nimport { Literal"
},
{
"path": "packages/discord-types/webpack/index.d.ts",
"chars": 10344,
"preview": "/*\n * @vencord/discord-types\n * Copyright (c) 2024 Vendicated, Nuckyz and contributors\n * SPDX-License-Identifier: LGPL-"
},
{
"path": "packages/vencord-types/.gitignore",
"chars": 70,
"preview": "*\n!.*ignore\n!package.json\n!*.md\n!prepare.ts\n!index.d.ts\n!globals.d.ts\n"
},
{
"path": "packages/vencord-types/.npmignore",
"chars": 46,
"preview": "node_modules\nprepare.ts\n.gitignore\nHOW2PUB.md\n"
},
{
"path": "packages/vencord-types/HOW2PUB.md",
"chars": 110,
"preview": "# How to publish\n\n1. run `pnpm generateTypes` in the project root\n2. bump package.json version\n3. npm publish\n"
},
{
"path": "packages/vencord-types/README.md",
"chars": 143,
"preview": "# Vencord Types\n\nTypings for Vencord's api, published to npm\n\n```sh\nnpm i @vencord/types\n\nyarn add @vencord/types\n\npnpm "
},
{
"path": "packages/vencord-types/globals.d.ts",
"chars": 916,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "packages/vencord-types/index.d.ts",
"chars": 136,
"preview": "/* eslint-disable */\n\n/// <reference path=\"Vencord.d.ts\" />\n/// <reference path=\"globals.d.ts\" />\n/// <reference path=\"m"
},
{
"path": "packages/vencord-types/package.json",
"chars": 834,
"preview": "{\n \"name\": \"@vencord/types\",\n \"private\": false,\n \"version\": \"1.14.1\",\n \"description\": \"\",\n \"types\": \"inde"
},
{
"path": "packages/vencord-types/prepare.ts",
"chars": 1755,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "patches/eslint-plugin-path-alias@2.1.0.patch",
"chars": 12766,
"preview": "diff --git a/dist/index.js b/dist/index.js\nindex 67de6fb139070fd0e49beca65e3b63c531202e16..aa2883c8126e4952a42872ee920f5"
},
{
"path": "pnpm-workspace.yaml",
"chars": 27,
"preview": "packages:\n - packages/*\n"
},
{
"path": "scripts/build/build.mjs",
"chars": 7057,
"preview": "#!/usr/bin/node\n/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributor"
},
{
"path": "scripts/build/buildWeb.mjs",
"chars": 6505,
"preview": "#!/usr/bin/node\n/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributor"
},
{
"path": "scripts/build/common.mjs",
"chars": 14016,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/build/inject/react.mjs",
"chars": 965,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/build/module/style.js",
"chars": 930,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/checkNodeVersion.js",
"chars": 941,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/generatePluginList.ts",
"chars": 8873,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/generateReport.ts",
"chars": 12419,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/header-new.txt",
"chars": 102,
"preview": "Vencord, a Discord client mod\nCopyright (c) {year} {author}\nSPDX-License-Identifier: GPL-3.0-or-later\n"
},
{
"path": "scripts/header-old.txt",
"chars": 742,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) {year} {author}\n *\n * This program is free soft"
},
{
"path": "scripts/runInstaller.mjs",
"chars": 4431,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/suppressExperimentalWarnings.js",
"chars": 976,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "scripts/utils.mjs",
"chars": 1165,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/Vencord.ts",
"chars": 7568,
"preview": "/*!\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pr"
},
{
"path": "src/VencordNative.ts",
"chars": 4290,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2023 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/Badges.ts",
"chars": 3701,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/ChatButton.css",
"chars": 67,
"preview": ".vc-chatbar-button {\n display: flex;\n align-items: center;\n}\n"
},
{
"path": "src/api/ChatButtons.tsx",
"chars": 6798,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2024 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/Commands/commandHelpers.ts",
"chars": 2239,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Commands/index.ts",
"chars": 6511,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Commands/types.ts",
"chars": 401,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/ContextMenu.ts",
"chars": 6687,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/DataStore/LICENSE",
"chars": 11358,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "src/api/DataStore/index.ts",
"chars": 8597,
"preview": "/* eslint-disable simple-header/header */\n\n/*!\n * idb-keyval v6.2.0\n * Copyright 2016, Jake Archibald\n * Copyright 2022,"
},
{
"path": "src/api/MemberListDecorators.tsx",
"chars": 2364,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/MessageAccessories.tsx",
"chars": 2082,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/MessageDecorations.tsx",
"chars": 2479,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/MessageEvents.ts",
"chars": 4674,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/MessagePopover.tsx",
"chars": 3471,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/MessageUpdater.ts",
"chars": 1254,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2024 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/Notices.tsx",
"chars": 1714,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Notifications/NotificationComponent.tsx",
"chars": 4710,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Notifications/Notifications.tsx",
"chars": 3774,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Notifications/index.ts",
"chars": 793,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Notifications/notificationLog.tsx",
"chars": 7081,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Notifications/styles.css",
"chars": 2833,
"preview": ".vc-notification-root {\n /* clear default button styles */\n all: unset;\n display: flex;\n flex-direction: col"
},
{
"path": "src/api/PluginManager.ts",
"chars": 14844,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/ServerList.tsx",
"chars": 1792,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Settings.ts",
"chars": 9817,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/SettingsSync/cloudSetup.tsx",
"chars": 5216,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/SettingsSync/cloudSync.ts",
"chars": 7640,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/SettingsSync/offline.ts",
"chars": 3543,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/api/Styles.ts",
"chars": 7130,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/Themes.ts",
"chars": 4808,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/UserSettings.ts",
"chars": 2818,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/api/index.ts",
"chars": 4363,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/BaseText.css",
"chars": 233,
"preview": ".vc-text-base {\n font-family: var(--font-primary);\n line-height: normal;\n\n /* Discord puts an insane default ma"
},
{
"path": "src/components/BaseText.tsx",
"chars": 2574,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Button.css",
"chars": 5590,
"preview": ".vc-btn-base {\n position: relative;\n display: flex;\n justify-content: center;\n align-items: center;\n max-"
},
{
"path": "src/components/Button.tsx",
"chars": 3648,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Card.css",
"chars": 729,
"preview": ".vc-card-base {\n background: var(--card-background-default);\n border-radius: var(--radius-sm, 8px);\n}\n\n.vc-card-no"
},
{
"path": "src/components/Card.tsx",
"chars": 991,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/CheckedTextInput.tsx",
"chars": 2124,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/CodeBlock.tsx",
"chars": 847,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2023 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Divider.css",
"chars": 115,
"preview": ".vc-divider {\n height: 1px;\n width: 100%;\n border: none;\n border-top: 1px solid var(--border-subtle);\n}"
},
{
"path": "src/components/Divider.tsx",
"chars": 514,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/ErrorBoundary.tsx",
"chars": 5086,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/ErrorCard.css",
"chars": 223,
"preview": ".vc-error-card {\n padding: 2em;\n background-color: #e7828430;\n border: 1px solid #e78284;\n border-radius: 5p"
},
{
"path": "src/components/ErrorCard.tsx",
"chars": 1099,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/ExpandableCard.css",
"chars": 418,
"preview": ".vc-expandable-card {\n color: var(--text-default);\n}\n\n.vc-expandable-card-header {\n display: flex;\n cursor: poi"
},
{
"path": "src/components/ExpandableCard.tsx",
"chars": 1514,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2026 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Flex.tsx",
"chars": 1518,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/FormSwitch.css",
"chars": 449,
"preview": ".vc-form-switch-wrapper {\n margin-bottom: 20px;\n cursor: pointer;\n}\n\n.vc-form-switch {\n display: flex;\n widt"
},
{
"path": "src/components/FormSwitch.tsx",
"chars": 1542,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Grid.tsx",
"chars": 644,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2024 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Heading.css",
"chars": 844,
"preview": ".vc-h1,\n.vc-h2 {\n color: var(--text-strong);\n font-weight: 600;\n}\n\n.vc-h3,\n.vc-h4,\n.vc-h5 {\n color: var(--text-"
},
{
"path": "src/components/Heading.tsx",
"chars": 1497,
"preview": "/*\n * Vencord, a Discord client mod\n * Copyright (c) 2025 Vendicated and contributors\n * SPDX-License-Identifier: GPL-3."
},
{
"path": "src/components/Heart.tsx",
"chars": 1896,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/Icons.tsx",
"chars": 32954,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2023 Vendicated and contributors\n *\n * This pro"
},
{
"path": "src/components/Link.tsx",
"chars": 1299,
"preview": "/*\n * Vencord, a modification for Discord's desktop app\n * Copyright (c) 2022 Vendicated and contributors\n *\n * This pro"
}
]
// ... and 552 more files (download for full content)
About this extraction
This page contains the full source code of the Vendicated/Vencord GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 752 files (2.4 MB), approximately 679.8k tokens, and a symbol index with 2204 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.