Compare commits

...

4 Commits

Author SHA1 Message Date
フズキ 15f2479e94
Corrected heading levels in settings, removed warning on text input 2021-05-22 23:14:32 +02:00
フズキ 2f5538a480
Added module development introduction 2021-05-22 23:03:16 +02:00
フズキ 18cd7e1595
Updated module settings for GMv8.5.0 amd GMv8.6.0 2021-05-22 23:02:54 +02:00
フズキ 70bd71b4e2
Ruby update 2021-05-22 22:57:50 +02:00
4 changed files with 240 additions and 74 deletions

View File

@ -205,12 +205,16 @@ GEM
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6) mercenary (0.3.6)
mini_portile2 (2.5.1)
minima (2.5.1) minima (2.5.1)
jekyll (>= 3.5, < 5.0) jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9) jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1) jekyll-seo-tag (~> 2.1)
minitest (5.14.4) minitest (5.14.4)
multipart-post (2.1.1) multipart-post (2.1.1)
nokogiri (1.11.1)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
nokogiri (1.11.1-x86_64-linux) nokogiri (1.11.1-x86_64-linux)
racc (~> 1.4) racc (~> 1.4)
octokit (4.20.0) octokit (4.20.0)
@ -254,6 +258,7 @@ GEM
zeitwerk (2.4.2) zeitwerk (2.4.2)
PLATFORMS PLATFORMS
ruby
x86_64-linux x86_64-linux
DEPENDENCIES DEPENDENCIES

View File

@ -47,7 +47,7 @@ sort: <number>
Before pushing your edits to the documentation, you may want to see what they Before pushing your edits to the documentation, you may want to see what they
look like. To do so, you need to: look like. To do so, you need to:
- have a local [Ruby](https://www.ruby-lang.org) environment - have a local [Ruby](https://www.ruby-lang.org) 2.7 environment
- install the `bundler` and `jekyll` gems - install the `bundler` and `jekyll` gems
`gem install bundler jekyll` `gem install bundler jekyll`
- install this project's specific requirements: - install this project's specific requirements:

View File

@ -0,0 +1,129 @@
---
title: Introduction
sort: 1
---
# Starting out making GooseMod modules
## Module structure
### Manifest file
The manifest file contains the metadata for your module. Its name is `goosemodModule.json`.
```json
{
"main": "",
"name": "",
"description": "",
"tags": ["", ""],
"authors": ["", ""],
"version": ""
}
```
- `main`: Main file of your module.
- `name`: Name of your module.
- `description`: Description of your module.
- `tags`: List of tags for your module.
- `authors`: List of authors (Discord IDs).
- `version`: Version of your module (semver).
### Main
Your main file will probably have your main definitions, but the only mandatory definition is the exported object:
```js
export default {
gooseHandlers: {
onImport: () => {
// Will be ran when your module is installed or on every GM load.
},
onRemove: () => {
// Will be ran when your module is uninstalled or disabled.
// Clean up everything here.
},
},
};
```
### Other files
You can separate your code in multiple files using ES module syntax.
## Testing your module
Once you have reached a point when you want to test your module, you'll want to run the development server. You can get it by cloning the [GooseMod/MS2Builder](https://github.com/GooseMod/MS2Builder) github repository.
You can then run the developement server with the following command, in the repository's directory:
`node src/dev.js <modules_dir> <port>`, replacing `<modules_dir>` with the directore in which you have your modules and `<port>` with the port to serve on.
An exemple `<modules_dir>` structure would be:
- `modules/`
- `module-1/`
- `goosemodModule.json`
- `index.js`
- `module-2/`
- `goosemodModule.json`
- `main.js`
- ...
- ...
## Local modules
```note
Local modules are currently a non-supported feature, but you could use [this method](#custom-repository) to have your own repository, or use the [development](#testing-your-module) server, although you need to launch it every time.
```
## Publishing your modules
### Official repository
Publishing to the official repository can be asked for on the [GooseNest Discord server](https://goosemod.com/discord).
### Custom repository
You can make your own repository by taking [GooseMod/MS2Builder](https://github.com/GooseMod/MS2Builder) as a base.
The first step is to clean up the repository definitions. Remove the files you don't need from the followin and remove all entries from those you kept:
- `src/modules/goosemod.js`: GooseMod modules (you will probably want to keep this one, just saying).
- `src/modules/ms2porter.js`: Ported GM MS1 modules (you won't need this one).
- `src/modules/ports/plugins/pcPlugins.js`: Powercord plugins auto-ports.
- `src/modules/ports/themes/bdThemes.js`: BetterDiscord themes auto-ports.
- `src/modules/ports/themes/pcThemes.js`: Powercord themes auto-ports.
To finish cleaning up, edit `src/modules/index.js`. This file contains the metadata for each generated repository. Remove the entries related to the files you previously removed, as well as the related imports at the top of the file.
Now that you've cleared everything unneeded out, you can start setting your repository up:
- Edit the module lists in the files you kept. The format for a single module is:
```js
[
'Github/repository', // Example: 'GooseMod/GMExampleModule'
'ref (commit hash, branch or tag)', // Example: 'main' (recommended to use a commit hash for safety,
// if left clear uses the default branch)
'path to module', // [OPTIONAL] Example: '/path/to/module'
'preprocessor (undefined for GM modules)', // [OPTIONAL] Example: 'pcPlugin' (used for autoports)
{} // [OPTIONAL] Metadata override (see goosemodModule.json)
]
```
- Edit the repository metadata in `src/modules/index.js`:
- `meta`:
- `name`: Name of the repository shown in the repository list in GooseMod.
- `description`: Description in the repository shown in the repository list in GooseMod.
- `filename`: Name of the generated repository definition file.
- `modules`: Object containing module definitions, use imports to keep the file clean.
Add a file named `gh_pat.js` in the `src/` directory, with the following content:
```js
export default "ghp_randomstuff"; // replace with an actual Github Personal Access Token
```
You can now buid your repository/repositories by running `node src/index.js` from the base directory of the MS2Builder clone.
If all went well, there should have been no errors in the building process. If there were errors you can ask for support on the [GooseNest Discord server](https://goosemod.com/discord), on the `#module-dev` channel.
You now have the necessary files for hosting the repository in `dist/`. You can just serve the directory directly, or you could make a repository like `GooseMod/MS2Builder`'s to host your repositories and built files, or even go a step further and setup CI/CD. That's all on you though.

View File

@ -7,22 +7,15 @@ sort: 2
## Accessing the GooseMod settings interface ## Accessing the GooseMod settings interface
The GooseMod settings interface can be accessed in your modules by importing The GooseMod settings interface can be accessed in your modules by importing `@goosemod/settings`. You can extend Discord's settings with more categories, pages, and other elements by importing the right procedures.
`@goosemod/settings`. You can extend Discord's settings with more categories,
pages, and other elements by importing the right procedures.
## Adding a new settings page ## Adding a new settings page
When GooseMod loads all modules, it first creates a new category called When GooseMod loads all modules, it first creates a new category called `GooseMod Modules`, so that all modules thereafter add their settings under this category by default.
`GooseMod Modules`, so that all modules thereafter add their settings under
this category by default.
Adding your own settings page is pretty straightforward: once your module has Adding your own settings page is pretty straightforward: once your module has been completely loaded it will call its defined `onLoadingFinished` prodedure, all that's needed to add a page is call `createItem` from the settings import.
been completely loaded it will call its defined `onLoadingFinished` prodedure,
all that's needed to add a page is call `createItem` from the settings import.
Do remember to remove the settings pages you add when your module gets disabled Do remember to remove the settings pages you add when your module gets disabled though.
though.
First import `createItem`: First import `createItem`:
@ -41,11 +34,9 @@ createItem('Page name', [
## Removing a settings page ## Removing a settings page
When your module is disabled, it should undo all modifications made, to When your module is disabled, it should undo all modifications made, to restore the state of Discord prior to when it was enabled.
restore the state of Discord prior to when it was enabled.
[Adding a settings page](#adding-a-new-settings-page) was easy enough, but [Adding a settings page](#adding-a-new-settings-page) was easy enough, but removing one is even easier.
removing one is even easier.
First add `removeItem` to your imports from `@goosemod/settings`: First add `removeItem` to your imports from `@goosemod/settings`:
@ -61,12 +52,9 @@ removeItem('Page name');
## Types of settings fields ## Types of settings fields
Settings fields are objects, each having a `type` property defining its type, Settings fields are objects, each having a `type` property defining its type, a `text` property defining the field's text.
a `text` property defining the field's text.
Most fields also have a `subtext` property to add additional information if Most fields also have a `subtext` property to add additional information if needed, for example: precising the default values of your settings. The way you would define a fields subtext is like so:
needed, for example: precising the default values of your settings. The way
you would define a fields subtext is like so:
```js ```js
{ {
@ -78,8 +66,7 @@ you would define a fields subtext is like so:
### Divider field ### Divider field
A simple divider to separate your fields. Most other fields already add a A simple divider to separate your fields. Most other fields already add a divider, so needing one is a more specific use case. They are defined like so:
divider, so needing one is a more specific use case. They are defined like so:
```js ```js
{ {
@ -88,19 +75,16 @@ divider, so needing one is a more specific use case. They are defined like so:
``` ```
```note ```note
Divider fields **do not** use the `subtext` property. However they have a Divider fields **do not** use the `subtext` property. However they have a `text` property.
`text` property.
``` ```
```warning ```warning
The divider field's `text` property has not yet been experimented with The divider field's `text` property has not yet been experimented with and documented.
and documented.
``` ```
### Header field ### Header field
Header fields let you make categories in your settings page, they are defined Header fields let you make categories in your settings page, they are defined like so:
like so:
```js ```js
{ {
@ -126,8 +110,7 @@ Text fields let you write text without user controls, they are defined like so:
### Button field ### Button field
Button fields let you add simple buttons to launch actions, they are defined Button fields let you add simple buttons to launch actions, they are defined like so:
like so:
```js ```js
{ {
@ -144,15 +127,11 @@ Buttons do not use the `subtext` property.
``` ```
```note ```note
Button fields are pretty bare and only simple buttons. If you use them, you may Button fields are pretty bare and only simple buttons. If you use them, you may want to add a [text field](#text-field) before to explain their function and a [divider field](#divider-field) afterwards to properly separate them from the following fields.
want to add a [text field](#text-field) before to explain their function and a
[divider field](#divider-field) afterwards to properly separate them from the
following fields.
``` ```
```tip ```tip
Given that button fields are so bare, I'd recommend using Given that button fields are so bare, [text-button fields](#text-button-field) may be more appropriate for your use case.
[text-button fields](#text-button-field) in most cases.
``` ```
#### Text-Button field #### Text-Button field
@ -172,14 +151,12 @@ They are defined like so:
``` ```
```note ```note
Unlike [button fields](#button-field), text-button fields include a Unlike [button fields](#button-field), text-button fields include a [divider field](#divider-field), so you don't need to add one after.
[divider field](#divider-field), so you don't need to add one after.
``` ```
#### Text-Button-Danger field #### Text-Button-Danger field
Exactly like the [text-button field](#text-button-field), but the button has Exactly like the [text-button field](#text-button-field), but the button has the danger styling (red). They are defined like so:
the danger styling (red). They are defined like so:
```js ```js
{ {
@ -193,14 +170,12 @@ the danger styling (red). They are defined like so:
``` ```
```note ```note
Due to the design language surrounding them, you should only use these if the Due to the design language surrounding them, you should only use these if the action could have impactful consequences.
action could have impactful consequences.
``` ```
### Toggle field ### Toggle field
Toggle fields let you make on/off switches for your basic settings, they are Toggle fields let you make on/off switches for your basic settings, they are defined like so:
defined like so:
```js ```js
{ {
@ -218,9 +193,7 @@ defined like so:
#### Toggle-Text-Button field #### Toggle-Text-Button field
A [toggle field](#toggle-field) with a small [button](#button-field), or a A [toggle field](#toggle-field) with a small [button](#button-field), or a [text-button field](#text-button-field) with a [toggle switch](#toggle-field). They are defined like so:
[text-button field](#text-button-field) with a [toggle switch](#toggle-field).
They are defined like so:
```js ```js
{ {
@ -242,8 +215,7 @@ They are defined like so:
#### Toggle-Text-Button-Danger #### Toggle-Text-Button-Danger
Exactly like the [toggle-text-button field](#toggle-text-button-field), but Exactly like the [toggle-text-button field](#toggle-text-button-field), but the button has the danger styling (red). They are defined like so:
the button has the danger styling (red). They are defined like so:
```js ```js
{ {
@ -264,14 +236,12 @@ the button has the danger styling (red). They are defined like so:
``` ```
```note ```note
Due to the design language surrounding them, you should only use these if the Due to the design language surrounding them, you should only use these if the action could have impactful consequences.
action could have impactful consequences.
``` ```
### Colour field ### Colour field
Colour fields let you make colour pickers for your settings, they are defined Colour fields let you make colour pickers for your settings, they are defined like so:
like so:
```js ```js
{ {
@ -291,43 +261,105 @@ like so:
The colour picker doesn't support alpha channel (opacity) yet. The colour picker doesn't support alpha channel (opacity) yet.
``` ```
### Card field ### Text input field
```warning Text input fields let you get text input for more complex needs. They are defined like so:
Not yet experimented with or documented.
```
### Search field ```js
{
```warning type: "text-input",
Not yet experimented with or documented. text: "Description",
``` initialValue: () => "Initial value",
oninput: (value, element) => {
### Sidebar field // Do something.
}
```warning }
Not yet experimented with or documented.
``` ```
### Custom field ### Custom field
Custom fields only support a single property: `element`. They are defined like Custom fields only support a single property: `element`. They are defined like so:
so:
```js ```js
{ {
type: "custom", type: "custom",
element: (() => { element: () => {
// Return a DOM element // Return a DOM element
let e = document.createElement("span"); let e = document.createElement("span");
e.innerText = "Custom Element"; e.innerText = "Custom Element";
return e; return e;
})() }
} }
``` ```
```note ```note
Custom fields can be used to make any kind of field that is not built into `element` can be a DOM element or a function that will be called and expected to return the element.
GooseMod. For example, [here is a procedure building a text input field](https://github.com/NovaGM/Modules/blob/master/settings-experiment/custom-settings.js#L1).
``` ```
```note
Custom fields can be used to make any kind of field that is not built into GooseMod.
For example, [here is a procedure building a text input field](https://github.com/NovaGM/Modules/blob/master/comfy-theme/custom-settings.js#L1) made when there was no [text input field](#text-input) yet.
```
### Internal fields
These fields are used internally by GooseMod for specific uses. You may reuse them, but you'll want to do your own research and testing.
#### Card field
Can be seen in the module and theme stores, each entry has a card.
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L697-L1126).
```warning
Not yet experimented with or documented.
```
#### Search field
Can be seen in the module and theme stores.
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L1128-L1203).
```warning
Not yet experimented with or documented.
```
#### Sidebar field
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L1205-L1309).
```warning
Not yet experimented with or documented.
```
#### Dropdown fields
##### Dropdown field
Dropdown field to offer multipple defined choices. Can be seen in the GooseMod settings page, to force select a language.
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L1450-L1520).
```warning
Not yet experimented with or documented.
```
##### Inline dropdown field
Dropdown field to offer multipple defined choices, designed to be used side by side. Can be seen in the module and theme stores.
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L1392-L1448).
```warning
Not yet experimented with or documented.
```
#### GM footer
Footer for the GooseMod settings page.
Defined [here](https://github.com/GooseMod/GooseMod/blob/master/src/ui/settings.js#L1321-L1390).
```note
Not intended for use in modules.
```