|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
// @flow
|
|
|
|
|
import { get, set } from 'idb-keyval';
|
|
|
|
|
import logger from './utils/logger.js'
|
|
|
|
|
import { get, set } from "idb-keyval";
|
|
|
|
|
import logger from "./utils/logger.js";
|
|
|
|
|
import settingsInj from "./settingsInj.js";
|
|
|
|
|
|
|
|
|
|
const pluginsSym = Symbol("__plugins");
|
|
|
|
|
|
|
|
|
@ -43,62 +44,72 @@ async function addPlugin(iife: string, metadata: Object): Promise<boolean> {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function delPlugin(name: string): Promise<boolean> {
|
|
|
|
|
const globalSettings = await get("demoncord")
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot remove non-existant plugin!", ["Plugins"])
|
|
|
|
|
return false
|
|
|
|
|
} else {
|
|
|
|
|
globalSettings["plugin"][name] = undefined
|
|
|
|
|
delete globalSettings["plugin"][name]
|
|
|
|
|
}
|
|
|
|
|
await set("demoncord", globalSettings)
|
|
|
|
|
return true
|
|
|
|
|
const globalSettings = await get("demoncord");
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot remove non-existant plugin!", ["Plugins"]);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
globalSettings["plugin"][name] = undefined;
|
|
|
|
|
delete globalSettings["plugin"][name];
|
|
|
|
|
}
|
|
|
|
|
await set("demoncord", globalSettings);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function startPlugin(name: string): Promise<boolean> {
|
|
|
|
|
const globalSettings = await get("demoncord")
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot start non-existant plugin!", ["Plugins"])
|
|
|
|
|
return false
|
|
|
|
|
} else {
|
|
|
|
|
logger.log(`Starting ${name}...`, ["Plugins"])
|
|
|
|
|
const plug = globalSettings["plugin"][name]
|
|
|
|
|
const exports: Object = (0, eval)(plug.iife)
|
|
|
|
|
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
|
|
|
|
|
onStart(ctx)
|
|
|
|
|
logger.log(`Started ${name}!`, ["Plugins"])
|
|
|
|
|
window.demon[pluginsSym][name] = {status: 1, ctx: ctx}
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
const globalSettings = await get("demoncord");
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot start non-existant plugin!", ["Plugins"]);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
logger.log(`Starting ${name}...`, ["Plugins"]);
|
|
|
|
|
const plug = globalSettings["plugin"][name];
|
|
|
|
|
const exports: Object = (0, eval)(plug.iife);
|
|
|
|
|
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
|
|
|
|
|
onStart(ctx);
|
|
|
|
|
if (exports.settings)
|
|
|
|
|
settingsInj.registerSettingsEntry(
|
|
|
|
|
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> {
|
|
|
|
|
const globalSettings = await get("demoncord")
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined ) {
|
|
|
|
|
logger.error("Cannot stop non-existant or non-running plugin!", ["Plugins"])
|
|
|
|
|
return false
|
|
|
|
|
} else {
|
|
|
|
|
logger.log(`Stopping ${name}...`, ["Plugins"])
|
|
|
|
|
const plug = globalSettings["plugin"][name]
|
|
|
|
|
const exports: Object = (0, eval)(plug.iife)
|
|
|
|
|
const onStop: (ctx: Object)=>void = exports.onStop
|
|
|
|
|
onStop(window.demon[pluginsSym][name].ctx);
|
|
|
|
|
logger.log(`Stopped ${name}!`, ["Plugins"])
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
const globalSettings = await get("demoncord");
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot stop non-existant or non-running plugin!", [
|
|
|
|
|
"Plugins",
|
|
|
|
|
]);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
logger.log(`Stopping ${name}...`, ["Plugins"]);
|
|
|
|
|
const plug = globalSettings["plugin"][name];
|
|
|
|
|
const exports: Object = (0, eval)(plug.iife);
|
|
|
|
|
const onStop: (ctx: Object) => void = exports.onStop;
|
|
|
|
|
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> {
|
|
|
|
|
const globalSettings = await get("demoncord")
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot toggle non-existant plugin!", ["Plugins"])
|
|
|
|
|
return false
|
|
|
|
|
} else {
|
|
|
|
|
globalSettings["plugin"][name].enabled = !globalSettings["plugin"][name].enabled
|
|
|
|
|
await set("demoncord", globalSettings)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
const globalSettings = await get("demoncord");
|
|
|
|
|
if (globalSettings["plugin"][name] === undefined) {
|
|
|
|
|
logger.error("Cannot toggle non-existant plugin!", ["Plugins"]);
|
|
|
|
|
return false;
|
|
|
|
|
} else {
|
|
|
|
|
globalSettings["plugin"][name].enabled =
|
|
|
|
|
!globalSettings["plugin"][name].enabled;
|
|
|
|
|
await set("demoncord", globalSettings);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|