diff --git a/Plugins/MentionAliasesRedux/CHANGELOG.md b/Plugins/MentionAliasesRedux/CHANGELOG.md index 6b8a068..51ddb6c 100644 --- a/Plugins/MentionAliasesRedux/CHANGELOG.md +++ b/Plugins/MentionAliasesRedux/CHANGELOG.md @@ -1,4 +1,9 @@ # [MentionAliasesRedux](https://1lighty.github.io/BetterDiscordStuff/?plugin=MentionAliasesRedux "MentionAliasesRedux") Changelog +### 2.0.3 +- Fixed clicking items in the menu not working +- Fixed tagging groups not working well +- Fixed unfriendly patch + ### 2.0.2 - Plugin has been renamed to MentionAliasesRedux to avoid issues loading due to the original plugin, as well as to be able to distinguish between the two more easily. - Fixed plugin description being wrong diff --git a/Plugins/MentionAliasesRedux/MentionAliasesRedux.plugin.js b/Plugins/MentionAliasesRedux/MentionAliasesRedux.plugin.js index 5d706ab..b836539 100644 --- a/Plugins/MentionAliasesRedux/MentionAliasesRedux.plugin.js +++ b/Plugins/MentionAliasesRedux/MentionAliasesRedux.plugin.js @@ -23,7 +23,7 @@ @else@*/ /* - * Copyright© 2019-2020, _Lighty_ + * Copyright © 2019-2020, _Lighty_ * All rights reserved. * Code may not be redistributed, modified or otherwise taken without explicit permission. */ @@ -41,21 +41,16 @@ var MentionAliasesRedux = (() => { twitter_username: '' } ], - version: '2.0.2', + version: '2.0.3', description: 'Set custom @mention aliases, that can also appear next to their name (nearly) anywhere, as well as have mention groups to mention multiple people at once.', github: 'https://github.com/1Lighty', github_raw: 'https://raw.githubusercontent.com/1Lighty/BetterDiscordPlugins/master/Plugins/MentionAliasesRedux/MentionAliasesRedux.plugin.js' }, changelog: [ - { - title: 'plugin has been renamed!', - type: 'added', - items: ['Plugin has been renamed to MentionAliasesRedux to avoid issues loading due to the original plugin, as well as to be able to distinguish between the two more easily.'] - }, { title: 'fixed', type: 'fixed', - items: ['Fixed plugin description being wrong', 'Fixed menu button not showing'] + items: ['Fixed clicking items in the menu not working', 'Fixed tagging groups not working well', 'Fixed unfriendly patch'] } ], defaultConfig: [ @@ -156,7 +151,7 @@ var MentionAliasesRedux = (() => { /* Build */ const buildPlugin = ([Plugin, Api]) => { const { ContextMenu, EmulatedTooltip, Toasts, Settings, Popouts, Modals, Utilities, WebpackModules, Filters, DiscordModules, ColorConverter, DOMTools, DiscordClasses, DiscordSelectors, ReactTools, ReactComponents, DiscordAPI, Logger, Patcher, PluginUpdater, PluginUtilities, DiscordClassModules, Structs } = Api; - const { React, ModalStack, ContextMenuActions, ContextMenuItem, ContextMenuItemsGroup, ReactDOM, ChannelStore, GuildStore, UserStore, DiscordConstants, Dispatcher, GuildMemberStore, GuildActions, SwitchRow, EmojiUtils, RadioGroup, Permissions, TextElement, FlexChild, PopoutOpener, Textbox } = DiscordModules; + const { React, ModalStack, ContextMenuActions, ContextMenuItem, ContextMenuItemsGroup, ReactDOM, ChannelStore, GuildStore, UserStore, DiscordConstants, Dispatcher, GuildMemberStore, GuildActions, SwitchRow, EmojiUtils, RadioGroup, Permissions, TextElement, FlexChild, PopoutOpener, Textbox, UserSettingsStore } = DiscordModules; const UserStatusStore = WebpackModules.getByProps('getStatus'); @@ -271,7 +266,7 @@ var MentionAliasesRedux = (() => { constructor(props) { super(props); this.handleSubmit = this.handleSubmitPatch.bind(this); - this.renderWarning = () => { }; + this.renderWarning = () => {}; } handleSubmitPatch(e) { e.preventDefault(); @@ -309,7 +304,8 @@ var MentionAliasesRedux = (() => { } handleClick(text, rich) { if (!this.props.channelTextAreaRef._editorRef) return Toasts.error('Internal error, cannot get _editorRef'); - this.props.channelTextAreaRef._editorRef.appendText(text); + /* hm.. */ + this.props.channelTextAreaRef._editorRef.ref.current.insertText(/* UserSettingsStore.useRichChatTextBox ? rich : */ text, true); } handleMentionsChange() { this.setState({ mentions: this.props.getMentions() }); @@ -350,12 +346,12 @@ var MentionAliasesRedux = (() => { const children = []; try { this.state.mentions.users.forEach(({ userId, alias }, index) => { - if (!index) children.push(this.renderHeader(`Users—”${this.state.mentions.users.length}`)); + if (!index) children.push(this.renderHeader(`Users—${this.state.mentions.users.length}`)); const user = UserStore.getUser(userId); children.push(React.createElement(AliasItem, { isUser: true, onContextMenu: e => this.handleContextMenu(e, userId), onClick: () => this.handleClick(`@${user.tag}`, `<@${userId}>`) }, React.createElement('div', { className: AvatarWrapperClassname }, renderAvatar(user)), renderAlias(alias, user.tag, undefined, true))); }); this.state.mentions.groups.forEach((group, index) => { - if (!index) children.push(this.renderHeader(`Groups—”${this.state.mentions.groups.length}`, true)); + if (!index) children.push(this.renderHeader(`Groups—${this.state.mentions.groups.length}`, true)); const groupUsers = this.props.getGroupUsers(group.users); if (groupUsers.note.length > 32) groupUsers.note = groupUsers.note.substr(0, 32 - 3) + '...'; children.push(React.createElement(AliasItem, { onContextMenu: e => this.handleContextMenu(e, group.id, true), onClick: () => this.handleClick(groupUsers.tags, groupUsers.tagsIds) }, renderAlias(group.name, groupUsers.note, undefined, false))); @@ -393,7 +389,7 @@ var MentionAliasesRedux = (() => { class PreviewField extends Settings.SettingField { constructor(name, note) { - super(name, note, () => { }, Preview); + super(name, note, () => {}, Preview); } } @@ -734,7 +730,7 @@ var MentionAliasesRedux = (() => { async patchPrivateChannel(promiseState) { const PrivateChannel = await ReactComponents.getComponentByName('PrivateChannel', `.${XenoLib.getSingleClass('closeButton channel')}`); if (promiseState.cancelled) return; - const TypePatch = function (e) { + const TypePatch = function(e) { const ret = e.__oldTypeMA(e); const nameAndDecorators = Utilities.getNestedProp(ret, 'props.children.props.children.1.props.children.0.props.children'); if (!nameAndDecorators) return ret; @@ -756,7 +752,7 @@ var MentionAliasesRedux = (() => { async patchFriendRow(promiseState) { const FriendRow = await ReactComponents.getComponentByName('FriendRow', `.${XenoLib.getSingleClass('friendsColumn friendsRow')}`); if (promiseState.cancelled) return; - const TypePatch2 = function (e) { + const TypePatch2 = function(e) { try { const ret = new e.__oldType2MA(e); ret.props.children.splice(1, 0, this.createAlias(e.__aliasMA, MemberTagClassname)); @@ -771,7 +767,7 @@ var MentionAliasesRedux = (() => { } } }.bind(this); - const TypePatch1 = function (e) { + const TypePatch1 = function(e) { try { const ret = new e.__oldType1MA(e); ret.props.__oldType2MA = ret.type; @@ -805,7 +801,7 @@ var MentionAliasesRedux = (() => { async patchMutualFriends(promiseState) { const MutualFriends = await ReactComponents.getComponentByName('MutualFriends', `.${XenoLib.getSingleClass('scroller themeGhostHairline')}`); if (promiseState.cancelled) return; - const TypePatch3 = function (e) { + const TypePatch3 = function(e) { try { const ret = new e.__oldType3MA(e); ret.props.children.push(this.createAlias(e.__aliasMA, MemberTagClassname)); @@ -820,7 +816,7 @@ var MentionAliasesRedux = (() => { } } }.bind(this); - const TypePatch2 = function (e) { + const TypePatch2 = function(e) { try { const ret = new e.__oldType2MA(e); ret.props.__oldType3MA = ret.type; @@ -836,7 +832,7 @@ var MentionAliasesRedux = (() => { } } }.bind(this); - const TypePatch1 = function (e) { + const TypePatch1 = function(e) { try { const ret = new e.__oldType1MA(e); const DiscordTag = Utilities.getNestedProp(ret, 'props.children.1'); @@ -877,25 +873,25 @@ var MentionAliasesRedux = (() => { async patchChannelTextArea(promiseState) { const ChannelTextArea = await ReactComponents.getComponentByName('ChannelTextAreaForm', `.${XenoLib.getSingleClass('channelTextArea')}`); if (promiseState.cancelled) return; - Patcher.after( - WebpackModules.find(m => m.render && m.render.displayName === 'ChannelTextAreaContainer'), - 'render', - (_this, _, ret) => { - const props = Utilities.getNestedProp(ret, 'props.children.0.props.children.props.children.2.props.children.2.props'); - if (!props || props.disabled || !this.settings.display.displayButton) return; - const buttons = Utilities.getNestedProp(ret, 'props.children.0.props.children.props.children.2.props.children'); - if (!buttons) return; - const _editorRef = Utilities.getNestedProp(props, 'editorRef.current'); - buttons.unshift( - React.createElement(ChannelTextAreaButton, { - iconName: 'Nova_At', - label: 'Open Aliases', - className: ChannelTextAreaButtonClassname, - onClick: e => this.openAliasesPopout(e, { _editorRef }) - }) - ); - } - ); + const ChannelTextAreaContainer = WebpackModules.find(m => m.render && m.render.displayName === 'ChannelTextAreaContainer'); + const original = ChannelTextAreaContainer.render; + Patcher.after(ChannelTextAreaContainer, 'render', (_this, _, ret) => { + const ChannelEditorContainer = Utilities.getNestedProp(ret, 'props.children.0.props.children.props.children.1'); + if (!ChannelEditorContainer || ChannelEditorContainer.props.disabled || !this.settings.display.displayButton) return; + const buttons = Utilities.getNestedProp(ret, 'props.children.0.props.children.props.children.2.props.children'); + if (!buttons) return; + const _editorRef = Utilities.getNestedProp(ChannelEditorContainer, 'ref.current'); + buttons.unshift( + React.createElement(ChannelTextAreaButton, { + iconName: 'Nova_At', + label: 'Open Aliases', + className: ChannelTextAreaButtonClassname, + onClick: e => this.openAliasesPopout(e, { _editorRef }) + }) + ); + }); + /* transfer displayName and such, to be friendly to other plugins */ + Object.keys(original).forEach(name => (ChannelTextAreaContainer.render[name] = original[name])); this.patchedModules.push(ChannelTextArea); ChannelTextArea.forceUpdateAll(); } @@ -998,11 +994,12 @@ var MentionAliasesRedux = (() => { Patcher.instead(WebpackModules.getByPrototypes('selectAutocompletion').prototype, 'selectAutocompletion', (_this, args, orig) => { const selected = args[0]; const type = _this.state.autocompleteType; - if (type !== 'MENTIONS' || !_this._editorRef) return orig(...args); - const autocompletes = _this.props.autocompletes; + const _editorRef = _this.props.editorRef.current; + if (type !== 'MENTIONS' || !_editorRef) return orig(...args); + const autocompletes = _this.state.autocompletes; const role = autocompletes.roles[selected - autocompletes.users.length - autocompletes.globals.length]; if (!role || !role.MA) return orig(...args); - _this._editorRef.insertAutocomplete(role.mentioned_users, role.mentioned_users_ids); + _editorRef.insertAutocomplete(role.mentioned_users, role.mentioned_users_ids); }); } @@ -1081,112 +1078,112 @@ var MentionAliasesRedux = (() => { return !global.ZeresPluginLibrary || !global.XenoLib ? class { - getName() { - return this.name.replace(/\s+/g, ''); - } - getAuthor() { - return this.author; - } - getVersion() { - return this.version; - } - getDescription() { - return this.description; - } - stop() { } - load() { - const XenoLibMissing = !global.XenoLib; - const zlibMissing = !global.ZeresPluginLibrary; - const bothLibsMissing = XenoLibMissing && zlibMissing; - const header = `Missing ${(bothLibsMissing && 'Libraries') || 'Library'}`; - const content = `The ${(bothLibsMissing && 'Libraries') || 'Library'} ${(zlibMissing && 'ZeresPluginLibrary') || ''} ${(XenoLibMissing && (zlibMissing ? 'and XenoLib' : 'XenoLib')) || ''} required for ${this.name} ${(bothLibsMissing && 'are') || 'is'} missing.`; - const ModalStack = BdApi.findModuleByProps('push', 'update', 'pop', 'popWithKey'); - const TextElement = BdApi.findModuleByProps('Sizes', 'Weights'); - const ConfirmationModal = BdApi.findModule(m => m.defaultProps && m.key && m.key() === 'confirm-modal'); - const onFail = () => BdApi.getCore().alert(header, `${content}
Due to a slight mishap however, you'll have to download the libraries yourself. After opening the links, do CTRL + S to download the library.
${(zlibMissing && '
Click here to download ZeresPluginLibrary') || ''}${(zlibMissing && '
Click here to download XenoLib') || ''}`); - if (!ModalStack || !ConfirmationModal || !TextElement) return onFail(); - ModalStack.push(props => { - return BdApi.React.createElement( - ConfirmationModal, - Object.assign( - { - header, - children: [TextElement({ color: TextElement.Colors.PRIMARY, children: [`${content} Please click Download Now to install ${(bothLibsMissing && 'them') || 'it'}.`] })], - red: false, - confirmText: 'Download Now', - cancelText: 'Cancel', - onConfirm: () => { - const request = require('request'); - const fs = require('fs'); - const path = require('path'); - const waitForLibLoad = callback => { - if (!global.BDEvents) return callback(); - const onLoaded = e => { - if (e !== 'ZeresPluginLibrary') return; - BDEvents.off('plugin-loaded', onLoaded); - callback(); - }; - BDEvents.on('plugin-loaded', onLoaded); - }; - const onDone = () => { - if (!global.pluginModule || (!global.BDEvents && !global.XenoLib)) return; - if (!global.BDEvents || global.XenoLib) pluginModule.reloadPlugin(this.name); - else { - const listener = () => { - pluginModule.reloadPlugin(this.name); - BDEvents.off('xenolib-loaded', listener); - }; - BDEvents.on('xenolib-loaded', listener); - } - }; - const downloadXenoLib = () => { - if (global.XenoLib) return onDone(); - request('https://raw.githubusercontent.com/1Lighty/BetterDiscordPlugins/master/Plugins/1XenoLib.plugin.js', (error, response, body) => { - if (error) return onFail(); - onDone(); - fs.writeFile(path.join(window.ContentManager.pluginsFolder, '1XenoLib.plugin.js'), body, () => { }); - }); - }; - if (!global.ZeresPluginLibrary) { - request('https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js', (error, response, body) => { - if (error) return onFail(); - waitForLibLoad(downloadXenoLib); - fs.writeFile(path.join(window.ContentManager.pluginsFolder, '0PluginLibrary.plugin.js'), body, () => { }); - }); - } else downloadXenoLib(); - } - }, - props - ) - ); - }); - } - - start() { } - get [Symbol.toStringTag]() { - return 'Plugin'; - } - get name() { - return config.info.name; - } - get short() { - let string = ''; - for (let i = 0, len = config.info.name.length; i < len; i++) { - const char = config.info.name[i]; - if (char === char.toUpperCase()) string += char; + getName() { + return this.name.replace(/\s+/g, ''); + } + getAuthor() { + return this.author; + } + getVersion() { + return this.version; + } + getDescription() { + return this.description; + } + stop() {} + load() { + const XenoLibMissing = !global.XenoLib; + const zlibMissing = !global.ZeresPluginLibrary; + const bothLibsMissing = XenoLibMissing && zlibMissing; + const header = `Missing ${(bothLibsMissing && 'Libraries') || 'Library'}`; + const content = `The ${(bothLibsMissing && 'Libraries') || 'Library'} ${(zlibMissing && 'ZeresPluginLibrary') || ''} ${(XenoLibMissing && (zlibMissing ? 'and XenoLib' : 'XenoLib')) || ''} required for ${this.name} ${(bothLibsMissing && 'are') || 'is'} missing.`; + const ModalStack = BdApi.findModuleByProps('push', 'update', 'pop', 'popWithKey'); + const TextElement = BdApi.findModuleByProps('Sizes', 'Weights'); + const ConfirmationModal = BdApi.findModule(m => m.defaultProps && m.key && m.key() === 'confirm-modal'); + const onFail = () => BdApi.getCore().alert(header, `${content}
Due to a slight mishap however, you'll have to download the libraries yourself. After opening the links, do CTRL + S to download the library.
${(zlibMissing && '
Click here to download ZeresPluginLibrary') || ''}${(zlibMissing && '
Click here to download XenoLib') || ''}`); + if (!ModalStack || !ConfirmationModal || !TextElement) return onFail(); + ModalStack.push(props => { + return BdApi.React.createElement( + ConfirmationModal, + Object.assign( + { + header, + children: [TextElement({ color: TextElement.Colors.PRIMARY, children: [`${content} Please click Download Now to install ${(bothLibsMissing && 'them') || 'it'}.`] })], + red: false, + confirmText: 'Download Now', + cancelText: 'Cancel', + onConfirm: () => { + const request = require('request'); + const fs = require('fs'); + const path = require('path'); + const waitForLibLoad = callback => { + if (!global.BDEvents) return callback(); + const onLoaded = e => { + if (e !== 'ZeresPluginLibrary') return; + BDEvents.off('plugin-loaded', onLoaded); + callback(); + }; + BDEvents.on('plugin-loaded', onLoaded); + }; + const onDone = () => { + if (!global.pluginModule || (!global.BDEvents && !global.XenoLib)) return; + if (!global.BDEvents || global.XenoLib) pluginModule.reloadPlugin(this.name); + else { + const listener = () => { + pluginModule.reloadPlugin(this.name); + BDEvents.off('xenolib-loaded', listener); + }; + BDEvents.on('xenolib-loaded', listener); + } + }; + const downloadXenoLib = () => { + if (global.XenoLib) return onDone(); + request('https://raw.githubusercontent.com/1Lighty/BetterDiscordPlugins/master/Plugins/1XenoLib.plugin.js', (error, response, body) => { + if (error) return onFail(); + onDone(); + fs.writeFile(path.join(window.ContentManager.pluginsFolder, '1XenoLib.plugin.js'), body, () => {}); + }); + }; + if (!global.ZeresPluginLibrary) { + request('https://rauenzi.github.io/BDPluginLibrary/release/0PluginLibrary.plugin.js', (error, response, body) => { + if (error) return onFail(); + waitForLibLoad(downloadXenoLib); + fs.writeFile(path.join(window.ContentManager.pluginsFolder, '0PluginLibrary.plugin.js'), body, () => {}); + }); + } else downloadXenoLib(); + } + }, + props + ) + ); + }); + } + + start() {} + get [Symbol.toStringTag]() { + return 'Plugin'; + } + get name() { + return config.info.name; + } + get short() { + let string = ''; + for (let i = 0, len = config.info.name.length; i < len; i++) { + const char = config.info.name[i]; + if (char === char.toUpperCase()) string += char; + } + return string; + } + get author() { + return config.info.authors.map(author => author.name).join(', '); + } + get version() { + return config.info.version; + } + get description() { + return config.info.description; } - return string; } - get author() { - return config.info.authors.map(author => author.name).join(', '); - } - get version() { - return config.info.version; - } - get description() { - return config.info.description; - } - } : buildPlugin(global.ZeresPluginLibrary.buildPlugin(config)); })();