Add 'RFC: settings'
parent
69959aa5b2
commit
1709873819
113
RFC%3A-settings.md
Normal file
113
RFC%3A-settings.md
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
# Meta
|
||||||
|
Type: request for comments
|
||||||
|
Title: mod settings
|
||||||
|
|
||||||
|
|
||||||
|
# Problem domain
|
||||||
|
Every mod with rare exceptions needs to deal with variable values -- either persistent or not -- that require user input. We'll call these "settings".
|
||||||
|
Some examples of settings would be:
|
||||||
|
|
||||||
|
* Whether or not to enable particular functionality
|
||||||
|
* Preferred number of iterations of some loop
|
||||||
|
* A text string to use in certain cases
|
||||||
|
|
||||||
|
Noteably, it isn't correct to assume "settings" are what the user sees on a settings page of the club, more on that later.
|
||||||
|
|
||||||
|
It is therefore proposed to unify the code that deals with settings in a separate library so that mod authors don't have to invent and implement
|
||||||
|
their own incompatible ways to that end.
|
||||||
|
|
||||||
|
Goals and non-goals list will be discussed later, after setting more context.
|
||||||
|
|
||||||
|
|
||||||
|
# Entity analysis
|
||||||
|
Fundamentally, these entities are at play:
|
||||||
|
|
||||||
|
## Type
|
||||||
|
Javascript is dynamic and weakly typed, but it does have types. Basically, for the purposes of this document, Type is twofold:
|
||||||
|
|
||||||
|
* what actual JSON type will the value have
|
||||||
|
* how to convert a string value (text that the user will input into the chat command) into an actual setting value
|
||||||
|
|
||||||
|
## Emptiness
|
||||||
|
Whether the value can be empty or not. The language around this question is confusing, because English isn't formal, while Javascript is,
|
||||||
|
so more correct term would be "Nullableness", but it's quite unwieldy. To try to mitigate any confusion, formal emptiness will be marked
|
||||||
|
with all caps, like this: EMPTY.
|
||||||
|
|
||||||
|
The value is EMPTY if and only if one of the following is true:
|
||||||
|
|
||||||
|
* Setting doesn't exist
|
||||||
|
* Setting is null
|
||||||
|
* Setting is undefined
|
||||||
|
|
||||||
|
Noteably, zero or empty string or empty array or false aren't EMPTY values.
|
||||||
|
|
||||||
|
## Default
|
||||||
|
Often, though not always, it makes sense to have a value that is used instead of an EMPTY value. This value is a Default value.
|
||||||
|
|
||||||
|
## Validator
|
||||||
|
Tempting as it may be, defining custom types for values is unrealistic and serves no real purpose. Instead, any rules for determining
|
||||||
|
valid values withing a given type constitute a validator.
|
||||||
|
|
||||||
|
## Persistence
|
||||||
|
Whether, and how, the value will persist between the user's club sessions. More on that later.
|
||||||
|
|
||||||
|
## Setting
|
||||||
|
Bringing all of the above together, a setting is a value of a particular type with emptiness specification, an optional default value,
|
||||||
|
an optional validator, and a persistence specification.
|
||||||
|
|
||||||
|
## Element
|
||||||
|
An important part of the problem is dealing with UI/UX, including GUI. An element is a club GUI control that is associated with a setting.
|
||||||
|
|
||||||
|
## Page
|
||||||
|
Traditionally, GUI is organised using forms, but the club is much more centered around pages. A page is a collection of elements, with some
|
||||||
|
important implications that will be, again, discussed later.
|
||||||
|
|
||||||
|
## Migration
|
||||||
|
Code tends to change. New settings are added, old are discarded, things move around. One can not simply design the ultimate data structure
|
||||||
|
from the get go. Migrations declare mutations of settings scheme. Noteably, the initial state is blank, any setting there is should come from
|
||||||
|
a migration, including the ones that are essential to the mod, are declared right away and never change later. No exceptions.
|
||||||
|
|
||||||
|
|
||||||
|
# UI/UX analysis
|
||||||
|
There are three main ways users interact with the club, all of them should be well supported:
|
||||||
|
|
||||||
|
* club GUI
|
||||||
|
* chat commands
|
||||||
|
* browser console
|
||||||
|
|
||||||
|
Let's go from simple to complex.
|
||||||
|
|
||||||
|
## Browser console
|
||||||
|
The browser gives us ready to use tools for a well established interaction pattern, all that needs to exist is a set of callable functions.
|
||||||
|
Care should be taken to utilise autocomplete functionality where appropriate and affordable.
|
||||||
|
|
||||||
|
## Chat commands
|
||||||
|
Making a new command isn't a problem, the main challenge is making it easy to use, at least for people with a keyboard. Autocomplete is mandatory,
|
||||||
|
however in absence of club native functionality it is proposed to outsource its mechanical implementation to a separate library, unless ready made
|
||||||
|
options exist.
|
||||||
|
|
||||||
|
## Club GUI
|
||||||
|
On a surface level it looks like an easy problem to solve: just have a manifest with element coordinates, however there are edge cases that bring
|
||||||
|
a lot of nuance. One example would be LSCG's collar buy-in, which is custom code not easily packed into a declarative manifest. Still, from the user's
|
||||||
|
perspective the club GUI offers a well established, if quirky, pattern of interaction with, well, somewhat rich palette of elements to more or less
|
||||||
|
satisfy all common types of values. It shouldn't be hard to make use of it.
|
||||||
|
|
||||||
|
|
||||||
|
# Interoperability analysis
|
||||||
|
As we propose a library, care should be taken to make it easy to use for actual mod authors to achieve everything (well, at least a sufficient part of)
|
||||||
|
that they are now implementing independently.
|
||||||
|
|
||||||
|
## Development time
|
||||||
|
Mod authors should have access to the current API documentation, examples and typedefs in order to make use of the library.
|
||||||
|
|
||||||
|
## Load time
|
||||||
|
It is proposed to utilise FUSAM for load time dependency management, it should take care of everything, loading the library as a module and exposing it
|
||||||
|
either as a global variable, or passing it to the mods that depend on it. As FUSAM itself is under development, the particularities of the load process
|
||||||
|
is beyond the scope of this document.
|
||||||
|
|
||||||
|
## Important note to consider
|
||||||
|
This library may become a part of FUSAM itself, especially if FUSAM will make use of it.
|
||||||
|
|
||||||
|
## Run time
|
||||||
|
Having the module variable, mods can call the library API directly.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user