diff --git a/package.json b/package.json index 8f4008a79..ef6fbeb29 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "lint": "eslint . --ext .js,.jsx,.ts,.tsx --ignore-pattern src/userplugins", "lint-styles": "stylelint \"src/**/*.css\" --ignore-pattern src/userplugins", "lint:fix": "pnpm lint --fix", - "test": "pnpm build && pnpm lint && pnpm lint-styles && pnpm testTsc", + "test": "pnpm build && pnpm lint && pnpm lint-styles && pnpm testTsc && pnpm generatePluginJson", "testWeb": "pnpm lint && pnpm buildWeb && pnpm testTsc", "testTsc": "tsc --noEmit", "uninject": "node scripts/runInstaller.mjs", diff --git a/scripts/build/common.mjs b/scripts/build/common.mjs index 24518fad3..a6b170a37 100644 --- a/scripts/build/common.mjs +++ b/scripts/build/common.mjs @@ -64,7 +64,7 @@ export const globPlugins = kind => ({ }); build.onLoad({ filter, namespace: "import-plugins" }, async () => { - const pluginDirs = ["plugins", "userplugins"]; + const pluginDirs = ["plugins/_api", "plugins/_core", "plugins", "userplugins"]; let code = ""; let plugins = "\n"; let i = 0; @@ -72,8 +72,9 @@ export const globPlugins = kind => ({ if (!existsSync(`./src/${dir}`)) continue; const files = await readdir(`./src/${dir}`); for (const file of files) { - if (file.startsWith(".")) continue; + if (file.startsWith("_") || file.startsWith(".")) continue; if (file === "index.ts") continue; + const fileBits = file.split("."); if (fileBits.length > 2 && ["ts", "tsx"].includes(fileBits.at(-1))) { const mod = fileBits.at(-2); diff --git a/scripts/generatePluginList.ts b/scripts/generatePluginList.ts index 87c32ab62..70dc142ee 100644 --- a/scripts/generatePluginList.ts +++ b/scripts/generatePluginList.ts @@ -171,8 +171,8 @@ async function parseFile(fileName: string) { throw fail("no default export called 'definePlugin' found"); } -async function getEntryPoint(dirent: Dirent) { - const base = join("./src/plugins", dirent.name); +async function getEntryPoint(dir: string, dirent: Dirent) { + const base = join(dir, dirent.name); if (!dirent.isDirectory()) return base; for (const name of ["index.ts", "index.tsx"]) { @@ -186,13 +186,23 @@ async function getEntryPoint(dirent: Dirent) { throw new Error(`${dirent.name}: Couldn't find entry point`); } +function isPluginFile({ name }: { name: string; }) { + if (name === "index.ts") return false; + return !name.startsWith("_") && !name.startsWith("."); +} + (async () => { parseDevs(); - const plugins = readdirSync("./src/plugins", { withFileTypes: true }).filter(d => d.name !== "index.ts"); - const promises = plugins.map(async dirent => parseFile(await getEntryPoint(dirent))); + const plugins = ["src/plugins", "src/plugins/_core"].flatMap(dir => + readdirSync(dir, { withFileTypes: true }) + .filter(isPluginFile) + .map(async dirent => + parseFile(await getEntryPoint(dir, dirent)) + ) + ); - const data = JSON.stringify(await Promise.all(promises)); + const data = JSON.stringify(await Promise.all(plugins)); if (process.argv.length > 2) { writeFileSync(process.argv[2], data); diff --git a/src/api/Badges.ts b/src/api/Badges.ts index a0961c46d..b50016c5b 100644 --- a/src/api/Badges.ts +++ b/src/api/Badges.ts @@ -22,7 +22,7 @@ import { ComponentType, HTMLProps } from "react"; import Plugins from "~plugins"; -export enum BadgePosition { +export const enum BadgePosition { START, END } @@ -79,7 +79,7 @@ export function _getBadges(args: BadgeUserArgs) { : badges.push({ ...badge, ...args }); } } - const donorBadges = (Plugins.BadgeAPI as unknown as typeof import("../plugins/apiBadges").default).getDonorBadges(args.user.id); + const donorBadges = (Plugins.BadgeAPI as unknown as typeof import("../plugins/_api/badges").default).getDonorBadges(args.user.id); if (donorBadges) badges.unshift(...donorBadges); return badges; diff --git a/src/api/Commands/types.ts b/src/api/Commands/types.ts index 9acab664f..bd349e250 100644 --- a/src/api/Commands/types.ts +++ b/src/api/Commands/types.ts @@ -24,7 +24,7 @@ export interface CommandContext { guild?: Guild; } -export enum ApplicationCommandOptionType { +export const enum ApplicationCommandOptionType { SUB_COMMAND = 1, SUB_COMMAND_GROUP = 2, STRING = 3, @@ -38,7 +38,7 @@ export enum ApplicationCommandOptionType { ATTACHMENT = 11, } -export enum ApplicationCommandInputType { +export const enum ApplicationCommandInputType { BUILT_IN = 0, BUILT_IN_TEXT = 1, BUILT_IN_INTEGRATION = 2, @@ -64,7 +64,7 @@ export interface ChoicesOption { displayName?: string; } -export enum ApplicationCommandType { +export const enum ApplicationCommandType { CHAT_INPUT = 1, USER = 2, MESSAGE = 3, diff --git a/src/api/ServerList.ts b/src/api/ServerList.ts index 480441391..75016e897 100644 --- a/src/api/ServerList.ts +++ b/src/api/ServerList.ts @@ -20,7 +20,7 @@ import { Logger } from "@utils/Logger"; const logger = new Logger("ServerListAPI"); -export enum ServerListRenderPosition { +export const enum ServerListRenderPosition { Above, In, } diff --git a/src/components/PluginSettings/index.tsx b/src/components/PluginSettings/index.tsx index 655eeefe9..8d7524de4 100644 --- a/src/components/PluginSettings/index.tsx +++ b/src/components/PluginSettings/index.tsx @@ -173,7 +173,7 @@ function PluginCard({ plugin, disabled, onRestartNeeded, onMouseEnter, onMouseLe ); } -enum SearchStatus { +const enum SearchStatus { ALL, ENABLED, DISABLED diff --git a/src/plugins/apiBadges.tsx b/src/plugins/_api/badges.tsx similarity index 100% rename from src/plugins/apiBadges.tsx rename to src/plugins/_api/badges.tsx diff --git a/src/plugins/apiCommands.ts b/src/plugins/_api/commands.ts similarity index 100% rename from src/plugins/apiCommands.ts rename to src/plugins/_api/commands.ts diff --git a/src/plugins/apiContextMenu.ts b/src/plugins/_api/contextMenu.ts similarity index 100% rename from src/plugins/apiContextMenu.ts rename to src/plugins/_api/contextMenu.ts diff --git a/src/plugins/apiMemberListDecorators.ts b/src/plugins/_api/memberListDecorators.ts similarity index 100% rename from src/plugins/apiMemberListDecorators.ts rename to src/plugins/_api/memberListDecorators.ts diff --git a/src/plugins/apiMessageAccessories.ts b/src/plugins/_api/messageAccessories.ts similarity index 100% rename from src/plugins/apiMessageAccessories.ts rename to src/plugins/_api/messageAccessories.ts diff --git a/src/plugins/apiMessageDecorations.ts b/src/plugins/_api/messageDecorations.ts similarity index 100% rename from src/plugins/apiMessageDecorations.ts rename to src/plugins/_api/messageDecorations.ts diff --git a/src/plugins/apiMessageEvents.ts b/src/plugins/_api/messageEvents.ts similarity index 100% rename from src/plugins/apiMessageEvents.ts rename to src/plugins/_api/messageEvents.ts diff --git a/src/plugins/apiMessagePopover.ts b/src/plugins/_api/messagePopover.ts similarity index 100% rename from src/plugins/apiMessagePopover.ts rename to src/plugins/_api/messagePopover.ts diff --git a/src/plugins/apiNotices.ts b/src/plugins/_api/notices.ts similarity index 100% rename from src/plugins/apiNotices.ts rename to src/plugins/_api/notices.ts diff --git a/src/plugins/apiServerList.ts b/src/plugins/_api/serverList.ts similarity index 100% rename from src/plugins/apiServerList.ts rename to src/plugins/_api/serverList.ts diff --git a/src/plugins/apiSettingsStore.ts b/src/plugins/_api/settingsStore.ts similarity index 100% rename from src/plugins/apiSettingsStore.ts rename to src/plugins/_api/settingsStore.ts diff --git a/src/plugins/noTrack.ts b/src/plugins/_core/noTrack.ts similarity index 100% rename from src/plugins/noTrack.ts rename to src/plugins/_core/noTrack.ts diff --git a/src/plugins/settings.tsx b/src/plugins/_core/settings.tsx similarity index 100% rename from src/plugins/settings.tsx rename to src/plugins/_core/settings.tsx diff --git a/src/plugins/anonymiseFileNames.ts b/src/plugins/anonymiseFileNames.ts index 0baf099d6..37fd18fd0 100644 --- a/src/plugins/anonymiseFileNames.ts +++ b/src/plugins/anonymiseFileNames.ts @@ -20,7 +20,7 @@ import { Settings } from "@api/Settings"; import { Devs } from "@utils/constants"; import definePlugin, { OptionType } from "@utils/types"; -enum Methods { +const enum Methods { Random, Consistent, Timestamp, diff --git a/src/plugins/customRPC.tsx b/src/plugins/customRPC.tsx index 27776ef03..8d1be96b0 100644 --- a/src/plugins/customRPC.tsx +++ b/src/plugins/customRPC.tsx @@ -74,7 +74,7 @@ interface Activity { flags: number; } -enum ActivityType { +const enum ActivityType { PLAYING = 0, LISTENING = 2, WATCHING = 3, diff --git a/src/plugins/fart.ts b/src/plugins/fart.ts deleted file mode 100644 index b92a41df0..000000000 --- a/src/plugins/fart.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 . -*/ - -import { ApplicationCommandOptionType } from "@api/Commands"; -import { Settings } from "@api/Settings"; -import { makeRange } from "@components/PluginSettings/components"; -import { Devs } from "@utils/constants"; -import definePlugin, { OptionType } from "@utils/types"; - -export default definePlugin({ - name: "Fart2", - authors: [Devs.Animal], - description: "Enable farting v2, a slash command that allows you to perform or request that someone perform a little toot.", - dependencies: ["CommandsAPI"], - commands: [{ - name: "fart", - description: "A simple command in which you may either request that a user do a little toot for you, or conduct one yourself.", - options: [ - { - type: ApplicationCommandOptionType.USER, - name: "user", - description: "A Discordâ„¢ user of which you would humbly request a toot from.", - required: false - } - ], - - execute(args) { - const fart = new Audio("https://raw.githubusercontent.com/ItzOnlyAnimal/AliuPlugins/main/fart.mp3"); - fart.volume = Settings.plugins.Fart2.volume; - fart.play(); - - return { - content: (args[0]) ? `<@${args[0].value}> fart` : "fart" - }; - }, - }], - options: { - volume: { - description: "how loud you wanna fart (aka volume)", - type: OptionType.SLIDER, - markers: makeRange(0, 1, 0.1), - default: 0.5, - stickToMarkers: false, - } - } -}); diff --git a/src/plugins/ignoreActivities.tsx b/src/plugins/ignoreActivities.tsx index 534b3f7f8..cf5464822 100644 --- a/src/plugins/ignoreActivities.tsx +++ b/src/plugins/ignoreActivities.tsx @@ -24,7 +24,7 @@ import definePlugin from "@utils/types"; import { findByPropsLazy, findStoreLazy } from "@webpack"; import { Tooltip } from "webpack/common"; -enum ActivitiesTypes { +const enum ActivitiesTypes { Game, Embedded } diff --git a/src/plugins/lastfm.tsx b/src/plugins/lastfm.tsx index 19620e0c0..a55f46156 100644 --- a/src/plugins/lastfm.tsx +++ b/src/plugins/lastfm.tsx @@ -63,12 +63,12 @@ interface TrackData { } // only relevant enum values -enum ActivityType { +const enum ActivityType { PLAYING = 0, LISTENING = 2, } -enum ActivityFlag { +const enum ActivityFlag { INSTANCE = 1 << 0, } diff --git a/src/plugins/muteNewGuild.tsx b/src/plugins/muteNewGuild.tsx index e5e618f7c..c1e43013b 100644 --- a/src/plugins/muteNewGuild.tsx +++ b/src/plugins/muteNewGuild.tsx @@ -18,37 +18,8 @@ import { definePluginSettings } from "@api/Settings"; import { Devs } from "@utils/constants"; -import { ModalContent, ModalFooter, ModalProps, ModalRoot, ModalSize, openModal } from "@utils/modal"; import definePlugin, { OptionType } from "@utils/types"; -import { findByProps, findStoreLazy } from "@webpack"; -import { Button, Text } from "@webpack/common"; - -const UserGuildSettingsStore = findStoreLazy("UserGuildSettingsStore"); - -function NoDMNotificationsModal({ modalProps }: { modalProps: ModalProps; }) { - return ( - - -
- You seem to have been affected by a bug that caused DM notifications to be muted and break if you used the MuteNewGuild plugin. - If you haven't received any notifications for private messages, this is why. This issue is now fixed, so they should work again. Please verify, and in case they are still broken, ask for help in the Vencord support channel! - We're very sorry for any inconvenience caused by this issue :( -
-
- -
- -
-
-
- ); -} +import { findByProps } from "@webpack"; const settings = definePluginSettings({ guild: { @@ -92,15 +63,5 @@ export default definePlugin({ suppress_roles: settings.store.role } ); - }, - - start() { - const [isMuted, isEveryoneSupressed, isRolesSupressed] = [UserGuildSettingsStore.isMuted(null), UserGuildSettingsStore.isSuppressEveryoneEnabled(null), UserGuildSettingsStore.isSuppressRolesEnabled(null)]; - - if (isMuted || isEveryoneSupressed || isRolesSupressed) { - findByProps("updateGuildNotificationSettings").updateGuildNotificationSettings(null, { muted: false, suppress_everyone: false, suppress_roles: false }); - - openModal(modalProps => ); - } } }); diff --git a/src/plugins/unminifyErrors.ts b/src/plugins/reactErrorDecoder.ts similarity index 100% rename from src/plugins/unminifyErrors.ts rename to src/plugins/reactErrorDecoder.ts diff --git a/src/plugins/serverListIndicators.tsx b/src/plugins/serverListIndicators.tsx index efb967a62..96833d8f3 100644 --- a/src/plugins/serverListIndicators.tsx +++ b/src/plugins/serverListIndicators.tsx @@ -24,7 +24,7 @@ import { useForceUpdater } from "@utils/react"; import definePlugin, { OptionType } from "@utils/types"; import { GuildStore, PresenceStore, RelationshipStore } from "@webpack/common"; -enum IndicatorType { +const enum IndicatorType { SERVER = 1 << 0, FRIEND = 1 << 1, BOTH = SERVER | FRIEND, diff --git a/src/plugins/shikiCodeblocks/types.ts b/src/plugins/shikiCodeblocks/types.ts index e724ea438..fb4a8218b 100644 --- a/src/plugins/shikiCodeblocks/types.ts +++ b/src/plugins/shikiCodeblocks/types.ts @@ -46,18 +46,18 @@ export type ShikiSpec = { }) => Promise; }; -export enum StyleSheets { +export const enum StyleSheets { Main = "MAIN", DevIcons = "DEVICONS", } -export enum HljsSetting { +export const enum HljsSetting { Never = "NEVER", Secondary = "SECONDARY", Primary = "PRIMARY", Always = "ALWAYS", } -export enum DeviconSetting { +export const enum DeviconSetting { Disabled = "DISABLED", Greyscale = "GREYSCALE", Color = "COLOR" diff --git a/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx b/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx index d01efecf5..8b41e16e9 100644 --- a/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx +++ b/src/plugins/showHiddenChannels/components/HiddenChannelLockScreen.tsx @@ -29,12 +29,12 @@ import openRolesAndUsersPermissionsModal, { PermissionType, RoleOrUserPermission import { sortPermissionOverwrites } from "../../permissionsViewer/utils"; import { settings, VIEW_CHANNEL } from ".."; -enum SortOrderTypes { +const enum SortOrderTypes { LATEST_ACTIVITY = 0, CREATION_DATE = 1 } -enum ForumLayoutTypes { +const enum ForumLayoutTypes { DEFAULT = 0, LIST = 1, GRID = 2 @@ -61,7 +61,7 @@ interface ExtendedChannel extends Channel { availableTags?: Array; } -enum ChannelTypes { +const enum ChannelTypes { GUILD_TEXT = 0, GUILD_VOICE = 2, GUILD_ANNOUNCEMENT = 5, @@ -69,12 +69,12 @@ enum ChannelTypes { GUILD_FORUM = 15 } -enum VideoQualityModes { +const enum VideoQualityModes { AUTO = 1, FULL = 2 } -enum ChannelFlags { +const enum ChannelFlags { PINNED = 1 << 1, REQUIRE_TAG = 1 << 4 } diff --git a/src/plugins/showHiddenChannels/index.tsx b/src/plugins/showHiddenChannels/index.tsx index 634b5cd63..e32daaef9 100644 --- a/src/plugins/showHiddenChannels/index.tsx +++ b/src/plugins/showHiddenChannels/index.tsx @@ -34,7 +34,7 @@ const ChannelListClasses = findByPropsLazy("channelName", "subtitle", "modeMuted export const VIEW_CHANNEL = 1n << 10n; const CONNECT = 1n << 20n; -enum ShowMode { +const enum ShowMode { LockIcon, HiddenIconWithMutedStyle } diff --git a/src/plugins/supportHelper.tsx b/src/plugins/supportHelper.tsx index cce7e9a39..9bade4993 100644 --- a/src/plugins/supportHelper.tsx +++ b/src/plugins/supportHelper.tsx @@ -27,7 +27,7 @@ import { Alerts, Forms, UserStore } from "@webpack/common"; import gitHash from "~git-hash"; import plugins from "~plugins"; -import settings from "./settings"; +import settings from "./_core/settings"; const REMEMBER_DISMISS_KEY = "Vencord-SupportHelper-Dismiss"; diff --git a/src/utils/dependencies.ts b/src/utils/dependencies.ts index 67bf5025f..3ef84b73f 100644 --- a/src/utils/dependencies.ts +++ b/src/utils/dependencies.ts @@ -37,7 +37,7 @@ export const importApngJs = makeLazy(async () => { }); // https://wiki.mozilla.org/APNG_Specification#.60fcTL.60:_The_Frame_Control_Chunk -export enum ApngDisposeOp { +export const enum ApngDisposeOp { /** * no disposal is done on this frame before rendering the next; the contents of the output buffer are left as is. */ @@ -53,7 +53,7 @@ export enum ApngDisposeOp { } // TODO: Might need to somehow implement this -export enum ApngBlendOp { +export const enum ApngBlendOp { SOURCE, OVER } diff --git a/src/utils/modal.tsx b/src/utils/modal.tsx index 173862370..05d235fc6 100644 --- a/src/utils/modal.tsx +++ b/src/utils/modal.tsx @@ -21,14 +21,14 @@ import type { ComponentType, PropsWithChildren, ReactNode, Ref } from "react"; import { LazyComponent } from "./react"; -export enum ModalSize { +export const enum ModalSize { SMALL = "small", MEDIUM = "medium", LARGE = "large", DYNAMIC = "dynamic", } -enum ModalTransitionState { +const enum ModalTransitionState { ENTERING, ENTERED, EXITING, diff --git a/src/utils/types.ts b/src/utils/types.ts index c81b13a86..6af1bdc87 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -117,7 +117,7 @@ export interface PluginDef { tags?: string[]; } -export enum OptionType { +export const enum OptionType { STRING, NUMBER, BIGINT,