diff --git a/package.json b/package.json index 8f4008a7..ef6fbeb2 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 24518fad..a6b170a3 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 87c32ab6..70dc142e 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 a0961c46..b50016c5 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 9acab664..bd349e25 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 48044139..75016e89 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 655eeefe..8d7524de 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 0baf099d..37fd18fd 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 27776ef0..8d1be96b 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 b92a41df..00000000 --- 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 534b3f7f..cf546482 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 19620e0c..a55f4615 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 e5e618f7..c1e43013 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 efb967a6..96833d8f 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 e724ea43..fb4a8218 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 d01efecf..8b41e16e 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 634b5cd6..e32daaef 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 cce7e9a3..9bade499 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 67bf5025..3ef84b73 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 17386237..05d235fc 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 c81b13a8..6af1bdc8 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,