Corestone

Configuration

All settings are in plugins/CoreStatus/config.yml, with comments in English and Polish. Run /corestatus reload after a change: it applies everything, the language and the intervals included.

Colours are written in quotes as "#rrggbb". Without the quotes YAML reads the # as a comment.

A value that cannot be used is replaced by its default, and the console (and /corestatus reload) says which key and what to fix in one sentence. A file that is not valid YAML gives the defaults for everything. Neither stops the plugin, and the messages never quote your file, so a webhook token does not end up in the console.

On a proxy the first start writes a different file, see Network mode.

Top level

Key Default Allowed What it does
language en en, pl Language of the messages in Discord and of the command answers. Anything else gives en.
footer true true, false The small print "Status by Corestone • corestone.dev" under every message. false hides it.

The status message: status

One message, sent the first time and then edited in place. After a restart it keeps editing the same message. If the message was deleted in Discord, a new one is posted.

Key Default Allowed What it does
status.enabled true true, false Turns the status message on or off. The other features keep working.
status.webhook empty a Discord webhook address Where the status goes. Empty: nothing is sent, and the console asks you to fill it in. A value that is not a Discord webhook address (it starts with https://discord.com/api/webhooks/) is ignored with a warning.
status.interval-seconds 60 whole number, 30 or more How often the message is refreshed. Below 30 it is raised to 30, because Discord limits faster edits.
status.title empty text Title of the message. Empty: "📊 Server status" or "📊 Status serwera", from the messages file.
status.description empty text, up to 1000 characters A line of your own under the title, for example a welcome or how to join. Empty: no line. A longer text is cut, with a warning in the console.
status.color-online "#57F287" "#rrggbb" Colour of the message while the server is online.
status.color-offline "#ED4245" "#rrggbb" Colour while it is offline.
status.icon empty an https:// address of an image A small picture in the corner of the message. Empty: none. Any other kind of value is ignored, with a warning in the console.
status.show.online true true, false The "Online" line (with the uptime, when that is on). An offline message always says "Offline".
status.show.players true true, false Players online as {players}/{max}.
status.show.player-list 10 whole number, 0 or more List up to this many nicknames, then "+N more". 0: no list. Nicknames reach Discord whenever this is above 0, which includes the default. A very long list is shortened so that the message always fits in Discord; the "+N more" then counts every name left out.
status.show.tps true true, false TPS with one decimal, behind a coloured circle.
status.show.mspt true true, false Milliseconds per tick. Only Paper and Purpur measure it; on Folia and Spigot the line is left out.
status.show.uptime true true, false How long the server has been running, in the online line: "Online for 2 d 3 h 14 min". It needs status.show.online.
status.show.version true true, false The server software and version, like Paper 1.21.4.
status.show.address empty text, or false An address players can copy, for example play.example.com. Empty or false: not shown.

The lines are grouped under three headers: Players (the count and the list), Performance (TPS and MSPT) and Server (version and address). A header whose lines are all switched off under status.show, or that the server cannot fill (Spigot has no MSPT, an unknown version), is left out together with them. Every status message ends with "Last update", a time that Discord shows in the time zone of whoever reads it. Values are shown as code, headers in bold.

A message with everything on (and a status.description set) looks like this:

📊 Server status
Come on in! The status refreshes every minute.

🟢 Online for 4 h 12 min

👥 Players
» Online: 12/100
» Steve, Alex, Notch, Jeb, Dinnerbone +7 more

⚙️ Performance
» TPS: 🟢 20.0
» MSPT: 1.6 ms

🖥️ Server
» Version: Paper 1.21.4
» Address: play.example.com

Last update: 1 minute ago

When the server stops, the message turns red and says since when, with a time Discord shows in the time zone of the reader:

📊 Server status
🔴 Offline since 14:32
The server is down. This message updates by itself when it is back.

🖥️ Server
» Address: play.example.com

Last update: 3 minutes ago

The "Server" part is there only when status.show.address is set.

TPS colours

The TPS is the average of the last minute, at most 20. The circle depends on the value as shown (one decimal):

Circle TPS
green 18 or more
yellow 15 or more, below 18
red below 15

On Paper and Purpur the server tells the TPS. On Spigot, and on Folia (its global region), CoreStatus counts the ticks itself.

Start and stop: start-stop

A short message when the server starts and when it stops. When the server stops, the status is first edited to "Offline", then "Server stopped" is posted. CoreStatus waits up to 5 seconds for Discord, so a slow Discord never holds up the stop.

After a crash CoreStatus has no chance to say goodbye. On the next start it posts "Server was offline since" with the time of the last sign of life, before "Server started". It does so when the last sign of life is older than two status intervals. A clean stop never triggers it.

Key Default Allowed What it does
start-stop.enabled true true, false Turns it on or off.
start-stop.webhook empty a Discord webhook address Own webhook for these messages. Empty: the one from status.webhook.
start-stop.color "#5865F2" "#rrggbb" Colour of the message.

Joins and leaves: join-leave

A message when a player joins or leaves. It is off by default because it sends player nicknames to Discord. Players in vanish are not announced.

Key Default Allowed What it does
join-leave.enabled false true, false Turns it on or off.
join-leave.webhook empty a Discord webhook address Own webhook for these messages. Empty: the one from status.webhook.
join-leave.max-per-minute 20 whole number, 1 or more At most this many messages a minute. The rest are counted and posted as one summary, "and N more", at the end of the minute.
join-leave.color-join "#57F287" "#rrggbb" Colour of a join message.
join-leave.color-leave "#99AAB5" "#rrggbb" Colour of a leave message, and of the summary.

Low TPS: low-tps

One warning when the TPS stays below a value for some minutes. After that there is no second warning until the TPS has come back to the value or above and dropped again. With the defaults: below 15 for 5 minutes.

The TPS is checked at every status refresh, so the warning comes after the first low reading plus the minutes you set. The check runs even when status.enabled is false.

Key Default Allowed What it does
low-tps.enabled true true, false Turns it on or off.
low-tps.webhook empty a Discord webhook address Own webhook for the warning. Empty: the one from status.webhook.
low-tps.threshold 15 a number above 0 Warn when the TPS is below this value.
low-tps.minutes 5 whole number, 1 or more ...for this many minutes in a row.
low-tps.color "#FEE75C" "#rrggbb" Colour of the warning.

More than one webhook

Each feature can post to its own channel through its own webhook. An empty webhook means the one from status.webhook. If that is empty too, the feature sends nothing.

A public channel and a staff channel. The status and the start and stop messages are made to be read by players, so a public channel suits them. The low-TPS warning, and the join and leave messages if you turn them on, are for the staff: create a second webhook in a staff channel and put it in low-tps.webhook (and join-leave.webhook). While those are empty, the messages go to the status channel, and so to the public. /corestatus test and /corestatus status list every address that is set, once each, whether its feature is on or not.

If you change the status address, CoreStatus posts a new status message there. The old message stays where it was: delete it in Discord.

Network mode: Velocity and BungeeCord

On a proxy the first start writes plugins/CoreStatus/config.yml for the network message. It has language, status, network and footer. The sections start-stop, join-leave and low-tps do not exist there: each server behind the proxy announces its own events with its own CoreStatus.

On the proxy only five keys of status are used, and they style the network message:

Key Default Allowed What it does
status.title empty text Title. Empty: "🌐 Network status" or "🌐 Status sieci".
status.description empty text, up to 1000 characters A line of your own under the title. Empty: no line.
status.color-online "#57F287" "#rrggbb" Colour while every listed server is online.
status.color-offline "#ED4245" "#rrggbb" Colour while at least one is offline.
status.icon empty an https:// address of an image A small picture in the corner.

The network message itself:

Key Default Allowed What it does
network.enabled false true, false Turns the network message on. It is off by default: set the webhook first.
network.webhook empty a Discord webhook address Where the message goes. Empty: nothing is sent, and the console asks you to fill it in.
network.interval-seconds 60 whole number, 30 or more How often the message is refreshed. Below 30 it is raised to 30.
network.total true true, false Show the number of players on the listed servers that are online.
network.servers two examples, lobby and survival a list of id and label The servers to show, in this order.
network:
  enabled: true
  webhook: "https://discord.com/api/webhooks/123/abc…"
  servers:
    - id: lobby
      label: "Lobby"
    - id: survival
      label: "Survival"
  • id must be the name of the server in the proxy's own config: the name under [servers] in Velocity's velocity.toml, or under servers in BungeeCord's config.yml. Write it as it is there. A name the proxy does not know is left out of the message, and the console says so once.
  • label is the name shown in Discord. Empty: the id.
  • Online or offline comes from the proxy pinging the server (it waits 10 seconds at most). The number of players is the number of players the proxy has connected to that server.

A network message looks like this:

🌐 Network status
👥 Players on the network: 19
🟢 Lobby » 12 players • TPS 🟢 20.0
🟢 Survival » 7 players • TPS —
🔴 Creative » offline

Last update: 1 minute ago

Offline servers keep their place in the list, in the order of network.servers.

TPS on the network

A proxy cannot measure TPS. Each backend server tells it:

  • CoreStatus must be installed on the backend server, with the same jar. It needs no webhook for this.
  • The backend sends its TPS once per status.interval-seconds (its own interval, 60 by default), through a player who is connected to it. So at least one player must be online on that server. Without a player nothing can be sent.
  • The proxy shows the TPS as long as the last report is not older than two intervals of network.interval-seconds. After that, and for a server that never reported, it shows a dash (—). To avoid a dash flickering between reports, keep the backend's interval at most twice the proxy's.

When the proxy stops, the message is edited to show every server offline.

Changing the texts

Every text CoreStatus writes comes from messages_en.yml or messages_pl.yml, according to language. They are inside the jar. To change a text:

  1. Create plugins/CoreStatus/messages_en.yml (or messages_pl.yml).
  2. Put in it only the keys you want to change. The others keep their built-in text.
  3. Run /corestatus reload.
status:
  title: "Our survival server"
event:
  joined: "{player} came online"

Keep the {variables} as they are: the plugin fills them in. A key the plugin does not know is ignored.

Keys Variables
status.online-for {uptime}
status.offline-since {time}, a Discord timestamp (time of day) shown in the reader's time zone
status.players {players}, {max}
status.player-list {names}, the nicknames, ending in status.more when there are more players than the list holds
status.more {count}
status.tps {tps}, the value with its coloured circle, already in code
status.mspt {mspt}
status.version {version}
status.address {address}
status.updated {time}, a Discord timestamp shown in the reader's time zone
event.joined, event.left {player}
event.was-offline {time}
event.and-more {count}
event.low-tps {tps}, {threshold}, {minutes}
network.total {players}
network.server-online {server}, {players} (the count with its noun, from network.players), {tps} (with its circle, already in code)
network.players.one, .other (Polish: .one, .few, .many) {count}
network.server-offline {server}
command.test-ok {name}
command.test-failed {name}, {reason}
command.status-header {version}
command.status-line {name}, {time}, {state}
console.config-warning {warning}

The other keys (for example footer, status.title, status.online, status.offline, status.offline-note, status.section-players, status.section-performance, status.section-server, event.started, event.stopped, event.test, network.title, network.unknown-tps, command.usage, command.reloaded, command.admincontrol and console.no-webhook) take no variables. Reports of failed sends in the console are always in English.

The emoji, the bold markers and the backticks around the values are part of the texts, so you can change or remove them. A value between backticks is shown by Discord as code.