Use Reflection, deleted any wpm references from plugin api for now

This commit is contained in:
Jiiks 2018-08-24 19:05:27 +03:00
parent 5c493d413b
commit f46694f2d0
24 changed files with 87 additions and 178 deletions

View File

@ -9,7 +9,7 @@
*/
import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules, ReactComponents } from 'modules';
import { Patcher, MonkeyPatch, Reflection, ReactComponents } from 'modules';
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
@ -21,7 +21,7 @@ export default new class TwentyFourHour extends BuiltinModule {
async enabled(e) {
if (Patcher.getPatchesByCaller('BD:TwentyFourHour').length) return;
const TimeFormatter = WebpackModules.getModuleByName('TimeFormatter');
const { TimeFormatter } = Reflection.modules;
MonkeyPatch('BD:TwentyFourHour', TimeFormatter).after('calendarFormat', (thisObject, args, returnValue) => {
const matched = returnValue.match(twelveHour);
if (!matched || matched.length != 4) return;

View File

@ -9,7 +9,7 @@
*/
import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules, ReactComponents } from 'modules';
import { Patcher, MonkeyPatch, Reflection, ReactComponents } from 'modules';
export default new class BlockedMessages extends BuiltinModule {
@ -18,16 +18,16 @@ export default new class BlockedMessages extends BuiltinModule {
}
static isBlocked(id) {
const RelationshipStore = WebpackModules.getModuleByName('RelationshipStore');
const { RelationshipStore } = Reflection.modules;
return RelationshipStore.isBlocked(id);
}
async enabled(e) {
if (Patcher.getPatchesByCaller('BD:BlockedMessages').length) return;
const MessageActions = WebpackModules.getModuleByName('MessageActions');
const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:BlockedMessages', MessageActions).instead('receiveMessage', this.processMessage);
const MessageListComponents = WebpackModules.getModuleByProps(['BlockedMessageGroup']);
const MessageListComponents = Reflection.module.byProps('BlockedMessageGroup');
MessageListComponents.OriginalBlockedMessageGroup = MessageListComponents.BlockedMessageGroup;
MessageListComponents.BlockedMessageGroup = () => {return null;};
this.cancelBlockedMessages = () => {

View File

@ -11,7 +11,7 @@
import BuiltinModule from './BuiltinModule';
import { Utils } from 'common';
import { Settings, Patcher, MonkeyPatch, WebpackModules, ReactComponents, DiscordApi } from 'modules';
import { Settings, Patcher, MonkeyPatch, Reflection, ReactComponents, DiscordApi } from 'modules';
export default new class ColoredText extends BuiltinModule {
@ -44,13 +44,13 @@ export default new class ColoredText extends BuiltinModule {
async enabled(e) {
if (Patcher.getPatchesByCaller('BD:ColoredText').length) return;
this.intensitySetting.on('setting-updated', this._intensityUpdated);
this.MessageContent = await ReactComponents.getComponent('MessageContent', { selector: WebpackModules.getSelector('container', 'containerCozy', 'containerCompact', 'edited') });
this.MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
MonkeyPatch('BD:ColoredText', this.MessageContent.component.prototype).after('render', this.injectColoredText);
this.MessageContent.forceUpdateAll();
}
injectColoredText(thisObject, args, returnValue) {
const TinyColor = WebpackModules.getModuleByName('TinyColor');
const { TinyColor } = Reflection.modules;
const markup = Utils.findInReactTree(returnValue, m => m && m.props && m.props.className && m.props.className.includes('da-markup'));
const roleColor = thisObject.props.message.colorString;
if (markup && roleColor) markup.props.style = {color: TinyColor.mix(roleColor, this.defaultColor, this.intensity)};

View File

@ -10,8 +10,8 @@
import { Settings, Cache, Events } from 'modules';
import BuiltinModule from './BuiltinModule';
import { WebpackModules, ReactComponents, MonkeyPatch, Patcher, DiscordApi, Security } from 'modules';
import { VueInjector, Reflection, Modals, Toasts } from 'ui';
import { Reflection, ReactComponents, MonkeyPatch, Patcher, DiscordApi, Security } from 'modules';
import { VueInjector, Modals, Toasts } from 'ui';
import { ClientLogger as Logger, ClientIPC } from 'common';
import { request } from 'vendor';
import { Utils } from 'common';
@ -45,8 +45,7 @@ export default new class E2EE extends BuiltinModule {
Events.on('discord:MESSAGE_CREATE', this.handlePublicKey);
this.patchDispatcher();
this.patchMessageContent();
const selector = `.${WebpackModules.getClassName('channelTextArea', 'emojiButton')}`;
const cta = await ReactComponents.getComponent('ChannelTextArea', { selector });
const cta = await ReactComponents.getComponent('ChannelTextArea', { selector: Reflection.resolve('channelTextArea', 'emojiButton').selector });
this.patchChannelTextArea(cta);
this.patchChannelTextAreaSubmit(cta);
cta.forceUpdateAll();
@ -188,7 +187,7 @@ export default new class E2EE extends BuiltinModule {
if (!ECDH_STORAGE.hasOwnProperty(channelId)) {
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${this.createKeyExchange(channelId)}\n-----END PUBLIC KEY-----\n\`\`\``;
if (this.encryptNewMessages) this.encryptNewMessages = false;
WebpackModules.getModuleByName('DraftActions').saveDraft(channelId, publicKeyMessage);
Reflection.modules.DraftActions.saveDraft(channelId, publicKeyMessage);
}
const secret = this.computeSecret(channelId, key);
this.setKey(channelId, secret);
@ -202,7 +201,7 @@ export default new class E2EE extends BuiltinModule {
}
patchDispatcher() {
const Dispatcher = WebpackModules.getModuleByName('Dispatcher');
const { Dispatcher } = Reflection.modules;
MonkeyPatch('BD:E2EE', Dispatcher).before('dispatch', (_, [event]) => {
if (event.type !== 'MESSAGE_CREATE') return;
@ -216,9 +215,8 @@ export default new class E2EE extends BuiltinModule {
decrypt = this.decrypt(this.decrypt(this.decrypt(seed, this.master), key), event.message.content);
} catch (err) { return } // Ignore errors such as non empty
const MessageParser = WebpackModules.getModuleByName('MessageParser');
const Permissions = WebpackModules.getModuleByName('GuildPermissions');
const DiscordConstants = WebpackModules.getModuleByName('DiscordConstants');
const { MessageParser, Permissions, DiscordConstants } = Reflection.modules;
const currentChannel = DiscordApi.Channel.fromId(event.message.channel_id).discordObject;
// Create a generic message object to parse mentions with
@ -234,11 +232,10 @@ export default new class E2EE extends BuiltinModule {
}
async patchMessageContent() {
const selector = `.${WebpackModules.getClassName('container', 'containerCozy', 'containerCompact', 'edited')}`;
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector });
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
MonkeyPatch('BD:E2EE', MessageContent.component.prototype).before('render', this.beforeRenderMessageContent.bind(this));
MonkeyPatch('BD:E2EE', MessageContent.component.prototype).after('render', this.renderMessageContent.bind(this));
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: `.${WebpackModules.getClassName('imageWrapper')}` });
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: Reflection.resolve('imageWrapper').selector });
MonkeyPatch('BD:E2EE', ImageWrapper.component.prototype).before('render', this.beforeRenderImageWrapper.bind(this));
}
@ -248,10 +245,7 @@ export default new class E2EE extends BuiltinModule {
const key = this.getKey(component.props.message.channel_id);
if (!key) return; // We don't have a key for this channel
const Message = WebpackModules.getModuleByPrototypes(['isMentioned']);
const MessageParser = WebpackModules.getModuleByName('MessageParser');
const Permissions = WebpackModules.getModuleByName('GuildPermissions');
const DiscordConstants = WebpackModules.getModuleByName('DiscordConstants');
const { Message, MessageParser, Permissions, DiscordConstants } = Reflection.modules;
const currentChannel = DiscordApi.Channel.fromId(component.props.message.channel_id).discordObject;
if (typeof component.props.message.content !== 'string') return; // Ignore any non string content

View File

@ -39,7 +39,7 @@
<script>
import { Utils, FileUtils, ClientIPC } from 'common';
import { E2EE } from 'builtin';
import { DiscordApi, WebpackModules } from 'modules';
import { DiscordApi, Reflection } from 'modules';
import { Toasts } from 'ui';
import { MiLock, MiImagePlus, MiIcVpnKey } from '../ui/components/common/MaterialIcon';
@ -61,8 +61,8 @@
if (!dialogResult || !dialogResult.length) return;
const readFile = await FileUtils.readFileBuffer(dialogResult[0]);
const FileActions = WebpackModules.getModuleByProps(['makeFile']);
const Uploader = WebpackModules.getModuleByProps(['instantBatchUpload']);
const FileActions = Reflection.module.byProps('makeFile');
const Uploader = Reflection.module.byProps('instantBatchUpload');
const img = await Utils.getImageFromBuffer(readFile);
@ -93,7 +93,7 @@
E2EE.preExchangeState = E2EE.encryptNewMessages;
E2EE.encryptNewMessages = false; // Disable encrypting new messages so we won't encrypt public keys
const publicKeyMessage = `\`\`\`\n-----BEGIN PUBLIC KEY-----\n${keyExchange}\n-----END PUBLIC KEY-----\n\`\`\``;
WebpackModules.getModuleByName('DraftActions').saveDraft(DiscordApi.currentChannel.id, publicKeyMessage);
Reflection.modules.DraftActions.saveDraft(DiscordApi.currentChannel.id, publicKeyMessage);
Toasts.info('Key exchange started. Expires in 30 seconds');
}
},

View File

@ -13,7 +13,7 @@ import path from 'path';
import { request } from 'vendor';
import { Utils, FileUtils, ClientLogger as Logger } from 'common';
import { DiscordApi, Settings, Globals, WebpackModules, ReactComponents, MonkeyPatch, Cache, Patcher, Database } from 'modules';
import { DiscordApi, Settings, Globals, Reflection, ReactComponents, MonkeyPatch, Cache, Patcher, Database } from 'modules';
import { VueInjector, DiscordContextMenu } from 'ui';
import Emote from './EmoteComponent.js';
@ -79,7 +79,7 @@ export default new class EmoteModule extends BuiltinModule {
this.patchMessageContent();
this.patchSendAndEdit();
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: WebpackModules.getSelector('imageWrapper') });
const ImageWrapper = await ReactComponents.getComponent('ImageWrapper', { selector: Reflection.resolve('imageWrapper').selector });
MonkeyPatch('BD:EMOTEMODULE', ImageWrapper.component.prototype).after('render', this.beforeRenderImageWrapper.bind(this));
}
@ -155,7 +155,7 @@ export default new class EmoteModule extends BuiltinModule {
* Patches MessageContent render method
*/
async patchMessageContent() {
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: WebpackModules.getSelector('container', 'containerCozy', 'containerCompact', 'edited') });
const MessageContent = await ReactComponents.getComponent('MessageContent', { selector: Reflection.resolve('container', 'containerCozy', 'containerCompact', 'edited').selector });
MonkeyPatch('BD:EMOTEMODULE', MessageContent.component.prototype).after('render', this.afterRenderMessageContent.bind(this));
MessageContent.forceUpdateAll();
}
@ -177,8 +177,9 @@ export default new class EmoteModule extends BuiltinModule {
* Patches MessageActions send and edit
*/
patchSendAndEdit() {
MonkeyPatch('BD:EMOTEMODULE', WebpackModules.getModuleByName('MessageActions')).instead('sendMessage', this.handleSendMessage.bind(this));
MonkeyPatch('BD:EMOTEMODULE', WebpackModules.getModuleByName('MessageActions')).instead('editMessage', this.handleEditMessage.bind(this));
const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:EMOTEMODULE', MessageActions).instead('sendMessage', this.handleSendMessage.bind(this));
MonkeyPatch('BD:EMOTEMODULE', MessageActions).instead('editMessage', this.handleEditMessage.bind(this));
}
/**
@ -213,8 +214,8 @@ export default new class EmoteModule extends BuiltinModule {
if (!emote) return orig(...args);
this.addToMostUsed(emote);
const FileActions = WebpackModules.getModuleByProps(['makeFile']);
const Uploader = WebpackModules.getModuleByProps(['instantBatchUpload']);
const FileActions = Reflection.module.byProps('makeFile');
const Uploader = Reflection.module.byProps('instantBatchUpload');
request.get(emote.props.src, { encoding: 'binary' }).then(res => {
const arr = new Uint8Array(new ArrayBuffer(res.length));

View File

@ -9,7 +9,7 @@
*/
import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules } from 'modules';
import { Patcher, MonkeyPatch, Reflection } from 'modules';
export default new class KillClyde extends BuiltinModule {
@ -19,7 +19,7 @@ export default new class KillClyde extends BuiltinModule {
async enabled(e) {
if (Patcher.getPatchesByCaller('BD:KillClyde').length) return;
const MessageActions = WebpackModules.getModuleByName('MessageActions');
const { MessageActions } = Reflection.modules;
MonkeyPatch('BD:KillClyde', MessageActions).instead('sendBotMessage', void 0);
}

View File

@ -10,7 +10,7 @@
import BuiltinModule from './BuiltinModule';
import { Patcher, MonkeyPatch, WebpackModules } from 'modules';
import { Patcher, MonkeyPatch, Reflection } from 'modules';
export default new class E2EE extends BuiltinModule {
@ -24,7 +24,7 @@ export default new class E2EE extends BuiltinModule {
enabled(e) {
if (Patcher.getPatchesByCaller('BD:TrackingProtection').length) return;
const trackingModule = WebpackModules.getModuleByProps(['track']);
const trackingModule = Reflection.module.byProps('track');
if (!trackingModule) return; // TODO Log it
MonkeyPatch('BD:TrackingProtection', trackingModule).instead('track', this.track);
}

View File

@ -9,7 +9,7 @@
*/
import BuiltinModule from './BuiltinModule';
import { WebpackModules } from 'modules';
import { Reflection } from 'modules';
export default new class VoiceDisconnect extends BuiltinModule {
@ -22,7 +22,7 @@ export default new class VoiceDisconnect extends BuiltinModule {
}
listener() {
const VoiceChannelActions = WebpackModules.getModuleByName('VoiceChannelActions');
const { VoiceChannelActions } = Reflection.modules;
VoiceChannelActions.selectVoiceChannel(null, null);
}

View File

@ -10,7 +10,7 @@
import { DOM, BdUI, BdMenu, Modals, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui';
import BdCss from './styles/index.scss';
import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager, PluginManager, ThemeManager, ExtModuleManager, Vendor, WebpackModules, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi, BdWebApi, Connectivity, Cache, Reflection } from 'modules';
import { Events, CssEditor, Globals, Settings, Database, Updater, ModuleManager, PluginManager, ThemeManager, ExtModuleManager, Vendor, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi, BdWebApi, Connectivity, Cache, Reflection } from 'modules';
import { ClientLogger as Logger, ClientIPC, Utils } from 'common';
import { BuiltinManager, EmoteModule, ReactDevtoolsModule, VueDevtoolsModule, TrackingProtection, E2EE } from 'builtin';
import electron from 'electron';
@ -34,7 +34,7 @@ class BetterDiscord {
ModuleManager, PluginManager, ThemeManager, ExtModuleManager,
Vendor,
WebpackModules, Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi,
Patcher, MonkeyPatch, ReactComponents, ReactHelpers, ReactAutoPatcher, DiscordApi,
EmoteModule,
BdWebApi,
Connectivity,
@ -49,7 +49,7 @@ class BetterDiscord {
module: Globals.require.cache[__filename],
require: Globals.require,
webpack_require: __webpack_require__, // eslint-disable-line no-undef
get discord_require() { return WebpackModules.require }
get discord_require() { return Reflection.require }
};
const developermode = Settings.getSetting('core', 'advanced', 'developer-mode');

View File

@ -10,11 +10,11 @@
import { List } from 'structs';
import { User, Channel, Guild, Message } from 'discordstructs';
import { WebpackModules } from './webpackmodules';
import Reflection from './reflection/index';
export const Modules = {
_getModule(name) {
const foundModule = WebpackModules.getModuleByName(name);
const foundModule = Reflection.module.byName(name);
if (!foundModule) return null;
delete this[name];
return this[name] = foundModule;

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { WebpackModules } from './webpackmodules';
import Reflection from './reflection/index';
import { MonkeyPatch } from './patcher';
import Events from './events';
import EventListener from './eventlistener';
@ -37,7 +37,7 @@ export default class extends EventListener {
}
hook() {
const Events = WebpackModules.getModuleByName('Events');
const { Events } = Reflection.modules;
MonkeyPatch('BD:EVENTS', Events.prototype).after('emit', (obj, args, retVal) => {
const eventId = args.length >= 3 ? args[2].id || -1 : -1;
if (eventId === this.ignoreMultiple) return;

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { WebpackModules } from './webpackmodules';
import Reflection from './reflection/index';
import { ClientLogger as Logger } from 'common';
/**
@ -64,7 +64,7 @@ export class Patcher {
static resolveModule(module) {
if (module instanceof Function || (module instanceof Object)) return module;
if (typeof module === 'string') return WebpackModules.getModuleByName(module);
if (typeof module === 'string') return Reflection.module.byName(module);
return null;
}

View File

@ -10,7 +10,7 @@
import { EmoteModule } from 'builtin';
import { SettingsSet, SettingsCategory, Setting, SettingsScheme } from 'structs';
import { BdMenu, Modals, DOM, DOMObserver, Reflection, VueInjector, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui';
import { BdMenu, Modals, DOM, DOMObserver, VueInjector, Toasts, Notifications, BdContextMenu, DiscordContextMenu } from 'ui';
import * as CommonComponents from 'commoncomponents';
import { Utils, Filters, ClientLogger as Logger, ClientIPC, AsyncEventEmitter } from 'common';
import Settings from './settings';
@ -19,7 +19,7 @@ import PluginManager from './pluginmanager';
import ThemeManager from './thememanager';
import Events from './events';
import EventsWrapper from './eventswrapper';
import { WebpackModules } from './webpackmodules';
import Reflection from './reflection/index';
import DiscordApi from './discordapi';
import { ReactComponents, ReactHelpers } from './reactcomponents';
import { Patcher, MonkeyPatch } from './patcher';
@ -542,92 +542,6 @@ export default class PluginApi {
};
}
/**
* WebpackModules
*/
get webpackRequire() {
return WebpackModules.require;
}
getWebpackModule(filter, first = true) {
return WebpackModules.getModule(filter, first);
}
getWebpackModuleByName(name, fallback) {
return WebpackModules.getModuleByName(name, fallback);
}
getWebpackModuleByDisplayName(name) {
return WebpackModules.getModuleByDisplayName(name);
}
getWebpackModuleByRegex(regex) {
return WebpackModules.getModuleByRegex(regex, true);
}
getWebpackModulesByRegex(regex) {
return WebpackModules.getModuleByRegex(regex, false);
}
getWebpackModuleByProperties(...props) {
return WebpackModules.getModuleByProps(props, true);
}
getWebpackModuleByPrototypeFields(...props) {
return WebpackModules.getModuleByPrototypes(props, true);
}
getWebpackModulesByProperties(...props) {
return WebpackModules.getModuleByProps(props, false);
}
getWebpackModulesByPrototypeFields(...props) {
return WebpackModules.getModuleByPrototypes(props, false);
}
waitForWebpackModule(filter) {
return WebpackModules.waitForModule(filter);
}
waitForWebpackModuleByName(name, fallback) {
return WebpackModules.waitForModuleByName(name, fallback);
}
waitForWebpackModuleByDisplayName(name) {
return WebpackModules.waitForModuleByDisplayName(name);
}
waitForWebpackModuleByRegex(regex) {
return WebpackModules.waitForModuleByRegex(regex);
}
waitForWebpackModuleByProperties(...props) {
return WebpackModules.waitForModuleByProps(props);
}
waitForWebpackModuleByPrototypeFields(...props) {
return WebpackModules.waitForModuleByPrototypes(props);
}
getWebpackClassName(...classes) {
return WebpackModules.getClassName(...classes);
}
waitForWebpackClassName(...classes) {
return WebpackModules.waitForClassName(...classes);
}
get WebpackModules() {
return new Proxy({
getModule: this.getWebpackModule.bind(this),
getModuleByName: this.getWebpackModuleByName.bind(this),
getModuleByDisplayName: this.getWebpackModuleByDisplayName.bind(this),
getModuleByRegex: this.getWebpackModuleByRegex.bind(this),
getModulesByRegex: this.getWebpackModulesByRegex.bind(this),
getModuleByProperties: this.getWebpackModuleByProperties.bind(this),
getModuleByPrototypeFields: this.getWebpackModuleByPrototypeFields.bind(this),
getModulesByProperties: this.getWebpackModulesByProperties.bind(this),
getModulesByPrototypeFields: this.getWebpackModulesByPrototypeFields.bind(this),
waitForModule: this.waitForWebpackModule.bind(this),
waitForModuleByName: this.waitForWebpackModuleByName.bind(this),
waitForModuleByDisplayName: this.waitForWebpackModuleByDisplayName.bind(this),
waitForModuleByRegex: this.waitForWebpackModuleByRegex.bind(this),
waitForModuleByProperties: this.waitForWebpackModuleByProperties.bind(this),
waitForModuleByPrototypeFields: this.waitForWebpackModuleByPrototypeFields.bind(this),
getClassName: this.getWebpackClassName.bind(this),
waitForClassName: this.waitForWebpackClassName.bind(this),
get KnownModules() { return WebpackModules.KnownModules },
get require() { return WebpackModules.require }
}, {
get(WebpackModules, property) {
return WebpackModules[property] || WebpackModules.getModuleByName(property);
}
});
}
/**
* Patcher
*/

View File

@ -10,10 +10,10 @@
* LICENSE file in the root directory of this source tree.
*/
import { DOM, Reflection, Modals } from 'ui';
import { DOM, Modals } from 'ui';
import { Utils, Filters, ClientLogger as Logger } from 'common';
import { MonkeyPatch } from './patcher';
import { WebpackModules } from './webpackmodules';
import Reflection from './reflection/index';
import DiscordApi from './discordapi';
class Helpers {
@ -153,11 +153,11 @@ class Helpers {
}
static get React() {
return WebpackModules.getModuleByName('React');
return Reflection.modules.React;
}
static get ReactDOM() {
return WebpackModules.getModuleByName('ReactDOM');
return Reflection.modules.ReactDOM;
}
}
@ -174,7 +174,7 @@ class ReactComponent {
forceUpdateAll() {
if (!this.important || !this.important.selector) return;
for (const e of document.querySelectorAll(this.important.selector)) {
Reflection(e).forceUpdate(this);
Reflection.DOM(e).forceUpdate(this);
}
}
}
@ -236,7 +236,7 @@ export class ReactComponents {
let component, reflect;
for (const element of elements) {
reflect = Reflection(element);
reflect = Reflection.DOM(element);
component = filter ? reflect.components.find(filter) : reflect.component;
if (component) break;
}
@ -310,7 +310,7 @@ export class ReactAutoPatcher {
* Also patches some known components.
*/
static async autoPatch() {
const React = await WebpackModules.waitForModuleByName('React');
const React = await Reflection.module.waitForModuleByName('React');
this.unpatchCreateElement = MonkeyPatch('BD:ReactComponents:createElement', React).before('createElement', (component, args) => ReactComponents.push(args[0]));
@ -326,7 +326,7 @@ export class ReactAutoPatcher {
}
static async patchMessage() {
const selector = `.${WebpackModules.getClassName('message', 'messageCozy', 'messageCompact')}`;
const { selector } = Reflection.resolve('message', 'messageCozy', 'messageCompact');
this.Message = await ReactComponents.getComponent('Message', {selector}, m => m.prototype && m.prototype.renderCozy);
this.unpatchMessageRender = MonkeyPatch('BD:ReactComponents', this.Message.component.prototype).after('render', (component, args, retVal) => {
@ -350,7 +350,7 @@ export class ReactAutoPatcher {
}
static async patchMessageGroup() {
const selector = `.${WebpackModules.getClassName('container', 'message', 'messageCozy')}`;
const { selector } = Reflection.resolve('container', 'message', 'messageCozy');
this.MessageGroup = await ReactComponents.getComponent('MessageGroup', {selector});
this.unpatchMessageGroupRender = MonkeyPatch('BD:ReactComponents', this.MessageGroup.component.prototype).after('render', (component, args, retVal) => {
@ -368,7 +368,7 @@ export class ReactAutoPatcher {
}
static async patchChannelMember() {
const selector = `.${WebpackModules.getClassName('member', 'memberInner', 'activity')}`;
const { selector } = Reflection.resolve('member', 'memberInner', 'activity');
this.ChannelMember = await ReactComponents.getComponent('ChannelMember', {selector}, m => m.prototype.renderActivity);
this.unpatchChannelMemberRender = MonkeyPatch('BD:ReactComponents', this.ChannelMember.component.prototype).after('render', (component, args, retVal) => {
@ -384,7 +384,7 @@ export class ReactAutoPatcher {
}
static async patchGuild() {
const selector = `div.${WebpackModules.getClassName('guild', 'guildsWrapper')}:not(:first-child)`;
const selector = `div.${Reflection.resolve('guild', 'guildsWrapper').className}:not(:first-child)`;
this.Guild = await ReactComponents.getComponent('Guild', {selector}, m => m.prototype.renderBadge);
this.unpatchGuild = MonkeyPatch('BD:ReactComponents', this.Guild.component.prototype).after('render', (component, args, retVal) => {
@ -421,7 +421,7 @@ export class ReactAutoPatcher {
* The GuildTextChannel component represents a text channel in the guild channel list.
*/
static async patchGuildTextChannel() {
const selector = `.${WebpackModules.getClassName('containerDefault', 'actionIcon')}`;
const { selector } = Reflection.resolve('containerDefault', 'actionIcon');
this.GuildTextChannel = await ReactComponents.getComponent('GuildTextChannel', {selector}, c => c.prototype.renderMentionBadge);
this.unpatchGuildTextChannel = MonkeyPatch('BD:ReactComponents', this.GuildTextChannel.component.prototype).after('render', this._afterChannelRender);
@ -433,7 +433,7 @@ export class ReactAutoPatcher {
* The GuildVoiceChannel component represents a voice channel in the guild channel list.
*/
static async patchGuildVoiceChannel() {
const selector = `.${WebpackModules.getClassName('containerDefault', 'actionIcon')}`;
const { selector } = Reflection.resolve('containerDefault', 'actionIcon');
this.GuildVoiceChannel = await ReactComponents.getComponent('GuildVoiceChannel', {selector}, c => c.prototype.handleVoiceConnect);
this.unpatchGuildVoiceChannel = MonkeyPatch('BD:ReactComponents', this.GuildVoiceChannel.component.prototype).after('render', this._afterChannelRender);
@ -467,7 +467,7 @@ export class ReactAutoPatcher {
}
static async patchUserProfileModal() {
const selector = `.${WebpackModules.getClassName('root', 'topSectionNormal')}`;
const { selector } = Reflection.resolve('root', 'topSectionNormal');
this.UserProfileModal = await ReactComponents.getComponent('UserProfileModal', {selector}, Filters.byPrototypeFields(['renderHeader', 'renderBadges']));
this.unpatchUserProfileModal = MonkeyPatch('BD:ReactComponents', this.UserProfileModal.component.prototype).after('render', (component, args, retVal) => {
@ -482,7 +482,7 @@ export class ReactAutoPatcher {
}
static async patchUserPopout() {
const selector = `.${WebpackModules.getClassName('userPopout', 'headerNormal')}`;
const { selector } = Reflection.resolve('userPopout', 'headerNormal');
this.UserPopout = await ReactComponents.getComponent('UserPopout', {selector});
this.unpatchUserPopout = MonkeyPatch('BD:ReactComponents', this.UserPopout.component.prototype).after('render', (component, args, retVal) => {
@ -501,10 +501,10 @@ export class ReactAutoPatcher {
}
static async patchUploadArea() {
const selector = `.${WebpackModules.getClassName('uploadArea')}`;
const { selector } = Reflection.resolve('uploadArea');
this.UploadArea = await ReactComponents.getComponent('UploadArea', {selector});
const reflect = Reflection(selector);
const reflect = Reflection.DOM(selector);
const stateNode = reflect.getComponentStateNode(this.UploadArea);
const callback = function(e) {
if (!e.dataTransfer.files.length || !e.dataTransfer.files[0].name.endsWith('.bd')) return;

View File

@ -37,4 +37,8 @@ export default class Reflection {
static get DOM() {
return DOM;
}
static get require() {
return Module.require;
}
}

View File

@ -1,4 +1,4 @@
import { Settings, Globals, WebpackModules, ReactComponents, MonkeyPatch, Cache } from 'modules';
import { Settings, Globals, Reflection, ReactComponents, MonkeyPatch, Cache } from 'modules';
import { VueInjector } from 'ui';
import AutocompleteComponent from './components/common/Autocomplete.vue';
@ -11,7 +11,7 @@ export default new class Autocomplete {
}
async init() {
this.cta = await ReactComponents.getComponent('ChannelTextArea', { selector: WebpackModules.getSelector('channelTextArea', 'emojiButton') });
this.cta = await ReactComponents.getComponent('ChannelTextArea', { selector: Reflection.resolve('channelTextArea', 'emojiButton').selector });
MonkeyPatch('BD:Autocomplete', this.cta.component.prototype).after('render', this.channelTextAreaAfterRender.bind(this));
this.initialized = true;
}

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { Module, WebpackModules } from 'modules';
import { Module, Reflection } from 'modules';
const normalizedPrefix = 'da';
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
@ -16,7 +16,7 @@ const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(
export default class ClassNormaliser extends Module {
init() {
this.patchClassModules(WebpackModules.getModule(this.moduleFilter.bind(this), false));
this.patchClassModules(Reflection.module.getModule(this.moduleFilter.bind(this), false));
this.normalizeElement(document.querySelector('#app-mount'));
}

View File

@ -23,7 +23,7 @@
<script>
// Imports
import { WebpackModules } from 'modules';
import { Reflection } from 'modules';
import { BdMenu } from 'ui';
import { shell } from 'electron';
import { MiGithubCircle, MiWeb, MiTwitterCircle, MiDiscord } from '../common';
@ -44,7 +44,7 @@
e.preventDefault();
},
openUserProfileModal(discord_id) {
WebpackModules.getModuleByName('UserProfileModal').open(discord_id);
Reflection.modules.UserProfileModal.open(discord_id);
BdMenu.close();
},
openGitHub() {

View File

@ -36,7 +36,6 @@
</template>
<script>
import { WebpackModules } from 'modules';
export default {
props: ['item'],
data() {
@ -44,7 +43,6 @@
},
methods: {
resolveThumb() {
window.momentTest = WebpackModules;
return `${this.item.repository.rawUri}/${this.item.files.previews[0].thumb}`;
}
}

View File

@ -36,8 +36,8 @@
</template>
<script>
import { WebpackModules, DiscordApi, Events } from 'modules';
let wtf = null;
import { Reflection, DiscordApi, Events } from 'modules';
export default {
data() {
return {

View File

@ -9,7 +9,7 @@
*/
import { Utils, ClientLogger as Logger } from 'common';
import { ReactComponents, WebpackModules, MonkeyPatch } from 'modules';
import { ReactComponents, Reflection, MonkeyPatch } from 'modules';
import { VueInjector, Toasts } from 'ui';
import CMGroup from './components/contextmenu/Group.vue';
@ -70,7 +70,7 @@ export class DiscordContextMenu {
if (this.patched) return;
this.patched = true;
const self = this;
MonkeyPatch('BD:DiscordCMOCM', WebpackModules.getModuleByProps(['openContextMenu'])).instead('openContextMenu', (_, [e, fn], originalFn) => {
MonkeyPatch('BD:DiscordCMOCM', Reflection.module.byProps('openContextMenu')).instead('openContextMenu', (_, [e, fn], originalFn) => {
const overrideFn = function () {
const res = fn.apply(this, arguments);
if (!res.hasOwnProperty('type')) return res;
@ -96,7 +96,7 @@ export class DiscordContextMenu {
target,
top,
left,
closeMenu: () => WebpackModules.getModuleByProps(['closeContextMenu']).closeContextMenu(),
closeMenu: () => Reflection.module.byProps('closeContextMenu').closeContextMenu(),
items: typeof menu.items === 'function' ? menu.items(target) : menu.items
}));
}

View File

@ -8,8 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { Module, ReactComponents, ReactHelpers, MonkeyPatch, WebpackModules } from 'modules';
import { Reflection } from 'ui';
import { Module, ReactComponents, ReactHelpers, MonkeyPatch, Reflection } from 'modules';
import { ClientLogger as Logger } from 'common';
import { BdBadge } from './components/bd';
import VueInjector from './vueinjector';
@ -88,7 +87,7 @@ export default class extends Module {
async patchNameTag() {
if (this.PatchedNameTag) return this.PatchedNameTag;
const selector = `.${WebpackModules.getClassName('nameTag', 'username', 'discriminator', 'ownerIcon')}`;
const selector = Reflection.resolve('nameTag', 'username', 'discriminator', 'ownerIcon').selector;
const NameTag = await ReactComponents.getComponent('NameTag', {selector});
this.PatchedNameTag = class extends NameTag.component {

View File

@ -8,7 +8,7 @@
* LICENSE file in the root directory of this source tree.
*/
import { WebpackModules } from 'modules';
import { Reflection } from 'modules';
import Vue from 'vue';
export default class {
@ -37,15 +37,14 @@ export default class {
* @return {React.Element}
*/
static createReactElement(component, props, mountAtTop) {
const React = WebpackModules.getModuleByName('React');
const { React } = Reflection.modules;
return React.createElement(this.ReactCompatibility, {component, mountAtTop, props});
}
static get ReactCompatibility() {
if (this._ReactCompatibility) return this._ReactCompatibility;
const React = WebpackModules.getModuleByName('React');
const ReactDOM = WebpackModules.getModuleByName('ReactDOM');
const { React, ReactDOM} = Reflection.modules;
return this._ReactCompatibility = class VueComponent extends React.Component {
render() {
@ -105,12 +104,12 @@ export const ReactComponent = {
return createElement('div');
},
mounted() {
const { React, ReactDOM } = WebpackModules;
const { React, ReactDOM } = Reflection.modules;
ReactDOM.unmountComponentAtNode(this.$el);
ReactDOM.render(this.reactElement || React.createElement(this.component, this.componentProps, ...(this.componentChildren || [])), this.$el);
},
beforeDestroy() {
WebpackModules.ReactDOM.unmountComponentAtNode(this.$el);
Reflection.modules.ReactDOM.unmountComponentAtNode(this.$el);
}
};