# 🖼️ MOTD

> **Info:**
This module is configured in **modules/motd.yml** inside the PhoenixLobby folder.

## MOTD

The MOTD is what anyone who has your server saved sees in their list before joining: two lines of text, an icon, and the player count next to them. Open it from **Editor > Modules > MOTD**.

Everything here is read fresh on every ping, so an edit shows up the next time the list refreshes without a restart.

Behind a proxy the ping never reaches the lobby, so this module stands down and the network motd is served from BungeeCord or Velocity, where the same options live in its **config.yml**. See [MOTD behind a proxy](../set-up/setup-with-proxy.md#motd).

## Messages

With this option, you can edit the message itself. Each entry is one variant of two lines, and one of them is picked at random every time somebody pings the server, so a list of four means four different messages your players can land on. Adding a variant, and editing or removing an existing one, is all done from here.

<figure><img src="../.gitbook/assets/motd-messages/add-motd.png" alt="" width="563"><figcaption><p>MOTD (Add MOTD)</p></figcaption></figure>

## Server Icon

With this option, you can change the icon shown next to the message. Drop a 64x64 png into the **servericons** folder inside the plugin folder and write its name here, without the `.png`. A larger image is scaled down for you. Leaving it empty keeps the server's own `server-icon.png`.

<figure><img src="../.gitbook/assets/motd/server-icon.png" alt="" width="563"><figcaption><p>MOTD (Server Icon)</p></figcaption></figure>

## Player Count

> **Info:**
This module is configured in **modules/motd.yml** inside the PhoenixLobby folder, under `player-count`.

By default the server list shows the real numbers, and hovering them lists a sample of who is online. Every part of that can be overridden or hidden here. Open it from **Editor > Modules > MOTD > Player Count**.

<figure><img src="../.gitbook/assets/motd/player-count.png" alt="" width="563"><figcaption><p>MOTD (Player Count)</p></figcaption></figure>

Leaving an option empty keeps the real value, so only what you actually fill in is replaced.

### Player Count Text

With this option, you can replace the two numbers with free text, which is what a server showing `Open!` or a queue length in that spot is doing.

<figure><img src="../.gitbook/assets/player-count/player-count-text.png" alt="" width="563"><figcaption><p>Player Count (Player Count Text)</p></figcaption></figure>

> **Warning:**
The client only draws text there when it thinks the server is a version it cannot join, so filling this in also puts the red incompatible-version marker on your entry in the list. Leave it empty if you would rather keep the normal numbers.

### Online Players

With this option, you can override the first number. A placeholder that resolves to something other than a number is ignored and the real count is used, which leaves vanished staff out.

<figure><img src="../.gitbook/assets/player-count/online-players.png" alt="" width="563"><figcaption><p>Player Count (Online Players)</p></figcaption></figure>

### Max Players

With this option, you can override the second number, which is otherwise the slot count from **server.properties**.

<figure><img src="../.gitbook/assets/player-count/max-players.png" alt="" width="563"><figcaption><p>Player Count (Max Players)</p></figcaption></figure>

### Extra Players

With this option, you can report the maximum as however many players are online plus this amount, so the server never looks full no matter how busy it gets. It is ignored while **Max Players** is set, since that one wins.

<figure><img src="../.gitbook/assets/player-count/extra-players.png" alt="" width="563"><figcaption><p>Player Count (Extra Players)</p></figcaption></figure>

### Hover Lines

With this option, you can replace the player sample that appears when the count is hovered with lines of your own. It is the one place in the list where more than two lines of text fit, which is what makes it useful for a rules note or a vote link.

<figure><img src="../.gitbook/assets/player-count/hover-lines.png" alt="" width="563"><figcaption><p>Player Count (Hover Lines)</p></figcaption></figure>

### Hide Players

With this option, you can drop the count from the ping entirely, so nothing is drawn where the numbers usually are.

<figure><img src="../.gitbook/assets/player-count/hide-players.png" alt="" width="563"><figcaption><p>Player Count (Hide Players)</p></figcaption></figure>

### Hide Hover

With this option, you can remove the hover list without touching the numbers, which keeps the count honest while keeping your players' names off it.

<figure><img src="../.gitbook/assets/player-count/hide-hover.png" alt="" width="563"><figcaption><p>Player Count (Hide Hover)</p></figcaption></figure>

> **Warning:**
**Player Count Text**, **Online Players**, **Hover Lines**, **Hide Players** and **Hide Hover** need [Paper](https://papermc.io/) or a fork of it, because Spigot's ping event cannot express any of them. On plain Spigot the module says so once on startup and applies what is left: the message, the icon, **Max Players** and **Extra Players**.

Every [MOTD placeholder](#placeholders) works in these options as well. While a maintenance is running, its own [player count and hover messages](maintenance.md#player-count-message) take over when they are turned on.

## Feature State

With this option, you can turn the MOTD off completely, which hands the message, the icon and the count back to the ones in **server.properties**.

<figure><img src="../.gitbook/assets/motd/feature-state.png" alt="" width="563"><figcaption><p>MOTD (Feature State)</p></figcaption></figure>

## Placeholders

The message, the server icon name and every player count option accept placeholders, from the name of whoever is pinging to the current date. PlaceholderAPI placeholders also work.

A name nobody recognises is left in the message exactly as you wrote it, so a stray `{` never eats the rest of the line.

### Player

Nobody is logged in when a ping arrives, so these come from the last player seen on that address. On a first-ever ping from an unknown address they resolve empty.

| Placeholder                | Returns                              |
| -------------------------- | ------------------------------------ |
| `{player name}`            | Name of the last player from that IP |
| `{player uuid}`            | Their UUID                           |
| `{player protocol}`        | Client protocol number               |
| `{player version}`         | Client version name                  |
| `{player hasPlayedBefore}` | `true` / `false`                     |
| `{player isBanned}`        | `true` / `false`                     |
| `{player isWhitelisted}`   | `true` / `false`                     |

### Server

| Placeholder                  | Returns                   |
| ---------------------------- | ------------------------- |
| `{server playersOnline}`     | Current player count      |
| `{server playersMax}`        | Slot count                |
| `{server host}`              | Address the client pinged |
| `{server whitelistEnabled}`  | `true` / `false`          |
| `{server version}`           | Server version            |

`{server playersOnline}` leaves vanished staff out, and on a proxy it is the whole network rather than one backend.

### Maintenance

| Placeholder                        | Returns                          |
| ---------------------------------- | -------------------------------- |
| `{maintenance maintenanceEnabled}` | `true` / `false`                 |
| `{maintenance timer}`              | Time left until maintenance ends |

See [Maintenance](maintenance.md) for what puts the server into that state.

### Date

`{date current}` prints the server's clock, and the three comparisons answer `true` or `false` so they can be fed into a [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) condition to swap a message around a date.

The results below are what a ping arriving on 24/12/2026 at 18:30 would produce.

| Placeholder                           | Example result        |
| ------------------------------------- | --------------------- |
| `{date current}`                      | `24/12/2026 18:30:00` |
| `{date current dd/MM/yyyy}`           | `24/12/2026`          |
| `{date current HH:mm}`                | `18:30`               |
| `{date current EEEE}`                 | `Thursday`            |
| `{date current 'Day' D 'of' yyyy}`    | `Day 358 of 2026`     |
| `{date isBefore 25/12/2026 00:00:00}` | `true`                |
| `{date isAfter 2026-12-01}`           | `true`                |
| `{date isExact 24/12/2026 18:30:00}`  | `true`                |

The pattern after `current` is a [Java date pattern](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html), and anything wrapped in single quotes inside it is printed as written. A pattern that cannot be read falls back to `dd/MM/yyyy HH:mm:ss`.

The date the three comparisons take is written either as `dd/MM/yyyy HH:mm:ss`, or as `2026-12-25` for midnight on that day. A date that cannot be read answers `false` rather than breaking the message.

> **Info:**
`{date isExact}` is true for the whole minute you name, since the seconds are ignored on both sides. A ping landing at `18:30:41` still matches `18:30:00`.

### Proxy

Behind a proxy the ping never reaches this server, so the MOTD has to be set in the PhoenixLobby proxy **config.yml** under `motds.motd` instead. Everything above works there too, with three differences.

| Placeholder                    | Returns                           |
| ------------------------------ | --------------------------------- |
| `{proxy status <server>}`      | Whether that backend is reachable |
| `{proxy players <server>}`     | Players on that backend           |
| `{proxy maxPlayers <server>}`  | Slot count of that backend        |

`{proxy players <server>}` leaves vanished staff out as well, unless that backend has no PhoenixLobby on it to report who is hidden.

`{maintenance maintenanceEnabled}` and `{maintenance timer}` take an optional server name on the proxy, so `{maintenance timer lobby}` answers for that backend rather than the whole network.

`{player isBanned}`, `{player isWhitelisted}` and `{server whitelistEnabled}` have no proxy equivalent and are not available there.

> **Warning:**
The older `${player name}` spelling, with a dollar in front, still resolves, so an existing setup keeps working. New messages should use `{player name}`.

Source: https://www.phoenixplugins.com/docs/phoenix-lobby/modules/motd