[Settings] Rewrite GMSettings to use proxy, add new experimental option

pull/62/head
Oj18 3 years ago
parent 49c5b2414a
commit 50d7450fea

@ -14,7 +14,7 @@ Other Mods: ${Object.keys(mods).filter((x) => Object.keys(window).includes(x)).m
GooseMod: GooseMod:
GM Version: ${goosemod.versioning.version} (${goosemod.versioning.hash}) GM Version: ${goosemod.versioning.version} (${goosemod.versioning.hash})
GM Branch: ${goosemod.storage.get('goosemodUntetheredBranch')} GM Branch: ${goosemod.versioning.branch}
GM Extension Version: ${window.gmExtension} GM Extension Version: ${window.gmExtension}
GM Storage Impl: ${goosemod.storage.type} GM Storage Impl: ${goosemod.storage.type}
Modules: ${Object.keys(goosemod.modules).join(', ')}`; Modules: ${Object.keys(goosemod.modules).join(', ')}`;

@ -130,7 +130,7 @@ export const addBadges = () => {
'https://goosemod.com/img/goose_gold.jpg', 'https://goosemod.com/img/goose_gold.jpg',
// Force check via query because Discord not properly rerendering // Force check via query because Discord not properly rerendering
() => goosemodScope.settings.gmSettings.get().gmBadges ? badgeUsers.sponsor : [], () => goosemodScope.settings.gmSettings.gmBadges ? badgeUsers.sponsor : [],
() => { () => {
showSponsorModal(); showSponsorModal();
@ -143,7 +143,7 @@ export const addBadges = () => {
'https://goosemod.com/img/goose_globe.png', 'https://goosemod.com/img/goose_globe.png',
// Force check via query because Discord not properly rerendering // Force check via query because Discord not properly rerendering
() => goosemodScope.settings.gmSettings.get().gmBadges ? badgeUsers.translator : [], () => goosemodScope.settings.gmSettings.gmBadges ? badgeUsers.translator : [],
() => { () => {
@ -156,7 +156,7 @@ export const addBadges = () => {
'https://goosemod.com/img/goose_glitch.jpg', 'https://goosemod.com/img/goose_glitch.jpg',
// Force check via query because Discord not properly rerendering // Force check via query because Discord not properly rerendering
() => goosemodScope.settings.gmSettings.get().gmBadges ? badgeUsers.dev : [], () => goosemodScope.settings.gmSettings.gmBadges ? badgeUsers.dev : [],
() => { () => {
@ -170,7 +170,7 @@ export const addBadges = () => {
'https://goosemod.com/img/logo.jpg', 'https://goosemod.com/img/logo.jpg',
// Force check via query because Discord not properly rerendering // Force check via query because Discord not properly rerendering
() => goosemodScope.settings.gmSettings.get().gmBadges ? ['756146058320674998'] : [], () => goosemodScope.settings.gmSettings.gmBadges ? ['756146058320674998'] : [],
() => { () => {

@ -1,5 +1,3 @@
let cache;
const defaultSettings = { const defaultSettings = {
changelog: true, changelog: true,
separators: true, separators: true,
@ -20,26 +18,32 @@ const defaultSettings = {
debugToasts: false debugToasts: false
}; };
export const get = () => { const loadStore = () => {
// Cache as this function is called frequently const loaded = JSON.parse(goosemod.storage.get('goosemodGMSettings')) || {};
if (cache) return cache;
cache = JSON.parse(goosemod.storage.get('goosemodGMSettings')) || {};
cache = { return {
...defaultSettings, ...defaultSettings,
...cache ...loaded,
};
return cache; get: () => target // gmSettings.get compat (because of all theme settings using old)
};
}; };
export const set = (key, value) => { const target = { uninit: true };
const settings = get(); export default new Proxy({ uninit: true }, {
get(target, prop) {
if (target.uninit) target = loadStore();
return target[prop] ?? false;
},
set(target, prop, value) {
if (target.uninit) target = loadStore();
settings[key] = value; target[prop] = value;
goosemod.storage.set('goosemodGMSettings', JSON.stringify(settings)); goosemod.storage.set('goosemodGMSettings', JSON.stringify(target));
cache = settings; // Set cache to new value return true;
}; }
});

@ -109,7 +109,9 @@ const init = async function () {
this.versioning = { this.versioning = {
version: `12.3-dev`, version: `12.3-dev`,
hash: '<hash>', // Hash of built final js file is inserted here via build script hash: '<hash>', // Hash of git commit
branch: goosemod.storage.get('goosemodUntetheredBranch'),
lastUsedVersion: this.storage.get('goosemodLastVersion') lastUsedVersion: this.storage.get('goosemodLastVersion')
}; };
@ -192,8 +194,8 @@ const init = async function () {
this.cssCache.removeStyle(); this.cssCache.removeStyle();
if (this.settings.gmSettings.get().gmBadges) this.gmBadges.addBadges(); if (this.settings.gmSettings.gmBadges) this.gmBadges.addBadges();
if (this.settings.gmSettings.get().attrs) this.attrs.patch(); if (this.settings.gmSettings.attrs) this.attrs.patch();
this.saveInterval = setInterval(() => { this.saveInterval = setInterval(() => {
this.moduleSettingsStore.saveModuleSettings(); this.moduleSettingsStore.saveModuleSettings();
@ -222,7 +224,7 @@ const init = async function () {
// Hotupdate every hour // Hotupdate every hour
this.hotupdateInterval = setInterval(() => { this.hotupdateInterval = setInterval(() => {
if (!this.settings.gmSettings.get().autoupdate) return; // Check main GM setting if (!this.settings.gmSettings.autoupdate) return; // Check main GM setting
this.moduleStoreAPI.hotupdate(); this.moduleStoreAPI.hotupdate();
}, 1000 * 60 * 60); }, 1000 * 60 * 60);

@ -130,7 +130,7 @@ export default {
return repo; return repo;
}))).sort((a, b) => goosemodScope.moduleStoreAPI.repos.indexOf(a.url) - goosemodScope.moduleStoreAPI.repos.indexOf(b.url)); }))).sort((a, b) => goosemodScope.moduleStoreAPI.repos.indexOf(a.url) - goosemodScope.moduleStoreAPI.repos.indexOf(b.url));
if (goosemodScope.settings.gmSettings.get().newModuleNotifications) for (const newModule of newModules) { if (goosemodScope.settings.gmSettings.newModuleNotifications) for (const newModule of newModules) {
const currentModule = goosemodScope.moduleStoreAPI.modules.find((x) => newModule.name === x.name); const currentModule = goosemodScope.moduleStoreAPI.modules.find((x) => newModule.name === x.name);
if (!currentModule) { // Is new module (not existing before) if (!currentModule) { // Is new module (not existing before)

@ -19,13 +19,13 @@ export default (goosemodScope, gmSettings, Items) => {
}, false] }, false]
]; ];
if (gmSettings.get().separators) items.unshift(['separator']); if (gmSettings.separators) items.unshift(['separator']);
goosemodScope.settings.items.splice(goosemodScope.settings.items.indexOf(goosemodScope.settings.items.find(x => x[1] === 'Themes')) + 1, 0, goosemodScope.settings.items.splice(goosemodScope.settings.items.indexOf(goosemodScope.settings.items.find(x => x[1] === 'Themes')) + 1, 0,
...items ...items
); );
} else { } else {
goosemodScope.settings.items.splice(goosemodScope.settings.items.indexOf(goosemodScope.settings.items.find(x => x[1] === 'Change Log')), gmSettings.get().separators ? 2 : 1); goosemodScope.settings.items.splice(goosemodScope.settings.items.indexOf(goosemodScope.settings.items.find(x => x[1] === 'Change Log')), gmSettings.separators ? 2 : 1);
} }
await goosemodScope.settings.reopenSettings(); await goosemodScope.settings.reopenSettings();
@ -46,8 +46,8 @@ export default (goosemodScope, gmSettings, Items) => {
case 'separators': { case 'separators': {
if (value) { if (value) {
if (!gmSettings.get().home) goosemod.settings.items.splice(2, 0, ['separator']); if (!gmSettings.home) goosemod.settings.items.splice(2, 0, ['separator']);
if (gmSettings.get().changelog) goosemod.settings.items.splice(4, 0, ['separator']); if (gmSettings.changelog) goosemod.settings.items.splice(4, 0, ['separator']);
} else { } else {
let main = true; let main = true;
@ -71,7 +71,7 @@ export default (goosemodScope, gmSettings, Items) => {
} }
} }
gmSettings.set(key, value); gmSettings[key] = value;
}; };
const refreshPrompt = async () => { const refreshPrompt = async () => {
@ -95,7 +95,7 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: '#settings.items.goosemod_change_log.note#', subtext: '#settings.items.goosemod_change_log.note#',
onToggle: (c) => changeSetting('changelog', c), onToggle: (c) => changeSetting('changelog', c),
isToggled: () => gmSettings.get().changelog isToggled: () => gmSettings.changelog
}, },
{ {
@ -105,7 +105,7 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: '#settings.items.main_separators.note#', subtext: '#settings.items.main_separators.note#',
onToggle: (c) => changeSetting('separators', c), onToggle: (c) => changeSetting('separators', c),
isToggled: () => gmSettings.get().separators isToggled: () => gmSettings.separators
}, },
{ {
@ -118,7 +118,7 @@ export default (goosemodScope, gmSettings, Items) => {
changeSetting('home', c); changeSetting('home', c);
refreshPrompt(); refreshPrompt();
}, },
isToggled: () => gmSettings.get().home isToggled: () => gmSettings.home
}, },
{ {
@ -133,7 +133,7 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: '#settings.items.auto_update.note#', subtext: '#settings.items.auto_update.note#',
onToggle: (c) => changeSetting('autoupdate', c), onToggle: (c) => changeSetting('autoupdate', c),
isToggled: () => gmSettings.get().autoupdate isToggled: () => gmSettings.autoupdate
}, },
{ {
@ -143,7 +143,7 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: 'Shows a toast each time a new module is added to the Store', // todo: i18n subtext: 'Shows a toast each time a new module is added to the Store', // todo: i18n
onToggle: (c) => changeSetting('newModuleNotifications', c), onToggle: (c) => changeSetting('newModuleNotifications', c),
isToggled: () => gmSettings.get().newModuleNotifications isToggled: () => gmSettings.newModuleNotifications
}, },
{ {
@ -158,7 +158,7 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: '#settings.items.goosemod_badges.note#', subtext: '#settings.items.goosemod_badges.note#',
onToggle: (c) => changeSetting('gmBadges', c), onToggle: (c) => changeSetting('gmBadges', c),
isToggled: () => gmSettings.get().gmBadges isToggled: () => gmSettings.gmBadges
}, },
{ {
@ -319,7 +319,7 @@ export default (goosemodScope, gmSettings, Items) => {
onToggle: (c) => { onToggle: (c) => {
changeSetting('placeholderimage', c); changeSetting('placeholderimage', c);
}, },
isToggled: () => gmSettings.get().placeholderimage isToggled: () => gmSettings.placeholderimage
}, },
{ {
@ -331,7 +331,7 @@ export default (goosemodScope, gmSettings, Items) => {
onToggle: (c) => { onToggle: (c) => {
changeSetting('collapsiblehome', c); changeSetting('collapsiblehome', c);
}, },
isToggled: () => gmSettings.get().collapsiblehome isToggled: () => gmSettings.collapsiblehome
}, },
{ {
@ -372,7 +372,7 @@ export default (goosemodScope, gmSettings, Items) => {
changeSetting('attrs', c); changeSetting('attrs', c);
refreshPrompt(); refreshPrompt();
}, },
isToggled: () => gmSettings.get().attrs isToggled: () => gmSettings.attrs
}, },
{ {
@ -386,7 +386,7 @@ export default (goosemodScope, gmSettings, Items) => {
changeSetting('snippets', c); changeSetting('snippets', c);
refreshPrompt(); refreshPrompt();
}, },
isToggled: () => gmSettings.get().snippets isToggled: () => gmSettings.snippets
}, },
{ {
@ -400,7 +400,18 @@ export default (goosemodScope, gmSettings, Items) => {
changeSetting('allThemeSettings', c); changeSetting('allThemeSettings', c);
refreshPrompt(); refreshPrompt();
}, },
isToggled: () => gmSettings.get().allThemeSettings isToggled: () => gmSettings.allThemeSettings
},
{
type: 'toggle',
experimental: true,
text: 'Patcher > Username | Next',
subtext: 'Potenetial next version of Username API: Inner patching of MessageHeader for going into Username-likely component',
onToggle: (c) => gmSettings.username_next = c,
isToggled: () => gmSettings.username_next
}, },
/* { /* {
@ -457,13 +468,13 @@ export default (goosemodScope, gmSettings, Items) => {
subtext: 'Shows some debug toasts on some events', subtext: 'Shows some debug toasts on some events',
onToggle: (c) => changeSetting('debugToasts', c), onToggle: (c) => changeSetting('debugToasts', c),
isToggled: () => gmSettings.get().debugToasts isToggled: () => gmSettings.debugToasts
}, */ }, */
{ type: 'gm-footer' } { type: 'gm-footer' }
]); ]);
if (gmSettings.get().separators && !gmSettings.get().home) goosemodScope.settings.createSeparator(); if (gmSettings.separators && !gmSettings.home) goosemodScope.settings.createSeparator();
let sortedVal = '#store.options.sort.stars#'; let sortedVal = '#store.options.sort.stars#';
let authorVal = '#store.options.author.all#'; let authorVal = '#store.options.author.all#';
@ -764,8 +775,8 @@ export default (goosemodScope, gmSettings, Items) => {
} }
]); ]);
if (gmSettings.get().changelog) { if (gmSettings.changelog) {
if (gmSettings.get().separators) goosemodScope.settings.createSeparator(); if (gmSettings.separators) goosemodScope.settings.createSeparator();
goosemodScope.settings.createItem('#terms.changelog#', [""], async () => { goosemodScope.settings.createItem('#terms.changelog#', [""], async () => {
GoosemodChangelog.show(); GoosemodChangelog.show();

@ -79,7 +79,7 @@ export default async (goosemodScope) => {
return (parentEl.classList.contains(className) && parentEl) || findClassInParentTree(parentEl, className, depth + 1); return (parentEl.classList.contains(className) && parentEl) || findClassInParentTree(parentEl, className, depth + 1);
}; };
let expanded = goosemodScope.settings.gmSettings.get().collapsiblehome ? (goosemod.storage.get('goosemodHomeExpanded') || true) : true; let expanded = goosemodScope.settings.gmSettings.collapsiblehome ? (goosemod.storage.get('goosemodHomeExpanded') || true) : true;
let settings = { let settings = {
plugins: goosemodScope.settings.items.find((x) => x[1] === '#terms.store.plugins#'), plugins: goosemodScope.settings.items.find((x) => x[1] === '#terms.store.plugins#'),
@ -160,7 +160,7 @@ export default async (goosemodScope) => {
} }
}; };
const snippetsEnabled = goosemodScope.settings.gmSettings.get().snippets; const snippetsEnabled = goosemodScope.settings.gmSettings.snippets;
goosemodScope.settingsUninjects.push(goosemodScope.patcher.patch(ConnectedPrivateChannelsList, 'default', (_args, res) => { goosemodScope.settingsUninjects.push(goosemodScope.patcher.patch(ConnectedPrivateChannelsList, 'default', (_args, res) => {
if (res.props.children.slice(3).find((x) => x?.toString()?.includes('GooseMod'))) return; if (res.props.children.slice(3).find((x) => x?.toString()?.includes('GooseMod'))) return;
@ -189,7 +189,7 @@ export default async (goosemodScope) => {
className: HeaderClasses.headerText className: HeaderClasses.headerText
}, 'GooseMod'), }, 'GooseMod'),
goosemodScope.settings.gmSettings.get().collapsiblehome ? React.createElement('div', { goosemodScope.settings.gmSettings.collapsiblehome ? React.createElement('div', {
className: `${HeaderClasses.privateChannelRecipientsInviteButtonIcon} ${IconClasses.iconWrapper} ${IconClasses.clickable}`, className: `${HeaderClasses.privateChannelRecipientsInviteButtonIcon} ${IconClasses.iconWrapper} ${IconClasses.clickable}`,
style: { style: {

@ -1,6 +1,6 @@
import sleep from '../../util/sleep'; import sleep from '../../util/sleep';
import * as GMSettings from '../../gmSettings'; import GMSettings from '../../gmSettings';
export const gmSettings = GMSettings; export const gmSettings = GMSettings;
import addToHome from './home/index'; import addToHome from './home/index';
@ -149,8 +149,8 @@ export const makeGooseModSettings = () => {
addBaseItems(goosemodScope, gmSettings, Items); addBaseItems(goosemodScope, gmSettings, Items);
addToSettingsSidebar(goosemodScope, gmSettings); addToSettingsSidebar(goosemodScope, gmSettings);
addToContextMenu(goosemodScope, gmSettings.get().home); addToContextMenu(goosemodScope, gmSettings.home);
if (gmSettings.get().home) addToHome(goosemodScope); if (gmSettings.home) addToHome(goosemodScope);
loadColorPicker(); loadColorPicker();
}; };

@ -104,7 +104,7 @@ return class Card extends React.PureComponent {
React.createElement(SmallMediaCarousel, { React.createElement(SmallMediaCarousel, {
autoplayInterval: 0, autoplayInterval: 0,
items: (this.props.images?.[0] ? this.props.images : [ (goosemod.settings.gmSettings.get().placeholderimage ? '/assets/2366391afb15ed6c2a019a0c0caa0797.svg' : 'data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=') ]).map((x) => ({ type: 1, src: x })), items: (this.props.images?.[0] ? this.props.images : [ (goosemod.settings.gmSettings.placeholderimage ? '/assets/2366391afb15ed6c2a019a0c0caa0797.svg' : 'data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=') ]).map((x) => ({ type: 1, src: x })),
paused: true, paused: true,
onCurrentItemClick: () => { onCurrentItemClick: () => {

@ -13,7 +13,7 @@ export default (goosemodScope, gmSettings) => {
sections.splice( sections.splice(
sections.indexOf(logout), 0, sections.indexOf(logout), 0,
...goosemodScope.settings.items.filter((x) => (gmSettings.get().home ? x[1] !== '#terms.store.plugins#' && x[1] !== '#terms.store.themes#' && x[1] !== '#terms.store.snippets#': true) && (!gmSettings.get().snippets ? x[1] !== '#terms.store.snippets#' : true)).map((i) => { ...goosemodScope.settings.items.filter((x) => (gmSettings.home ? x[1] !== '#terms.store.plugins#' && x[1] !== '#terms.store.themes#' && x[1] !== '#terms.store.snippets#': true) && (!gmSettings.snippets ? x[1] !== '#terms.store.snippets#' : true)).map((i) => {
switch (i[0]) { switch (i[0]) {
case 'item': case 'item':
let id = i[1]; let id = i[1];

@ -90,7 +90,7 @@ document.head.appendChild(styleSheet);
export default (text, options = {}) => { export default (text, options = {}) => {
if (options?.type?.startsWith('debug')) { if (options?.type?.startsWith('debug')) {
if (!goosemod.settings.gmSettings.get().debugToasts) return; if (!goosemod.settings.gmSettings.debugToasts) return;
options.type = options.type.replace('debug', ''); options.type = options.type.replace('debug', '');
} }

@ -8,33 +8,35 @@ export const setThisScope = (scope) => {
export const patch = (generateElement) => { export const patch = (generateElement) => {
const MessageHeader = goosemodScope.webpackModules.find((x) => x.default && !x.default.displayName && x.default.toString().indexOf('headerText') > -1); const MessageHeader = goosemodScope.webpackModules.find((x) => x.default && !x.default.displayName && x.default.toString().indexOf('headerText') > -1);
/* Advanced-ish patching inside of Username but glitched and overcomplicated // Advanced-ish patching inside of Username but glitched and overcomplicated
return PatcherBase.patch(MessageHeader, 'default', (_args, res) => { if (goosemod.settings.gmSettings.username_next) {
const header = goosemod.reactUtils.findInReactTree(res, el => Array.isArray(el?.props?.children) && el.props.children.find(c => c?.props?.message)); return PatcherBase.patch(MessageHeader, 'default', (_args, res) => {
const [ Username ] = header.props.children; const header = goosemod.reactUtils.findInReactTree(res, el => Array.isArray(el?.props?.children) && el.props.children.find(c => c?.props?.message));
const [ Username ] = header.props.children;
PatcherBase.patch(Username, 'type', (_args, res) => {
const [ , Inner ] = res.props.children; PatcherBase.patch(Username, 'type', (_args, res) => {
const [ , Inner ] = res.props.children;
PatcherBase.patch(Inner.props, 'children', (_args, res) => {
res.props.children = [ PatcherBase.patch(Inner.props, 'children', (_args, res) => {
res.props.children, res.props.children = [
generateElement(Username.props) res.props.children,
]; generateElement(Username.props)
];
return res;
return res;
});
}); });
return res;
}); });
}
return res;
}); */
return PatcherBase.patch(MessageHeader, 'default', (_args, res) => { return PatcherBase.patch(MessageHeader, 'default', (_args, res) => {
const header = goosemod.reactUtils.findInReactTree(res, el => Array.isArray(el?.props?.children) && el.props.children.find(c => c?.props?.message)); const header = goosemod.reactUtils.findInReactTree(res, el => Array.isArray(el?.props?.children) && el.props.children.find(c => c?.props?.message));
header.props.children.push(generateElement(header.props.children[0].props)); header.props.children.push(generateElement(header.props.children[0].props));
return res; return res;
}); });
}; };

Loading…
Cancel
Save