Chat, channels, chat logs & Social Spy
This page covers three areas: the chat channels (part of core), the network-wide chat logs (module chatlog) and Social Spy (module socialspy).
License: the chat channels are part of core and therefore of the free base by default (like punishments, reports, lobby). chatlog and socialspy need an EternalSystem license. Which modules are free can change – the dashboard shows locked modules grayed out.
Chat channels
Every player has one active channel for writing (normal chat goes there) and any number of channels they receive. /chat opens the channel menu: left-click = write in this channel, right-click = receiving on/off. Every message carries its channel tag ([G], [Slow], [Team], [Clan], [Party], [Gruppe], [MSG]).
| Channel | Reach | Write | Requirement | Chat log |
|---|---|---|---|---|
| Global | normal chat, local to the server | chat or /chat global | – | CHAT |
| Slow | like Global, with a per-player delay (chat.slow-seconds) | /chat slow | – | SLOW |
| Local | only players nearby (chat.local.radius, default 20 blocks, same world). While Local is active, all other channels are muted | /localchat or /chat local | eternal.chat.local | LOCAL |
| Team | network-wide to everyone with eternal.team | /tc <Text> or /chat team | eternal.team | TEAM |
| Clan | network-wide to your own clan | /cc <Text> or /chat clan | module clans, clan member | CLAN |
| Party | network-wide to your own party | /pc <Text> or /chat party | module party, in a party | PARTY |
Group ([Gruppe]) | network-wide to the private group | /gr <Text> or /chat group | member of a group | GROUP |
| Private | /msg, /reply | /msg <Spieler> <Text> | recipient has „Private Nachrichten“ ("Private messages") on | MSG |
| 18+ | network-wide to verified players, no filter | /18 <text> or /18 | age check by the team, see 18+ chat | ADULT |
Short forms for /chat <Kanal>: g, s, l/lc/lokal, t/tc/staff, c/cc, p/pc, gr.
Local chat
/localchat (aliases /lc, /local, /lokal, /umkreis) turns local mode on and, the second time, off again; /localchat on|off sets it explicitly. When you leave it, you write in the channel you had active before. In the channel menu, Local sits next to Global and Slow; a left-click also turns it on and off.
chat:
local:
radius: 20 # blocks
keep-private: true # /msg still arrives in local mode (false = really everything off)
Owner messages in the Global channel (eternal.chat.owner) still reach everyone, including players in local mode. If nobody nearby is listening, the sender gets a notice.
Commands
| Command | Aliases | Permission | Description |
|---|---|---|---|
/chat [Kanal] | /channel, /channels, /kanal | – | Open the menu or switch the active channel |
/localchat [on|off] | /lc, /local, /lokal, /umkreis | eternal.chat.local | Local mode on/off |
/teamchat <Text> | /tc, /staffchat, /sc | eternal.team | Write a single message in team chat |
/partychat <Text> | /pc | – | Write a single message in party chat |
/groupchat <Text> | /gr | – | Write a single message in group chat |
/group create [Name] | /gruppe | – | Create a private group |
/group invite <Spieler> | – | Clickable invitation, network-wide | |
/group join <Gruppe> · /group leave · /group list | – | Join (sets the active channel to Group), leave, list | |
/globalmute [on|off] | eternal.chat.globalmute | Lock Global and Slow network-wide | |
/colors | /colours, /farben | – | Shows the colour codes you may use |
/msg <Spieler> <Text> | /tell, /w, /whisper | eternal.base.msg | Private message |
/reply <Text> | /r | eternal.base.msg | Reply |
Vanished players appear offline to everyone who cannot see them: /msg, /tell, /reply, /pay and tab completion answer „Spieler nicht gefunden“ ("Player not found").
Special permissions
| Permission | Default level | Effect |
|---|---|---|
eternal.chat.owner | Admin | Global messages reach everyone, including players who have hidden Global |
eternal.chat.globalmute | Admin | /globalmute |
eternal.chat.globalmute.bypass | Team | Can write despite global mute |
eternal.chat.slow.bypass | Team | No waiting time in slow chat |
eternal.base.msg.bypass | Team | Reaches players via /msg even if they have turned off private messages |
The global mute toggle is stored in the database; all servers pick it up within 10 seconds.
config.yml
chat:
# Seconds between two messages in slow chat
slow-seconds: 10
# Chat format with rank from Eternal Perms.
# Placeholders: {prefix} {suffix} {color} {name} {group} {message}
# Leave empty if another chat plugin should set the format.
format: "{prefix}{color}{name}{suffix} &8» &7{message}"
Channel tags and formats are in translations/<sprache>.yml (<sprache> = language): chat-tag-*, chat-team-format, chat-party-format, chat-group-format, clan-chat-format. The clan tag ([TAG]) appears before the name in Global and Slow chat.
Colours in chat
Colour codes in chat, /msg, team, clan, party and group chat only work with a permission – otherwise &a stays as typed. /colors (/farben) shows everyone what they may use, each in its colour.
| Permission | Default level | Codes |
|---|---|---|
eternal.chat.color | Team | &0–&9, &a–&f |
eternal.chat.color.hex | Team | &#RRGGBB, any colour (from 1.16) |
eternal.chat.format | Team | &l bold, &m strikethrough, &n underline, &o italic, &r reset |
eternal.chat.magic | Admin | &k scrambled characters |
Can be switched off as the feature listener:chat-colors (Server → Zuordnung).
Chat format, tab and display name
The chat format from chat.format, the rank in the tab list and the display name come from Eternal Perms. Without an Eternal Perms license, Eternal sets none of them – whatever else is installed formats instead (CloudNet-Chat, LuckPerms with a chat plugin, Essentials …). Mute, global mute, channels and colours stay active.
Chat filter
The chat filter automatically blocks or censors insults, hate speech, sexual content, swearing and advertising. It checks:
- the chat (global, slow, local)
/msgand/reply- team, clan, party and group chat
- signs and books
Everything is set in the dashboard under Moderation → Chatfilter. The 18+ chat is never filtered.
Categories (all editable, you can add your own):
| Category | Default action | Points | Examples |
|---|---|---|---|
| Beleidigung (insult) | Block | 3 | slurs against a person, "kill yourself", "your mother …" |
| Hassrede / Diskriminierung (hate speech) | Block | 6 | racist and homophobic terms, Nazi slogans |
| Sexuelles (sexual) | Block | 4 | porn, sex and body terms |
| Unangebrachte Wörter (swearing) | Censor | 1 | swear words like "shit" |
| Werbung (advertising) | Block | 2 | other domains, IP addresses, Discord invites |
Actions:
- Block: the message does not go out, the player sees why.
- Censor: the word becomes
****, the rest goes out. - Log only: the message goes out, the team sees the hit.
The filter sees through the usual tricks:
- case and umlauts
- digits for letters (
4sshole) - repeated letters (
fuuuck) - split letters (
f u c k,f.u.c.k)
An entry word matches the whole word, word* its start, *word its end and *word* any part. Words on the whitelist (e.g. your server name) never match. Links and IPs use regular expressions.
Caps: a message in almost only capital letters is lowered (default: more than 70 %, from 8 letters).
Points and auto-mute
Every hit gives its category's points. 10 points within 60 minutes mute the player automatically:
- 1st time 10 minutes
- 2nd time 1 hour
- 3rd time 1 day
- then 7 days each time
Steps, limit and window are set in the dashboard (10m, 1h, 1d, 7d, perm). After an auto-mute the points start from zero. The mute shows up like any other under Aktive Strafen, reason "Chatfilter: …", issuer "Chatfilter".
A mute now also applies to team, clan, party, group and 18+ chat.
Dashboard: Moderation → Chatfilter
| Tab | What you do there |
|---|---|
| Regeln (rules) | filter on/off, what is filtered, mute limit and steps, caps, whitelist, categories with words and expressions |
| Testen (test) | type a message and see at once what the filter makes of it – unsaved changes included |
| Treffer (hits) | every hit and every auto-mute with player, channel, server and the original message |
Saved settings apply on every server within 30 seconds.
18+ chat
A network-wide channel without the filter. Only players whose age the team checked get in:
- The player asks with
/18 antrag [note], e.g./18 antrag Discord: name#1. The team is told in game. - The team checks the age outside Eternal, e.g. an ID in a Discord ticket.
- Under Moderation → 18+ Freigaben the team verifies or denies, each with a note. Verifying directly by name works without a request too.
- Within 30 seconds the player can use
/18. Who, when and why is kept. Revoking removes the player from the channel at once.
| Command | Effect |
|---|---|
/18 | 18+ chat on/off as your channel: plain chat goes there |
/18 <text> | one message into the 18+ chat |
/18 an · /18 aus | channel on, or back to the normal chat |
/18 antrag [note] | ask to be verified |
/18 status | where your request stands |
Aliases: /ue18, /adult; the channel menu (/chat) lists the 18+ chat as well. Messages go to the chat log as ADULT (filter "18+").
Language per player
Every player can choose the language of all plugin messages themselves: /settings lang <server|auto|de|en|…>. Details on the Settings page.
Chat logs (module chatlog)
The module stores chat, commands and private messages network-wide in the database and additionally in files per server. It also provides the chat history for reports.
- Module key:
chatlog(no dependencies). Enable it on every server whose chat should be logged, including the proxy. - It is also responsible for cleaning up old server logs (
log-cleanup).
chatlog:
enabled: true
directory: "chatlogs" # relative to plugins/Eternal/
log-chat: true
log-commands: true
report-context-before: 10
report-context-after: 10
report-context-window-seconds: 120
flush-interval-ticks: 40 # write interval (~2 s)
sensitive-commands: # first word without slash, case-insensitive
- "login"
- "l"
- "register"
- "reg"
- "changepassword"
- "changepass"
- "2fa"
- "authme"
socialspy-network: true
Commands from sensitive-commands are stored separately and are only visible in the dashboard with a dedicated permission.
l is in sensitive-commands by default (login plugins). With Eternal Cloud, however, /l is also a proxy command for the lobby – those calls then end up in the sensitive area as well.
Log cleanup
Runs on Spigot and proxy and deletes rotated server logs:
log-cleanup:
enabled: true
directory: logs # relative to the server folder
max-age-days: 7
interval-minutes: 120
patterns: ["*.log.gz", "*.log", "proxy.log.*"]
keep: ["latest.log"]
Dashboard: Moderation → Chat-Logs
Permission: eternal.web.chatlogs (default level Team).
- Filters: server, free-text search, time range („Von“/„Bis“, "from"/"to") and types
CHAT,COMMAND,MSG,GROUP,TEAM,CLAN,PARTY,SLOW. - Sensibler Modus ("sensitive mode"): shows only the commands from
sensitive-commands. Permissioneternal.web.chatlogs.sensitive(default level Admin, requireseternal.web.chatlogs). - The player profile (
eternal.web.player.view) contains the chat history per session.
Nicknames in the log
Log lines always store the real name. If the player was nicked, the displayed name is stored alongside it; the dashboard shows it as a purple chip „als Nickname“ ("as nickname") after the name, the files as Name (als Nick). The search also finds nicknames. Every nick session is also listed under Moderation → Nicknamen ("Nicknames", permission eternal.web.nicks). See Autonicker.
Social Spy (module socialspy)
Staff members read private messages (/msg, /reply) network-wide.
- Module key:
socialspy, requirescore. The command only exists ifchatlogorsocialspyis running on the server. /socialspy [on|off](alias/spy), permissioneternal.socialspy(default level Admin). Without an argument, it toggles.- The state is saved and reported to the proxy; with
chatlog.socialspy-network: true(default) you see messages from all servers. - Alternatively in
/settings→ Social Spy (only visible to staff members with the permission). - Format: key
socialspy-formatin the translations.
Common pitfalls
- Chat formatted twice: another chat plugin also sets the format. Without an Eternal Perms license Eternal does not format; with one, set
chat.format: ""if the other plugin should win. - Team chat is empty: only players with
eternal.team(via the rank, a wildcard such as*, or as OP) see and write in team chat. The permission is not preset inplugin.yml. - Global mute does not take effect immediately: up to 10 s delay per server.
- No chat logs in the dashboard: server and REST API must use the same MySQL database.
- Social Spy only sees its own server:
chatlog.socialspy-networkis set tofalse.