Advertisement
PaladinMods

Untitled

Jul 24th, 2022
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.30 KB | None | 0 0
  1. /**
  2. * @name AssignBadges
  3. * @version 1.0.27
  4. * @description Allows you to locally assign badges to users through the user context menu.
  5. * @author QWERT
  6. * @source https://github.com/QWERTxD/BetterDiscordPlugins/tree/main/AssignBadges
  7. * @updateUrl https://raw.githubusercontent.com/QWERTxD/BetterDiscordPlugins/main/AssignBadges/AssignBadges.plugin.js
  8. */
  9. /*@cc_on
  10. @if (@_jscript)
  11.  
  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. /* Generated Code */
  32. const config = {
  33. "info": {
  34. "name": "AssignBadges",
  35. "version": "1.0.27",
  36. "description": "Allows you to locally assign badges to users through the user context menu.",
  37. "authors": [{
  38. "name": "QWERT",
  39. "discord_id": "678556376640913408",
  40. "github_username": "QWERTxD"
  41. }],
  42. "github": "https://github.com/QWERTxD/BetterDiscordPlugins/tree/main/AssignBadges",
  43. "github_raw": "https://raw.githubusercontent.com/QWERTxD/BetterDiscordPlugins/main/AssignBadges/AssignBadges.plugin.js"
  44. },
  45. "build": {
  46. "zlibrary": true,
  47. "copy": true,
  48. "production": false,
  49. "scssHash": false,
  50. "alias": {
  51. "components": "components/index.js"
  52. },
  53. "release": {
  54. "source": true,
  55. "readme": true
  56. }
  57. },
  58. "changelog": [{
  59. "type": "fixed",
  60. "title": "Fixes",
  61. "items": [
  62. "Fixed bot tag crashing discord\nThanks to AGreenPig for debugging and fix"
  63. ]
  64. }]
  65. };
  66. function buildPlugin([BasePlugin, PluginApi]) {
  67. const module = {
  68. exports: {}
  69. };
  70. (() => {
  71. "use strict";
  72. class StyleLoader {
  73. static styles = "";
  74. static element = null;
  75. static append(module, css) {
  76. this.styles += `/* ${module} */\n${css}`;
  77. }
  78. static inject(name = config.info.name) {
  79. if (this.element) this.element.remove();
  80. this.element = document.head.appendChild(Object.assign(document.createElement("style"), {
  81. id: name,
  82. textContent: this.styles
  83. }));
  84. }
  85. static remove() {
  86. if (this.element) {
  87. this.element.remove();
  88. this.element = null;
  89. }
  90. }
  91. }
  92. function ___createMemoize___(instance, name, value) {
  93. value = value();
  94. Object.defineProperty(instance, name, {
  95. value,
  96. configurable: true
  97. });
  98. return value;
  99. };
  100. const Modules = {
  101. get 'react-spring'() {
  102. return ___createMemoize___(this, 'react-spring', () => BdApi.findModuleByProps('useSpring'))
  103. },
  104. '@discord/utils': {
  105. get 'joinClassNames'() {
  106. return ___createMemoize___(this, 'joinClassNames', () => BdApi.findModule(e => e.toString().indexOf('return e.join(" ")') > 200))
  107. },
  108. get 'useForceUpdate'() {
  109. return ___createMemoize___(this, 'useForceUpdate', () => BdApi.findModuleByProps('useForceUpdate')?.useForceUpdate)
  110. },
  111. get 'Logger'() {
  112. return ___createMemoize___(this, 'Logger', () => BdApi.findModuleByProps('setLogFn')?.default)
  113. },
  114. get 'Navigation'() {
  115. return ___createMemoize___(this, 'Navigation', () => BdApi.findModuleByProps('replaceWith', 'currentRouteIsPeekView'))
  116. }
  117. },
  118. '@discord/components': {
  119. get 'Tooltip'() {
  120. return ___createMemoize___(this, 'Tooltip', () => BdApi.findModuleByDisplayName('Tooltip'))
  121. },
  122. get 'TooltipContainer'() {
  123. return ___createMemoize___(this, 'TooltipContainer', () => BdApi.findModuleByProps('TooltipContainer')?.TooltipContainer)
  124. },
  125. get 'TextInput'() {
  126. return ___createMemoize___(this, 'TextInput', () => BdApi.findModuleByDisplayName('TextInput'))
  127. },
  128. get 'SlideIn'() {
  129. return ___createMemoize___(this, 'SlideIn', () => BdApi.findModuleByDisplayName('SlideIn'))
  130. },
  131. get 'SettingsNotice'() {
  132. return ___createMemoize___(this, 'SettingsNotice', () => BdApi.findModuleByDisplayName('SettingsNotice'))
  133. },
  134. get 'TransitionGroup'() {
  135. return ___createMemoize___(this, 'TransitionGroup', () => BdApi.findModuleByDisplayName('TransitionGroup'))
  136. },
  137. get 'Button'() {
  138. return ___createMemoize___(this, 'Button', () => BdApi.findModule(m => 'DropdownSizes' in m && typeof(m) === 'function'))
  139. },
  140. get 'Popout'() {
  141. return ___createMemoize___(this, 'Popout', () => BdApi.findModuleByDisplayName('Popout'))
  142. },
  143. get 'Flex'() {
  144. return ___createMemoize___(this, 'Flex', () => BdApi.findModuleByDisplayName('Flex'))
  145. },
  146. get 'Text'() {
  147. return ___createMemoize___(this, 'Text', () => BdApi.findModuleByDisplayName('Text'))
  148. },
  149. get 'Card'() {
  150. return ___createMemoize___(this, 'Card', () => BdApi.findModuleByDisplayName('Card'))
  151. }
  152. },
  153. '@discord/modules': {
  154. get 'Dispatcher'() {
  155. return ___createMemoize___(this, 'Dispatcher', () => BdApi.findModuleByProps('dirtyDispatch', 'subscribe'))
  156. },
  157. get 'ComponentDispatcher'() {
  158. return ___createMemoize___(this, 'ComponentDispatcher', () => BdApi.findModuleByProps('ComponentDispatch')?.ComponentDispatch)
  159. },
  160. get 'EmojiUtils'() {
  161. return ___createMemoize___(this, 'EmojiUtils', () => BdApi.findModuleByProps('uploadEmoji'))
  162. },
  163. get 'PermissionUtils'() {
  164. return ___createMemoize___(this, 'PermissionUtils', () => BdApi.findModuleByProps('computePermissions', 'canManageUser'))
  165. },
  166. get 'DMUtils'() {
  167. return ___createMemoize___(this, 'DMUtils', () => BdApi.findModuleByProps('openPrivateChannel'))
  168. }
  169. },
  170. '@discord/stores': {
  171. get 'Messages'() {
  172. return ___createMemoize___(this, 'Messages', () => BdApi.findModuleByProps('getMessage', 'getMessages'))
  173. },
  174. get 'Channels'() {
  175. return ___createMemoize___(this, 'Channels', () => BdApi.findModuleByProps('getChannel', 'getDMFromUserId'))
  176. },
  177. get 'Guilds'() {
  178. return ___createMemoize___(this, 'Guilds', () => BdApi.findModuleByProps('getGuild'))
  179. },
  180. get 'SelectedGuilds'() {
  181. return ___createMemoize___(this, 'SelectedGuilds', () => BdApi.findModuleByProps('getGuildId', 'getLastSelectedGuildId'))
  182. },
  183. get 'SelectedChannels'() {
  184. return ___createMemoize___(this, 'SelectedChannels', () => BdApi.findModuleByProps('getChannelId', 'getLastSelectedChannelId'))
  185. },
  186. get 'Info'() {
  187. return ___createMemoize___(this, 'Info', () => BdApi.findModuleByProps('getSessionId'))
  188. },
  189. get 'Status'() {
  190. return ___createMemoize___(this, 'Status', () => BdApi.findModuleByProps('getStatus', 'getActivities', 'getState'))
  191. },
  192. get 'Users'() {
  193. return ___createMemoize___(this, 'Users', () => BdApi.findModuleByProps('getUser', 'getCurrentUser'))
  194. },
  195. get 'SettingsStore'() {
  196. return ___createMemoize___(this, 'SettingsStore', () => BdApi.findModuleByProps('afkTimeout', 'status'))
  197. },
  198. get 'UserProfile'() {
  199. return ___createMemoize___(this, 'UserProfile', () => BdApi.findModuleByProps('getUserProfile'))
  200. },
  201. get 'Members'() {
  202. return ___createMemoize___(this, 'Members', () => BdApi.findModuleByProps('getMember'))
  203. },
  204. get 'Activities'() {
  205. return ___createMemoize___(this, 'Activities', () => BdApi.findModuleByProps('getActivities'))
  206. },
  207. get 'Games'() {
  208. return ___createMemoize___(this, 'Games', () => BdApi.findModuleByProps('getGame', 'games'))
  209. },
  210. get 'Auth'() {
  211. return ___createMemoize___(this, 'Auth', () => BdApi.findModuleByProps('getId', 'isGuest'))
  212. },
  213. get 'TypingUsers'() {
  214. return ___createMemoize___(this, 'TypingUsers', () => BdApi.findModuleByProps('isTyping'))
  215. }
  216. },
  217. '@discord/actions': {
  218. get 'ProfileActions'() {
  219. return ___createMemoize___(this, 'ProfileActions', () => BdApi.findModuleByProps('fetchProfile'))
  220. },
  221. get 'GuildActions'() {
  222. return ___createMemoize___(this, 'GuildActions', () => BdApi.findModuleByProps('requestMembersById'))
  223. }
  224. },
  225. get '@discord/i18n'() {
  226. return ___createMemoize___(this, '@discord/i18n', () => BdApi.findModule(m => m.Messages?.CLOSE && typeof(m.getLocale) === 'function'))
  227. },
  228. get '@discord/constants'() {
  229. return ___createMemoize___(this, '@discord/constants', () => BdApi.findModuleByProps('API_HOST'))
  230. },
  231. get '@discord/contextmenu'() {
  232. return ___createMemoize___(this, '@discord/contextmenu', () => {
  233. const ctx = Object.assign({}, BdApi.findModuleByProps('openContextMenu'), BdApi.findModuleByProps('MenuItem'));
  234. ctx.Menu = ctx.default;
  235. return ctx;
  236. })
  237. },
  238. get '@discord/forms'() {
  239. return ___createMemoize___(this, '@discord/forms', () => BdApi.findModuleByProps('FormItem'))
  240. },
  241. get '@discord/scrollbars'() {
  242. return ___createMemoize___(this, '@discord/scrollbars', () => BdApi.findModuleByProps('ScrollerAuto'))
  243. },
  244. get '@discord/native'() {
  245. return ___createMemoize___(this, '@discord/native', () => BdApi.findModuleByProps('requireModule'))
  246. },
  247. get '@discord/flux'() {
  248. return ___createMemoize___(this, '@discord/flux', () => Object.assign({}, BdApi.findModuleByProps('useStateFromStores').default, BdApi.findModuleByProps('useStateFromStores')))
  249. },
  250. get '@discord/modal'() {
  251. return ___createMemoize___(this, '@discord/modal', () => Object.assign({}, BdApi.findModuleByProps('ModalRoot'), BdApi.findModuleByProps('openModal', 'closeAllModals')))
  252. },
  253. get '@discord/connections'() {
  254. return ___createMemoize___(this, '@discord/connections', () => BdApi.findModuleByProps('get', 'isSupported', 'map'))
  255. },
  256. get '@discord/sanitize'() {
  257. return ___createMemoize___(this, '@discord/sanitize', () => BdApi.findModuleByProps('stringify', 'parse', 'encode'))
  258. },
  259. get '@discord/icons'() {
  260. return ___createMemoize___(this, '@discord/icons', () => BdApi.findAllModules(m => m.displayName && ~m.toString().indexOf('currentColor')).reduce((icons, icon) => (icons[icon.displayName] = icon, icons), {}))
  261. },
  262. '@discord/classes': {
  263. get 'Timestamp'() {
  264. return ___createMemoize___(this, 'Timestamp', () => BdApi.findModuleByPrototypes('toDate', 'month'))
  265. },
  266. get 'Message'() {
  267. return ___createMemoize___(this, 'Message', () => BdApi.findModuleByPrototypes('getReaction', 'isSystemDM'))
  268. },
  269. get 'User'() {
  270. return ___createMemoize___(this, 'User', () => BdApi.findModuleByPrototypes('tag'))
  271. },
  272. get 'Channel'() {
  273. return ___createMemoize___(this, 'Channel', () => BdApi.findModuleByPrototypes('isOwner', 'isCategory'))
  274. }
  275. }
  276. };
  277. var __webpack_modules__ = {
  278. 113: module => {
  279. module.exports = BdApi.React;
  280. }
  281. };
  282. var __webpack_module_cache__ = {};
  283. function __webpack_require__(moduleId) {
  284. var cachedModule = __webpack_module_cache__[moduleId];
  285. if (void 0 !== cachedModule) return cachedModule.exports;
  286. var module = __webpack_module_cache__[moduleId] = {
  287. exports: {}
  288. };
  289. __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
  290. return module.exports;
  291. }
  292. (() => {
  293. __webpack_require__.n = module => {
  294. var getter = module && module.__esModule ? () => module["default"] : () => module;
  295. __webpack_require__.d(getter, {
  296. a: getter
  297. });
  298. return getter;
  299. };
  300. })();
  301. (() => {
  302. __webpack_require__.d = (exports, definition) => {
  303. for (var key in definition)
  304. if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {
  305. enumerable: true,
  306. get: definition[key]
  307. });
  308. };
  309. })();
  310. (() => {
  311. __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
  312. })();
  313. (() => {
  314. __webpack_require__.r = exports => {
  315. if ("undefined" !== typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {
  316. value: "Module"
  317. });
  318. Object.defineProperty(exports, "__esModule", {
  319. value: true
  320. });
  321. };
  322. })();
  323. var __webpack_exports__ = {};
  324. (() => {
  325. __webpack_require__.r(__webpack_exports__);
  326. __webpack_require__.d(__webpack_exports__, {
  327. default: () => AssignBadges
  328. });
  329. const external_PluginApi_namespaceObject = PluginApi;
  330. const external_BasePlugin_namespaceObject = BasePlugin;
  331. var external_BasePlugin_default = __webpack_require__.n(external_BasePlugin_namespaceObject);
  332. const contextmenu_namespaceObject = Modules["@discord/contextmenu"];
  333. const external_PluginApi_DiscordModules_namespaceObject = PluginApi.DiscordModules;
  334. const {
  335. BadgeKeys
  336. } = external_PluginApi_namespaceObject.WebpackModules.getByProps("BadgeKeys");
  337. const {
  338. UserFlags
  339. } = external_PluginApi_namespaceObject.WebpackModules.getByProps("UserFlags");
  340. const UserFlagsFormatted = [{
  341. id: "STAFF",
  342. value: UserFlags["STAFF"],
  343. name: "Discord Staff",
  344. key: BadgeKeys["STAFF"]
  345. }, {
  346. id: "PARTNER",
  347. value: UserFlags["PARTNER"],
  348. name: "Partnered Server Owner",
  349. key: BadgeKeys["PARTNER"]
  350. }, {
  351. id: "HYPESQUAD",
  352. value: UserFlags["HYPESQUAD"],
  353. name: "HypeSquad Events",
  354. key: BadgeKeys["HYPESQUAD"]
  355. }, {
  356. id: "HYPESQUAD_ONLINE_HOUSE_1",
  357. value: UserFlags["HYPESQUAD_ONLINE_HOUSE_1"],
  358. name: "House Bravery",
  359. key: BadgeKeys["HYPESQUAD_ONLINE_HOUSE_1"]
  360. }, {
  361. id: "HYPESQUAD_ONLINE_HOUSE_2",
  362. value: UserFlags["HYPESQUAD_ONLINE_HOUSE_2"],
  363. name: "House Brilliance",
  364. key: BadgeKeys["HYPESQUAD_ONLINE_HOUSE_2"]
  365. }, {
  366. id: "HYPESQUAD_ONLINE_HOUSE_3",
  367. value: UserFlags["HYPESQUAD_ONLINE_HOUSE_3"],
  368. name: "House Balance",
  369. key: BadgeKeys["HYPESQUAD_ONLINE_HOUSE_3"]
  370. }, {
  371. id: "EARLY_VERIFIED_BOT",
  372. value: 0,
  373. name: "Verified Bot",
  374. key: BadgeKeys["VERIFIED_BOT"]
  375. }, {
  376. id: "BUG_HUNTER_LEVEL_1",
  377. value: UserFlags["BUG_HUNTER_LEVEL_1"],
  378. name: "Bug Hunter Level 1",
  379. key: BadgeKeys["BUG_HUNTER_LEVEL_1"]
  380. }, {
  381. id: "BUG_HUNTER_LEVEL_2",
  382. value: UserFlags["BUG_HUNTER_LEVEL_2"],
  383. name: "Bug Hunter Level 2",
  384. key: BadgeKeys["BUG_HUNTER_LEVEL_2"]
  385. }, {
  386. id: "EARLY_SUPPORTER",
  387. value: UserFlags["PREMIUM_EARLY_SUPPORTER"],
  388. name: "Early Supporter",
  389. key: BadgeKeys["EARLY_SUPPORTER"]
  390. }, {
  391. id: "EARLY_VERIFIED_DEVELOPER",
  392. value: UserFlags["VERIFIED_DEVELOPER"],
  393. name: "Early Verified Bot Developer",
  394. key: BadgeKeys["EARLY_VERIFIED_DEVELOPER"]
  395. }, {
  396. id: "CERTIFIED_MODERATOR",
  397. value: UserFlags["CERTIFIED_MODERATOR"],
  398. name: "Discord Certified Moderator",
  399. key: BadgeKeys["CERTIFIED_MODERATOR"]
  400. }, {
  401. id: "PREMIUM",
  402. value: 0,
  403. name: "Nitro",
  404. key: BadgeKeys["PREMIUM"]
  405. }];
  406. const modules_UserFlags = UserFlagsFormatted;
  407. const utils_namespaceObject = Modules["@discord/utils"];
  408. var React = __webpack_require__(113);
  409. function _defineProperty(obj, key, value) {
  410. if (key in obj) Object.defineProperty(obj, key, {
  411. value,
  412. enumerable: true,
  413. configurable: true,
  414. writable: true
  415. });
  416. else obj[key] = value;
  417. return obj;
  418. }
  419. const months = function(n) {
  420. return 26298e5 * n;
  421. };
  422. const day = 864e5;
  423. const {
  424. MenuCheckboxItem,
  425. MenuRadioItem
  426. } = external_PluginApi_namespaceObject.WebpackModules.getByProps("MenuRadioItem");
  427. const classes = {
  428. ...external_PluginApi_namespaceObject.WebpackModules.getByProps("executedCommand", "buttonContainer", "applicationName"),
  429. ...external_PluginApi_namespaceObject.WebpackModules.getByProps("container", "profileBadge18", "profileBadge22", "profileBadge22")
  430. };
  431. const memberlistClasses = external_PluginApi_namespaceObject.WebpackModules.getByProps("placeholder", "activity", "icon");
  432. const getFlags = external_PluginApi_namespaceObject.WebpackModules.find((m => {
  433. let d = m.default.toString();
  434. return ~d.indexOf("closeUserProfileModal") && ~d.indexOf("openPremiumSettings");
  435. }));
  436. const User = external_PluginApi_namespaceObject.WebpackModules.getByPrototypes("getAvatarURL");
  437. const BadgeList = external_PluginApi_namespaceObject.WebpackModules.getByProps("BadgeSizes").default;
  438. const boosts = [{
  439. id: "boost1",
  440. value: 0 << 0,
  441. name: "Booster - 1 Month",
  442. time: 1.04
  443. }, {
  444. id: "boost2",
  445. value: 0 << 0,
  446. name: "Booster - 2 Months",
  447. time: 2.04
  448. }, {
  449. id: "boost3",
  450. value: 0 << 0,
  451. name: "Booster - 3 Months",
  452. time: 3.04
  453. }, {
  454. id: "boost4",
  455. value: 0 << 0,
  456. name: "Booster - 6 Months",
  457. time: 6.04
  458. }, {
  459. id: "boost5",
  460. value: 0 << 0,
  461. name: "Booster - 9 Months",
  462. time: 9.04
  463. }, {
  464. id: "boost6",
  465. value: 0 << 0,
  466. name: "Booster - 1 Year",
  467. time: 12.04
  468. }, {
  469. id: "boost7",
  470. value: 0 << 0,
  471. name: "Booster - 1 Year and 3 Months",
  472. time: 15.04
  473. }, {
  474. id: "boost8",
  475. value: 0 << 0,
  476. name: "Booster - 1 Year and 6 Months",
  477. time: 18.04
  478. }, {
  479. id: "boost9",
  480. value: 0 << 0,
  481. name: "Booster - 2 Years",
  482. time: 24.04
  483. }];
  484. const BotTag = external_PluginApi_namespaceObject.WebpackModules.getByProps("BotTagTypes").default;
  485. const MessageAuthor = external_PluginApi_namespaceObject.WebpackModules.find((m => m.default.toString().indexOf("userOverride") > -1));
  486. const NameTag = external_PluginApi_namespaceObject.WebpackModules.find((m => "DiscordTag" === m.default.displayName));
  487. const MemberListItem = external_PluginApi_namespaceObject.WebpackModules.find((m => "MemberListItem" === m.default.displayName));
  488. class AssignBadges extends(external_BasePlugin_default()) {
  489. constructor(...args) {
  490. super(...args);
  491. _defineProperty(this, "promises", {
  492. cancelled: false,
  493. cancel() {
  494. this.cancelled = true;
  495. }
  496. });
  497. _defineProperty(this, "patches", []);
  498. }
  499. onStart() {
  500. this.patchUserContextMenus();
  501. this.patchUserFlagGetter();
  502. this.patchUserStore();
  503. this.patchMessageAuthor();
  504. this.patchNameTag();
  505. this.patchMemberlistItem();
  506. }
  507. onStop() {
  508. external_PluginApi_namespaceObject.Patcher.unpatchAll();
  509. }
  510. isUserVerifiedBot(user) {
  511. const settings = this.getSettings();
  512. const userSettings = settings?.[user.id];
  513. if (userSettings && userSettings?.EARLY_VERIFIED_BOT) return true;
  514. return false;
  515. }
  516. patchUserFlagGetter() {
  517. external_PluginApi_namespaceObject.Patcher.before(getFlags, "default", ((_this, [props]) => {
  518. const settings = this.getSettings()?.[props.user.id];
  519. if (settings)
  520. if (true === settings?.PREMIUM) props.premiumSince = new Date(0);
  521. if (settings?.boost) {
  522. const boost = boosts[boosts.findIndex((e => e.id === settings.boost))];
  523. props.premiumGuildSince = new Date(Date.now() - months(boost.time) - day);
  524. }
  525. }));
  526. }
  527. patchUserStore() {
  528. external_PluginApi_namespaceObject.Patcher.after(external_PluginApi_DiscordModules_namespaceObject.UserStore, "getUser", ((_this, [id], ret) => {
  529. const settings = this.getSettings();
  530. const userSettings = settings?.[id];
  531. if (userSettings) {
  532. const newFlags = Object.keys(userSettings).filter((e => userSettings[e])).map((e => modules_UserFlags.find((f => f.id === e)))).filter((e => e)).map((e => e.value)).reduce(((a, b) => a + b), 0);
  533. ret.publicFlags = newFlags;
  534. }
  535. }));
  536. }
  537. patchMessageAuthor() {
  538. external_PluginApi_namespaceObject.Patcher.after(MessageAuthor, "default", ((_this, [props], ret) => {
  539. const user = props.message.author;
  540. if (!user) return;
  541. if (this.isUserVerifiedBot(user)) {
  542. const badgeIndex = props.compact ? 0 : 2;
  543. const displayClass = props.compact ? classes.botTagCompact : classes.botTagCozy;
  544. ret.props.children[badgeIndex] = React.createElement(BotTag, {
  545. verified: true,
  546. className: (0, utils_namespaceObject.joinClassNames)(displayClass, classes.botTag)
  547. });
  548. }
  549. }));
  550. }
  551. patchNameTag() {
  552. external_PluginApi_namespaceObject.Patcher.after(NameTag, "default", ((_this, [props], ret) => {
  553. const user = props.user;
  554. if (!user) return;
  555. if (this.isUserVerifiedBot(user)) {
  556. ret.props.botType = 0;
  557. ret.props.botVerified = true;
  558. }
  559. }));
  560. }
  561. patchMemberlistItem() {
  562. external_PluginApi_namespaceObject.Patcher.after(MemberListItem.default.prototype, "renderBot", ((_this, [props]) => {
  563. const user = _this.props.user;
  564. if (this.isUserVerifiedBot(user)) return React.createElement(BotTag, {
  565. verified: true,
  566. className: memberlistClasses.botTag
  567. });
  568. }));
  569. }
  570. async patchUserContextMenus() {
  571. const getMenu = props => {
  572. const settings = this.getSettings();
  573. const propsUser = external_PluginApi_DiscordModules_namespaceObject.UserStore.getUser(props);
  574. props = {
  575. user: propsUser
  576. };
  577. const userBadges = getFlags.default({
  578. user: propsUser
  579. }).map((badge => badge?.key));
  580. const [selectedBoost, setSelectedBoost] = React.useState(settings[props.user.id]?.boost);
  581. return React.createElement(contextmenu_namespaceObject.MenuItem, {
  582. id: "assign-badge",
  583. key: "assign-badge",
  584. label: "Manage Badges",
  585. children: [modules_UserFlags.map((flag => {
  586. const [state, setState] = React.useState(settings?.[props.user.id]?.hasOwnProperty(flag.id) ? settings?.[props.user.id]?.[flag.id] : ~userBadges.indexOf(flag.key));
  587. return React.createElement(MenuCheckboxItem, {
  588. id: flag.id,
  589. label: "EARLY_VERIFIED_BOT" !== flag.id ? React.createElement("div", {
  590. className: classes?.container
  591. }, React.createElement(BadgeList, {
  592. user: this.fakeUser(flag.value),
  593. premiumSince: "PREMIUM" === flag.id ? new Date(0) : null,
  594. size: 2
  595. }), flag.name) : React.createElement("div", {
  596. className: classes?.container
  597. }, React.createElement(BotTag, {
  598. verified: true
  599. })),
  600. checked: state,
  601. action: () => {
  602. const user = settings[props.user.id] || {};
  603. user[flag.id] = !state;
  604. settings[props.user.id] = user;
  605. this.saveSettings(settings);
  606. setState(!state);
  607. }
  608. });
  609. })), React.createElement(contextmenu_namespaceObject.MenuItem, {
  610. id: "boosts",
  611. label: React.createElement("div", {
  612. className: classes?.container
  613. }, React.createElement(BadgeList, {
  614. user: this.fakeUser(0),
  615. premiumGuildSince: new Date(Date.now() - months(3) - day),
  616. size: 2
  617. }), "Boosts")
  618. }, [boosts.map((boost => React.createElement(MenuRadioItem, {
  619. id: boost.id,
  620. checked: selectedBoost === boost.id,
  621. label: React.createElement("div", {
  622. className: classes?.container
  623. }, React.createElement(BadgeList, {
  624. user: this.fakeUser(0),
  625. premiumGuildSince: new Date(Date.now() - months(boost.time) - day),
  626. size: 2
  627. }), boost.name),
  628. action: () => {
  629. const user = settings[props.user.id] || {};
  630. user.boost = boost.id;
  631. setSelectedBoost(boost.id);
  632. settings[props.user.id] = user;
  633. this.saveSettings(settings);
  634. }
  635. }))), React.createElement(contextmenu_namespaceObject.MenuGroup, null, React.createElement(contextmenu_namespaceObject.MenuItem, {
  636. label: "Reset Boost Preferences",
  637. id: "reset-boosts",
  638. color: "colorDanger",
  639. action: () => {
  640. delete settings[props.user.id]?.boost;
  641. this.saveSettings(settings);
  642. external_PluginApi_namespaceObject.Toasts.success(`Successfully cleared boost preferences for <strong>${props.user}</strong>!`);
  643. }
  644. }))]), React.createElement(contextmenu_namespaceObject.MenuGroup, null, React.createElement(contextmenu_namespaceObject.MenuItem, {
  645. color: "colorDanger",
  646. label: "Reset Preferences",
  647. id: "reset",
  648. action: () => {
  649. delete settings[props.user.id];
  650. this.saveSettings(settings);
  651. settings[props.user.id] = {};
  652. external_PluginApi_namespaceObject.Toasts.success(`Successfully cleared preferences for <strong>${props.user}</strong>!`);
  653. }
  654. }))]
  655. });
  656. };
  657. const patched = new Set;
  658. const REGEX = /user.*contextmenu|useUserRolesItems/i;
  659. const filter = function(name) {
  660. const shouldInclude = ["page", "section", "objectType"];
  661. const notInclude = ["use", "root"];
  662. const isRegex = name instanceof RegExp;
  663. return module => {
  664. const string = module.toString({});
  665. const getDisplayName = () => external_PluginApi_namespaceObject.Utilities.getNestedProp(module({}), "props.children.type.displayName");
  666. return !~string.indexOf("return function") && shouldInclude.every((s => ~string.indexOf(s))) && !notInclude.every((s => ~string.indexOf(s))) && (isRegex ? name.test(getDisplayName()) : name === getDisplayName());
  667. };
  668. }(REGEX);
  669. const search = async () => {
  670. const Menu = await external_PluginApi_namespaceObject.DCM.getDiscordMenu((m => {
  671. if (patched.has(m)) return false;
  672. if (null != m.displayName) return REGEX.test(m.displayName);
  673. return filter(m);
  674. }));
  675. if (this.promises.cancelled) return;
  676. let original = null;
  677. function wrapper(props) {
  678. const rendered = original.call(this, props);
  679. try {
  680. const children = external_PluginApi_namespaceObject.Utilities.findInReactTree(rendered, Array.isArray);
  681. const user = props.user || external_PluginApi_DiscordModules_namespaceObject.UserStore.getUser(props.channel?.getRecipientId?.());
  682. if (!children || !user || children.some((c => c && "assign-badge" === c.key))) return rendered;
  683. children.splice(7, 0, getMenu(user.id));
  684. } catch (error) {
  685. cancel();
  686. console.error("Error in context menu patch:", error);
  687. }
  688. return rendered;
  689. }
  690. const cancel = external_PluginApi_namespaceObject.Patcher.after(Menu, "default", ((...args) => {
  691. const [, , ret] = args;
  692. const contextMenu = external_PluginApi_namespaceObject.Utilities.getNestedProp(ret, "props.children");
  693. if (!contextMenu || "function" !== typeof contextMenu.type) return;
  694. original ??=contextMenu.type;
  695. wrapper.displayName ??=original.displayName;
  696. contextMenu.type = wrapper;
  697. }));
  698. patched.add(Menu.default);
  699. search();
  700. };
  701. search();
  702. }
  703. fakeUser(flags) {
  704. return new User({
  705. id: 1337,
  706. username: "Lana",
  707. publicFlags: flags
  708. });
  709. }
  710. getSettings() {
  711. return external_PluginApi_namespaceObject.PluginUtilities.loadSettings(this.constructor.name, {});
  712. }
  713. saveSettings(settings) {
  714. external_PluginApi_namespaceObject.PluginUtilities.saveSettings(this.constructor.name, settings);
  715. }
  716. }
  717. })();
  718. module.exports.LibraryPluginHack = __webpack_exports__;
  719. })();
  720. const PluginExports = module.exports.LibraryPluginHack;
  721. return PluginExports?.__esModule ? PluginExports.default : PluginExports;
  722. }
  723. module.exports = window.hasOwnProperty("ZeresPluginLibrary") ?
  724. buildPlugin(window.ZeresPluginLibrary.buildPlugin(config)) :
  725. class {
  726. getName() {
  727. return config.info.name;
  728. }
  729. getAuthor() {
  730. return config.info.authors.map(a => a.name).join(", ");
  731. }
  732. getDescription() {
  733. return `${config.info.description}. __**ZeresPluginLibrary was not found! This plugin will not work!**__`;
  734. }
  735. getVersion() {
  736. return config.info.version;
  737. }
  738. load() {
  739. BdApi.showConfirmationModal(
  740. "Library plugin is needed",
  741. [`The library plugin needed for ${config.info.name} is missing. Please click Download to install it.`], {
  742. confirmText: "Download",
  743. cancelText: "Cancel",
  744. onConfirm: () => {
  745. require("request").get("https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js", async (error, response, body) => {
  746. if (error) return require("electron").shell.openExternal("https://betterdiscord.net/ghdl?url=https://raw.githubusercontent.com/rauenzi/BDPluginLibrary/master/release/0PluginLibrary.plugin.js");
  747. await new Promise(r => require("fs").writeFile(require("path").join(BdApi.Plugins.folder, "0PluginLibrary.plugin.js"), body, r));
  748. });
  749. }
  750. }
  751. );
  752. }
  753. start() {}
  754. stop() {}
  755. };
  756. /*@end@*/
  757.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement