forked from Demon/demoncord
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.2 KiB
93 lines
2.2 KiB
// @flow
|
|
|
|
import webpack from "./webpack";
|
|
|
|
const settingsSym = Symbol("__settings");
|
|
|
|
// super secret value that shouldnt be exposed, used internally to avoid section conflicts and the like
|
|
const ovrwrtSctnSym: symbol = Symbol("__overwriteSection");
|
|
|
|
const settingsView = webpack.find(
|
|
(m) => m.default && m.default.displayName === "SettingsView"
|
|
);
|
|
|
|
type getPredicateSectionsEntry =
|
|
| {
|
|
section: "HEADER",
|
|
label: string,
|
|
}
|
|
| {
|
|
section: "DIVIDER",
|
|
}
|
|
| {
|
|
section: string,
|
|
label: string,
|
|
component: Function,
|
|
};
|
|
|
|
function patch(args: mixed, ret: getPredicateSectionsEntry[]) {
|
|
const processedEntries = window.demon[settingsSym].entries.map((e) => ({
|
|
section:
|
|
(e[ovrwrtSctnSym] ? e[ovrwrtSctnSym] : "DEMON_SETTINGS_LOADER_") +
|
|
e.name,
|
|
label: e.name,
|
|
element: e.component,
|
|
}));
|
|
|
|
const injectionIndex =
|
|
2 + ret.findIndex((section) => section.section === "Game Activity");
|
|
ret.splice(
|
|
injectionIndex,
|
|
0,
|
|
{ section: "HEADER", label: "Demon" },
|
|
...processedEntries,
|
|
{ section: "DIVIDER" }
|
|
);
|
|
return ret;
|
|
}
|
|
|
|
function init() {
|
|
window.demon[settingsSym] = {
|
|
patch: window.demon.patcher.after(
|
|
"getPredicateSections",
|
|
settingsView.default.prototype,
|
|
patch
|
|
),
|
|
entries: [],
|
|
};
|
|
|
|
// debug
|
|
window.__demontemp__UnpatchSettingsInj = unInit();
|
|
}
|
|
|
|
function unInit() {
|
|
window.demon[settingsSym].patch();
|
|
delete window.demon[settingsSym];
|
|
}
|
|
|
|
function unregisterSettingsEntry(name: string) {
|
|
let s = window.demon[settingsSym];
|
|
s.entries = s.entries.filter(
|
|
(e) => (e[ovrwrtSctnSym] ? e[ovrwrtSctnSym] : e.name) !== name
|
|
);
|
|
}
|
|
|
|
function registerSettingsEntry(
|
|
name: string,
|
|
section: ?string,
|
|
component: Function
|
|
): () => void {
|
|
let entry: { [symbol | string]: any } = { name, component };
|
|
if (section) entry[ovrwrtSctnSym] = section;
|
|
window.demon[settingsSym].entries.push(entry);
|
|
return () => unregisterSettingsEntry(name);
|
|
}
|
|
|
|
export default {
|
|
init,
|
|
unInit,
|
|
registerSettingsEntry,
|
|
unregisterSettingsEntry,
|
|
ovrwrtSctnSymm: ovrwrtSctnSym,
|
|
};
|