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).

Note

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]).

ChannelReachWriteRequirementChat log
Globalnormal chat, local to the serverchat or /chat global–CHAT
Slowlike Global, with a per-player delay (chat.slow-seconds)/chat slow–SLOW
Localonly players nearby (chat.local.radius, default 20 blocks, same world). While Local is active, all other channels are muted/localchat or /chat localeternal.chat.localLOCAL
Teamnetwork-wide to everyone with eternal.team/tc <Text> or /chat teameternal.teamTEAM
Clannetwork-wide to your own clan/cc <Text> or /chat clanmodule clans, clan memberCLAN
Partynetwork-wide to your own party/pc <Text> or /chat partymodule party, in a partyPARTY
Group ([Gruppe])network-wide to the private group/gr <Text> or /chat groupmember of a groupGROUP
Private/msg, /reply/msg <Spieler> <Text>recipient has „Private Nachrichten“ ("Private messages") onMSG
18+network-wide to verified players, no filter/18 <text> or /18age check by the team, see 18+ chatADULT

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

CommandAliasesPermissionDescription
/chat [Kanal]/channel, /channels, /kanal–Open the menu or switch the active channel
/localchat [on|off]/lc, /local, /lokal, /umkreiseternal.chat.localLocal mode on/off
/teamchat <Text>/tc, /staffchat, /sceternal.teamWrite 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.globalmuteLock Global and Slow network-wide
/colors/colours, /farben–Shows the colour codes you may use
/msg <Spieler> <Text>/tell, /w, /whispereternal.base.msgPrivate message
/reply <Text>/reternal.base.msgReply

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

PermissionDefault levelEffect
eternal.chat.ownerAdminGlobal messages reach everyone, including players who have hidden Global
eternal.chat.globalmuteAdmin/globalmute
eternal.chat.globalmute.bypassTeamCan write despite global mute
eternal.chat.slow.bypassTeamNo waiting time in slow chat
eternal.base.msg.bypassTeamReaches 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.

PermissionDefault levelCodes
eternal.chat.colorTeam&0–&9, &a–&f
eternal.chat.color.hexTeam&#RRGGBB, any colour (from 1.16)
eternal.chat.formatTeam&l bold, &m strikethrough, &n underline, &o italic, &r reset
eternal.chat.magicAdmin&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)
  • /msg and /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):

CategoryDefault actionPointsExamples
Beleidigung (insult)Block3slurs against a person, "kill yourself", "your mother …"
Hassrede / Diskriminierung (hate speech)Block6racist and homophobic terms, Nazi slogans
Sexuelles (sexual)Block4porn, sex and body terms
Unangebrachte Wörter (swearing)Censor1swear words like "shit"
Werbung (advertising)Block2other 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

TabWhat 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:

  1. The player asks with /18 antrag [note], e.g. /18 antrag Discord: name#1. The team is told in game.
  2. The team checks the age outside Eternal, e.g. an ID in a Discord ticket.
  3. Under Moderation → 18+ Freigaben the team verifies or denies, each with a note. Verifying directly by name works without a request too.
  4. Within 30 seconds the player can use /18. Who, when and why is kept. Revoking removes the player from the channel at once.
CommandEffect
/1818+ chat on/off as your channel: plain chat goes there
/18 <text>one message into the 18+ chat
/18 an · /18 auschannel on, or back to the normal chat
/18 antrag [note]ask to be verified
/18 statuswhere 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.

Warning

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. Permission eternal.web.chatlogs.sensitive (default level Admin, requires eternal.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, requires core. The command only exists if chatlog or socialspy is running on the server.
  • /socialspy [on|off] (alias /spy), permission eternal.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-format in 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 in plugin.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-network is set to false.