├── 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 | ![Image](https://files.unbound.rip/r/090815.png) 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 | ![Preview](https://media.wtf/12141189) 6 | ![Preview](https://media.wtf/64166532) 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 | ![Image](https://files.unbound.rip/r/484126.png) 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 | ![Preview](https://i.imgur.com/GvPunQp.png) 7 | ![Preview](https://i.imgur.com/e9tgbwO.png) 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 |
2 | 3 | Author 4 | Stars 5 | PayPal 6 |
7 | 8 | --- 9 | 10 |

BetterDiscord Plugins

11 | 12 |

A collection of my BetterDiscord plugins.

13 | 14 | --- 15 | 16 |

17 | 18 | ## [ShowHiddenChannels](https://github.com/discord-modifications/better-discord-plugins/tree/master/ShowHiddenChannels "ShowHiddenChannels")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=ShowHiddenChannels) 19 | Displays all hidden channels which can't be accessed, this won't allow you to read them. 20 | 21 | ![Image](https://files.unbound.rip/r/825599.png) 22 | 23 | ## [DNDBypass](https://github.com/discord-modifications/better-discord-plugins/tree/master/DNDBypass "DNDBypass")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=DNDBypass) 24 | Give your selection of friends the ability to bypass Do Not Disturb. 25 | 26 | ![Image](https://files.unbound.rip/r/090815.png) 27 | 28 | ## [HideDMButtons](https://github.com/discord-modifications/better-discord-plugins/tree/master/HideDMButtons "HideDMButtons")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=HideDMButtons) 29 | Hides every button in the DMs list except friends. 30 | 31 | ![Image](https://files.unbound.rip/r/484126.png) 32 | 33 | ## [RelationshipsNotifier](https://github.com/discord-modifications/better-discord-plugins/tree/master/RelationshipsNotifier "RelationshipsNotifier")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=RelationshipsNotifier) 34 | Notifies you when someone removes you from their friends list, you are banned/kicked from a server or kicked from a group chat. 35 | 36 | ## [SilentTyping](https://github.com/discord-modifications/better-discord-plugins/tree/master/SilentTyping "SilentTyping")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=SilentTyping) 37 | Silences your typing indicator/status. 38 | 39 | ## [CommandsAPI](https://github.com/discord-modifications/better-discord-plugins/tree/master/CommandsAPI "CommandsAPI")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=CommandsAPI) 40 | Adds a command system to BetterDiscord for other plugins to utilize. 41 | 42 | ## [MessageCleaner](https://github.com/discord-modifications/better-discord-plugins/tree/master/MessageCleaner "MessageCleaner")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=MessageCleaner) 43 | Clears messages in the current channel. 44 | 45 | ## [VoiceChatMoveAll](https://github.com/discord-modifications/better-discord-plugins/tree/master/VoiceChatMoveAll "VoiceChatMoveAll")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=VoiceChatMoveAll) 46 | A context menu utility to move everyone to a certain voice channel. 47 | 48 | ## [Mock](https://github.com/discord-modifications/better-discord-plugins/tree/master/Mock "Mock")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=Mock) 49 | Adds the command "mock" that uppercases & lowercases letters to mock someone. 50 | 51 | ## [UserLookup](https://github.com/discord-modifications/better-discord-plugins/tree/master/UserLookup "UserLookup")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=UserLookup) 52 | Adds a command to look up information about the user using their ID. 53 | 54 | ## [SpotifyCrack](https://github.com/discord-modifications/better-discord-plugins/tree/master/SpotifyCrack "SpotifyCrack")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=SpotifyCrack) 55 | Allows you to listen along with discord users without premium. 56 | 57 | ## [NSFWGateBypass](https://github.com/discord-modifications/better-discord-plugins/tree/master/NSFWGateBypass "NSFWGateBypass")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=NSFWGateBypass) 58 | Bypasses discord's NSFW age gate. 59 | 60 | ## [MarkAllRead](https://github.com/discord-modifications/better-discord-plugins/tree/master/MarkAllRead "MarkAllRead")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=MarkAllRead) 61 | Adds the command "read" that reads channels, DMs and removes pings. 62 | 63 | ## [BegoneAutoPause](https://github.com/discord-modifications/better-discord-plugins/tree/master/BegoneAutoPause "BegoneAutoPause")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=BegoneAutoPause) 64 | Stops Discord from automatically pausing your music after 30 seconds. 65 | 66 | ## [NoBandwidthKick](https://github.com/discord-modifications/better-discord-plugins/tree/master/NoBandwidthKick "NoBandwidthKick")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=NoBandwidthKick) 67 | Stops discord from disconnecting you when you're in a call alone for more than 5 minutes. 68 | 69 | ## [PictureLink](https://github.com/discord-modifications/better-discord-plugins/tree/master/PictureLink "PictureLink")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=PictureLink) 70 | Allows you to click people's profile pictures and banners in their user modal and open them in your browser. 71 | 72 | ## [OpenInApp](https://github.com/discord-modifications/better-discord-plugins/tree/master/OpenInApp "OpenInApp")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=OpenInApp) 73 | Opens links all over the app in their respective app. 74 | 75 | ## [DoubleClickVC](https://github.com/discord-modifications/better-discord-plugins/tree/master/DoubleClickVC "DoubleClickVC")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=DoubleClickVC) 76 | Requires you to double click voice channels to join them instead of single clicking. 77 | 78 | 79 | ## [ScreenshareCrack](https://github.com/discord-modifications/better-discord-plugins/tree/master/ScreenshareCrack "ScreenshareCrack")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=ScreenshareCrack) 80 | Allows you to screenshare in any quality/fps without nitro. 81 | 82 | 83 | ## [DataSaver](https://github.com/discord-modifications/better-discord-plugins/tree/master/DataSaver "DataSaver")   [![Download][download-badge]](https://marioparaschiv.github.io/better-discord-downloader/?plugin=DataSaver) 84 | Saves friends & Servers every 30 minutes to a file. 85 | 86 | 87 | [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== 88 | -------------------------------------------------------------------------------- /RelationshipsNotifier/README.md: -------------------------------------------------------------------------------- 1 | # Relationships Notifier [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Notifies you when someone removes you from their friends list, you are banned/kicked from a server or kicked from a group chat. 3 | 4 | # Preview 5 | ![Preview](https://media.wtf/22820930)
6 | ![Preview](https://media.wtf/49346438)
7 | ![Preview](https://media.wtf/89826297)
8 | ![Preview](https://media.wtf/56583707)
9 | ![Preview](https://media.wtf/71195975.gif) 10 | 11 | [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= 12 | [paypal-link]: https://paypal.me/eternal404 13 | 14 | 15 | 16 | [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== 17 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=RelationshipsNotifier 18 | -------------------------------------------------------------------------------- /ScreenshareCrack/README.md: -------------------------------------------------------------------------------- 1 | # Screenshare Crack [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Allows you to screenshare in any quality/fps without nitro. 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=ScreenshareCrack 11 | -------------------------------------------------------------------------------- /ScreenshareCrack/ScreenshareCrack.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ScreenshareCrack 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/ScreenshareCrack/ScreenshareCrack.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ScreenshareCrack/ScreenshareCrack.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/ScreenshareCrack/ScreenshareCrack.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: 'ScreenshareCrack', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.0', 47 | description: 'Allows you to screenshare in any quality/fps without nitro..', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ScreenshareCrack/ScreenshareCrack.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 } = API; 127 | 128 | const Stream = WebpackModules.getByProps('ApplicationStreamFPSButtons'); 129 | const Lodash = window._; 130 | 131 | return class extends Plugin { 132 | start() { 133 | const requirements = Stream.ApplicationStreamSettingRequirements; 134 | this.original = Lodash.cloneDeep(requirements); 135 | 136 | for (let i = 0; i < requirements.length; i++) { 137 | for (const key in requirements[i]) { 138 | if (!~['resolution', 'fps'].indexOf(key)) { 139 | delete requirements[i][key]; 140 | } 141 | } 142 | } 143 | }; 144 | 145 | stop() { 146 | Stream.ApplicationStreamSettingRequirements = this.original; 147 | }; 148 | }; 149 | })(ZLibrary.buildPlugin(config)); 150 | })(); 151 | 152 | /*@end@*/ 153 | -------------------------------------------------------------------------------- /ShowHiddenChannels/README.md: -------------------------------------------------------------------------------- 1 | # Show Hidden Channels [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Displays all hidden channels which can't be accessed, this won't allow you to read them. 3 | 4 | ![Image](https://files.unbound.rip/r/825599.png) 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=ShowHiddenChannels 13 | 14 | -------------------------------------------------------------------------------- /ShowHiddenChannels/ShowHiddenChannels.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ShowHiddenChannels 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/ShowHiddenChannels/ShowHiddenChannels.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ShowHiddenChannels/ShowHiddenChannels.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/ShowHiddenChannels/ShowHiddenChannels.plugin.js 6 | * @authorId 263689920210534400 7 | * @donate https://paypal.me/eternal404 8 | */ 9 | 10 | /*@cc_on 11 | @if (@_jscript) 12 | // Offer to self-install for clueless users that try to run this directly. 13 | var shell = WScript.CreateObject("WScript.Shell"); 14 | var fs = new ActiveXObject("Scripting.FileSystemObject"); 15 | var pathPlugins = shell.ExpandEnvironmentStrings("%APPDATA%\\BetterDiscord\\plugins"); 16 | var pathSelf = WScript.ScriptFullName; 17 | // Put the user at ease by addressing them in the first person 18 | 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); 19 | if (fs.GetParentFolderName(pathSelf) === fs.GetAbsolutePathName(pathPlugins)) { 20 | shell.Popup("I'm in the correct folder already.", 0, "I'm already installed", 0x40); 21 | } else if (!fs.FolderExists(pathPlugins)) { 22 | shell.Popup("I can't find the BetterDiscord plugins folder.\nAre you sure it's even installed?", 0, "Can't install myself", 0x10); 23 | } else if (shell.Popup("Should I copy myself to BetterDiscord's plugins folder for you?", 0, "Do you need some help?", 0x34) === 6) { 24 | fs.CopyFile(pathSelf, fs.BuildPath(pathPlugins, fs.GetFileName(pathSelf)), true); 25 | // Show the user where to put plugins in the future 26 | shell.Exec("explorer " + pathPlugins); 27 | shell.Popup("I'm installed!", 0, "Successfully installed", 0x40); 28 | } 29 | WScript.Quit(); 30 | @else@*/ 31 | 32 | module.exports = (() => { 33 | const config = { 34 | info: { 35 | name: 'ShowHiddenChannels', 36 | authors: [ 37 | { 38 | name: 'eternal', 39 | discord_id: '263689920210534400', 40 | github_username: 'eternal404' 41 | } 42 | ], 43 | version: '1.0.1', 44 | description: 'Displays all hidden channels which can\'t be accessed, this won\'t allow you to read them.', 45 | github: 'https://github.com/eternal404', 46 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ShowHiddenChannels/ShowHiddenChannels.plugin.js' 47 | }, 48 | }; 49 | 50 | return !global.ZeresPluginLibrary ? class { 51 | constructor() { 52 | this.start = this.load = this.handleMissingLib; 53 | } 54 | 55 | getName() { 56 | return config.info.name.replace(/\s+/g, ''); 57 | } 58 | 59 | getAuthor() { 60 | return config.info.authors.map(a => a.name).join(', '); 61 | } 62 | 63 | getVersion() { 64 | return config.info.version; 65 | } 66 | 67 | getDescription() { 68 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 69 | } 70 | 71 | start() { } 72 | 73 | stop() { } 74 | 75 | async handleMissingLib() { 76 | const request = require('request'); 77 | const path = require('path'); 78 | const fs = require('fs'); 79 | 80 | const dependencies = [ 81 | { 82 | global: 'ZeresPluginLibrary', 83 | filename: '0PluginLibrary.plugin.js', 84 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 85 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 86 | } 87 | ]; 88 | 89 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 90 | 91 | if (global.eternalModal) { 92 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 93 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 94 | }; 95 | 96 | global.eternalModal = true; 97 | 98 | BdApi.showConfirmationModal( 99 | 'Dependencies needed', 100 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 101 | { 102 | confirmText: 'Download', 103 | cancelText: 'Cancel', 104 | onCancel: () => delete global.eternalModal, 105 | onConfirm: async () => { 106 | for (const dependency of dependencies) { 107 | if (!window.hasOwnProperty(dependency.global)) { 108 | await new Promise((resolve) => { 109 | request.get(dependency.url, (error, res, body) => { 110 | if (error) return electron.shell.openExternal(dependency.external); 111 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 112 | }); 113 | }); 114 | } 115 | } 116 | 117 | delete global.eternalModal; 118 | } 119 | } 120 | ); 121 | } 122 | } : (([Plugin, API]) => { 123 | const { Patcher, Utilities, DiscordModules: { Clickable, DiscordConstants, MessageActions, LocaleManager }, PluginUtilities } = API; 124 | const { React, Webpack } = BdApi; 125 | 126 | const [ 127 | Route, 128 | ChannelItem, 129 | ChannelClasses, 130 | ChannelUtil, 131 | Permissions, 132 | Channel, 133 | { getChannel } = {}, 134 | { getGuild } = {}, 135 | { iconItem, actionIcon } = {}, 136 | UnreadStore, 137 | Voice, 138 | { TooltipContainer: Tooltip } = {}, 139 | LockClosed, 140 | ChannelTopic, 141 | { chat } = {}, 142 | Text 143 | ] = Webpack.getBulk( 144 | { filter: Webpack.Filters.byDisplayName('RouteWithImpression'), defaultExport: false }, 145 | { filter: Webpack.Filters.byDisplayName('ChannelItem'), defaultExport: false }, 146 | { filter: Webpack.Filters.byProps('wrapper', 'mainContent') }, 147 | { filter: Webpack.Filters.byProps('getChannelIconComponent') }, 148 | { filter: Webpack.Filters.byProps('getChannelPermissions') }, 149 | { filter: Webpack.Filters.byPrototypeFields('isManaged') }, 150 | { filter: Webpack.Filters.byProps('getDMFromUserId') }, 151 | { filter: Webpack.Filters.byProps('getGuild') }, 152 | { filter: Webpack.Filters.byProps('iconItem') }, 153 | { filter: Webpack.Filters.byProps('isForumPostUnread') }, 154 | { filter: Webpack.Filters.byProps('getVoiceStateStats') }, 155 | { filter: Webpack.Filters.byProps('TooltipContainer') }, 156 | { filter: Webpack.Filters.byDisplayName('LockClosed') }, 157 | { filter: Webpack.Filters.byDisplayName('ChannelTopic') }, 158 | { filter: Webpack.Filters.byProps('chat', 'chatContent') }, 159 | { filter: Webpack.Filters.byDisplayName('LegacyText') }, 160 | ); 161 | 162 | const { ChannelTypes, Permissions: DiscordPermissions } = DiscordConstants; 163 | 164 | function getDateFromSnowflake(number) { 165 | try { 166 | const id = parseInt(number); 167 | const binary = id.toString(2).padStart(64, '0'); 168 | const excerpt = binary.substring(0, 42); 169 | const decimal = parseInt(excerpt, 2); 170 | const unix = decimal + 1420070400000; 171 | return new Date(unix).toLocaleString(); 172 | } catch (e) { 173 | console.error(e); 174 | return '(Failed to get date)'; 175 | } 176 | } 177 | 178 | const LockedScreen = React.memo(props => { 179 | return React.createElement('div', { 180 | className: ['shc-locked-chat-content', chat].filter(Boolean).join(' ') 181 | }, React.createElement('div', { 182 | className: 'shc-locked-notice' 183 | }, React.createElement('img', { 184 | className: 'shc-notice-lock', 185 | src: '/assets/755d4654e19c105c3cd108610b78d01c.svg' 186 | }), React.createElement(Text, { 187 | className: 'shc-locked-channel-text', 188 | color: Text.Colors.HEADER_PRIMARY, 189 | size: Text.Sizes.SIZE_32 190 | }, 'This is a hidden channel.'), React.createElement(Text, { 191 | className: 'shc-no-access-text', 192 | color: Text.Colors.HEADER_SECONDARY, 193 | size: Text.Sizes.SIZE_16 194 | }, 'You cannot see the contents of this channel. ', props.channel.topic && 'However, you may see its topic.'), props.channel.topic && React.createElement(ChannelTopic, { 195 | key: props.channel.id, 196 | channel: props.channel, 197 | guild: props.guild 198 | }), props.channel.lastMessageId && React.createElement(Text, { 199 | color: Text.Colors.INTERACTIVE_NORMAL, 200 | size: Text.Sizes.SIZE_14 201 | }, 'Last message sent: ', getDateFromSnowflake(props.channel.lastMessageId)))); 202 | }); 203 | 204 | return class extends Plugin { 205 | start() { 206 | this.can = Permissions.__powercordOriginal_can ?? Permissions.can; 207 | 208 | 209 | PluginUtilities.addStyle(this.getName(), ` 210 | .shc-guild-settings { 211 | width: auto !important; 212 | margin-bottom: 32px; 213 | } 214 | 215 | .shc-guild-item.selectableItem-1MP3MQ.selected-31soGA { 216 | cursor: pointer !important; 217 | } 218 | 219 | .shc-guild-scroller { 220 | max-height: 500px; 221 | } 222 | 223 | .shc-lock-icon-clickable { 224 | margin-left: 0; 225 | } 226 | 227 | .shc-guild-item { 228 | padding: 6px; 229 | padding-left: 18px; 230 | margin-top: 4px; 231 | margin-bottom: 4px; 232 | height: auto; 233 | } 234 | 235 | .shc-guild { 236 | margin: 6px; 237 | width: 32px; 238 | height: 32px; 239 | float: left; 240 | border-radius: 360px; 241 | } 242 | 243 | .shc-guild-name { 244 | color: white; 245 | float: left; 246 | font-family: 'Whitney', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; 247 | font-weight: 700; 248 | margin-left: 8px; 249 | font-size: 20px; 250 | } 251 | 252 | .shc-guild-name { 253 | margin-top: 8px; 254 | } 255 | 256 | .shc-locked-notice { 257 | display: flex; 258 | flex-direction: column; 259 | justify-content: center; 260 | align-items: center; 261 | margin: auto; 262 | text-align: center; 263 | } 264 | 265 | .shc-additional-info-text { 266 | margin-top: 10px; 267 | } 268 | 269 | .shc-locked-notice > div[class^="divider"] { 270 | display: none 271 | } 272 | 273 | .shc-locked-notice > div[class^="topic"] { 274 | background-color: var(--background-secondary); 275 | padding: 5px; 276 | max-width: 50vh; 277 | text-overflow: ellipsis; 278 | border-radius: 5px; 279 | margin: 10px auto; 280 | } 281 | 282 | .shc-notice-lock { 283 | -webkit-user-drag: none; 284 | max-height: 128px; 285 | } 286 | 287 | .shc-locked-channel-text { 288 | margin-top: 20px; 289 | font-weight: bold; 290 | } 291 | 292 | .shc-no-access-text { 293 | margin-top: 10px; 294 | } 295 | `); 296 | 297 | const _this = this; 298 | Channel.prototype.isHidden = function () { 299 | return ![1, 3].includes(this.type) && !_this.can(DiscordPermissions.VIEW_CHANNEL, this); 300 | }; 301 | 302 | Patcher.after(UnreadStore, 'hasAnyUnread', (args, res) => { 303 | return res && !getChannel(args[0])?.isHidden(); 304 | }); 305 | 306 | Patcher.after(UnreadStore, 'hasUnread', (_, args, res) => { 307 | return res && !getChannel(args[0])?.isHidden(); 308 | }); 309 | 310 | Patcher.after(UnreadStore, 'hasNotableUnread', (_, args, res) => { 311 | return res && !getChannel(args[0])?.isHidden(); 312 | }); 313 | 314 | Patcher.after(UnreadStore, 'hasRelevantUnread', (_, args, res) => { 315 | return res && !args[0].isHidden(); 316 | }); 317 | 318 | Patcher.after(Permissions, 'can', (_, args, res) => { 319 | if (args[0] == DiscordPermissions.VIEW_CHANNEL) return true; 320 | 321 | return res; 322 | }); 323 | 324 | Patcher.after(UnreadStore, 'getMentionCount', (_, args, res) => { 325 | return getChannel(args[0])?.isHidden() ? 0 : res; 326 | }); 327 | 328 | Patcher.after(Route, 'default', (_, __, res) => { 329 | const id = res.props?.computedMatch?.params?.channelId; 330 | const guild = res.props?.computedMatch?.params?.guildId; 331 | 332 | let channel; 333 | if (id && guild && (channel = getChannel(id)) && channel?.isHidden?.() && channel?.id != Voice.getChannelId()) { 334 | res.props.render = () => React.createElement(LockedScreen, { 335 | channel, 336 | guild: getGuild(guild) 337 | }); 338 | }; 339 | 340 | return res; 341 | }); 342 | 343 | Patcher.instead(MessageActions, 'fetchMessages', (ctx, args, orig) => { 344 | if (getChannel(args.channelId)?.isHidden?.()) return; 345 | 346 | return orig.apply(ctx, args); 347 | }); 348 | 349 | Patcher.after(ChannelItem, 'default', (_, args, res) => { 350 | const instance = args[0]; 351 | 352 | if (instance.channel?.isHidden()) { 353 | const item = res.props?.children?.props; 354 | if (item?.className) item.className += ` shc-hidden-channel shc-hidden-channel-type-${instance.channel.type}`; 355 | 356 | const children = Utilities.findInReactTree(res, r => r?.props?.onClick && r?.type === 'div'); 357 | if (children.props?.children) { 358 | children.props.children = [ 359 | React.createElement(Tooltip, { 360 | text: LocaleManager.Messages.CHANNEL_LOCKED_SHORT 361 | }, React.createElement(Clickable, { 362 | className: [iconItem, 'shc-lock-icon-clickable'].join(' '), 363 | style: { 364 | display: 'block' 365 | } 366 | }, React.createElement(LockClosed, { 367 | className: actionIcon 368 | }))) 369 | ]; 370 | } 371 | 372 | if (instance.channel.type == ChannelTypes.GUILD_VOICE && !instance.connected) { 373 | const wrapper = Utilities.findInReactTree(res, n => n?.props?.className?.includes(ChannelClasses.wrapper)); 374 | 375 | if (wrapper) { 376 | wrapper.props.onMouseDown = () => { }; 377 | wrapper.props.onMouseUp = () => { }; 378 | } 379 | 380 | const mainContent = Utilities.findInReactTree(res, n => n?.props?.className?.includes(ChannelClasses.mainContent)); 381 | 382 | if (mainContent) { 383 | mainContent.props.onClick = () => { }; 384 | mainContent.props.href = null; 385 | } 386 | }; 387 | } 388 | 389 | return res; 390 | }); 391 | 392 | Patcher.before(ChannelUtil, 'getChannelIconComponent', (_, args) => { 393 | if (args[0]?.isHidden?.() && args[2]?.locked) { 394 | args[2].locked = false; 395 | } 396 | 397 | return args; 398 | }); 399 | }; 400 | 401 | stop() { 402 | delete Channel.prototype.isHidden; 403 | PluginUtilities.removeStyle(this.getName()); 404 | Patcher.unpatchAll(); 405 | }; 406 | }; 407 | })(ZLibrary.buildPlugin(config)); 408 | })(); 409 | 410 | /*@end@*/ 411 | -------------------------------------------------------------------------------- /SilentTyping/README.md: -------------------------------------------------------------------------------- 1 | # Silent Typing [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Silences your typing indicator. 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=SilentTyping 11 | -------------------------------------------------------------------------------- /SilentTyping/SilentTyping.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name SilentTyping 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/SilentTyping/SilentTyping.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/SilentTyping/SilentTyping.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/SilentTyping/SilentTyping.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: 'SilentTyping', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.3', 47 | description: 'Silences your typing indicator/status.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/SilentTyping/SilentTyping.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 typing = WebpackModules.getByProps('startTyping'); 128 | 129 | return class extends Plugin { 130 | constructor() { 131 | super(); 132 | } 133 | 134 | start() { 135 | Patcher.instead(typing, 'startTyping', () => { }); 136 | Patcher.instead(typing, 'stopTyping', () => { }); 137 | }; 138 | 139 | stop() { 140 | Patcher.unpatchAll(); 141 | }; 142 | }; 143 | })(ZLibrary.buildPlugin(config)); 144 | })(); 145 | 146 | /*@end@*/ 147 | -------------------------------------------------------------------------------- /SpotifyCrack/README.md: -------------------------------------------------------------------------------- 1 | # Spotify Crack [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Allows you to listen along with discord users without premium. 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=SpotifyCrack 11 | -------------------------------------------------------------------------------- /SpotifyCrack/SpotifyCrack.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name SpotifyCrack 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/SpotifyCrack/SpotifyCrack.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/SpotifyCrack/SpotifyCrack.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/SpotifyCrack/SpotifyCrack.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: 'SpotifyCrack', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.4', 47 | description: 'Allows you to listen along with discord users without premium.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/SpotifyCrack/SpotifyCrack.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 ? 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 } = API; 136 | const Dispatcher = WebpackModules.getByProps('_currentDispatchActionType'); 137 | const Profile = WebpackModules.getByProps('getProfile'); 138 | const Spotify = WebpackModules.getByProps('isSpotifyPremium'); 139 | 140 | return class extends Plugin { 141 | constructor() { 142 | super(); 143 | } 144 | 145 | start() { 146 | Patcher.after(Profile, 'getProfile', async (_, args) => { 147 | let unpatch = Patcher.after(Spotify, 'isSpotifyPremium', () => true); 148 | Dispatcher.dispatch({ type: 'SPOTIFY_PROFILE_UPDATE', accountId: args[0], isPremium: true }); 149 | unpatch(); 150 | return; 151 | }); 152 | }; 153 | 154 | stop() { 155 | Patcher.unpatchAll(); 156 | }; 157 | }; 158 | })(ZLibrary.buildPlugin(config)); 159 | })(); 160 | 161 | /*@end@*/ 162 | -------------------------------------------------------------------------------- /Template.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name ReplacePluginName 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/ReplacePluginName/ReplacePluginName.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ReplacePluginName/ReplacePluginName.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/ReplacePluginName/ReplacePluginName.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: 'ReplacePluginName', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '1.0.0', 47 | description: 'Description here.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/ReplacePluginName/ReplacePluginName.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 | return class extends Plugin { 127 | constructor() { 128 | super(); 129 | } 130 | 131 | start() { 132 | 133 | }; 134 | 135 | stop() { 136 | 137 | }; 138 | }; 139 | })(ZLibrary.buildPlugin(config)); 140 | })(); 141 | 142 | /*@end@*/ 143 | -------------------------------------------------------------------------------- /UserLookup/README.md: -------------------------------------------------------------------------------- 1 | # User Lookup [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | Adds a command to look up information about the user using their ID. 3 | 4 | # Usage 5 | - `-whois 263689920210534400` 6 | - `-id 263689920210534400` 7 | - `-lookup 263689920210534400` 8 | 9 | > Legend: `-` = `Your prefix` 10 | 11 | [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= 12 | [paypal-link]: https://paypal.me/eternal404 13 | 14 | 15 | 16 | [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== 17 | [download-link]: https://marioparaschiv.github.io/better-discord-downloader/?plugin=UserLookup 18 | -------------------------------------------------------------------------------- /UserLookup/UserLookup.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name UserLookup 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/UserLookup/UserLookup.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/UserLookup/UserLookup.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/UserLookup/UserLookup.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: 'UserLookup', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '3.1.0', 47 | description: 'Adds a command to look up information about the user using their ID.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/UserLookup/UserLookup.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 { getUser } = WebpackModules.getByProps('getUser'); 143 | 144 | return class extends Plugin { 145 | constructor() { 146 | super(); 147 | } 148 | 149 | start() { 150 | if (!window.commands) window.commands = {}; 151 | if (!window.commands['whois']) { 152 | window.commands['whois'] = { 153 | command: 'whois', 154 | aliases: ['id', 'lookup'], 155 | label: 'User ID Info', 156 | usage: '{c} ', 157 | description: 'Lookup user info from a user id', 158 | executor: this.getInfo.bind(this) 159 | }; 160 | } 161 | }; 162 | 163 | async getInfo(id) { 164 | try { 165 | let user = await getUser(String(id)); 166 | let tag = `${user.username}#${user.discriminator}`; 167 | let avatar; 168 | 169 | if (!user.avatar) { 170 | avatar = `https://canary.discord.com${user.avatarURL}`; 171 | } else { 172 | avatar = `https://cdn.discordapp.com/avatars/${String(user.id)}/${user.avatar}.${user.avatar.startsWith('a_') ? 'gif' : 'png'}?size=4096`; 173 | } 174 | 175 | let unix = (id / 4194304) + 1420070400000; 176 | let time = new Date(unix); 177 | let date = `${time.getMonth() + 1}/${time.getDate()}/${time.getFullYear()} `; 178 | let difference = this.differentiate(Date.now(), unix); 179 | 180 | return { 181 | result: { 182 | type: 'rich', 183 | title: `User Lookup for ${tag}`, 184 | color: 0xff0000, 185 | fields: [ 186 | { name: 'ID', value: String(id) }, 187 | { name: 'Tag', value: `<@${id}> ` }, 188 | { name: 'Username', value: tag }, 189 | { name: 'Bot', value: user.bot ? 'Yes' : 'No' }, 190 | { name: 'Avatar', value: `[URL](${avatar})` }, 191 | { name: 'Created', value: `${date} (${difference})` } 192 | ] 193 | }, 194 | embed: true 195 | }; 196 | } catch (err) { 197 | return { 198 | result: 'Invalid ID.' 199 | }; 200 | } 201 | } 202 | 203 | differentiate(current, previous) { 204 | var msPerMinute = 60 * 1000; 205 | var msPerHour = msPerMinute * 60; 206 | var msPerDay = msPerHour * 24; 207 | var msPerMonth = msPerDay * 30; 208 | var msPerYear = msPerDay * 365; 209 | var elapsed = current - previous; 210 | if (elapsed < msPerMinute) { 211 | return `${Math.round(elapsed / 1000)} seconds ago`; 212 | } else if (elapsed < msPerHour) { 213 | return `${Math.round(elapsed / msPerMinute)} minutes ago`; 214 | } else if (elapsed < msPerDay) { 215 | return `${Math.round(elapsed / msPerHour)} hours ago`; 216 | } else if (elapsed < msPerMonth) { 217 | return `${Math.round(elapsed / msPerDay)} days ago`; 218 | } else if (elapsed < msPerYear) { 219 | return `${Math.round(elapsed / msPerMonth)} months ago`; 220 | } else { 221 | return `${Math.round(elapsed / msPerYear)} years ago`; 222 | } 223 | } 224 | 225 | stop() { 226 | delete window.commands?.['whois']; 227 | }; 228 | }; 229 | })(ZLibrary.buildPlugin(config)); 230 | })(); 231 | 232 | /*@end@*/ 233 | -------------------------------------------------------------------------------- /VoiceChatMoveAll/README.md: -------------------------------------------------------------------------------- 1 | # VoiceChat Move All [![Download][download-badge]][download-link] [![PayPal][paypal-badge]][paypal-link] 2 | A context menu utility to move everyone to a certain voice channel. 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=VoiceChatMoveAll 11 | -------------------------------------------------------------------------------- /VoiceChatMoveAll/VoiceChatMoveAll.plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @name VoiceChatMoveAll 3 | * @source https://github.com/discord-modifications/better-discord-plugins/blob/master/VoiceChatMoveAll/VoiceChatMoveAll.plugin.js 4 | * @updateUrl https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/VoiceChatMoveAll/VoiceChatMoveAll.plugin.js 5 | * @website https://github.com/discord-modifications/better-discord-plugins/tree/master/VoiceChatMoveAll/VoiceChatMoveAll.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: 'VoiceChatMoveAll', 39 | authors: [ 40 | { 41 | name: 'eternal', 42 | discord_id: '263689920210534400', 43 | github_username: 'eternal404' 44 | } 45 | ], 46 | version: '2.0.7', 47 | description: 'A context menu utility to move everyone to a certain voice channel.', 48 | github: 'https://github.com/eternal404', 49 | github_raw: 'https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/master/VoiceChatMoveAll/VoiceChatMoveAll.plugin.js' 50 | }, 51 | changelog: [ 52 | { 53 | title: 'Fixed', 54 | type: 'fixed', 55 | items: ['The plugin now works again.'] 56 | } 57 | ] 58 | }; 59 | 60 | return !global.ZeresPluginLibrary ? class { 61 | constructor() { 62 | this.start = this.load = this.handleMissingLib; 63 | } 64 | 65 | getName() { 66 | return config.info.name.replace(/\s+/g, ''); 67 | } 68 | 69 | getAuthor() { 70 | return config.info.authors.map(a => a.name).join(', '); 71 | } 72 | 73 | getVersion() { 74 | return config.info.version; 75 | } 76 | 77 | getDescription() { 78 | return config.info.description + ' You are missing libraries for this plugin, please enable the plugin and click Download Now.'; 79 | } 80 | 81 | start() { } 82 | 83 | stop() { } 84 | 85 | async handleMissingLib() { 86 | const request = require('request'); 87 | const path = require('path'); 88 | const fs = require('fs'); 89 | 90 | const dependencies = [ 91 | { 92 | global: 'ZeresPluginLibrary', 93 | filename: '0PluginLibrary.plugin.js', 94 | external: 'https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js', 95 | url: 'https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js' 96 | } 97 | ]; 98 | 99 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return; 100 | 101 | if (global.eternalModal) { 102 | while (global.eternalModal && dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) await new Promise(f => setTimeout(f, 1000)); 103 | if (!dependencies.map(d => window.hasOwnProperty(d.global)).includes(false)) return BdApi.Plugins.reload(this.getName()); 104 | }; 105 | 106 | global.eternalModal = true; 107 | 108 | BdApi.showConfirmationModal( 109 | 'Dependencies needed', 110 | `Dependencies needed for ${this.getName()} are missing. Please click download to install the dependecies.`, 111 | { 112 | confirmText: 'Download', 113 | cancelText: 'Cancel', 114 | onCancel: () => delete global.eternalModal, 115 | onConfirm: async () => { 116 | for (const dependency of dependencies) { 117 | if (!window.hasOwnProperty(dependency.global)) { 118 | await new Promise((resolve) => { 119 | request.get(dependency.url, (error, res, body) => { 120 | if (error) return electron.shell.openExternal(dependency.external); 121 | fs.writeFile(path.join(BdApi.Plugins.folder, dependency.filename), body, resolve); 122 | }); 123 | }); 124 | } 125 | } 126 | 127 | delete global.eternalModal; 128 | } 129 | } 130 | ); 131 | } 132 | } : (([Plugin, API]) => { 133 | const { WebpackModules, Patcher, DCM, DiscordModules: { React } } = API; 134 | 135 | const sleep = (time) => new Promise((f) => setTimeout(f, time)); 136 | 137 | const { getVoiceStatesForChannel } = WebpackModules.getByProps('getVoiceStatesForChannel'); 138 | const DiscordPermissions = WebpackModules.getByProps('API_HOST').Permissions; 139 | const { getVoiceChannelId } = WebpackModules.getByProps('getVoiceChannelId'); 140 | const { patch } = WebpackModules.find(m => typeof m == 'object' && m.patch); 141 | const Menu = WebpackModules.getByProps('MenuGroup', 'MenuItem'); 142 | const Permissions = WebpackModules.getByProps('getChannelPermissions'); 143 | const { getChannel } = WebpackModules.getByProps('hasChannel'); 144 | const { Endpoints } = WebpackModules.getByProps('Endpoints'); 145 | const { getGuild } = WebpackModules.getByProps('getGuild'); 146 | 147 | return class extends Plugin { 148 | constructor() { 149 | super(); 150 | } 151 | 152 | start() { 153 | this.promises = { cancelled: false }; 154 | this.patchContextMenu(); 155 | } 156 | 157 | async patchContextMenu() { 158 | const ContextMenu = await DCM.getDiscordMenu('ChannelListVoiceChannelContextMenu'); 159 | if (this.promises.cancelled) return; 160 | 161 | Patcher.after(ContextMenu, 'default', (_, args, res) => { 162 | const channel = args[0].channel; 163 | if (!channel || !channel.guild_id || !this.canMoveAll(channel)) return res; 164 | const currentChannel = this.getVoiceChannel(); 165 | if (!currentChannel) return res; 166 | 167 | const item = React.createElement(Menu.MenuItem, { 168 | action: async () => { 169 | for (const member of currentChannel.members) { 170 | await patch({ 171 | url: Endpoints.GUILD_MEMBER(channel.guild_id, member), 172 | body: { 173 | channel_id: channel.id 174 | } 175 | }).catch(async (e) => { 176 | await sleep(e.body.retry_after * 1000); 177 | currentChannel.members.unshift(member); 178 | }); 179 | } 180 | }, 181 | id: 'move-all-vc', 182 | label: 'Move All' 183 | }); 184 | 185 | const element = React.createElement(Menu.MenuGroup, null, item); 186 | if (res.props.children?.props) { 187 | res.props.children?.props.children.push(element); 188 | } else { 189 | res.props.children.push(element); 190 | }; 191 | 192 | return res; 193 | }); 194 | } 195 | 196 | stop() { 197 | Patcher.unpatchAll(); 198 | this.promises.cancelled = true; 199 | } 200 | 201 | getVoiceUserIds(channel) { 202 | if (!channel) return null; 203 | return Object.keys(getVoiceStatesForChannel(channel)); 204 | } 205 | 206 | canMoveAll(channel) { 207 | let instance = this.getVoiceChannel(); 208 | 209 | if ( 210 | instance?.channel.id !== channel.id && 211 | instance?.channel.guild_id === channel.guild_id && 212 | ( 213 | Permissions.can(DiscordPermissions.ADMINISTRATOR, getGuild(channel.guild_id)) || 214 | (this.canJoinAndMove(channel) && (channel.userLimit == 0 || channel.userLimit - instance.count >= 0)) 215 | ) 216 | ) return true; 217 | 218 | return false; 219 | } 220 | 221 | canJoinAndMove(channel) { 222 | return Permissions.can(DiscordPermissions.CONNECT, channel) && Permissions.can(DiscordPermissions.MOVE_MEMBERS, channel); 223 | } 224 | 225 | getVoiceChannel() { 226 | let channel = getChannel(getVoiceChannelId()); 227 | let members = this.getVoiceUserIds(channel?.id); 228 | if (channel && members) return { channel, members, count: members.length }; 229 | return null; 230 | } 231 | }; 232 | })(ZLibrary.buildPlugin(config)); 233 | })(); 234 | 235 | /*@end@*/ -------------------------------------------------------------------------------- /assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/09578c9af22ff9e2445213128fcb0d9b17f41f95/assets/banner.png -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/09578c9af22ff9e2445213128fcb0d9b17f41f95/assets/icon.png -------------------------------------------------------------------------------- /assets/icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/discord-modifications/better-discord-plugins/09578c9af22ff9e2445213128fcb0d9b17f41f95/assets/icon.psd --------------------------------------------------------------------------------