diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.zplrc.js b/.zplrc.js new file mode 100644 index 00000000..dc6f699a --- /dev/null +++ b/.zplrc.js @@ -0,0 +1,4 @@ +module.exports = name => ({ + base: "./src/plugins", + out: "./Plugins/" + name +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..42b72e2b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,50 @@ +{ + "name": "betterdiscordaddons", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "betterdiscordaddons", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "zerespluginlibrary": "^2.0.6" + } + }, + "../PluginLibrary": { + "name": "zerespluginlibrary", + "version": "2.0.6", + "extraneous": true, + "license": "MIT", + "bin": { + "zpl": "bin/zpl.js" + }, + "devDependencies": { + "foodoc": "github:rauenzi/foodoc", + "jsdoc": "^3.6.10", + "raw-loader": "^4.0.2", + "typescript": "^4.8.3", + "webpack": "^5.74.0", + "webpack-cli": "^4.9.1" + } + }, + "node_modules/zerespluginlibrary": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/zerespluginlibrary/-/zerespluginlibrary-2.0.6.tgz", + "integrity": "sha512-xFJGAKWWHVhCPCX6Qq1tsVJzOzTHRF7xnz2bu+3DKGaXsNCP7hPxy0LJ3mXtHLeSlH3v9ARZ0kzDs4cj5bCVnw==", + "dev": true, + "bin": { + "zpl": "bin/zpl.js" + } + } + }, + "dependencies": { + "zerespluginlibrary": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/zerespluginlibrary/-/zerespluginlibrary-2.0.6.tgz", + "integrity": "sha512-xFJGAKWWHVhCPCX6Qq1tsVJzOzTHRF7xnz2bu+3DKGaXsNCP7hPxy0LJ3mXtHLeSlH3v9ARZ0kzDs4cj5bCVnw==", + "dev": true + } + } +} diff --git a/package.json b/package.json index aa3d62bd..e1467007 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,9 @@ "type": "git", "url": "https://github.com/rauenzi/BetterDiscordAddons" }, - "devDependencies": {}, "scripts": { - "build_plugin": "node ./scripts/build.js local", - "build_plugin_remote": "node ./scripts/build.js remote" + "build": "zpl build", + "init": "zpl init" }, "author": "Zerebos", "license": "MIT", @@ -24,5 +23,8 @@ "github": "https://github.com/rauenzi/BetterDiscordAddons/tree/master/Plugins/`{{PLUGIN_NAME}}`", "githubRaw": "https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/`{{PLUGIN_NAME}}`/`{{PLUGIN_NAME}}`.plugin.js", "authorLink": "https://twitter.com/IAmZerebos" + }, + "devDependencies": { + "zerespluginlibrary": "^2.0.6" } } diff --git a/scripts/build.js b/scripts/build.js deleted file mode 100644 index b9845487..00000000 --- a/scripts/build.js +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable no-console */ -const path = require("path"); -const fs = require("fs"); -const args = process.argv.slice(2); -const defaultConfig = require(path.join(__dirname, "../package.json")).buildConfig; -const configFilePath = path.join(__dirname, "../config.json"); -const buildConfig = Object.assign(defaultConfig, fs.existsSync(configFilePath) ? require(configFilePath) : {}); -const pluginsPath = path.isAbsolute(buildConfig.pluginsFolder) ? buildConfig.pluginsFolder : path.join(__dirname, "..", buildConfig.pluginsFolder); -const releasePath = path.isAbsolute(buildConfig.releaseFolder) ? buildConfig.releaseFolder : path.join(__dirname, "..", buildConfig.releaseFolder); -const windows = process.env.APPDATA; -const mac = process.env.HOME + "/Library/Application Support"; -const linux = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : process.env.HOME + "/.config"; -let bdFolder = (process.platform == "win32" ? windows : process.platform == "darwin" ? mac : linux) + "/BetterDiscord/"; -if (buildConfig.bdFolder) bdFolder = buildConfig.bdFolder; - -const embedFiles = function(content, pluginName, files) { - for (const fileName of files) { - content = content.replace(new RegExp(`require\\(('|"|\`)${fileName}('|"|\`)\\)`, "g"), () => { - const filePath = path.join(pluginsPath, pluginName, fileName); - if (!fileName.endsWith(".js")) return `\`${fs.readFileSync(filePath).toString().replace(/\\/g, `\\\\`).replace(/\\\\\$\{/g, "\\${").replace(/`/g, "\\`")}\``; - const exported = require(filePath); - if (typeof(exported) !== "object" && !Array.isArray(exported)) return `(${require(filePath).toString()})`; - if (Array.isArray(exported)) return `(${JSON.stringify(exported)})`; - const raw = fs.readFileSync(filePath).toString().replace(/module\.exports\s*=\s*/, ""); - return `(() => {return ${raw}})()`; - }); - } - return content; -}; - -const template = fs.readFileSync(path.join(__dirname, "template.js")).toString(); -const list = args.slice(1).length ? args.slice(1) : fs.readdirSync(pluginsPath).filter(f => fs.lstatSync(path.join(pluginsPath, f)).isDirectory()); -console.log(""); -console.log(`Building ${list.length} plugin${list.length > 1 ? "s" : ""}`); -console.time("Build took"); -for (let f = 0; f < list.length; f++) { - const pluginName = list[f]; - const configPath = path.join(pluginsPath, pluginName, "config.json"); - console.log(`Building ${pluginName} from ${configPath}`); - - if (!fs.existsSync(configPath)) { - console.error(`Could not find "${configPath}". Skipping...`); - continue; - } - const config = require(configPath); - const files = fs.readdirSync(path.join(pluginsPath, pluginName)).filter(p => p != "config.json" && p != config.main); - const content = embedFiles(require(path.join(pluginsPath, pluginName, config.main)).toString(), pluginName, files); - let result = buildMeta(config); - if (buildConfig.addInstallScript) result += require(path.join(__dirname, "installscript.js")); - result += template.replace(`const config = "";`, `const config = ${JSON.stringify(config, null, 4).replace(/"((?:[A-Za-z]|[0-9]|_)+)"\s?:/g, "$1:")};`) - .replace(`const plugin = "";`, () => `const plugin = ${content};`); - if (buildConfig.addInstallScript) result += "\n/*@end@*/"; - const buildFile = path.join(releasePath, pluginName, pluginName + ".plugin.js"); - fs.writeFileSync(buildFile, result); - if (buildConfig.copyToBD) { - console.log(`Copying ${pluginName} to BD folder`); - fs.writeFileSync(path.join(bdFolder, "plugins", pluginName + ".plugin.js"), result); - } - console.log(`${pluginName} built successfully`); - console.log(`${pluginName} saved as ${buildFile}`); -} -console.timeEnd("Build took"); - -function buildMeta(config) { - const metaString = ["/**"]; - const line = (label, val) => val && metaString.push(` * @${label} ${val}`); - line("name", config.info.name); - line("description", config.info.description); - line("version", config.info.version); - line("author", config.info.authors.map(a => a.name).join(", ")); - line("authorId", config.info.authors[0].id ?? config.info.authors[0].discord_id); - line("authorLink", config.info.authors[0].link ?? buildConfig.authorLink); - line("invite", config.info.invite ?? buildConfig.invite); - line("website", config.info.website ?? config.info.github); - line("source", config.info.source ?? config.info.github_raw); - line("donate", config.info.donate); - line("patreon", config.info.patreon); - metaString.push(" */"); - metaString.push(""); - return metaString.join("\n"); -} - diff --git a/scripts/installscript.js b/scripts/installscript.js deleted file mode 100644 index 0674c7f4..00000000 --- a/scripts/installscript.js +++ /dev/null @@ -1,24 +0,0 @@ -module.exports = `/*@cc_on -@if (@_jscript) - - // Offer to self-install for clueless users that try to run this directly. - var shell = WScript.CreateObject("WScript.Shell"); - var fs = new ActiveXObject("Scripting.FileSystemObject"); - var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\\\BetterDiscord\\\\plugins"); - var pathSelf = WScript.ScriptFullName; - // Put the user at ease by addressing them in the first person - shell.Popup("It looks like you've mistakenly tried to run me directly. \\n(Don't do that!)", 0, "I'm a plugin for BetterDiscord", 0x30); - if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { - shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); - } else if (!fs.FolderExists(pathPlugins)) { - shell.Popup("I can't find the BetterDiscord plugins folder.\\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); - } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { - fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); - // Show the user where to put plugins in the future - shell.Exec("explorer " + pathPlugins); - shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); - } - WScript.Quit(); - -@else@*/ -`; diff --git a/scripts/template.js b/scripts/template.js deleted file mode 100644 index 223cf8ed..00000000 --- a/scripts/template.js +++ /dev/null @@ -1,24 +0,0 @@ -const config = ""; -class Dummy { - constructor() {this._config = config;} - start() {} - stop() {} -} - -if (!global.ZeresPluginLibrary) { - BdApi.showConfirmationModal("Library Missing", `The library plugin needed for ${config.info.name} is missing. Please click Download Now to install it.`, { - confirmText: "Download Now", - cancelText: "Cancel", - onConfirm: () => { - require("request").get("https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js", async (error, response, body) => { - if (error) return require("electron").shell.openExternal("https://betterdiscord.app/Download?id=9"); - await new Promise(r => require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0PluginLibrary.plugin.js"), body, r)); - }); - } - }); -} - -module.exports = !global.ZeresPluginLibrary ? Dummy : (([Plugin, Api]) => { - const plugin = ""; - return plugin(Plugin, Api); -})(global.ZeresPluginLibrary.buildPlugin(config)); \ No newline at end of file diff --git a/src/plugins/BDContextMenu/index.js b/src/plugins/BDContextMenu/index.js index 463d2fda..0fdec858 100644 --- a/src/plugins/BDContextMenu/index.js +++ b/src/plugins/BDContextMenu/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, DiscordModules, DCM, PluginUtilities, WebpackModules} = Api; diff --git a/src/plugins/BetterFormattingRedux/index.js b/src/plugins/BetterFormattingRedux/index.js index b8f48b12..1b307391 100644 --- a/src/plugins/BetterFormattingRedux/index.js +++ b/src/plugins/BetterFormattingRedux/index.js @@ -1,3 +1,7 @@ +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {DiscordSelectors, PluginUtilities, Tooltip, DiscordModules, Patcher, Utilities, DCM, DOMTools, ReactTools, WebpackModules} = Api; diff --git a/src/plugins/BetterRoleColors/config.json b/src/plugins/BetterRoleColors/config.json index 3120fc67..bfe23477 100644 --- a/src/plugins/BetterRoleColors/config.json +++ b/src/plugins/BetterRoleColors/config.json @@ -1,17 +1,10 @@ { - "info": { - "name": "BetterRoleColors", - "authors": [{ - "name": "Zerebos", - "discord_id": "249746236008169473", - "github_username": "rauenzi", - "twitter_username": "ZackRauen" - }], - "version": "0.9.0", - "description": "Adds server-based role colors to typing, voice, popouts, modals and more!", - "github": "https://github.com/rauenzi/BetterDiscordAddons/tree/master/Plugins/BetterRoleColors", - "github_raw": "https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/BetterRoleColors/BetterRoleColors.plugin.js" - }, + "name": "BetterRoleColors", + "author": "Zerebos", + "version": "0.9.0", + "description": "Adds server-based role colors to typing, voice, popouts, modals and more!", + "github": "https://github.com/rauenzi/BetterDiscordAddons/tree/master/Plugins/BetterRoleColors", + "github_raw": "https://raw.githubusercontent.com/rauenzi/BetterDiscordAddons/master/Plugins/BetterRoleColors/BetterRoleColors.plugin.js", "changelog": [ { "title":"Added", diff --git a/src/plugins/BetterRoleColors/index.js b/src/plugins/BetterRoleColors/index.js index 028ec359..b8152ccc 100644 --- a/src/plugins/BetterRoleColors/index.js +++ b/src/plugins/BetterRoleColors/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {DiscordSelectors, WebpackModules, DiscordModules, Patcher, ColorConverter, ReactComponents, Utilities, Logger} = Api; diff --git a/src/plugins/BlurNSFW/index.js b/src/plugins/BlurNSFW/index.js index 4e33b7a5..ed86308d 100644 --- a/src/plugins/BlurNSFW/index.js +++ b/src/plugins/BlurNSFW/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, WebpackModules, DiscordModules, PluginUtilities, Utilities, DCM} = Api; diff --git a/src/plugins/DoNotTrack/index.js b/src/plugins/DoNotTrack/index.js index 21cc9037..5e543a59 100644 --- a/src/plugins/DoNotTrack/index.js +++ b/src/plugins/DoNotTrack/index.js @@ -1,3 +1,7 @@ +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, WebpackModules, Modals} = Api; diff --git a/src/plugins/GhostPingDetector/index.js b/src/plugins/GhostPingDetector/index.js index 510dd077..8ad1bfde 100644 --- a/src/plugins/GhostPingDetector/index.js +++ b/src/plugins/GhostPingDetector/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {DiscordModules, Logger, Patcher} = Api; diff --git a/src/plugins/HideDisabledEmojis/index.js b/src/plugins/HideDisabledEmojis/index.js index a85d808c..51bcfb8c 100644 --- a/src/plugins/HideDisabledEmojis/index.js +++ b/src/plugins/HideDisabledEmojis/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, DiscordModules, WebpackModules} = Api; return class HideDisabledEmojis extends Plugin { diff --git a/src/plugins/HideIconBadge/index.js b/src/plugins/HideIconBadge/index.js index 6b58a133..e7da8e0e 100644 --- a/src/plugins/HideIconBadge/index.js +++ b/src/plugins/HideIconBadge/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, WebpackModules} = Api; const ElectronModule = WebpackModules.getByProps(["setBadge"]); diff --git a/src/plugins/PermissionsViewer/index.js b/src/plugins/PermissionsViewer/index.js index 59936ddd..b579e150 100644 --- a/src/plugins/PermissionsViewer/index.js +++ b/src/plugins/PermissionsViewer/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Patcher, DiscordModules, WebpackModules, PluginUtilities, Toasts, DiscordClasses, Utilities, DOMTools, ColorConverter, DCM, Structs, ReactTools} = Api; diff --git a/src/plugins/RoleMembers/index.js b/src/plugins/RoleMembers/index.js index 3a01cad7..7fc84639 100644 --- a/src/plugins/RoleMembers/index.js +++ b/src/plugins/RoleMembers/index.js @@ -1,4 +1,7 @@ - +/** + * @param {import("zerespluginlibrary").Plugin} Plugin + * @param {import("zerespluginlibrary").BoundAPI} Api + */ module.exports = (Plugin, Api) => { const {Popouts, DiscordModules, DiscordSelectors, Utilities, WebpackModules, Patcher, DCM, DOMTools, Toasts} = Api;