├── BegoneAutoPause ├── BegoneAutoPause.plugin.js └── README.md ├── CommandsAPI ├── 2CommandsAPI.plugin.js └── README.md ├── DNDBypass ├── DNDBypass.plugin.js └── README.md ├── DataSaver ├── DataSaver.plugin.js └── README.md ├── DoubleClickVC ├── DoubleClickVC.plugin.js └── README.md ├── GameActivityToggle ├── GameActivityToggle.plugin.js └── README.md ├── HideDMButtons ├── HideDMButtons.plugin.js └── README.md ├── MarkAllRead ├── MarkAllRead.plugin.js └── README.md ├── MessageCleaner ├── MessageCleaner.plugin.js └── README.md ├── Mock ├── Mock.plugin.js └── README.md ├── NSFWGateBypass ├── NSFWGateBypass.plugin.js └── README.md ├── NoBandwidthKick ├── NoBandwidthKick.plugin.js └── README.md ├── OpenInApp ├── OpenInApp.plugin.js └── README.md ├── PictureLink ├── PictureLink.plugin.js └── README.md ├── README.md ├── RelationshipsNotifier ├── README.md └── RelationshipsNotifier.plugin.js ├── ScreenshareCrack ├── README.md └── ScreenshareCrack.plugin.js ├── ShowHiddenChannels ├── README.md └── ShowHiddenChannels.plugin.js ├── SilentTyping ├── README.md └── SilentTyping.plugin.js ├── SpotifyCrack ├── README.md └── SpotifyCrack.plugin.js ├── Template.plugin.js ├── UserLookup ├── README.md └── UserLookup.plugin.js ├── VoiceChatMoveAll ├── README.md └── VoiceChatMoveAll.plugin.js └── assets ├── banner.png ├── icon.png └── icon.psd /BegoneAutoPause/BegoneAutoPause.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name BegoneAutoPause 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/BegoneAutoPause/BegoneAutoPause.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/BegoneAutoPause/BegoneAutoPause.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/BegoneAutoPause/BegoneAutoPause.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'BegoneAutoPause', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.3', 47 | description: 'Stops Discord from automatically pausing your music after 30 seconds.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/BegoneAutoPause/BegoneAutoPause.plugin.js' 50 | }, 51 | }; 52 | 53 | return !global.ZeresPluginLibrary ? class { 54 | constructor() { 55 | this.start = this.load = this.handleMissingLib; 56 | } 57 | 58 | getName() { 59 | return config.info.name.replace(/\s+/g, ''); 60 | } 61 | 62 | getAuthor() { 63 | return config.info.authors.map(a => a.name).join(', '); 64 | } 65 | 66 | getVersion() { 67 | return config.info.version; 68 | } 69 | 70 | getDescription() { 71 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 72 | } 73 | 74 | start() { } 75 | 76 | stop() { } 77 | 78 | async handleMissingLib() { 79 | const request = require('request'); 80 | const path = require('path'); 81 | const fs = require('fs'); 82 | 83 | const dependencies = [ 84 | { 85 | global: 'ZeresPluginLibrary', 86 | filename: '0PluginLibrary.plugin.js', 87 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 88 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 89 | } 90 | ]; 91 | 92 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 93 | 94 | if (global.eternalModal) { 95 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 96 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 97 | }; 98 | 99 | global.eternalModal = true; 100 | 101 | BdApi.showConfirmationModal( 102 | 'Dependencies needed', 103 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 104 | { 105 | confirmText: 'Download', 106 | cancelText: 'Cancel', 107 | onCancel: () => delete global.eternalModal, 108 | onConfirm: async () => { 109 | for (const dependency of dependencies) { 110 | if (!window.hasOwnProperty(dependency.global)) { 111 | await new Promise((resolve) => { 112 | request.get(dependency.url, (error, res, body) => { 113 | if (error) return electron.shell.openExternal(dependency.external); 114 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 115 | }); 116 | }); 117 | } 118 | } 119 | 120 | delete global.eternalModal; 121 | } 122 | } 123 | ); 124 | } 125 | } : (([Plugin, API]) => { 126 | const { WebpackModules, Patcher } = API; 127 | const Modules = WebpackModules.getByProps('initialize', 'wasAutoPaused'); 128 | const Spotify = WebpackModules.getByProps('fetchIsSpotifyProtocolRegistered'); 129 | 130 | return class extends Plugin { 131 | constructor() { 132 | super(); 133 | } 134 | 135 | start() { 136 | Patcher.instead(Modules.__proto__, 'wasAutoPaused', () => false); 137 | Patcher.instead(Spotify, 'pause', () => { }); 138 | }; 139 | 140 | stop() { 141 | Patcher.unpatchAll(); 142 | }; 143 | }; 144 | })(ZLibrary.buildPlugin(config)); 145 | })(); 146 | 147 | /*@end@*/ 148 | -------------------------------------------------------------------------------- /BegoneAutoPause/README.md: -------------------------------------------------------------------------------- 1 | # Begone AutoPause [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Stops Discord from automatically pausing your music after 30 seconds. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=BegoneAutoPause 11 | -------------------------------------------------------------------------------- /CommandsAPI/README.md: -------------------------------------------------------------------------------- 1 | # Commands API [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Adds a command system to BetterDiscord for other plugins to utilize. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?custom=CommandsAPI/2CommandsAPI.plugin.js 11 | -------------------------------------------------------------------------------- /DNDBypass/DNDBypass.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name DNDBypass 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/DNDBypass/DNDBypass.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DNDBypass/DNDBypass.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/DNDBypass/DNDBypass.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'DNDBypass', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.7', 47 | description: 'Give your selection of friends the ability to bypass Do Not Disturb.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DNDBypass/DNDBypass.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | title: 'Fixed', 54 | type: 'fixed', 55 | items: [ 56 | `Fixed the plugin.` 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | } 99 | ]; 100 | 101 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 102 | 103 | if (global.eternalModal) { 104 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 105 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 106 | }; 107 | 108 | global.eternalModal = true; 109 | 110 | BdApi.showConfirmationModal( 111 | 'Dependencies needed', 112 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 113 | { 114 | confirmText: 'Download', 115 | cancelText: 'Cancel', 116 | onCancel: () => delete global.eternalModal, 117 | onConfirm: async () => { 118 | for (const dependency of dependencies) { 119 | if (!window.hasOwnProperty(dependency.global)) { 120 | await new Promise((resolve) => { 121 | request.get(dependency.url, (error, res, body) => { 122 | if (error) return electron.shell.openExternal(dependency.external); 123 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 124 | }); 125 | }); 126 | } 127 | } 128 | 129 | delete global.eternalModal; 130 | } 131 | } 132 | ); 133 | } 134 | } : (([Plugin, API]) => { 135 | const { WebpackModules, Patcher, PluginUtilities, DiscordModules: { React } } = API; 136 | 137 | const { getChannelId } = WebpackModules.getByProps('getLastSelectedChannelId'); 138 | const Notifications = WebpackModules.getByProps('makeTextChatNotification'); 139 | const { getChannel } = WebpackModules.getByProps('hasChannel'); 140 | 141 | const settings = PluginUtilities.loadSettings(config.info.name, { 142 | friends: [], 143 | guilds: false, 144 | groups: false 145 | }); 146 | 147 | const Components = (() => { 148 | const comps = {}; 149 | 150 | const { AdvancedScrollerThin } = WebpackModules.getByProps('AdvancedScrollerThin'); 151 | const PopoutList = WebpackModules.getByDisplayName('PopoutList'); 152 | const Flex = WebpackModules.getByDisplayName('Flex'); 153 | const { getRelationships } = WebpackModules.getByProps('getRelationships'); 154 | const { getUser } = WebpackModules.getByProps('getUser', 'getUsers'); 155 | const classes = { 156 | elevationBorderHigh: WebpackModules.getByProps('elevationBorderHigh').elevationBorderHigh, 157 | alignCenter: WebpackModules.getByProps('alignCenter').alignCenter, 158 | scroller: WebpackModules.getByProps('listWrapper', 'scroller').scroller, 159 | discriminator: WebpackModules.getByProps('discriminator', 'avatar', 'scroller').discriminator, 160 | userText: WebpackModules.getByProps('discriminator', 'avatar', 'scroller').userText, 161 | popoutList: WebpackModules.getByProps('popoutList').popoutList 162 | }; 163 | 164 | comps.FriendSelector = class extends React.Component { 165 | constructor(props) { 166 | super(props); 167 | 168 | this.state = { 169 | friends: settings.friends 170 | }; 171 | }; 172 | 173 | render() { 174 | const PopoutListSearchBar = PopoutList.prototype.constructor.SearchBar; 175 | const PopoutListDivider = PopoutList.prototype.constructor.Divider; 176 | const FlexChild = Flex.prototype.constructor.Child; 177 | const SelectableItem = PopoutList.prototype.constructor.Item; 178 | const relationships = getRelationships(); 179 | let friends = Object.keys(relationships).filter(relation => relationships[relation] === 1); 180 | friends = [...this.state.friends.filter(f => !friends.includes(f)), ...friends]; 181 | return React.createElement('div', null, React.createElement('div', { 182 | className: `db-user-settings ${classes.popoutList} ${classes.elevationBorderHigh}`, 183 | popoutKey: 'db-users' 184 | }, React.createElement(PopoutListSearchBar, { 185 | autoFocus: true, 186 | placeholder: 'Search friends', 187 | query: this.state.friendsQuery || '', 188 | onChange: e => this.setState({ 189 | friendsQuery: e 190 | }), 191 | onClear: () => this.setState({ 192 | friendsQuery: '' 193 | }) 194 | }), React.createElement(PopoutListDivider, null), React.createElement(AdvancedScrollerThin, { 195 | className: `${classes.scroller} db-friend-scroller` 196 | }, friends.map(getUser).filter(user => this.state.friendsQuery ? user?.username?.toLowerCase().includes(this.state.friendsQuery.toLowerCase()) : true).map((user, i) => user && React.createElement(SelectableItem, { 197 | className: 'db-friend-item', 198 | id: user.id, 199 | key: i.toString(), 200 | selected: this.state.friends.includes(user.id), 201 | onClick: (e) => { 202 | if (!e.selected) { 203 | this.state.friends.push(e.id); 204 | } else { 205 | const index = this.state.friends.indexOf(e.id); 206 | if (~index) this.state.friends.splice(index, 1); 207 | } 208 | 209 | this.props.onClick(e, this.state); 210 | } 211 | }, React.createElement(Flex, { 212 | align: classes.alignCenter, 213 | basis: 'auto', 214 | grow: 1, 215 | shrink: 1 216 | }, React.createElement('div', null, React.createElement(Flex, { 217 | align: classes.alignCenter, 218 | basis: 'auto', 219 | grow: 1, 220 | shrink: 1 221 | }, React.createElement(FlexChild, { 222 | key: 'avatar', 223 | basis: 'auto', 224 | grow: 0, 225 | shrink: 0, 226 | wrap: false 227 | }, React.createElement('img', { 228 | src: !user.avatar ? `https://cdn.discordapp.com/embed/avatars/${user.discriminator % 5}.png` : `https://cdn.discordapp.com/avatars/${user.id}/${user.avatar}.png`, 229 | width: 32, 230 | height: 32, 231 | style: { 232 | borderRadius: '360px' 233 | } 234 | })), React.createElement(FlexChild, { 235 | key: 'user-text', 236 | basis: 'auto', 237 | grow: 1, 238 | shrink: 1, 239 | wrap: false 240 | }, React.createElement('div', { 241 | className: classes.userText 242 | }, React.createElement('span', { 243 | className: classes.userText 244 | }, user.username), React.createElement('span', { 245 | className: classes.discriminator 246 | }, '#', user.discriminator)))))))).sort((a, b) => { 247 | const firstName = a.props.children.props.children.props.children.props.children[1].props.children.props.children[0].props.children; 248 | const secondName = b.props.children.props.children.props.children.props.children[1].props.children.props.children[0].props.children; 249 | return firstName.localeCompare(secondName); 250 | })))); 251 | } 252 | }; 253 | 254 | const SwitchItem = WebpackModules.getByDisplayName('SwitchItem'); 255 | comps.SwitchItem = SwitchItem; 256 | 257 | return comps; 258 | })(); 259 | 260 | return class DNDBypass extends Plugin { 261 | constructor() { 262 | super(); 263 | } 264 | 265 | start() { 266 | Patcher.after(Notifications, 'shouldNotify', (_, [msg, channelId], res) => { 267 | if (settings.friends.includes(msg.author.id)) { 268 | // Check if were already looking at the channel 269 | if (document.hasFocus() && getChannelId() == channelId) { 270 | return false; 271 | } 272 | 273 | // Guilds 274 | if (msg.guild_id && !settings.guilds) { 275 | return false; 276 | } 277 | 278 | // Groups 279 | if (getChannel(msg.channel_id)?.type == 3 && !settings.groups) { 280 | return false; 281 | } 282 | 283 | return true; 284 | } 285 | 286 | return res; 287 | }); 288 | 289 | PluginUtilities.addStyle(config.info.name, ` 290 | .db-user-settings { 291 | width: auto !important; 292 | margin-bottom: 32px; 293 | } 294 | 295 | .db-friend-item.selectableItem-1MP3MQ.selected-31soGA { 296 | cursor: pointer !important; 297 | } 298 | 299 | .db-friend-scroller { 300 | max-height: 500px; 301 | } 302 | 303 | .db-friend-item { 304 | padding: 6px; 305 | padding-left: 18px; 306 | margin-top: 4px; 307 | margin-bottom: 4px; 308 | height: auto; 309 | } 310 | 311 | .db-friend { 312 | margin: 6px; 313 | width: 32px; 314 | height: 32px; 315 | float: left; 316 | border-radius: 360px; 317 | } 318 | 319 | .db-friend-name { 320 | color: white; 321 | float: left; 322 | font-family: 'Whitney', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; 323 | font-weight: 700; 324 | margin-left: 8px; 325 | font-size: 20px; 326 | } 327 | 328 | .db-friend-discrim { 329 | color: hsla(0, 0%, 100%, .6); 330 | float: left; 331 | font-family: 'Whitney', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; 332 | font-size: 16px; 333 | position: relative; 334 | top: 4px; 335 | padding-right: 6px; 336 | } 337 | 338 | .db-friend-discrim::before { 339 | content: '#' 340 | } 341 | 342 | .db-friend-name, .db-friend-discrim { 343 | margin-top: 8px; 344 | } 345 | `); 346 | }; 347 | 348 | stop() { 349 | PluginUtilities.removeStyle(config.info.name); 350 | Patcher.unpatchAll(); 351 | }; 352 | 353 | getSettingsPanel() { 354 | return class Settings extends React.Component { 355 | constructor(props) { 356 | super(props); 357 | } 358 | 359 | update(setting, value) { 360 | settings[setting] = value; 361 | PluginUtilities.saveSettings(config.info.name, settings); 362 | this.forceUpdate(); 363 | } 364 | 365 | render() { 366 | return React.createElement('div', null, React.createElement(Components.SwitchItem, { 367 | note: 'Bypasses DND or any type of server mute/channel mute when that person speaks in a server.', 368 | value: settings.guilds, 369 | onChange: () => this.update('guilds', !settings.guilds) 370 | }, 'Notify if user speaks in server'), React.createElement(Components.SwitchItem, { 371 | note: 'Bypasses DND or any type of channel mute when that person speaks in a group chat.', 372 | value: settings.groups, 373 | onChange: () => this.update('groups', !settings.groups) 374 | }, 'Notify if user speaks in group chats'), React.createElement(Components.FriendSelector, { 375 | onClick: (e, state) => { 376 | if (!e.selected) { 377 | this.update('friends', state.friends); 378 | } else { 379 | this.update('friends', state.friends.filter(a => a !== e.id)); 380 | } 381 | } 382 | })); 383 | }; 384 | }; 385 | }; 386 | }; 387 | })(ZLibrary.buildPlugin(config)); 388 | })(); 389 | 390 | /*@end@*/ 391 | -------------------------------------------------------------------------------- /DNDBypass/README.md: -------------------------------------------------------------------------------- 1 | # DND Bypass [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Give your selection of friends the ability to bypass Do Not Disturb. 3 | 4 |  5 | 6 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 7 | [paypal-link]: https://paypal.me/eternal404 8 | 9 | 10 | 11 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 12 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=DNDBypass 13 | -------------------------------------------------------------------------------- /DataSaver/DataSaver.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name DataSaver 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/DataSaver/DataSaver.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DataSaver/DataSaver.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/DataSaver/DataSaver.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'DataSaver', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.7', 47 | description: 'Saves friends & Servers every 30 minutes to a file.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DataSaver/DataSaver.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | type: 'added', 54 | title: 'Changes', 55 | items: [ 56 | 'The plugin now works on linux and macOS.', 57 | 'The plugin now saves its data in its settings file inside the BetterDiscord plugins folder.', 58 | 'The plugin now saves information for each account you log into under the user ID.' 59 | ] 60 | } 61 | ] 62 | }; 63 | 64 | return !global.ZeresPluginLibrary ? class { 65 | constructor() { 66 | this.start = this.load = this.handleMissingLib; 67 | } 68 | 69 | getName() { 70 | return config.info.name.replace(/\s+/g, ''); 71 | } 72 | 73 | getAuthor() { 74 | return config.info.authors.map(a => a.name).join(', '); 75 | } 76 | 77 | getVersion() { 78 | return config.info.version; 79 | } 80 | 81 | getDescription() { 82 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 83 | } 84 | 85 | start() { } 86 | 87 | stop() { } 88 | 89 | async handleMissingLib() { 90 | const request = require('request'); 91 | const path = require('path'); 92 | const fs = require('fs'); 93 | 94 | const dependencies = [ 95 | { 96 | global: 'ZeresPluginLibrary', 97 | filename: '0PluginLibrary.plugin.js', 98 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 99 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 100 | } 101 | ]; 102 | 103 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 104 | 105 | if (global.eternalModal) { 106 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 107 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 108 | }; 109 | 110 | global.eternalModal = true; 111 | 112 | BdApi.showConfirmationModal( 113 | 'Dependencies needed', 114 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 115 | { 116 | confirmText: 'Download', 117 | cancelText: 'Cancel', 118 | onCancel: () => delete global.eternalModal, 119 | onConfirm: async () => { 120 | for (const dependency of dependencies) { 121 | if (!window.hasOwnProperty(dependency.global)) { 122 | await new Promise((resolve) => { 123 | request.get(dependency.url, (error, res, body) => { 124 | if (error) return electron.shell.openExternal(dependency.external); 125 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 126 | }); 127 | }); 128 | } 129 | } 130 | 131 | delete global.eternalModal; 132 | } 133 | } 134 | ); 135 | } 136 | } : (([Plugin, API]) => { 137 | const { WebpackModules, PluginUtilities } = API; 138 | 139 | const { getRelationships } = WebpackModules.getByProps('getRelationships'); 140 | const { getUser } = WebpackModules.getByProps('getUser'); 141 | const { getGuilds } = WebpackModules.getByProps('getGuilds'); 142 | const { getCurrentUser } = WebpackModules.getByProps('getCurrentUser', 'getUser'); 143 | 144 | return class extends Plugin { 145 | constructor() { 146 | super(); 147 | } 148 | 149 | start() { 150 | this.interval = setInterval(this.save, 18e5); 151 | this.save(); 152 | }; 153 | 154 | async save() { 155 | const user = getCurrentUser(); 156 | if (!user) return; 157 | 158 | const obj = { 159 | servers: [], 160 | friends: [] 161 | }; 162 | 163 | for (const id of Object.keys(getRelationships())) { 164 | const friend = await getUser(id); 165 | 166 | if (!friend || !friend.id) continue; 167 | 168 | obj.friends.push({ 169 | username: friend.username, 170 | discriminator: friend.discriminator, 171 | id: friend.id, 172 | tag: `${friend.username}#${friend.discriminator}` 173 | }); 174 | }; 175 | 176 | for (const { id, name, vanityURLCode, ownerId } of Object.values(getGuilds())) { 177 | obj.servers.push({ id, name, vanityURLCode, ownerId }); 178 | } 179 | 180 | PluginUtilities.saveData(config.info.name, user.id, obj); 181 | }; 182 | 183 | stop() { 184 | clearInterval(this.interval); 185 | }; 186 | }; 187 | })(ZLibrary.buildPlugin(config)); 188 | })(); 189 | 190 | /*@end@*/ 191 | -------------------------------------------------------------------------------- /DataSaver/README.md: -------------------------------------------------------------------------------- 1 | # Data Saver [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Saves friends & Servers every 30 minutes to a file. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=DataSaver 11 | -------------------------------------------------------------------------------- /DoubleClickVC/DoubleClickVC.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name DoubleClickVC 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/DoubleClickVC/DoubleClickVC.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DoubleClickVC/DoubleClickVC.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/DoubleClickVC/DoubleClickVC.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'DoubleClickVC', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.0', 47 | description: 'Requires you to double click voice channels to join them instead of single clicking.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/DoubleClickVC/DoubleClickVC.plugin.js' 50 | }, 51 | }; 52 | 53 | return !global.ZeresPluginLibrary ? class { 54 | constructor() { 55 | this.start = this.load = this.handleMissingLib; 56 | } 57 | 58 | getName() { 59 | return config.info.name.replace(/\s+/g, ''); 60 | } 61 | 62 | getAuthor() { 63 | return config.info.authors.map(a => a.name).join(', '); 64 | } 65 | 66 | getVersion() { 67 | return config.info.version; 68 | } 69 | 70 | getDescription() { 71 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 72 | } 73 | 74 | start() { } 75 | 76 | stop() { } 77 | 78 | async handleMissingLib() { 79 | const request = require('request'); 80 | const path = require('path'); 81 | const fs = require('fs'); 82 | 83 | const dependencies = [ 84 | { 85 | global: 'ZeresPluginLibrary', 86 | filename: '0PluginLibrary.plugin.js', 87 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 88 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 89 | } 90 | ]; 91 | 92 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 93 | 94 | if (global.eternalModal) { 95 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 96 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 97 | }; 98 | 99 | global.eternalModal = true; 100 | 101 | BdApi.showConfirmationModal( 102 | 'Dependencies needed', 103 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 104 | { 105 | confirmText: 'Download', 106 | cancelText: 'Cancel', 107 | onCancel: () => delete global.eternalModal, 108 | onConfirm: async () => { 109 | for (const dependency of dependencies) { 110 | if (!window.hasOwnProperty(dependency.global)) { 111 | await new Promise((resolve) => { 112 | request.get(dependency.url, (error, res, body) => { 113 | if (error) return electron.shell.openExternal(dependency.external); 114 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 115 | }); 116 | }); 117 | } 118 | } 119 | 120 | delete global.eternalModal; 121 | } 122 | } 123 | ); 124 | } 125 | } : (([Plugin, API]) => { 126 | const { Patcher, WebpackModules, Utilities } = API; 127 | 128 | return class extends Plugin { 129 | start() { 130 | const ChannelItem = WebpackModules.find(m => m.default?.displayName === 'ChannelItem'); 131 | Patcher.after(ChannelItem, 'default', (_, [{ channel }], res) => { 132 | if (channel.type !== 2) return res; 133 | 134 | const clickable = Utilities.findInReactTree(res, r => r?.onClick); 135 | if (clickable) { 136 | const onClick = clickable.onClick; 137 | clickable.onDoubleClick = onClick; 138 | clickable.onClick = () => { }; 139 | } 140 | 141 | return res; 142 | }); 143 | 144 | const Mention = WebpackModules.find(m => m.default?.displayName === 'Mention'); 145 | Patcher.after(Mention, 'default', (_, [{ iconType }], res) => { 146 | if (iconType === 'voice') { 147 | const onClick = res.props.onClick; 148 | res.props.onClick = () => { }; 149 | res.props.onDoubleClick = onClick; 150 | } 151 | 152 | return res; 153 | }); 154 | }; 155 | 156 | stop() { 157 | Patcher.unpatchAll(); 158 | }; 159 | }; 160 | })(ZLibrary.buildPlugin(config)); 161 | })(); 162 | 163 | /*@end@*/ 164 | -------------------------------------------------------------------------------- /DoubleClickVC/README.md: -------------------------------------------------------------------------------- 1 | # Double Click VC [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Requires you to double click voice channels to join them instead of single clicking. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=DoubleClickVC 11 | -------------------------------------------------------------------------------- /GameActivityToggle/GameActivityToggle.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name GameActivityToggle 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/GameActivityToggle/GameActivityToggle.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/GameActivityToggle/GameActivityToggle.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/GameActivityToggle/GameActivityToggle.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'GameActivityToggle', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.8', 47 | description: 'Adds an entry in the status picker to toggle game activity.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/GameActivityToggle/GameActivityToggle.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | type: 'fixed', 54 | title: 'Fixed', 55 | items: [ 56 | 'Fixed the plugin.' 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | } 99 | ]; 100 | 101 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 102 | 103 | if (global.eternalModal) { 104 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 105 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 106 | }; 107 | 108 | global.eternalModal = true; 109 | 110 | BdApi.showConfirmationModal( 111 | 'Dependencies needed', 112 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 113 | { 114 | confirmText: 'Download', 115 | cancelText: 'Cancel', 116 | onCancel: () => delete global.eternalModal, 117 | onConfirm: async () => { 118 | for (const dependency of dependencies) { 119 | if (!window.hasOwnProperty(dependency.global)) { 120 | await new Promise((resolve) => { 121 | request.get(dependency.url, (error, res, body) => { 122 | if (error) return electron.shell.openExternal(dependency.external); 123 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 124 | }); 125 | }); 126 | } 127 | } 128 | 129 | delete global.eternalModal; 130 | } 131 | } 132 | ); 133 | } 134 | } : (([Plugin, API]) => { 135 | const { Patcher, WebpackModules, DiscordModules: { React } } = API; 136 | 137 | return class extends Plugin { 138 | constructor() { 139 | super(); 140 | } 141 | 142 | start() { 143 | const { ShowCurrentGame } = WebpackModules.getByProps('ShowCurrentGame') || {}; 144 | const classes = WebpackModules.getByProps('status', 'statusItem'); 145 | const Menu = WebpackModules.getByProps('MenuItem'); 146 | 147 | const enabledIcon = w => React.createElement('svg', { 148 | viewBox: '0 0 24 24', width: w, height: w, style: { 'margin-left': '-2px' } 149 | }, React.createElement('path', { 150 | style: { fill: 'currentColor' }, 151 | d: 'M20.8,7.7c-0.6-1.2-1.8-1.9-3.1-1.9H6.3C5,5.7,3.8,6.5,3.2,7.6l-2.8,5.8c0,0,0,0,0,0C-0.3,15.1,0.4,17,2,17.8L2.3,18C4,18.7,5.9,18,6.7,16.4l0.1-0.3c0.3-0.6,0.9-1,1.6-1h7.1c0.7,0,1.3,0.4,1.6,1l0.1,0.3c0.8,1.6,2.7,2.4,4.4,1.6l0.3-0.1c1.6-0.8,2.3-2.7,1.6-4.4L20.8,7.7z M8.6,10.5c0,0.2-0.2,0.4-0.4,0.4H7.3c-0.2,0-0.4,0.2-0.4,0.4v0.9c0,0.2-0.2,0.4-0.4,0.4H5.7c-0.2,0-0.4-0.2-0.4-0.4v-0.9c0-0.2-0.2-0.4-0.4-0.4c0,0,0,0,0,0H4.1c-0.2,0-0.4-0.2-0.4-0.4V9.7c0-0.2,0.2-0.4,0.4-0.4h0.9c0.2,0,0.4-0.2,0.4-0.4c0,0,0,0,0,0V8.1c0-0.2,0.2-0.4,0.4-0.4h0.8C6.8,7.7,7,7.9,7,8.1V9c0,0.2,0.2,0.4,0.4,0.4h0.9c0.2,0,0.3,0.2,0.3,0.4V10.5z M15.6,10.9c-0.4,0-0.8-0.3-0.8-0.8c0-0.4,0.3-0.8,0.8-0.8c0,0,0,0,0,0c0.4,0,0.8,0.3,0.8,0.8C16.4,10.5,16.1,10.9,15.6,10.9z M17.2,7.7C17.2,7.7,17.2,7.7,17.2,7.7c0.4,0,0.8,0.3,0.8,0.8c0,0,0,0,0,0c0,0.4-0.4,0.8-0.8,0.8c-0.4,0-0.8-0.4-0.8-0.8S16.8,7.7,17.2,7.7z M18,11.7L18,11.7C18,11.7,18,11.7,18,11.7c0,0.4-0.3,0.8-0.8,0.8c-0.4,0-0.8-0.3-0.8-0.8c0-0.4,0.3-0.8,0.8-0.8c0,0,0,0,0,0C17.7,10.9,18,11.3,18,11.7C18,11.7,18,11.7,18,11.7L18,11.7C18,11.7,18,11.7,18,11.7C18,11.7,18,11.7,18,11.7z M18.9,10.9c-0.4,0-0.8-0.3-0.8-0.8c0-0.4,0.3-0.8,0.8-0.8c0,0,0,0,0,0c0.4,0,0.8,0.3,0.8,0.8C19.6,10.5,19.3,10.9,18.9,10.9z' 152 | })); 153 | 154 | const disabledIcon = w => React.createElement('svg', { 155 | viewBox: '0 0 24 24', width: w, height: w, style: { 'margin-left': '-2px' } 156 | }, React.createElement('path', { 157 | style: { fill: 'currentColor' }, 158 | d: 'M17.7,5.7h-0.8L4.4,18.1c1-0.2,1.9-0.8,2.3-1.8l0.1-0.3c0.3-0.6,0.9-1,1.6-1h1.9l4.7-4.6v0c-0.1-0.1-0.1-0.2-0.1-0.4c0-0.4,0.3-0.8,0.8-0.8c0,0,0,0,0,0c0.1,0,0.2,0,0.3,0.1l0.5-0.5c-0.1-0.1-0.1-0.2-0.1-0.4c0-0.4,0.3-0.8,0.8-0.8c0.1,0,0.3,0,0.4,0.1l1.7-1.7C18.8,5.8,18.3,5.7,17.7,5.7z M23.5,13.4l-2.8-5.8c0,0,0-0.1-0.1-0.1l-1.8,1.8c0.4,0,0.7,0.4,0.7,0.8c0,0.4-0.3,0.8-0.8,0.8c-0.4,0-0.8-0.3-0.8-0.7l-0.8,0.8c0.4,0,0.7,0.4,0.7,0.8c0,0.4-0.4,0.8-0.8,0.8c-0.4,0-0.8-0.3-0.8-0.7L13.1,15h2.4c0.7,0,1.3,0.4,1.6,1l0.1,0.3c0.8,1.6,2.7,2.3,4.4,1.6l0.3-0.1C23.6,17,24.3,15,23.5,13.4z M6.3,5.7C5,5.7,3.8,6.4,3.3,7.6l-2.8,5.8c0,0,0,0,0,0C-0.3,15,0.4,16.9,2,17.7L14,5.7H6.3z M8.2,10.8H7.3c-0.2,0-0.4,0.2-0.4,0.3v0.9c0,0.2-0.2,0.3-0.3,0.3H5.7c-0.2,0-0.3-0.2-0.3-0.3v-0.9c0-0.2-0.2-0.3-0.4-0.3H4.1c-0.2,0-0.4-0.2-0.4-0.4V9.6c0-0.2,0.2-0.4,0.4-0.4H5c0.2,0,0.4-0.2,0.4-0.4V8c0-0.2,0.2-0.4,0.4-0.4h0.8C6.8,7.7,7,7.8,7,8v0.9c0,0.2,0.2,0.4,0.4,0.4h0.9c0.2,0,0.3,0.2,0.3,0.4v0.8C8.6,10.7,8.4,10.8,8.2,10.8z' 159 | }), React.createElement('polygon', { 160 | style: { fill: '#F04747' }, 161 | points: '22.6,2.7 22.6,2.8 19.3,6.1 16,9.3 16,9.4 15,10.4 15,10.4 10.3,15 2.8,22.5 1.4,21.1 21.2,1.3 ' 162 | })); 163 | 164 | Patcher.before(Menu, 'default', (_, args) => { 165 | if (args[0]?.navId != 'status-picker') return args; 166 | const enabled = ShowCurrentGame.getSetting(); 167 | 168 | const [{ children }] = args; 169 | const invisibleStatus = children.find(c => c?.props?.id == 'invisible'); 170 | 171 | if (!children.find(c => c?.props?.id == 'game-activity')) { 172 | children.splice(children.indexOf(invisibleStatus) + 1, 0, React.createElement(Menu.MenuItem, { 173 | id: 'game-activity', 174 | keepItemStyles: true, 175 | action: () => { 176 | return ShowCurrentGame.updateSetting(!ShowCurrentGame.getSetting()); 177 | }, 178 | render: () => React.createElement('div', { 179 | className: classes.statusItem, 180 | 'aria-label': `${enabled ? 'Hide' : 'Show'} Game Activity` 181 | }, enabled ? disabledIcon('16') : enabledIcon('16'), React.createElement('div', { 182 | className: classes.status 183 | }, `${enabled ? 'Hide' : 'Show'} Game Activity`), React.createElement('div', { 184 | className: classes.description 185 | }, 'Display currently running game as a status message.')) 186 | })); 187 | } 188 | }); 189 | }; 190 | 191 | stop() { 192 | Patcher.unpatchAll(); 193 | }; 194 | }; 195 | })(ZLibrary.buildPlugin(config)); 196 | })(); 197 | 198 | /*@end@*/ 199 | -------------------------------------------------------------------------------- /GameActivityToggle/README.md: -------------------------------------------------------------------------------- 1 | # Game Activity Toggle [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Adds an entry in the status picker to toggle game activity. 3 | 4 | # Preview 5 |  6 |  7 | 8 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 9 | [paypal-link]: https://paypal.me/eternal404 10 | 11 | 12 | 13 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 14 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=GameActivityToggle 15 | -------------------------------------------------------------------------------- /HideDMButtons/HideDMButtons.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name HideDMButons 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/HideDMButons/HideDMButons.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/HideDMButons/HideDMButons.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/HideDMButons/HideDMButons.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'HideDMButons', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.1', 47 | description: 'Hides every button in the DMs list except friends.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/HideDMButons/HideDMButons.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | type: 'fixed', 54 | title: 'Fixed', 55 | items: [ 56 | 'Fixed the plugin.' 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | } 99 | ]; 100 | 101 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 102 | 103 | if (global.eternalModal) { 104 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 105 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 106 | }; 107 | 108 | global.eternalModal = true; 109 | 110 | BdApi.showConfirmationModal( 111 | 'Dependencies needed', 112 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 113 | { 114 | confirmText: 'Download', 115 | cancelText: 'Cancel', 116 | onCancel: () => delete global.eternalModal, 117 | onConfirm: async () => { 118 | for (const dependency of dependencies) { 119 | if (!window.hasOwnProperty(dependency.global)) { 120 | await new Promise((resolve) => { 121 | request.get(dependency.url, (error, res, body) => { 122 | if (error) return electron.shell.openExternal(dependency.external); 123 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 124 | }); 125 | }); 126 | } 127 | } 128 | 129 | delete global.eternalModal; 130 | } 131 | } 132 | ); 133 | } 134 | } : (([Plugin, API]) => { 135 | const { Patcher, WebpackModules } = API; 136 | const DMsList = WebpackModules.find(m => m.default?.displayName == 'ConnectedPrivateChannelsList'); 137 | 138 | return class extends Plugin { 139 | constructor() { 140 | super(); 141 | } 142 | 143 | start() { 144 | Patcher.before(DMsList, 'default', (_, args, res) => { 145 | const Arguments = args[0]; 146 | if (Arguments?.children) { 147 | Arguments.children = Arguments.children.filter(a => a?.key == 'friends');; 148 | } 149 | }); 150 | 151 | DMsList.default.displayName = 'ConnectedPrivateChannelsList'; 152 | }; 153 | 154 | stop() { 155 | Patcher.unpatchAll(); 156 | }; 157 | }; 158 | })(ZLibrary.buildPlugin(config)); 159 | })(); 160 | 161 | /*@end@*/ 162 | -------------------------------------------------------------------------------- /HideDMButtons/README.md: -------------------------------------------------------------------------------- 1 | # Hide DM Buttons [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Hides every button in the DMs list except friends. 3 | 4 |  5 | 6 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 7 | [paypal-link]: https://paypal.me/eternal404 8 | 9 | 10 | 11 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 12 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=HideDMButtons 13 | -------------------------------------------------------------------------------- /MarkAllRead/MarkAllRead.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name MarkAllRead 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/MarkAllRead/MarkAllRead.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/MarkAllRead/MarkAllRead.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/MarkAllRead/MarkAllRead.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'MarkAllRead', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '3.0.9', 47 | description: 'Adds the command "read" that reads channels, DMs and removes pings.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/MarkAllRead/MarkAllRead.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | title: 'Fixed', 54 | type: 'fixed', 55 | items: [ 56 | 'Fixed canary errors' 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary || !global.CommandsAPI ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | }, 99 | { 100 | global: 'CommandsAPI', 101 | filename: '2CommandsAPI.plugin.js', 102 | external: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/CommandsAPI/2CommandsAPI.plugin.js', 103 | url: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/CommandsAPI/2CommandsAPI.plugin.js' 104 | } 105 | ]; 106 | 107 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 108 | 109 | if (global.eternalModal) { 110 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 111 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 112 | }; 113 | 114 | global.eternalModal = true; 115 | 116 | BdApi.showConfirmationModal( 117 | 'Dependencies needed', 118 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 119 | { 120 | confirmText: 'Download', 121 | cancelText: 'Cancel', 122 | onCancel: () => delete global.eternalModal, 123 | onConfirm: async () => { 124 | for (const dependency of dependencies) { 125 | if (!window.hasOwnProperty(dependency.global)) { 126 | await new Promise((resolve) => { 127 | request.get(dependency.url, (error, res, body) => { 128 | if (error) return electron.shell.openExternal(dependency.external); 129 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 130 | }); 131 | }); 132 | } 133 | } 134 | 135 | delete global.eternalModal; 136 | } 137 | } 138 | ); 139 | } 140 | } : (([Plugin, API]) => { 141 | const { WebpackModules } = API; 142 | const { getMutableGuildAndPrivateChannels } = WebpackModules.getByProps('hasChannel'); 143 | const unreadAcks = WebpackModules.getByProps('ack', 'ackCategory'); 144 | const messageStore = WebpackModules.getByProps('hasUnread', 'lastMessageId'); 145 | 146 | return class extends Plugin { 147 | constructor() { 148 | super(); 149 | } 150 | 151 | start() { 152 | if (!window.commands) window.commands = {}; 153 | if (!window.commands?.['read']) { 154 | window.commands['read'] = { 155 | command: 'read', 156 | description: 'Read all channels & remove pings', 157 | usage: '{c}', 158 | executor: async () => { 159 | let channels = Object.keys(getMutableGuildAndPrivateChannels()); 160 | const unreads = channels.map(c => ({ 161 | channelId: c, 162 | messageId: messageStore.lastMessageId(c) 163 | })); 164 | return await unreadAcks.bulkAck(unreads); 165 | } 166 | }; 167 | } 168 | }; 169 | 170 | stop() { 171 | delete window.commands?.['read']; 172 | }; 173 | }; 174 | })(ZLibrary.buildPlugin(config)); 175 | })(); 176 | 177 | /*@end@*/ 178 | -------------------------------------------------------------------------------- /MarkAllRead/README.md: -------------------------------------------------------------------------------- 1 | # Mark All Read [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Adds the command "read" that reads channels, DMs and removes pings. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=MarkAllRead 11 | -------------------------------------------------------------------------------- /MessageCleaner/README.md: -------------------------------------------------------------------------------- 1 | # Message Cleaner [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Clears messages in the current channel. 3 | 4 | # Previews 5 | 6 |  7 |  8 | 9 | # Usage 10 | 11 | - `-clear all beforeId` 12 | - `-clear number beforeId` 13 | - `-clear stop` 14 | - `-prune all beforeId` 15 | - `-prune number beforeId` 16 | - `-prune stop` 17 | 18 | 19 | # Examples 20 | 21 | - `-clear all` 22 | - `-clear all 739493961713975368` 23 | - `-clear 10` 24 | - `-clear 10 739493961713975368` 25 | - `-clear stop` 26 | - `-prune all` 27 | - `-prune all 739493961713975368` 28 | - `-prune 10` 29 | - `-prune 10 739493961713975368` 30 | - `-prune stop` 31 | 32 | > Legend: `-` = `Your prefix` 33 | 34 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 35 | [paypal-link]: https://paypal.me/eternal404 36 | 37 | 38 | 39 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 40 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=MessageCleaner 41 | -------------------------------------------------------------------------------- /Mock/Mock.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name Mock 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/Mock/Mock.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/Mock/Mock.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/Mock/Mock.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'Mock', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '3.0.8', 47 | description: 'Adds the command "mock" that uppercases & lowercases letters to mock someone.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/Mock/Mock.plugin.js' 50 | } 51 | }; 52 | 53 | return !global.ZeresPluginLibrary || !global.CommandsAPI ? class { 54 | constructor() { 55 | this.start = this.load = this.handleMissingLib; 56 | } 57 | 58 | getName() { 59 | return config.info.name.replace(/\s+/g, ''); 60 | } 61 | 62 | getAuthor() { 63 | return config.info.authors.map(a => a.name).join(', '); 64 | } 65 | 66 | getVersion() { 67 | return config.info.version; 68 | } 69 | 70 | getDescription() { 71 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 72 | } 73 | 74 | start() { } 75 | 76 | stop() { } 77 | 78 | async handleMissingLib() { 79 | const request = require('request'); 80 | const path = require('path'); 81 | const fs = require('fs'); 82 | 83 | const dependencies = [ 84 | { 85 | global: 'ZeresPluginLibrary', 86 | filename: '0PluginLibrary.plugin.js', 87 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 88 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 89 | }, 90 | { 91 | global: 'CommandsAPI', 92 | filename: '2CommandsAPI.plugin.js', 93 | external: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/CommandsAPI/2CommandsAPI.plugin.js', 94 | url: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/CommandsAPI/2CommandsAPI.plugin.js' 95 | } 96 | ]; 97 | 98 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 99 | 100 | if (global.eternalModal) { 101 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 102 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 103 | }; 104 | 105 | global.eternalModal = true; 106 | 107 | BdApi.showConfirmationModal( 108 | 'Dependencies needed', 109 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 110 | { 111 | confirmText: 'Download', 112 | cancelText: 'Cancel', 113 | onCancel: () => delete global.eternalModal, 114 | onConfirm: async () => { 115 | for (const dependency of dependencies) { 116 | if (!window.hasOwnProperty(dependency.global)) { 117 | await new Promise((resolve) => { 118 | request.get(dependency.url, (error, res, body) => { 119 | if (error) return electron.shell.openExternal(dependency.external); 120 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 121 | }); 122 | }); 123 | } 124 | } 125 | 126 | delete global.eternalModal; 127 | } 128 | } 129 | ); 130 | } 131 | } : (([Plugin, API]) => { 132 | return class extends Plugin { 133 | constructor() { 134 | super(); 135 | } 136 | 137 | async start() { 138 | if (!window.commands) window.commands = {}; 139 | if (!window.commands?.['mock']) { 140 | window.commands['mock'] = { 141 | command: 'mock', 142 | description: 'Mock a user...', 143 | usage: '{c} [text to mock]', 144 | executor: (args) => ({ 145 | send: true, 146 | result: args.join(' ').split('').map((c, i) => i % 2 ? c.toUpperCase() : c.toLowerCase()).join('') 147 | }) 148 | }; 149 | } 150 | }; 151 | 152 | stop() { 153 | delete window.commands?.['mock']; 154 | }; 155 | }; 156 | })(ZLibrary.buildPlugin(config)); 157 | })(); 158 | 159 | /*@end@*/ 160 | -------------------------------------------------------------------------------- /Mock/README.md: -------------------------------------------------------------------------------- 1 | # Mock [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Adds the command "mock" that uppercases & lowercases letters to mock someone. 3 | 4 | # Usage 5 | - `-mock test` => `tEsT` 6 | 7 | > Legend: `-` = `Your prefix` 8 | 9 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 10 | [paypal-link]: https://paypal.me/eternal404 11 | 12 | 13 | 14 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 15 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=Mock 16 | -------------------------------------------------------------------------------- /NSFWGateBypass/NSFWGateBypass.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name NSFWGateBypass 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/NSFWGateBypass/NSFWGateBypass.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/NSFWGateBypass/NSFWGateBypass.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/NSFWGateBypass/NSFWGateBypass.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'NSFWGateBypass', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.6', 47 | description: "Bypasses discord's NSFW age gate.", 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/NSFWGateBypass/NSFWGateBypass.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | title: 'Fixed', 54 | type: 'fixed', 55 | items: [ 56 | 'The plugin now works again.' 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | } 99 | ]; 100 | 101 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 102 | 103 | if (global.eternalModal) { 104 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 105 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 106 | }; 107 | 108 | global.eternalModal = true; 109 | 110 | BdApi.showConfirmationModal( 111 | 'Dependencies needed', 112 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 113 | { 114 | confirmText: 'Download', 115 | cancelText: 'Cancel', 116 | onCancel: () => delete global.eternalModal, 117 | onConfirm: async () => { 118 | for (const dependency of dependencies) { 119 | if (!window.hasOwnProperty(dependency.global)) { 120 | await new Promise((resolve) => { 121 | request.get(dependency.url, (error, res, body) => { 122 | if (error) return electron.shell.openExternal(dependency.external); 123 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 124 | }); 125 | }); 126 | } 127 | } 128 | 129 | delete global.eternalModal; 130 | } 131 | } 132 | ); 133 | } 134 | } : (([Plugin, API]) => { 135 | const { Patcher, WebpackModules } = API; 136 | const Users = WebpackModules.getByProps('getCurrentUser', 'getUser'); 137 | 138 | return class extends Plugin { 139 | constructor() { 140 | super(); 141 | } 142 | 143 | start() { 144 | Patcher.after(Users, 'getCurrentUser', (_, args, res) => { 145 | if (res?.hasOwnProperty('nsfwAllowed')) { 146 | res.nsfwAllowed = true; 147 | } 148 | }); 149 | }; 150 | 151 | stop() { 152 | Patcher.unpatchAll(); 153 | }; 154 | }; 155 | })(ZLibrary.buildPlugin(config)); 156 | })(); 157 | 158 | /*@end@*/ 159 | -------------------------------------------------------------------------------- /NSFWGateBypass/README.md: -------------------------------------------------------------------------------- 1 | # NSFW Gate Bypass [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Bypasses discord's NSFW age gate. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=NSFWGateBypass 11 | -------------------------------------------------------------------------------- /NoBandwidthKick/NoBandwidthKick.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name NoBandwidthKick 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/NoBandwidthKick/NoBandwidthKick.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/NoBandwidthKick/NoBandwidthKick.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/NoBandwidthKick/NoBandwidthKick.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'NoBandwidthKick', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.3', 47 | description: "Stops discord from disconnecting you when you're in a call alone for more than 5 minutes.", 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/NoBandwidthKick/NoBandwidthKick.plugin.js' 50 | }, 51 | }; 52 | 53 | return !global.ZeresPluginLibrary ? class { 54 | constructor() { 55 | this.start = this.load = this.handleMissingLib; 56 | } 57 | 58 | getName() { 59 | return config.info.name.replace(/\s+/g, ''); 60 | } 61 | 62 | getAuthor() { 63 | return config.info.authors.map(a => a.name).join(', '); 64 | } 65 | 66 | getVersion() { 67 | return config.info.version; 68 | } 69 | 70 | getDescription() { 71 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 72 | } 73 | 74 | start() { } 75 | 76 | stop() { } 77 | 78 | async handleMissingLib() { 79 | const request = require('request'); 80 | const path = require('path'); 81 | const fs = require('fs'); 82 | 83 | const dependencies = [ 84 | { 85 | global: 'ZeresPluginLibrary', 86 | filename: '0PluginLibrary.plugin.js', 87 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 88 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 89 | } 90 | ]; 91 | 92 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 93 | 94 | if (global.eternalModal) { 95 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 96 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 97 | }; 98 | 99 | global.eternalModal = true; 100 | 101 | BdApi.showConfirmationModal( 102 | 'Dependencies needed', 103 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 104 | { 105 | confirmText: 'Download', 106 | cancelText: 'Cancel', 107 | onCancel: () => delete global.eternalModal, 108 | onConfirm: async () => { 109 | for (const dependency of dependencies) { 110 | if (!window.hasOwnProperty(dependency.global)) { 111 | await new Promise((resolve) => { 112 | request.get(dependency.url, (error, res, body) => { 113 | if (error) return electron.shell.openExternal(dependency.external); 114 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 115 | }); 116 | }); 117 | } 118 | } 119 | 120 | delete global.eternalModal; 121 | } 122 | } 123 | ); 124 | } 125 | } : (([Plugin, API]) => { 126 | const { Patcher, WebpackModules } = API; 127 | const { Timeout } = WebpackModules.getByProps('Timeout'); 128 | 129 | return class extends Plugin { 130 | constructor() { 131 | super(); 132 | } 133 | 134 | start() { 135 | Patcher.after(Timeout.prototype, 'start', (instance, args) => { 136 | if (args[1]?.toString().includes('BOT_CALL_IDLE_DISCONNECT')) { 137 | instance.stop(); 138 | }; 139 | }); 140 | }; 141 | 142 | stop() { 143 | Patcher.unpatchAll(); 144 | }; 145 | }; 146 | })(ZLibrary.buildPlugin(config)); 147 | })(); 148 | 149 | /*@end@*/ 150 | -------------------------------------------------------------------------------- /NoBandwidthKick/README.md: -------------------------------------------------------------------------------- 1 | # No Bandwidth Kick [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Stops discord from disconnecting you when you're in a call alone for more than 5 minutes. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=NoBandwidthKick 11 | -------------------------------------------------------------------------------- /OpenInApp/OpenInApp.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name OpenInApp 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/OpenInApp/OpenInApp.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/OpenInApp/OpenInApp.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/OpenInApp/OpenInApp.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const services = [ 37 | { 38 | name: 'Steam', 39 | links: ['store.steampowered.com', 'steamcommunity.com', 'help.steampowered.com'], 40 | identifier: 'steam://openurl/' 41 | }, 42 | { 43 | name: 'Tidal', 44 | links: ['listen.tidal.com', 'tidal.com'], 45 | identifier: 'tidal://' 46 | }, 47 | { 48 | name: 'Spotify', 49 | links: ['open.spotify.com'], 50 | identifier: 'spotify:' 51 | } 52 | ]; 53 | 54 | const config = { 55 | info: { 56 | name: 'OpenInApp', 57 | authors: [ 58 | { 59 | name: 'eternal', 60 | discord_id: '263689920210534400', 61 | github_username: 'eternal404' 62 | } 63 | ], 64 | version: '1.0.2', 65 | description: 'Opens links all over the app in their respective app.', 66 | github: 'https://github.com/eternal404', 67 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/OpenInApp/OpenInApp.plugin.js' 68 | }, 69 | changelog: [ 70 | { 71 | title: 'Fixed', 72 | type: 'fixed', 73 | items: ['If someone posts a link that already includes an identifier for example: steam://something, identifiers will no longer duplicate causing the links to be unusable. The plugin will now respect the identifier and make them usable.'] 74 | } 75 | ], 76 | defaultConfig: [] 77 | }; 78 | 79 | for (const service of services) config.defaultConfig.push({ 80 | name: service.name, 81 | id: service.name, 82 | type: 'switch', 83 | value: true 84 | }); 85 | 86 | return !global.ZeresPluginLibrary ? class { 87 | constructor() { 88 | this.start = this.load = this.handleMissingLib; 89 | } 90 | 91 | getName() { 92 | return config.info.name.replace(/\s+/g, ''); 93 | } 94 | 95 | getAuthor() { 96 | return config.info.authors.map(a => a.name).join(', '); 97 | } 98 | 99 | getVersion() { 100 | return config.info.version; 101 | } 102 | 103 | getDescription() { 104 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 105 | } 106 | 107 | start() { } 108 | 109 | stop() { } 110 | 111 | async handleMissingLib() { 112 | const request = require('request'); 113 | const path = require('path'); 114 | const fs = require('fs'); 115 | 116 | const dependencies = [ 117 | { 118 | global: 'ZeresPluginLibrary', 119 | filename: '0PluginLibrary.plugin.js', 120 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 121 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 122 | } 123 | ]; 124 | 125 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 126 | 127 | if (global.eternalModal) { 128 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 129 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 130 | }; 131 | 132 | global.eternalModal = true; 133 | 134 | BdApi.showConfirmationModal( 135 | 'Dependencies needed', 136 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 137 | { 138 | confirmText: 'Download', 139 | cancelText: 'Cancel', 140 | onCancel: () => delete global.eternalModal, 141 | onConfirm: async () => { 142 | for (const dependency of dependencies) { 143 | if (!window.hasOwnProperty(dependency.global)) { 144 | await new Promise((resolve) => { 145 | request.get(dependency.url, (error, res, body) => { 146 | if (error) return electron.shell.openExternal(dependency.external); 147 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 148 | }); 149 | }); 150 | } 151 | } 152 | 153 | delete global.eternalModal; 154 | } 155 | } 156 | ); 157 | } 158 | } : (([Plugin, API]) => { 159 | const { WebpackModules, Patcher } = API; 160 | const Anchor = WebpackModules.find(m => m.default?.displayName == 'Anchor'); 161 | const Copy = WebpackModules.getByProps('asyncify', 'copy'); 162 | 163 | return class extends Plugin { 164 | constructor() { 165 | super(); 166 | } 167 | 168 | start() { 169 | Patcher.before(Anchor, 'default', (_, args, res) => { 170 | let link = args[0]?.href?.toLowerCase(); 171 | 172 | if (link) { 173 | for (const service of services) { 174 | if (this.settings[service.name] && service.links.some(l => ~link.indexOf(l))) { 175 | if (!link.includes(service.identifier)) args[0].href = `${service.identifier}${args[0].href}`; 176 | } 177 | } 178 | } 179 | 180 | return args; 181 | }); 182 | 183 | Patcher.before(Copy, 'copy', (_, [link], res) => { 184 | for (const service of services) { 185 | if (this.settings[service.name] && service.links.some(l => ~link.indexOf(l))) { 186 | link = link.replace(service.identifier, ''); 187 | } 188 | } 189 | 190 | return [link]; 191 | }); 192 | }; 193 | 194 | stop() { 195 | Patcher.unpatchAll(); 196 | }; 197 | 198 | getSettingsPanel() { 199 | return this.buildSettingsPanel().getElement(); 200 | } 201 | }; 202 | })(ZLibrary.buildPlugin(config)); 203 | })(); 204 | 205 | /*@end@*/ 206 | -------------------------------------------------------------------------------- /OpenInApp/README.md: -------------------------------------------------------------------------------- 1 | # Open In App [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Opens links all over the app in their respective app. 3 | 4 | ## Supported Apps 5 | - [x] Spotify 6 | - [x] Tidal 7 | - [x] Steam 8 | 9 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 10 | [paypal-link]: https://paypal.me/eternal404 11 | 12 | 13 | 14 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 15 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=OpenInApp 16 | -------------------------------------------------------------------------------- /PictureLink/PictureLink.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name PictureLink 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/PictureLink/PictureLink.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/PictureLink/PictureLink.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/PictureLink/PictureLink.plugin.js 6 | * @authorId 263689920210534400 7 | * @invite HQ5N7Rcajc 8 | * @donate https://paypal.me/eternal404 9 | */ 10 | 11 | /*@cc_on 12 | @if (@_jscript) 13 | 14 | // Offer to self-install for clueless users that try to run this directly. 15 | var shell = WScript.CreateObject("WScript.Shell"); 16 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 17 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 18 | var pathSelf = WScript.ScriptFullName; 19 | // Put the user at ease by addressing them in the first person 20 | 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); 21 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 22 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 23 | } else if (!fs.FolderExists(pathPlugins)) { 24 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 25 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 26 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 27 | // Show the user where to put plugins in the future 28 | shell.Exec("explorer " + pathPlugins); 29 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 30 | } 31 | WScript.Quit(); 32 | 33 | @else@*/ 34 | 35 | module.exports = (() => { 36 | const config = { 37 | info: { 38 | name: 'PictureLink', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.1', 47 | description: "Allows you to click people's profile pictures and banners in their user modal and open them in your browser.", 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/PictureLink/PictureLink.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | type: 'fixed', 54 | title: 'Fixed', 55 | items: [ 56 | 'Now works again.' 57 | ] 58 | } 59 | ] 60 | }; 61 | 62 | return !global.ZeresPluginLibrary ? class { 63 | constructor() { 64 | this.start = this.load = this.handleMissingLib; 65 | } 66 | 67 | getName() { 68 | return config.info.name.replace(/\s+/g, ''); 69 | } 70 | 71 | getAuthor() { 72 | return config.info.authors.map(a => a.name).join(', '); 73 | } 74 | 75 | getVersion() { 76 | return config.info.version; 77 | } 78 | 79 | getDescription() { 80 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 81 | } 82 | 83 | start() { } 84 | 85 | stop() { } 86 | 87 | async handleMissingLib() { 88 | const request = require('request'); 89 | const path = require('path'); 90 | const fs = require('fs'); 91 | 92 | const dependencies = [ 93 | { 94 | global: 'ZeresPluginLibrary', 95 | filename: '0PluginLibrary.plugin.js', 96 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 97 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 98 | } 99 | ]; 100 | 101 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 102 | 103 | if (global.eternalModal) { 104 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 105 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 106 | }; 107 | 108 | global.eternalModal = true; 109 | 110 | BdApi.showConfirmationModal( 111 | 'Dependencies needed', 112 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 113 | { 114 | confirmText: 'Download', 115 | cancelText: 'Cancel', 116 | onCancel: () => delete global.eternalModal, 117 | onConfirm: async () => { 118 | for (const dependency of dependencies) { 119 | if (!window.hasOwnProperty(dependency.global)) { 120 | await new Promise((resolve) => { 121 | request.get(dependency.url, (error, res, body) => { 122 | if (error) return electron.shell.openExternal(dependency.external); 123 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 124 | }); 125 | }); 126 | } 127 | } 128 | 129 | delete global.eternalModal; 130 | } 131 | } 132 | ); 133 | } 134 | } : (([Plugin, API]) => { 135 | const { WebpackModules, DiscordModules: { React }, Utilities, Patcher, PluginUtilities } = API; 136 | const { clipboard } = require('electron'); 137 | 138 | const listeners = []; 139 | async function findLazy(filter) { 140 | const direct = WebpackModules.find(filter); 141 | if (direct) return direct; 142 | 143 | return new Promise(resolve => { 144 | const listener = (m) => { 145 | const direct = filter(m); 146 | if (direct) { 147 | resolve(m); 148 | return void remove(); 149 | } 150 | 151 | if (!m.default) return; 152 | const defaultMatch = filter(m.default); 153 | if (!defaultMatch) return; 154 | 155 | resolve(m.default); 156 | remove(); 157 | }; 158 | 159 | const remove = WebpackModules.addListener(listener); 160 | listeners.push(remove); 161 | }); 162 | } 163 | 164 | const { openContextMenu, closeContextMenu } = WebpackModules.getByProps('openContextMenu', 'closeContextMenu'); 165 | const ContextMenu = WebpackModules.getByProps('MenuGroup', 'MenuItem'); 166 | const SizeRegex = /(?:\?size=\d{3,4})?$/; 167 | const style = `.picture-link { cursor: pointer; }`; 168 | 169 | return class extends Plugin { 170 | start() { 171 | this.promises = { cancelled: false }; 172 | PluginUtilities.addStyle(this.getName(), style); 173 | 174 | this.patchBanners(); 175 | this.patchModalAvatar(); 176 | }; 177 | 178 | async patchModalAvatar() { 179 | const ProfileModalHeader = await findLazy(m => m.default?.displayName == 'UserProfileModalHeader'); 180 | if (this.promises.cancelled) return; 181 | 182 | const classes = WebpackModules.getByProps('relationshipButtons'); 183 | Patcher.after(ProfileModalHeader, 'default', (_, args, res) => { 184 | const avatar = Utilities.findInReactTree(res, m => m?.props?.className == classes?.avatar); 185 | const image = args[0].user?.getAvatarURL?.(false, 4096, true)?.replace('.webp', '.png'); 186 | 187 | if (avatar && image) { 188 | avatar.props.onClick = () => open(image); 189 | 190 | avatar.props.onContextMenu = (e) => openContextMenu(e, () => 191 | React.createElement(ContextMenu.default, { onClose: closeContextMenu }, 192 | React.createElement(ContextMenu.MenuItem, { 193 | label: 'Copy Avatar URL', 194 | id: 'copy-avatar-url', 195 | action: () => clipboard.writeText(image) 196 | }) 197 | ) 198 | ); 199 | } 200 | }); 201 | } 202 | 203 | patchBanners() { 204 | const Banners = WebpackModules.findAll(m => m.default?.displayName === 'UserBanner'); 205 | 206 | for (const Banner of Banners) { 207 | Patcher.after(Banner, 'default', (_, args, res) => { 208 | const [options] = args; 209 | if (options.bannerType !== 1) return; 210 | 211 | if (options?.bannerSrc) { 212 | const image = options.bannerSrc.replace(SizeRegex, '?size=4096'); 213 | 214 | res.props.onClick = () => { 215 | open(image); 216 | }; 217 | 218 | res.props.onContextMenu = (e) => openContextMenu(e, () => 219 | React.createElement(ContextMenu.default, { onClose: closeContextMenu }, 220 | React.createElement(ContextMenu.MenuItem, { 221 | label: 'Copy Banner URL', 222 | id: 'copy-banner-url', 223 | action: () => clipboard.writeText(image) 224 | }) 225 | ) 226 | ); 227 | 228 | res.props.className = [res.props.className, 'picture-link'].join(' '); 229 | } 230 | 231 | return res; 232 | }); 233 | } 234 | } 235 | 236 | stop() { 237 | this.promises.cancelled = true; 238 | PluginUtilities.removeStyle(this.getName()); 239 | Patcher.unpatchAll(); 240 | listeners.map(l => l()); 241 | }; 242 | }; 243 | })(ZLibrary.buildPlugin(config)); 244 | })(); 245 | 246 | /*@end@*/ 247 | -------------------------------------------------------------------------------- /PictureLink/README.md: -------------------------------------------------------------------------------- 1 | # Picture Link [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Allows you to click people's profile pictures and banners in their user modal and open them in your browser. 3 | 4 | [paypal-badge]: https://img.shields.io/badge/PayPal-%23003087.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAdhwAAHYcBj+XxZQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIZSURBVEiJvZa7a1RREIe/CRsIqBBQJEEUO5+YRgSx0JTBwkKwsBMU/4HY2dmKFmm1tRBREEGFYGMhvgolPlBsRBuJj5iIiRvzWWxuOF7v3r2Ld/ODhXNmhvnOzHnshZzU82rTamqqn9XX6jV1XB3K52wrtaHOV4S104J6Ue2vAtz2n7BUt9S+PCNv2FG5HZ11GDi1mkCA052AO2sG7s63tdcV9gON1BDZQA1gFlhTI3AmIgZTQ1rhlpphAFN5Qwqse/8A7uYNaX/r3j+Am9lAHQbmegmcjIhnyfwosLFXwEXgbM52BBhemdl6hOvSeEpSR9QldTYzDNUE+q2eyZer3lj2rwBHa4A9UA8UwE4kMS+yPexm/xZpPRDTwBvgCXA9Ip4XwEaBicT0MHNMlKz8ijrQxYKynMfVn7lcxzLnZAnwYJegEfV2QZ6P6kDW0rJX5lUHwAZgD7CP1l3b2yb0XETMow6WVDedS35Bfbf8+2LrqFfRVVt/DqDuLwm8nwM+qghIdcnk+6aP8hO60s7lFW4va2+iReAOcCgiTkZEM3M0OgBfJuNNwLqCmHvAY+AbMAO8BZ5GxNeihA2qH5iiuO/AWET8Ksnxl/o6ANMKizox1Q0sA65t45sDPiTzov0rvTJFagC7gM0FvoWIMJkXVdg1sLLUTwVHfqxXsPVt7tjWbnP98+3fRkXt/AG8Xy3gEnA5Ipa6Bf4BbzmPtw84RMAAAAAASUVORK5CYII= 5 | [paypal-link]: https://paypal.me/eternal404 6 | 7 | 8 | 9 | [download-badge]: https://img.shields.io/badge/Download-%233a71c1.svg?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAgCAYAAAAIXrg4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAd5gAAHeYBMKt3fAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAE9SURBVEiJ7ZQ7TsNAFEWv06IAShOkEDD5UNCwB8RCWEYWAqkIYiEgZQERoqLgFz4hUIaC+tCM4cmyk4mxCyRfaSRL8+49781YI3kKOASmwBtw4OvzFnDJry58fZUlGGvme70IQCaVgBLwXwBADegDp0AjaxjQAAbACVCzG+fmGRgDYYJ5ZGpGCfuh80Ya/EwgqWpqQ0lDoLVE5y1JQ+eNVLUFXfdSWr0A7UUTAG1XazUFuvEudoFJrPAd2EsDuMZeY56PyJM0aqohDljU0Lzz7KSMbMMmJB9px/fStoFH/PWMuS9fyBbw4Bnu/cclQe7nhD8BO5nCDaQJ3CWEj/8cbiAbwI0JvwU2cwk3kDpw7FY91/BShSoAmpKOJK3knP0l6SwAriXt5xwe6SoAPiWtFgSYVST1JM2KCJfU+wadgFl0/0HGbQAAAABJRU5ErkJggg== 10 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=PictureLink 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
7 | 8 | --- 9 | 10 |A collection of my BetterDiscord plugins.
13 | 14 | --- 15 | 16 |