plugin settings now working

master^2
Cain Atkinson 2 years ago
parent 529582bb3b
commit c913445708

@ -1,13 +1,14 @@
import flow from 'rollup-plugin-flow' import flow from "rollup-plugin-flow";
import { minify } from 'rollup-plugin-esbuild' import { minify } from "rollup-plugin-esbuild";
import { nodeResolve } from '@rollup/plugin-node-resolve'; import { nodeResolve } from "@rollup/plugin-node-resolve";
import commonjs from '@rollup/plugin-commonjs'; import commonjs from "@rollup/plugin-commonjs";
import { defineConfig } from "rollup";
export default { export default defineConfig({
input: 'src/index.js', input: "src/index.js",
plugins: [flow(), commonjs(), nodeResolve(), minify()], plugins: [flow(), commonjs(), nodeResolve(), minify()],
output: { output: {
file: 'dist/build.js', file: "dist/build.js",
format: "iife" format: "iife",
} },
} });

@ -1,6 +1,7 @@
// @flow // @flow
import { get, set } from 'idb-keyval'; import { get, set } from "idb-keyval";
import logger from './utils/logger.js' import logger from "./utils/logger.js";
import settingsInj from "./settingsInj.js";
const pluginsSym = Symbol("__plugins"); const pluginsSym = Symbol("__plugins");
@ -43,62 +44,72 @@ async function addPlugin(iife: string, metadata: Object): Promise<boolean> {
} }
async function delPlugin(name: string): Promise<boolean> { async function delPlugin(name: string): Promise<boolean> {
const globalSettings = await get("demoncord") const globalSettings = await get("demoncord");
if (globalSettings["plugin"][name] === undefined) { if (globalSettings["plugin"][name] === undefined) {
logger.error("Cannot remove non-existant plugin!", ["Plugins"]) logger.error("Cannot remove non-existant plugin!", ["Plugins"]);
return false return false;
} else { } else {
globalSettings["plugin"][name] = undefined globalSettings["plugin"][name] = undefined;
delete globalSettings["plugin"][name] delete globalSettings["plugin"][name];
} }
await set("demoncord", globalSettings) await set("demoncord", globalSettings);
return true return true;
} }
async function startPlugin(name: string): Promise<boolean> { async function startPlugin(name: string): Promise<boolean> {
const globalSettings = await get("demoncord") const globalSettings = await get("demoncord");
if (globalSettings["plugin"][name] === undefined) { if (globalSettings["plugin"][name] === undefined) {
logger.error("Cannot start non-existant plugin!", ["Plugins"]) logger.error("Cannot start non-existant plugin!", ["Plugins"]);
return false return false;
} else { } else {
logger.log(`Starting ${name}...`, ["Plugins"]) logger.log(`Starting ${name}...`, ["Plugins"]);
const plug = globalSettings["plugin"][name] const plug = globalSettings["plugin"][name];
const exports: Object = (0, eval)(plug.iife) const exports: Object = (0, eval)(plug.iife);
const onStart: (ctx: Object)=>void = exports.onStart const onStart: (ctx: Object) => void = exports.onStart;
let ctx = {} // ctx is how you're going to store things that need to be accessed in both onStart and onStop. dumb, i know let ctx = {}; // ctx is how you're going to store things that need to be accessed in both onStart and onStop. dumb, i know
onStart(ctx) onStart(ctx);
logger.log(`Started ${name}!`, ["Plugins"]) if (exports.settings)
window.demon[pluginsSym][name] = {status: 1, ctx: ctx} settingsInj.registerSettingsEntry(
return true name,
} "DEMON_PLUGIN_SETTINGS_" + name,
exports.settings
);
logger.log(`Started ${name}!`, ["Plugins"]);
window.demon[pluginsSym][name] = { status: 1, ctx: ctx };
return true;
}
} }
async function stopPlugin(name: string): Promise<boolean> { async function stopPlugin(name: string): Promise<boolean> {
const globalSettings = await get("demoncord") const globalSettings = await get("demoncord");
if (globalSettings["plugin"][name] === undefined ) { if (globalSettings["plugin"][name] === undefined) {
logger.error("Cannot stop non-existant or non-running plugin!", ["Plugins"]) logger.error("Cannot stop non-existant or non-running plugin!", [
return false "Plugins",
} else { ]);
logger.log(`Stopping ${name}...`, ["Plugins"]) return false;
const plug = globalSettings["plugin"][name] } else {
const exports: Object = (0, eval)(plug.iife) logger.log(`Stopping ${name}...`, ["Plugins"]);
const onStop: (ctx: Object)=>void = exports.onStop const plug = globalSettings["plugin"][name];
onStop(window.demon[pluginsSym][name].ctx); const exports: Object = (0, eval)(plug.iife);
logger.log(`Stopped ${name}!`, ["Plugins"]) const onStop: (ctx: Object) => void = exports.onStop;
return true onStop(window.demon[pluginsSym][name].ctx);
} settingsInj.unregisterSettingsEntry("DEMON_PLUGIN_SETTINGS_" + name);
logger.log(`Stopped ${name}!`, ["Plugins"]);
return true;
}
} }
async function togglePlugin(name: string): Promise<boolean> { async function togglePlugin(name: string): Promise<boolean> {
const globalSettings = await get("demoncord") const globalSettings = await get("demoncord");
if (globalSettings["plugin"][name] === undefined) { if (globalSettings["plugin"][name] === undefined) {
logger.error("Cannot toggle non-existant plugin!", ["Plugins"]) logger.error("Cannot toggle non-existant plugin!", ["Plugins"]);
return false return false;
} else { } else {
globalSettings["plugin"][name].enabled = !globalSettings["plugin"][name].enabled globalSettings["plugin"][name].enabled =
await set("demoncord", globalSettings) !globalSettings["plugin"][name].enabled;
return true await set("demoncord", globalSettings);
} return true;
}
} }
export default { export default {

@ -27,7 +27,9 @@ type getPredicateSectionsEntry =
function patch(args: mixed, ret: getPredicateSectionsEntry[]) { function patch(args: mixed, ret: getPredicateSectionsEntry[]) {
const processedEntries = window.demon[settingsSym].entries.map((e) => ({ const processedEntries = window.demon[settingsSym].entries.map((e) => ({
section: e[ovrwrtSctnSym] ?? "DEMON_SETTINGS_LOADER_" + e.name, section:
(e[ovrwrtSctnSym] ? e[ovrwrtSctnSym] : "DEMON_SETTINGS_LOADER_") +
e.name,
label: e.name, label: e.name,
element: e.component, element: e.component,
})); }));
@ -65,13 +67,18 @@ function unInit(obj: Object) {
function unregisterSettingsEntry(name: string) { function unregisterSettingsEntry(name: string) {
let s = window.demon[settingsSym]; let s = window.demon[settingsSym];
s.entries = s.entries.filter((e) => e.name !== name); s.entries = s.entries.filter(
(e) => (e[ovrwrtSctnSym] ? e[ovrwrtSctnSym] : e.name) !== name
);
} }
function registerSettingsEntry(name: string, section: string, component: Function): () => void { function registerSettingsEntry(
let entry = { name, component }; name: string,
if (section) section: string,
entry[ovrwrtSctnSym] = section; component: Function
): () => void {
let entry: { [symbol | string]: any } = { name, component };
if (section) entry[ovrwrtSctnSym] = section;
window.demon[settingsSym].entries.push(entry); window.demon[settingsSym].entries.push(entry);
return () => unregisterSettingsEntry(name); return () => unregisterSettingsEntry(name);
} }

@ -4,7 +4,7 @@ import webpack from "./api/webpack";
import common from "./api/common"; import common from "./api/common";
import commands from "./api/commands"; import commands from "./api/commands";
import plugins from "./api/plugins"; import plugins from "./api/plugins";
import settingsInj from "./api/settingsInjection"; import settingsInj from "./api/settingsInj";
async function init(obj: Object): Promise<void> { async function init(obj: Object): Promise<void> {
const patcher = new Patcher(); const patcher = new Patcher();

Loading…
Cancel
Save