Configuring

The config files

plugins/ChorusCore/
├── config.yml            storage, economy, language, confirmations, metrics,
│                         staff log, updates
├── aliases.yml           extra names for every command
├── palette.yml           the colours every line is written in
├── messages/             every line the plugin sends, one file per part of it
│   ├── menus.yml         every word that appears on a screen
│   └── es/               the same in Spanish, and a folder per language after it
├── motd.txt              what players read as they join, and on /motd
├── info.txt              the chapters behind /info
├── chorus.db             the database, when storage is sqlite
└── modules/
    ├── homes.yml
    ├── warps.yml
    ├── spawn.yml
    ├── teleport.yml
    ├── utility.yml
    ├── economy.yml
    ├── shops.yml
    ├── chat.yml
    ├── items.yml
    ├── kits.yml
    ├── world.yml
    ├── staff.yml
    ├── players.yml
    └── custom-commands.yml

The rule for finding a setting: anything about one command is in that command's module file; anything the whole plugin shares is in config.yml.

The startup check#

The plugin reads its own config when the server starts and says what will not work, with the file and the line:

[ChorusCore] 3 problems in the configuration:
  1. modules/homes.yml:142  'cooldown-second' is not an option. Did you mean 'cooldown-seconds'?
  2. modules/warps.yml:61  'DIAMOND_HELMET_X' is not a material.
  3. config.yml:98  'decimals' takes a number, not text.

It says nothing when there is nothing wrong, so a quiet start is the answer.

What it looks for#

Options that do not exist A key the plugin has no option for, with the closest real name when there is one. Inside a command block that means every option the defaults block has, plus permission
Values of the wrong kind Text where a number goes, one value where a list goes. A number written where text goes is fine — it is read as text
Materials Icons, fillers and buttons in the menu blocks, the keys of the worth list, and both sides of the condense list
Sounds A name that is not shaped like one, such as Entity Enderman Teleport
Particles One this server version does not have

The list of real options is the copy of each file inside the jar, so the check always knows the options of the version you are actually running.

Which files#

config.yml, aliases.yml and every file in modules/. The messages folder and palette.yml are not checked.

What it leaves alone#

The sections you fill in yourself, where a name the plugin has never heard of is the normal case:

  • kits.definitions
  • custom in custom-commands.yml
  • shops.worth
  • items.condense
  • homes.world-limits
  • storage.mysql.properties
  • a messages: block inside any command

The values inside them are still checked: a kit icon or a worth entry that is not a material is reported.

The lines inside requires, on-success and on-fail are not checked here either. One the plugin does not understand is named in the console when the file is read.

Worlds#

Not checked at startup, because a world another plugin creates may not exist yet at that point. /chorus check checks them: every worlds: list, every homes.world-limits entry and spawn.fallback-world.

At most 25 problems are listed at once.

Reloading#

/chorus reload            every file
/chorus reload kits       one module

The module names are homes, warps, spawn, teleport-requests, utility, economy, shops, chat, items, kits, world, staff, players and custom-commands.

A full reload takes in palette.yml and everything under messages/, so a recolour or a reworded line is live without a restart.

Three things need a full restart instead:

  1. The storage section — the connection pool is built once.
  2. aliases.yml — command names are registered with the server at startup.
  3. Adding, renaming or removing a custom command — same reason.

Changing what an existing custom command says is picked up by a reload.

config.yml#

startup-banner#

startup-banner: true

false prints one line in the console instead of the block.

storage#

storage:
  type: sqlite
  file: chorus.db
  mysql:
    host: localhost
    port: 3306
    database: chorus
    username: root
    password: ''
    pool-size: 8
    properties:
      useSSL: false
      characterEncoding: utf8
Key What it does
type sqlite for a single file in this folder, nothing to set up. mysql for MySQL or MariaDB, which is what several servers sharing data need.
file SQLite only, relative to plugins/ChorusCore/.
mysql.pool-size How many connections are held open. Eight is plenty for one server.
mysql.properties Appended to the connection URL as it is written.

See Storage for what the tables are and how migrations work.

economy#

economy:
  enabled: true
  provider: auto
  starting-balance: 0.0
  minimum-balance: 0.0
  maximum-balance: 1000000000000.0
  currency:
    symbol: "$"
    suffix: false
    decimals: 2
    singular: coin
    plural: coins
Key What it does
enabled false switches prices off entirely and leaves /pay and /balance saying so.
provider auto uses the built-in ledger unless another economy plugin registered with Vault. self always uses the built-in one. vault uses another plugin only, and ignores every price if Vault is missing. off is the same as enabled: false.
starting-balance What a brand new player has.
minimum-balance / maximum-balance A balance is never taken past either.
currency.symbol $, €, or a word.
currency.suffix true writes 100$ instead of $100.
currency.decimals 0 to 4.
currency.singular / plural The words for lines that read "5 coins".

The currency block is only used by the built-in ledger. Another economy plugin formats its own money its own way.

language#

language:
  default: ''
  per-player: false

default: '' is English — the files directly inside messages/. default: es gives everybody messages/es/. per-player: true sends each player the folder matching their own Minecraft language instead. See Languages.

confirmations#

confirmations:
  seconds: 0

How long you have to run a command a second time to confirm it. 0, the default, asks for nothing and everything runs on the first try. Raise it to put the second step back — 15 is a reasonable window. chorus.bypass.confirm skips them whatever this says.

The commands that ask, once it is above zero: /clearinventory, /delhome, /delwarp, /sethome over a home you already have, /sweep of a whole world, a payment over economy.confirm-above, and both importers.

metrics#

metrics: true

Sends the server version, the storage type, the economy mode and how many modules are on to bStats. No player data of any kind. false sends nothing.

staff-log#

staff-log:
  enabled: true
  keep-days: 60
  page-size: 10

Writes down freezing and unfreezing, /sudo, /lockdown, /tempfly, notes and every /eco. Read it with /stafflog. keep-days: 0 keeps entries for ever, which on a busy server means a table that only ever grows. page-size maximum is 50.

updates#

updates:
  check: true
  source: spigot
  project: '138794'
  url: ''
  notify-staff: true
Key What it does
check false never asks anybody anything.
source modrinth, hangar, spigot or plain.
project The project on that site. For spigot it is the number in the resource URL. Empty switches the check off.
url Only read when source: plain — a page of your own that answers with nothing but a version number.
notify-staff Tells anybody holding chorus.updates as they join. The console is told either way.

It is a plain request for a version number, once at startup and once a day. Nothing is downloaded, nothing is installed, and nothing about this server is sent — not the address, not the player count, not even the version being run. Every failure is quiet: a site that is down, a renamed project or a server with no internet all end with no answer and no line in the console.

Module files#

Every module file has the same shape:

enabled: true          # switches off every command in this file

<module>:              # settings that belong to the module as a whole
  ...

commands:
  defaults: ...        # what every command below inherits
  <command>: ...       # what that one does differently

The commands half is the same everywhere and is documented once, in Per-command rules. The settings half differs per module and is documented on that module's own page.

Where every setting lives#

Setting File
Home limits, the homes menu, per-world home caps modules/homes.yml
Per-warp permissions, warp sorting, [Warp] signs modules/warps.yml
First-join spawn, respawn behaviour, per-world spawns modules/spawn.yml
Warmups, /back history, safe landing, request timeout modules/teleport.yml
Service signs, /trash size, /near radius, /invsee refresh, motd on join modules/utility.yml
Payment limits, /baltop size, the payment log modules/economy.yml
Sell prices, the sell multiplier, chest shop rules modules/shops.yml
Mail retention and inbox size, social spy modules/chat.yml
Item restrictions, /condense recipes, inventory backups modules/items.yml
The kits themselves, the kit menu, the editor screen modules/kits.yml
Per-world permissions, /spawnmob limit, auto-sweep modules/world.yml
Auto-AFK, nickname length, GeoIP modules/players.yml
Your own /discord and /rules modules/custom-commands.yml

modules/staff.yml holds no settings of its own: everything staff-related is a per-command rule or a permission.

Text is the exception to that rule: it lives in messages/ rather than beside the setting it belongs to — see Messages and translations. What a screen says is in messages/menus.yml; how many rows it has and which items it uses are still in the module file.