Define settings using blueprints.

This commit is contained in:
Pachira 2024-04-17 17:26:33 +00:00
parent cf71bab92d
commit 58d4bfb948
3 changed files with 122 additions and 63 deletions

View file

@ -82,54 +82,54 @@ window.Umi = { UI: {}, Protocol: { SockChat: { Protocol: {} } } };
const settings = new MamiSettings('umi-', ctx.events.scopeTo('settings'));
ctx.settings = settings;
settings.define('style', 'string', 'dark');
settings.define('compactView', 'boolean', false);
settings.define('autoScroll', 'boolean', true);
settings.define('closeTabConfirm', 'boolean', false);
settings.define('showChannelList', 'boolean', false);
settings.define('fancyInfo', 'boolean', true);
settings.define('autoCloseUserContext', 'boolean', true);
settings.define('enableParser', 'boolean', true);
settings.define('enableEmoticons', 'boolean', true);
settings.define('autoParseUrls', 'boolean', true);
settings.define('preventOverflow', 'boolean', false);
settings.define('expandTextBox', 'boolean', false);
settings.define('eepromAutoInsert', 'boolean', true);
settings.define('autoEmbedV1', 'boolean', false);
settings.define('soundEnable', 'boolean', true, false, true);
settings.define('soundPack', 'string', 'ajax-chat');
settings.define('soundVolume', 'number', 80);
settings.define('soundEnableJoin', 'boolean', true);
settings.define('soundEnableLeave', 'boolean', true);
settings.define('soundEnableError', 'boolean', true);
settings.define('soundEnableServer', 'boolean', true);
settings.define('soundEnableIncoming', 'boolean', true);
settings.define('onlySoundOnMention', 'boolean', false);
settings.define('soundEnableOutgoing', 'boolean', true);
settings.define('soundEnablePrivate', 'boolean', true);
settings.define('soundEnableForceLeave', 'boolean', true);
settings.define('minecraft', ['no', 'yes', 'old'], 'no');
settings.define('windowsLiveMessenger', 'boolean', false);
settings.define('seinfeld', 'boolean', false);
settings.define('flashTitle', 'boolean', true);
settings.define('showServerMsgInTitle', 'boolean', true);
settings.define('onlyConnectWhenVisible', 'boolean', true);
settings.define('playJokeSounds', 'boolean', true);
settings.define('weeaboo', 'boolean', false);
settings.define('motivationalImages', 'boolean', false);
settings.define('motivationalVideos', 'boolean', false);
settings.define('osuKeys', 'boolean', false);
settings.define('osuKeysV2', ['no', 'yes', 'rng'], 'no');
settings.define('explosionRadius', 'number', 20);
settings.define('dumpPackets', 'boolean', FUTAMI_DEBUG);
settings.define('dumpEvents', 'boolean', FUTAMI_DEBUG);
settings.define('marqueeAllNames', 'boolean', false);
settings.define('tmpDisableOldThemeSys', 'boolean', false, false, true);
settings.define('style').default('dark').create();
settings.define('compactView').default(false).create();
settings.define('autoScroll').default(true).create();
settings.define('closeTabConfirm').default(false).create();
settings.define('showChannelList').default(false).create();
settings.define('fancyInfo').default(true).create();
settings.define('autoCloseUserContext').default(true).create();
settings.define('enableParser').default(true).create();
settings.define('enableEmoticons').default(true).create();
settings.define('autoParseUrls').default(true).create();
settings.define('preventOverflow').default(false).create();
settings.define('expandTextBox').default(false).create();
settings.define('eepromAutoInsert').default(true).create();
settings.define('autoEmbedV1').default(false).create();
settings.define('soundEnable').default(true).critical().create();
settings.define('soundPack').default('ajax-chat').create();
settings.define('soundVolume').default(80).create();
settings.define('soundEnableJoin').default(true).create();
settings.define('soundEnableLeave').default(true).create();
settings.define('soundEnableError').default(true).create();
settings.define('soundEnableServer').default(true).create();
settings.define('soundEnableIncoming').default(true).create();
settings.define('onlySoundOnMention').default(false).create();
settings.define('soundEnableOutgoing').default(true).create();
settings.define('soundEnablePrivate').default(true).create();
settings.define('soundEnableForceLeave').default(true).create();
settings.define('minecraft').type(['no', 'yes', 'old']).default('no').create();
settings.define('windowsLiveMessenger').default(false).create();
settings.define('seinfeld').default(false).create();
settings.define('flashTitle').default(true).create();
settings.define('showServerMsgInTitle').default(true).create();
settings.define('onlyConnectWhenVisible').default(true).create();
settings.define('playJokeSounds').default(true).create();
settings.define('weeaboo').default(false).create();
settings.define('motivationalImages').default(false).create();
settings.define('motivationalVideos').default(false).create();
settings.define('osuKeys').default(false).create();
settings.define('osuKeysV2').type(['no', 'yes', 'rng']).default('no').create();
settings.define('explosionRadius').default(20).create();
settings.define('dumpPackets').default(FUTAMI_DEBUG).create();
settings.define('dumpEvents').default(FUTAMI_DEBUG).create();
settings.define('marqueeAllNames').default(false).create();
settings.define('tmpDisableOldThemeSys').default(false).critical().create();
const noNotifSupport = !('Notification' in window);
settings.define('enableNotifications', 'boolean', false, noNotifSupport, true);
settings.define('notificationShowMessage', 'boolean', false, noNotifSupport);
settings.define('notificationTriggers', 'string', '', noNotifSupport);
settings.define('enableNotifications').default(false).immutable(noNotifSupport).critical().create();
settings.define('notificationShowMessage').default(false).immutable(noNotifSupport).create();
settings.define('notificationTriggers').default('').immutable(noNotifSupport).create();
loadingOverlay.setMessage('Loading sounds...');

View file

@ -10,7 +10,7 @@ const MamiSettingsScoped = function(settings, prefix) {
prefix += ':';
return {
define: (name, type, fallback, immutable, critical) => settings.define(prefix + name, type, fallback, immutable, critical),
define: name => settings.define(prefix + name),
info: name => settings.info(prefix + name),
names: () => {
const filtered = [];

View file

@ -108,26 +108,85 @@ const MamiSettings = function(storageOrPrefix, eventTarget) {
}
};
const pub = {
define: (name, type, fallback, immutable, critical, virtual) => {
if(typeof name !== 'string')
throw 'setting name must be a string';
if(typeof type !== 'string' && !Array.isArray(type))
throw 'type must be a javascript type or array of valid string values.';
const settingBlueprint = function(name) {
if(typeof name !== 'string')
throw 'setting name must be a string';
const checkDefined = () => {
if(settings.has(name))
throw `setting ${name} has already been defined`;
};
settings.set(name, Object.freeze({
name: name,
type: type === null ? undefined : type,
fallback: fallback === undefined ? null : fallback,
immutable: immutable === true,
critical: critical === true,
}));
checkDefined();
if(virtual === true)
storage.virtualise(name);
},
let created = false;
let type = undefined;
let fallback = null;
let immutable = false;
let critical = false;
let virtual = false;
const checkCreated = () => {
if(created)
throw 'setting has already been created';
};
const pub = {
type: value => {
if(typeof value !== 'string' && !Array.isArray(value))
throw 'type must be a javascript type or array of valid string values.';
checkCreated();
type = value;
return pub;
},
default: value => {
checkCreated();
fallback = value === undefined ? null : value;
if(type === undefined)
type = typeof fallback;
return pub;
},
immutable: value => {
checkCreated();
immutable = value === undefined || value === true;
return pub;
},
critical: value => {
checkCreated();
critical = value === undefined || value === true;
return pub;
},
virtual: value => {
checkCreated();
virtual = value === undefined || value === true;
return pub;
},
create: () => {
checkCreated();
checkDefined();
settings.set(name, Object.freeze({
name: name,
type: type,
fallback: fallback,
immutable: immutable,
critical: critical,
}));
if(virtual)
storage.virtualise(name);
},
};
return pub;
};
const pub = {
define: name => new settingBlueprint(name),
info: name => getSetting(name),
names: () => Array.from(settings.keys()),
has: name => {