Deepslate Studios
SlateChat

Configuration

Every option in config.yml, channels.yml and the other module config files.


All of SlateChat's config files support MiniMessage and MineDown formatting, plus any PlaceholderAPI expansion you have installed. Each module has its own file so you're never staring at options you don't use.

config.yml

Global messages, plus the switches that turn each module on or off.

# Sent when a player lacks permission for a channel or command
no_permission: '<red>You do not have permission!'

# Sent to the sender with how many players saw their message
amount_readed: '<dark_purple><amount> players saw your message!'
no_one: '<red>No one readed your message! :c'

# Console-only / usage messages
players_only: '<red>Only players can execute this command!'
channel_command_usage: '<red>Usage: /ch <channel>'
channel_usage_message: '<red>Usage: /<command> <message>'
channel_changed: '<green>Channel changed to <channelName> - <channelCommand>'
invalid_channel: '<red>Invalid channel!'
plugin_reloaded: '<green>Plugin reloaded.'

# Update checker messages (see modules.update_checker below)
# Placeholders: <version> - the newer version found, <current> - the version you're running
update_available: '<yellow>A new SlateChat version (<green><version></green>) is available! You are running <red><current></red>.'
update_up_to_date: "<green>You're already running the latest version (<current>)."
update_check_failed: '<red>Could not reach GitLab to check for updates. Try again later.'
# Console-only, logged on startup. Placeholders: <version>, <current>, <url>
update_console_log: 'A new version (<version>) is available! You are running <current>. Download: <url>'

# Mirror every chat message to console
log_to_console: true
console_log: '[<channel>] <player>> <message>'

modules:
  chatcolor: true # Lets players pick their own chat color with /chatcolor
  discordsrv: true # Detect DiscordSRV and bridge channel messages to it
  discordsrv_send: false # Forward chat to DiscordSRV, per-channel (off by default, avoids duplicates)
  itemsadder: true # ItemsAdder compatibility: resolve its :name: font images in chat (no-op without ItemsAdder)
  update_checker: true # Check GitLab for a newer release on startup (async, fail-silent)
  focus: true # Let players lock to a default channel with /ch
  filter: true # Word filtering (blocked_words / replace)

  chatformat:
    spam:
      enable: false
      limit: 10 # Max repeated characters before a message is blocked
      message: '<green>Message canceled because contain spam.'
    flood:
      enable: false # Block sending the same message twice in a row
      message: '<green>You cannot send a message like the previous message.'
    lowercase: false # Force messages to lowercase
    title_format: false # Force-capitalize the first letter of every message

Picking which channel goes to Discord

With discordsrv_send: true, a SlateChat channel is only forwarded if its name is a key in DiscordSRV's own Channels option (plugins/DiscordSRV/config.yml) — e.g. Channels: {"global": "123456789"} forwards only the global channel, and anything left out simply isn't sent. If DiscordSRV's own built-in chat listener is also relaying raw vanilla chat regardless of channel, set DiscordChatChannelMinecraftToDiscord: false in DiscordSRV's config so SlateChat's per-channel forwarding is the only path to Discord.

ItemsAdder compatibility

With itemsadder: true (the default), any :name: font image ItemsAdder registers — emoji, rank/prefix badges (including one set via %luckperms_prefix%), custom icons — resolves through ItemsAdder's own FontImageWrapper.replaceFontImages() API wherever SlateChat renders text, including that font image's permission, if it has one set in ItemsAdder's config. Nothing to configure on ItemsAdder's side, it just needs to be installed and enabled. See the formatting guide for the syntax.

channels.yml

Defines every channel. Keys must be unique, and local is the default channel new players start in — don't remove it.

local:
  format: '<yellow>[Local] <yellow><player><blue><bold>> <yellow>%chat_color%<message>'
  command: 'l'
  enable: true
  broadcast: false
  radius: 200
  restrict: false
  actionbar: true
  permission: chat.local

global:
  format: '<gray>[Global] <gray><player><blue><bold>> <gray>%chat_color%<message>'
  command: 'g'
  broadcast: true
  radius: 0
  restrict: false
  actionbar: false
  permission: chat.global

Prefixes/suffixes are opt-in

The default formats above don't depend on LuckPerms — add placeholders like %luckperms_prefix% directly into a channel's format if you want ranks shown, resolved through PlaceholderAPI.

KeyMeaning
formatThe message format. Supports <player>, <message>, PAPI placeholders and %chat_color%
commandWhat /ch <command> matches, alongside the channel's name
enableOnly used on local — whether the default channel is active
broadcastIf true, ignores radius and reaches every online player
radiusBlock radius the message reaches when broadcast is false. 0 means same world only
restrictIf true, only players with permission can use this channel
actionbarShow the sender an action bar read receipt for this channel
permissionNode checked when restrict is true, and reported by /ch tab-completion

Add as many extra channels as you want under this file, they all support the same keys as global.

color.yml

Backs the /chatcolor command.

enable_rgb: true # Allow hex colors; disable to only accept legacy codes
clear_keywords:
  - 'clear'
  - 'remove'
  - 'reset'

only_players: '<red>Avaliable only for players!'
no_permission: '<red>You do not have permission!'
no_arg: '<red>Type an color! /chatcolor #<color>'
invalid: '<red>Type an valid hex color! /chatcolor #<color>'
removed: '<green>Your chat color was removed!'
success: '<green>The color of your chat was changed to %chat_color%this<green>.'

filter.yml

Word filtering. Matching is case-insensitive.

# Censored (replaced with asterisks) wherever they appear
blocked_words:
  - 'bitch'
  - 'damn'

# left->right replacement, e.g. every "barney" becomes "swarley"
replace:
  - 'barney->swarley'

focus.yml

Forces players into a channel while they're in specific worlds, regardless of what they last picked with /ch.

worlds:
  - dummy:global

Each entry is world:channel — replace dummy with a real world name and global with the channel you want enforced there.

On this page