diff --git a/.gitignore b/.gitignore index ca3b7f0..f24a721 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ yarn-error.log* lerna-debug.log* .pnpm-debug.log* *.tsbuildinfo + +src/userplugins diff --git a/README.md b/README.md index 43db4c8..976f20c 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,14 @@ pnpm buildWeb You will find the built extension at dist/extension.zip. Now just install this extension in your Browser +## Installing Plugins + +Vencord comes with a bunch of plugins out of the box! +However, if you want to install your own ones, create a `userplugins` folder in the `src` directory and create or clone your plugins in there. +Don't forget to rebuild! + +Want to learn how to create your own plugin, and maybe PR it into Vencord? See the [Contributing](#contributing) section below! + ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) and [Megu's Plugin Guide!](docs/2_PLUGINS.md) diff --git a/docs/2_PLUGINS.md b/docs/2_PLUGINS.md index a80afa6..6ac4b24 100644 --- a/docs/2_PLUGINS.md +++ b/docs/2_PLUGINS.md @@ -6,7 +6,9 @@ You don't need to run `pnpm build` every time you make a change. Instead, use `p ## Plugin Entrypoint -1. Create a folder in `src/plugins/` with the name of your plugin. For example, `src/plugins/epicPlugin/` - All of your plugin files will go here. +> If it doesn't already exist, create a folder called `userplugins` in the `src` directory of this repo. + +1. Create a folder in `src/userplugins/` with the name of your plugin. For example, `src/userplugins/epicPlugin/` - All of your plugin files will go here. 2. Create a file in that folder called `index.ts` @@ -20,7 +22,7 @@ export default definePlugin({ description: "This plugin is absolutely epic", authors: [ { - id: "your discord user id goes here", + id: 12345n, name: "Your Name", }, ], @@ -33,6 +35,8 @@ export default definePlugin({ Change the name, description, and authors to your own information. +Replace `12345n` with your user ID ending in `n` (e.g., `545581357812678656n`). If you don't want to share your Discord account, use `0n` instead! + ## How Plugins Work In Vencord Vencord uses a different way of making mods than you're used to. @@ -97,7 +101,9 @@ abc.isStaff = function () { The match value _can_ be a string, rather than regex, however usually regex will be better suited, as it can work with unknown values, whereas strings must be exact matches. -Once you've made your plugin, make sure you run `pnpm lint` and make sure your code is nice and clean, and then open a PR on github :) +Once you've made your plugin, make sure you run `pnpm test` and make sure your code is nice and clean! + +If you want to publish your plugin into the Vencord repo, move your plugin from `src/userplugins` into the `src/plugins` folder and open a PR! > **Warning** > Make sure you've read [CONTRIBUTING.md](../CONTRIBUTING.md) before opening a PR diff --git a/scripts/build/common.mjs b/scripts/build/common.mjs index 59153a6..deb8ff4 100644 --- a/scripts/build/common.mjs +++ b/scripts/build/common.mjs @@ -1,5 +1,6 @@ import { execSync } from "child_process"; import esbuild from "esbuild"; +import { existsSync } from "fs"; import { readdir } from "fs/promises"; const watch = process.argv.includes("--watch"); @@ -41,21 +42,27 @@ export const globPlugins = { }); build.onLoad({ filter: /^plugins$/, namespace: "import-plugins" }, async () => { - const files = await readdir("./src/plugins"); + const pluginDirs = ["plugins", "userplugins"]; let code = ""; let plugins = "\n"; - for (let i = 0; i < files.length; i++) { - if (files[i] === "index.ts") { - continue; + let i = 0; + for (const dir of pluginDirs) { + if (!existsSync(`./src/${dir}`)) continue; + const files = await readdir(`./src/${dir}`); + for (const file of files) { + if (file === "index.ts") { + continue; + } + const mod = `p${i}`; + code += `import ${mod} from "./${dir}/${file.replace(/.tsx?$/, "")}";\n`; + plugins += `[${mod}.name]:${mod},\n`; + i++; } - const mod = `p${i}`; - code += `import ${mod} from "./${files[i].replace(/.tsx?$/, "")}";\n`; - plugins += `[${mod}.name]:${mod},\n`; } code += `export default {${plugins}};`; return { contents: code, - resolveDir: "./src/plugins" + resolveDir: "./src" }; }); }