allow plugins to specify how soon their start() method is called

This commit is contained in:
V 2023-11-22 06:14:16 +01:00
parent 074ebae334
commit 371b5b0be8
No known key found for this signature in database
GPG key ID: A1DC0CFB5615D905
4 changed files with 38 additions and 24 deletions

View file

@ -27,6 +27,8 @@ export { PlainSettings, Settings };
import "./utils/quickCss"; import "./utils/quickCss";
import "./webpack/patchWebpack"; import "./webpack/patchWebpack";
import { StartAt } from "@utils/types";
import { get as dsGet } from "./api/DataStore"; import { get as dsGet } from "./api/DataStore";
import { showNotification } from "./api/Notifications"; import { showNotification } from "./api/Notifications";
import { PlainSettings, Settings } from "./api/Settings"; import { PlainSettings, Settings } from "./api/Settings";
@ -79,7 +81,7 @@ async function syncSettings() {
async function init() { async function init() {
await onceReady; await onceReady;
startAllPlugins(); startAllPlugins(StartAt.WebpackReady);
syncSettings(); syncSettings();
@ -130,13 +132,17 @@ async function init() {
} }
} }
startAllPlugins(StartAt.Init);
init(); init();
if (IS_DISCORD_DESKTOP && Settings.winNativeTitleBar && navigator.platform.toLowerCase().startsWith("win")) { document.addEventListener("DOMContentLoaded", () => {
document.addEventListener("DOMContentLoaded", () => { startAllPlugins(StartAt.DOMContentLoaded);
if (IS_DISCORD_DESKTOP && Settings.winNativeTitleBar && navigator.platform.toLowerCase().startsWith("win")) {
document.head.append(Object.assign(document.createElement("style"), { document.head.append(Object.assign(document.createElement("style"), {
id: "vencord-native-titlebar-style", id: "vencord-native-titlebar-style",
textContent: "[class*=titleBar]{display: none!important}" textContent: "[class*=titleBar]{display: none!important}"
})); }));
}, { once: true }); }
} }, { once: true });

View file

@ -12,7 +12,7 @@ import { getTheme, Theme } from "@utils/discord";
import { Margins } from "@utils/margins"; import { Margins } from "@utils/margins";
import { classes } from "@utils/misc"; import { classes } from "@utils/misc";
import { LazyComponent } from "@utils/react"; import { LazyComponent } from "@utils/react";
import definePlugin, { OptionType } from "@utils/types"; import definePlugin, { OptionType, StartAt } from "@utils/types";
import { findByCode } from "@webpack"; import { findByCode } from "@webpack";
import { Button, Forms } from "@webpack/common"; import { Button, Forms } from "@webpack/common";
@ -87,25 +87,13 @@ export default definePlugin({
description: "Recreation of the old client theme experiment. Add a color to your Discord client theme", description: "Recreation of the old client theme experiment. Add a color to your Discord client theme",
settings, settings,
patches: [ startAt: StartAt.DOMContentLoaded,
{ start() {
find: "Could not find app-mount", updateColorVars(settings.store.color);
replacement: { generateColorOffsets();
match: /(?<=Could not find app-mount"\))/,
replace: ",$self.addThemeInitializer()"
}
}
],
addThemeInitializer() {
document.addEventListener("DOMContentLoaded", this.themeInitializer = () => {
updateColorVars(settings.store.color);
generateColorOffsets();
});
}, },
stop() { stop() {
document.removeEventListener("DOMContentLoaded", this.themeInitializer);
document.getElementById("clientThemeVars")?.remove(); document.getElementById("clientThemeVars")?.remove();
document.getElementById("clientThemeOffsets")?.remove(); document.getElementById("clientThemeOffsets")?.remove();
} }

View file

@ -19,7 +19,7 @@
import { registerCommand, unregisterCommand } from "@api/Commands"; import { registerCommand, unregisterCommand } from "@api/Commands";
import { Settings } from "@api/Settings"; import { Settings } from "@api/Settings";
import { Logger } from "@utils/Logger"; import { Logger } from "@utils/Logger";
import { Patch, Plugin } from "@utils/types"; import { Patch, Plugin, StartAt } from "@utils/types";
import { FluxDispatcher } from "@webpack/common"; import { FluxDispatcher } from "@webpack/common";
import { FluxEvents } from "@webpack/types"; import { FluxEvents } from "@webpack/types";
@ -85,9 +85,15 @@ for (const p of pluginsValues) {
} }
} }
export const startAllPlugins = traceFunction("startAllPlugins", function startAllPlugins() { export const startAllPlugins = traceFunction("startAllPlugins", function startAllPlugins(target: StartAt) {
logger.info(`Starting plugins (stage ${target})`);
for (const name in Plugins) for (const name in Plugins)
if (isPluginEnabled(name)) { if (isPluginEnabled(name)) {
const p = Plugins[name];
const startAt = p.startAt ?? StartAt.WebpackReady;
if (startAt !== target) continue;
startPlugin(Plugins[name]); startPlugin(Plugins[name]);
} }
}); });

View file

@ -80,6 +80,11 @@ export interface PluginDef {
* Whether this plugin should be enabled by default, but can be disabled * Whether this plugin should be enabled by default, but can be disabled
*/ */
enabledByDefault?: boolean; enabledByDefault?: boolean;
/**
* When to call the start() method
* @default StartAt.WebpackReady
*/
startAt?: StartAt,
/** /**
* Optionally provide settings that the user can configure in the Plugins tab of settings. * Optionally provide settings that the user can configure in the Plugins tab of settings.
* @deprecated Use `settings` instead * @deprecated Use `settings` instead
@ -117,6 +122,15 @@ export interface PluginDef {
tags?: string[]; tags?: string[];
} }
export const enum StartAt {
/** Right away, as soon as Vencord initialised */
Init = "Init",
/** On the DOMContentLoaded event, so once the document is ready */
DOMContentLoaded = "DOMContentLoaded",
/** Once Discord's core webpack modules have finished loading, so as soon as things like react and flux are available */
WebpackReady = "WebpackReady"
}
export const enum OptionType { export const enum OptionType {
STRING, STRING,
NUMBER, NUMBER,