convert more to builtins

This commit is contained in:
Zack Rauen 2019-05-30 17:18:52 -04:00
parent dc7e6e8260
commit e06d2d9d9e
18 changed files with 1025 additions and 781 deletions

1261
js/main.js

File diff suppressed because it is too large Load Diff

2
js/main.min.js vendored

File diff suppressed because one or more lines are too long

32
src/builtins/24hour.js Normal file
View File

@ -0,0 +1,32 @@
import Builtin from "../structs/builtin";
import {Utilities, DiscordModules} from "modules";
export default new class TwentyFourHour extends Builtin {
get name() {return "24Hour";}
get category() {return "Modules";}
get id() {return "bda-gs-6";}
enabled() {
this.inject24Hour();
}
disabled() {
if (this.cancel24Hour) this.cancel24Hour();
}
inject24Hour() {
if (this.cancel24Hour) return;
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
const convert = (data) => {
const matched = data.returnValue.match(twelveHour);
if (!matched || matched.length !== 4) return;
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
};
const cancelCozy = Utilities.monkeyPatch(DiscordModules.TimeFormatter, "calendarFormat", {after: convert}); // Called in Cozy mode
const cancelCompact = Utilities.monkeyPatch(DiscordModules.TimeFormatter, "dateFormat", {after: convert}); // Called in Compact mode
this.cancel24Hour = () => {cancelCozy(); cancelCompact();}; // Cancel both
}
};

8
src/builtins/builtins.js Normal file
View File

@ -0,0 +1,8 @@
export {default as VoiceMode} from "./voicemode";
export {default as ClassNormalizer} from "./classnormalizer";
export {default as DeveloperMode} from "./developermode";
export {default as PublicServers} from "./publicservers";
export {default as DarkMode} from "./darkmode";
export {default as MinimalMode} from "./minimalmode";
export {default as TwentyFourHour} from "./24hour";
export {default as ColoredText} from "./coloredtext";

View File

@ -1,22 +1,24 @@
import BdApi from "./pluginapi";
import Builtin from "../structs/builtin";
import {WebpackModules} from "modules";
const normalizedPrefix = "da";
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
export default new class ClassNormalizer {
export default new class ClassNormalizer extends Builtin {
get id() {return "fork-ps-4";}
get category() {return "Modules";}
get name() {return "ClassNormalizer";}
stop() {
disabled() {
if (!this.hasPatched) return;
this.unpatchClassModules(BdApi.findAllModules(this.moduleFilter.bind(this)));
this.unpatchClassModules(WebpackModules.getModules(this.moduleFilter.bind(this)));
this.revertElement(document.querySelector("#app-mount"));
this.hasPatched = false;
}
start() {
enabled() {
if (this.hasPatched) return;
this.patchClassModules(BdApi.findAllModules(this.moduleFilter.bind(this)));
this.patchClassModules(WebpackModules.getModules(this.moduleFilter.bind(this)));
this.normalizeElement(document.querySelector("#app-mount"));
this.hasPatched = true;
}

View File

@ -0,0 +1,37 @@
import Builtin from "../structs/builtin";
import {Utilities, WebpackModules} from "modules";
const MessageContent = WebpackModules.getModule(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons"));
export default new class ColoredText extends Builtin {
get name() {return "ColoredText";}
get category() {return "Modules";}
get id() {return "bda-gs-7";}
enabled() {
this.injectColoredText();
}
disabled() {
if (this.cancelColoredText) this.cancelColoredText();
}
injectColoredText() {
if (this.cancelColoredText) return;
this.cancelColoredText = Utilities.monkeyPatch(MessageContent.prototype, "render", {after: (data) => {
Utilities.monkeyPatch(data.returnValue.props, "children", {silent: true, after: ({returnValue}) => {
const markup = returnValue.props.children[1];
const roleColor = data.thisObject.props.message.colorString;
if (markup && roleColor) markup.props.style = {color: roleColor};
return returnValue;
}});
}});
}
removeColoredText() {
document.querySelectorAll(".markup-2BOw-j").forEach(elem => {
elem.style.setProperty("color", "");
});
}
};

15
src/builtins/darkmode.js Normal file
View File

@ -0,0 +1,15 @@
import Builtin from "../structs/builtin";
export default new class DarkMode extends Builtin {
get name() {return "DarkMode";}
get category() {return "Modules";}
get id() {return "bda-gs-5";}
enabled() {
$("#app-mount").addClass("bda-dark").addClass("bd-dark");
}
disabled() {
$("#app-mount").removeClass("bda-dark").removeClass("bd-dark");
}
};

View File

@ -0,0 +1,104 @@
import Builtin, {onSettingChange} from "../structs/builtin";
import {SettingsCookie} from "data";
import {DiscordModules} from "modules";
export default new class DeveloperMode extends Builtin {
get name() {return "DeveloperMode";}
get category() {return "Modules";}
get id() {return "bda-gs-8";}
get selectorModeID() {return "fork-dm-1";}
get selectorMode() {return SettingsCookie[this.selectorModeID];}
constructor() {
super();
this.enableSelectors = this.enableSelectors.bind(this);
this.disableSelectors = this.disableSelectors.bind(this);
}
enabled() {
$(window).on("keydown.bdDevmode", (e) => {
if (e.which === 119 || e.which == 118) {//F8
this.log("Debugger Activated");
debugger; // eslint-disable-line no-debugger
}
});
if (this.selectorMode) this.enableSelectors();
this.selectorCancel = onSettingChange(this.category, this.selectorModeID, this.enableSelectors, this.disableSelectors);
}
disabled() {
$(window).off("keydown.bdDevmode");
if (this.selectorMode) this.disableSelectors();
if (this.selectorCancel) this.selectorCancel();
}
enableSelectors() {
$(document).on("contextmenu.bdDevmode", (e) => {
this.lastSelector = this.getSelector(e.toElement);
const attach = () => {
let cm = $(".contextMenu-HLZMGh");
if (cm.length <= 0) {
cm = $("<div class=\"contextMenu-HLZMGh bd-context-menu\"></div>");
cm.addClass($(".app, .app-2rEoOp").hasClass("theme-dark") ? "theme-dark" : "theme-light");
cm.appendTo(".app, .app-2rEoOp");
cm.css("top", e.clientY);
cm.css("left", e.clientX);
$(document).on("click.bdDevModeCtx", () => {
cm.remove();
$(document).off(".bdDevModeCtx");
});
$(document).on("contextmenu.bdDevModeCtx", () => {
cm.remove();
$(document).off(".bdDevModeCtx");
});
$(document).on("keyup.bdDevModeCtx", (e) => {
if (e.keyCode === 27) {
cm.remove();
$(document).off(".bdDevModeCtx");
}
});
}
const cmo = $("<div/>", {
"class": "itemGroup-1tL0uz"
});
const cmi = $("<div/>", {
"class": "item-1Yvehc",
"click": () => {
DiscordModules.ElectronModule.copy(this.lastSelector);
cm.hide();
}
}).append($("<span/>", {text: "Copy Selector"}));
cmo.append(cmi);
cm.append(cmo);
if (cm.hasClass("undefined")) cm.css("top", "-=" + cmo.outerHeight());
};
setImmediate(attach);
e.stopPropagation();
});
}
disableSelectors() {
$(document).off("contextmenu.bdDevmode");
$(document).off("contextmenu.bdDevModeCtx");
}
getRules(element, css = element.ownerDocument.styleSheets) {
// return [].concat(...[...css].map(s => [...s.cssRules || []])).filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8);
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
return elementRules;
}
getSelector(element) {
if (element.id) return `#${element.id}`;
const rules = this.getRules(element);
const latestRule = rules[rules.length - 1];
if (latestRule) return latestRule.selectorText;
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
return `.${Array.from(element.parentElement.classList).join(".")}`;
}
};

View File

@ -0,0 +1,36 @@
import Builtin, {onSettingChange} from "../structs/builtin";
import {SettingsCookie} from "data";
export default new class MinimalMode extends Builtin {
get name() {return "MinimalMode";}
get category() {return "Modules";}
get id() {return "bda-gs-2";}
get hideChannelsID() {return "bda-gs-3";}
get hideChannels() {return SettingsCookie[this.hideChannelsID];}
constructor() {
super();
this.enableHideChannels = this.enableHideChannels.bind(this);
this.disableHideChannels = this.disableHideChannels.bind(this);
}
enabled() {
$("body").addClass("bd-minimal");
if (this.hideChannels) this.enableHideChannels();
this.hideChannelCancel = onSettingChange(this.category, this.hideChannelsID, this.enableHideChannels, this.disableHideChannels);
}
disabled() {
$("body").removeClass("bd-minimal");
if (this.hideChannels) this.disableHideChannels();
if (this.hideChannelCancel) this.hideChannelCancel();
}
enableHideChannels() {
$("body").addClass("bd-minimal-chan");
}
disableHideChannels() {
$("body").removeClass("bd-minimal-chan");
}
};

View File

@ -1,21 +1,28 @@
import Builtin from "../structs/builtin";
import {SettingsCookie} from "data";
import {BDV2, DiscordModules} from "modules";
import {PublicServers} from "ui";
import {PublicServers as PSComponents} from "ui";
export default new class {
export default new class PublicServers extends Builtin {
get name() {return "PublicServers";}
get category() {return "Modules";}
get id() {return "bda-gs-1";}
initialize() {
enabled() {
const wrapper = BDV2.guildClasses.wrapper.split(" ")[0];
const guilds = $(`.${wrapper} .scroller-2FKFPG >:first-child`);
guilds.after(this.button);
}
disabled() {
$("#bd-pub-li").remove();
}
get component() {
return DiscordModules.React.createElement(PublicServers.Layer, {
return DiscordModules.React.createElement(PSComponents.Layer, {
rootId: "pubslayerroot",
id: "pubslayer",
children: DiscordModules.React.createElement(PublicServers.Menu, {rootId: "pubslayerroot"})
});
id: "pubslayer"
}, DiscordModules.React.createElement(PSComponents.Menu, {rootId: "pubslayerroot"}));
}
get root() {

View File

@ -1,5 +1,5 @@
import BDV2 from "./bdv2";
import Utilties from "./utilities";
import Utilities from "./utilities";
import {Config, SettingsCookie} from "data";
import EmoteModule from "./emotes";
import QuickEmoteMenu from "./emotemenu";
@ -8,9 +8,9 @@ import QuickEmoteMenu from "./emotemenu";
import PluginManager from "./pluginmanager";
import ThemeManager from "./thememanager";
import DataStore from "./datastore";
import PublicServers from "./publicservers";
// import PublicServers from "./publicservers";
import SettingsPanel from "./settingspanel";
import VoiceMode from "../builtins/voicemode";
import * as Builtins from "builtins";
function Core() {
}
@ -33,12 +33,12 @@ Core.prototype.init = async function() {
`);
}
Utilties.log("Startup", "Initializing Settings");
Utilities.log("Startup", "Initializing Settings");
this.initSettings();
Utilties.log("Startup", "Initializing EmoteModule");
Utilities.log("Startup", "Initializing EmoteModule");
window.emotePromise = EmoteModule.init().then(() => {
EmoteModule.initialized = true;
Utilties.log("Startup", "Initializing QuickEmoteMenu");
Utilities.log("Startup", "Initializing QuickEmoteMenu");
QuickEmoteMenu.init();
});
@ -46,14 +46,14 @@ Core.prototype.init = async function() {
await this.checkForGuilds();
BDV2.initialize();
Utilties.log("Startup", "Updating Settings");
Utilities.log("Startup", "Updating Settings");
SettingsPanel.initializeSettings();
VoiceMode.init();
for (const module in Builtins) Builtins[module].initialize();
Utilties.log("Startup", "Loading Plugins");
Utilities.log("Startup", "Loading Plugins");
const pluginErrors = PluginManager.loadPlugins();
Utilties.log("Startup", "Loading Themes");
Utilities.log("Startup", "Loading Themes");
const themeErrors = ThemeManager.loadThemes();
$("#customcss").detach().appendTo(document.head);
@ -62,17 +62,17 @@ Core.prototype.init = async function() {
if (SettingsCookie["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
});
PublicServers.initialize();
// PublicServers.initialize();
EmoteModule.autoCapitalize();
Utilties.log("Startup", "Removing Loading Icon");
Utilities.log("Startup", "Removing Loading Icon");
document.getElementsByClassName("bd-loaderv2")[0].remove();
Utilties.log("Startup", "Initializing Main Observer");
Utilities.log("Startup", "Initializing Main Observer");
this.initObserver();
// Show loading errors
if (SettingsCookie["fork-ps-1"]) {
Utilties.log("Startup", "Collecting Startup Errors");
Utilities.log("Startup", "Collecting Startup Errors");
this.showContentErrors({plugins: pluginErrors, themes: themeErrors});
}
@ -98,7 +98,7 @@ Core.prototype.checkForGuilds = function() {
};
Core.prototype.injectExternals = async function() {
await Utilties.injectJs("https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
await Utilities.injectJs("https://cdnjs.cloudflare.com/ajax/libs/ace/1.2.9/ace.js");
if (window.require.original) window.require = window.require.original;
};
@ -156,44 +156,6 @@ Core.prototype.initObserver = function () {
});
};
Core.prototype.inject24Hour = function() {
if (this.cancel24Hour) return;
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
const convert = (data) => {
if (!SettingsCookie["bda-gs-6"]) return;
const matched = data.returnValue.match(twelveHour);
if (!matched || matched.length !== 4) return;
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
};
const cancelCozy = Utilties.monkeyPatch(BDV2.TimeFormatter, "calendarFormat", {after: convert}); // Called in Cozy mode
const cancelCompact = Utilties.monkeyPatch(BDV2.TimeFormatter, "dateFormat", {after: convert}); // Called in Compact mode
this.cancel24Hour = () => {cancelCozy(); cancelCompact();}; // Cancel both
};
Core.prototype.injectColoredText = function() {
if (this.cancelColoredText) return;
this.cancelColoredText = Utilties.monkeyPatch(BDV2.MessageContentComponent.prototype, "render", {after: (data) => {
if (!SettingsCookie["bda-gs-7"]) return;
Utilties.monkeyPatch(data.returnValue.props, "children", {silent: true, after: ({returnValue}) => {
const markup = returnValue.props.children[1];
const roleColor = data.thisObject.props.message.colorString;
if (markup && roleColor) markup.props.style = {color: roleColor};
return returnValue;
}});
}});
};
Core.prototype.removeColoredText = function() {
document.querySelectorAll(".markup-2BOw-j").forEach(elem => {
elem.style.setProperty("color", "");
});
};
Core.prototype.alert = function(title, content) {
const modal = $(`<div class="bd-modal-wrapper theme-dark">
<div class="bd-backdrop backdrop-1wrmKB"></div>
@ -271,7 +233,7 @@ Core.prototype.showContentErrors = function({plugins: pluginErrors = [], themes:
if (err.error) {
error.find("a").on("click", (e) => {
e.preventDefault();
Utilties.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error);
Utilities.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error);
});
}
}

View File

@ -1,84 +0,0 @@
import BDV2 from "./bdv2";
function devMode() {}
devMode.prototype.enable = function(selectorMode) {
const self = this;
this.disable();
$(window).on("keydown.bdDevmode", function(e) {
if (e.which === 119 || e.which == 118) {//F8
console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", "");
debugger; // eslint-disable-line no-debugger
}
});
if (!selectorMode) return;
$(document).on("contextmenu.bdDevmode", function(e) {
self.lastSelector = self.getSelector(e.toElement);
function attach() {
let cm = $(".contextMenu-HLZMGh");
if (cm.length <= 0) {
cm = $("<div class=\"contextMenu-HLZMGh bd-context-menu\"></div>");
cm.addClass($(".app, .app-2rEoOp").hasClass("theme-dark") ? "theme-dark" : "theme-light");
cm.appendTo(".app, .app-2rEoOp");
cm.css("top", e.clientY);
cm.css("left", e.clientX);
$(document).on("click.bdDevModeCtx", () => {
cm.remove();
$(document).off(".bdDevModeCtx");
});
$(document).on("contextmenu.bdDevModeCtx", () => {
cm.remove();
$(document).off(".bdDevModeCtx");
});
$(document).on("keyup.bdDevModeCtx", (e) => {
if (e.keyCode === 27) {
cm.remove();
$(document).off(".bdDevModeCtx");
}
});
}
const cmo = $("<div/>", {
"class": "itemGroup-1tL0uz"
});
const cmi = $("<div/>", {
"class": "item-1Yvehc",
"click": function() {
BDV2.NativeModule.copy(self.lastSelector);
cm.hide();
}
}).append($("<span/>", {text: "Copy Selector"}));
cmo.append(cmi);
cm.append(cmo);
if (cm.hasClass("undefined")) cm.css("top", "-=" + cmo.outerHeight());
}
setImmediate(attach);
e.stopPropagation();
});
};
devMode.prototype.getRules = function(element, css = element.ownerDocument.styleSheets) {
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
return [].concat(...[...css].map(s => [...s.cssRules || []])).filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8);
};
devMode.prototype.getSelector = function(element) {
if (element.id) return `#${element.id}`;
const rules = this.getRules(element);
const latestRule = rules[rules.length - 1];
if (latestRule) return latestRule.selectorText;
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
return `.${Array.from(element.parentElement.classList).join(".")}`;
};
devMode.prototype.disable = function() {
$(window).off("keydown.bdDevmode");
$(document).off("contextmenu.bdDevmode");
$(document).off("contextmenu.bdDevModeCtx");
};
export default new devMode();

View File

@ -7,24 +7,22 @@ import Core from "./core";
import ClassNormalizer from "./classnormalizer";
import ContentManager from "./contentmanager";
import DataStore from "./datastore";
import DevMode from "./devmode";
// import DevMode from "./devmode";
import Events from "./emitter";
import EmoteMenu from "./emotemenu";
import EmoteModule from "./emotes";
import PluginManager from "./pluginmanager";
// import PublicServers from "./publicservers";
import ThemeManager from "./thememanager";
import VoiceMode from "./voicemode";
export const React = DiscordModules.React;
export const ReactDOM = DiscordModules.ReactDOM;
export {BDV2, BdApi, Core, ClassNormalizer, ContentManager, DataStore, DevMode,
export {BDV2, BdApi, Core, ContentManager, DataStore,
Events, EmoteMenu, EmoteModule, PluginManager, /*PublicServers,*/ ThemeManager,
VoiceMode, Utilities, WebpackModules, DiscordModules};
Utilities, WebpackModules, DiscordModules};

View File

@ -1,10 +1,10 @@
import {SettingsCookie} from "data";
import ClassNormalizer from "./classnormalizer";
// import ClassNormalizer from "./classnormalizer";
import ContentManager from "./contentmanager";
import BdApi from "./pluginapi";
import Core from "./core";
import EmoteModule from "./emotes";
import DevMode from "./devmode";
// import DevMode from "./devmode";
import Events from "./emitter";
import {SettingsPanel as SettingsRenderer} from "ui";
@ -23,48 +23,12 @@ export default new class SettingsPanel {
Events.dispatch("setting-updated", "Modules", id, enabled);
SettingsCookie[id] = enabled;
if (id == "bda-es-0") {
if (enabled) $("#twitchcord-button-container").show();
else $("#twitchcord-button-container").hide();
}
if (id == "bda-gs-2") {
if (enabled) $("body").addClass("bd-minimal");
else $("body").removeClass("bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) $("body").addClass("bd-minimal-chan");
else $("body").removeClass("bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) $("#bd-pub-li").show();
else $("#bd-pub-li").hide();
}
if (id == "bda-gs-5") {
if (enabled) $("#app-mount").addClass("bda-dark");
else $("#app-mount").removeClass("bda-dark");
}
if (enabled && id == "bda-gs-6") Core.inject24Hour();
if (id == "bda-gs-7") {
if (enabled) Core.injectColoredText();
else Core.removeColoredText();
}
if (id == "bda-es-4") {
if (enabled) EmoteModule.autoCapitalize();
else EmoteModule.disableAutoCapitalize();
}
if (id == "fork-ps-4") {
if (enabled) ClassNormalizer.start();
else ClassNormalizer.stop();
}
if (id == "fork-ps-5") {
if (enabled) {
ContentManager.watchContent("plugin");
@ -82,39 +46,17 @@ export default new class SettingsPanel {
else BdApi.setWindowPreference("backgroundColor", "#2f3136");
}
/*if (_c["fork-wp-2"]) {
const current = BdApi.getWindowPreference("frame");
if (current != _c["fork-wp-2"]) BdApi.setWindowPreference("frame", _c["fork-wp-2"]);
}*/
if (id == "bda-gs-8") {
if (enabled) DevMode.enable(SettingsCookie["fork-dm-1"]);
else DevMode.disable();
}
Core.saveSettings();
}
initializeSettings() {
if (SettingsCookie["bda-es-0"]) $("#twitchcord-button-container").show();
// if (SettingsCookie["bda-gs-b"]) $("body").addClass("bd-blue");
if (SettingsCookie["bda-gs-2"]) $("body").addClass("bd-minimal");
if (SettingsCookie["bda-gs-3"]) $("body").addClass("bd-minimal-chan");
if (SettingsCookie["bda-gs-1"]) $("#bd-pub-li").show();
if (SettingsCookie["bda-gs-5"]) $("#app-mount").addClass("bda-dark");
if (SettingsCookie["bda-gs-6"]) Core.inject24Hour();
if (SettingsCookie["bda-gs-7"]) Core.injectColoredText();
if (SettingsCookie["bda-es-4"]) EmoteModule.autoCapitalize();
if (SettingsCookie["fork-ps-4"]) ClassNormalizer.start();
if (SettingsCookie["fork-ps-5"]) {
ContentManager.watchContent("plugin");
ContentManager.watchContent("theme");
}
if (SettingsCookie["bda-gs-8"]) DevMode.enable(SettingsCookie["fork-dm-1"]);
Core.saveSettings();
}
};

View File

@ -1,19 +0,0 @@
export default new class {
enable() {
$(".scroller.guild-channels ul").first().css("display", "none");
$(".scroller.guild-channels header").first().css("display", "none");
$(".app.flex-vertical, .app-2rEoOp").first().css("overflow", "hidden");
$(".chat-3bRxxu").first().css("visibility", "hidden").css("min-width", "0px");
$(".flex-vertical.channels-wrap").first().css("flex-grow", "100000");
$(".guild-header .btn.btn-hamburger").first().css("visibility", "hidden");
}
disable() {
$(".scroller.guild-channels ul").first().css("display", "");
$(".scroller.guild-channels header").first().css("display", "");
$(".app.flex-vertical, .app-2rEoOp").first().css("overflow", "");
$(".chat-3bRxxu").first().css("visibility", "").css("min-width", "");
$(".flex-vertical.channels-wrap").first().css("flex-grow", "");
$(".guild-header .btn.btn-hamburger").first().css("visibility", "");
}
};

View File

@ -104,6 +104,7 @@ const DiscordModules = Utilities.memoizeObject({
get Moment() {return WebpackModules.getByProps("parseZone");},
get LocationManager() {return WebpackModules.getByProps("createLocation");},
get Timestamps() {return WebpackModules.getByProps("fromTimestamp");},
get TimeFormatter() {return WebpackModules.getByProps("dateFormat");},
/* Strings and Utils */
get Strings() {return WebpackModules.getByProps("Messages").Messages;},

View File

@ -2,19 +2,28 @@ import {SettingsCookie} from "data";
import Utilities from "../modules/utilities";
import Events from "../modules/emitter";
export function onSettingChange(category, identifier, onEnable, onDisable) {
const handler = (cat, id, enabled) => {
if (category !== cat || id !== identifier) return;
if (enabled) onEnable();
else onDisable();
};
Events.on("setting-updated", handler);
return () => {Events.off("setting-updated", handler);};
}
export default class BuiltinModule {
get name() {return "Unnamed Builtin";}
get category() {return "Modules";}
get id() {return "None";}
async init() {
console.log("Init a builtin");
async initialize() {
if (SettingsCookie[this.id]) await this.enable();
Events.on("setting-updated", async (category, id, enabled) => {
Events.on("setting-updated", (category, id, enabled) => {
if (category !== this.category || id !== this.id) return;
if (enabled) await this.enable();
else await this.disable();
if (enabled) this.enable();
else this.disable();
});
}
@ -31,15 +40,15 @@ export default class BuiltinModule {
async enabled() {}
async disabled() {}
log(message) {
Utilities.log(this.name, message);
log(...message) {
Utilities.log(this.name, ...message);
}
warn(message) {
Utilities.warn(this.name, message);
warn(...message) {
Utilities.warn(this.name, ...message);
}
error(message) {
Utilities.err(this.name, message);
error(...message) {
Utilities.err(this.name, ...message);
}
}

View File

@ -22,6 +22,7 @@ module.exports = {
resolve: {
extensions: [".js", ".jsx"],
modules: [
path.resolve("src", "builtins"),
path.resolve("src", "data"),
path.resolve("src", "modules"),
path.resolve("src", "ui")