Home›Java›Mods›ChatCop | Auto Chat Moderation | 1.21-26.1 | Folia Support
ChatCop | Auto Chat Moderation | 1.21-26.1 | Folia Support
ModsJava

ChatCop | Auto Chat Moderation | 1.21-26.1 | Folia Support

Java mod listed for Minecraft 1.21–26.x. Downloads from the MC Java Mods app on Android.

⬇ Download on Spigot
[​IMG]
ChatCop
Smart, automatic chat moderation — spam, ads, toxicity, threats and profanity, handled for you

Spigot • Paper • Purpur • Folia | 1.20 – 1.21.x | Java 17+ | One jar, no dependencies

Discord Support: https://discord.gg/6YMprsqNTT​

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

ChatCop reads every message your players send — in chat, in private messages, on signs, in books and in anvil renames — and acts on it in real time.

The difference is the detection. Most chat plugins match words. ChatCop normalises the message first, so leet speak, symbol substitution, dots between letters, spaced-out words, repeated characters and invisible unicode all collapse down to the real text before anything is checked. n1gg3r, f.u.c.k, #n#i#g, s h i t and example (dot) com are all caught by the same rule that catches the plain spelling.

Everything runs in memory, async where it matters, with zero heavy dependencies.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

What's new in 1.1.0


Upgrading from 1.0.x? Just replace the jar. Every new option has a built-in default, so your existing config.yml keeps working — add only the keys you want to change.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Features

The five filters

Detection that does not get bypassed

Four ways to respond

Punishments that escalate on their own

Chat control

Alerts and integrations

Built for real servers

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Requirements

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Installation
  1. Drop ChatCop-1.1.0.jar into your plugins/ folder
  2. Restart the server
  3. Edit plugins/ChatCop/config.yml and run /chatcop reload

That is it — the defaults are production-ready out of the box.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Commands

Main command: /chatcop — aliases /cc and /cop


Durations: s, m, h, d, w — combinable, e.g. 1h30m — or perm for permanent.
Example: /ccmute Steve 2d Advertising

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Permissions


Note: chatcop.bypass skips the filters. It does not let a muted player talk — mutes are always enforced.

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

PlaceholderAPI


▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Configuration

Every option is commented in the file, and every option has a built-in default — so an older config keeps working after an update.

Spoiler: config.yml
Code (Text):

# ============================================================
#   ChatCop - Advanced Chat Moderation Plugin
#   Author: Abood_8001
#
#   Every option below has a built-in default, so an older
#   config.yml keeps working after an update - you only need
#   to add the keys for features you want to change.
# ============================================================

general:
  # Enable debug mode - logs filter decisions to console (disable on production)
  debug: false
  # Save all blocked messages to a log file
  log-to-file: true
  # Path to the log file (relative to the ChatCop plugin folder)
  log-file: "logs/chatcop.log"
  # Rotate the log once it passes this size, in KB. 0 disables rotation.
  log-max-size-kb: 5120
  # Silent mode - block messages without telling the sender
  silent-block: false
  # Worlds where chat filtering is skipped (e.g. staff worlds).
  # Mutes are still enforced in these worlds.
  disabled-worlds: []

# ============================================================
# UPDATE CHECKER
# Checks for a newer version on startup and tells you about it.
# It only READS the latest version number - it never downloads or
# installs anything. Runs fully async and fails silently if offline.
# ============================================================
update-checker:
  enabled: true
  # Also notify players with chatcop.admin when they join, if an update exists
  notify-admins: true
  # Where to check for the latest version: "spigot" or "modrinth"
  source: "spigot"

# ============================================================
# METRICS (bStats)
# Anonymous usage statistics. Register your plugin at bstats.org,
# then paste the service id it gives you below. Left at 0, no
# metrics are sent at all.
# ============================================================
metrics:
  enabled: true
  service-id: 0

# Plugin prefix shown in all messages (supports & color codes and &#RRGGBB hex).
# Write && for a literal ampersand.
prefix: "&8[&bChat&3Cop&8] "

# ============================================================
# PLACEHOLDERS
#
# In punishment commands (%name% form):
#   %player%   - offending player name      %punisher% - who triggered it
#   %uuid%     - offending player UUID      %reason%   - why it was flagged
#   %message%  - the offending message      %duration% - punishment duration
#   %filter%   - filter name                %world%    - world name
#
# In the messages section below, both {name} and %name% work.
# ============================================================

# ============================================================
# PUNISHMENT POINTS SYSTEM
# Every filter awards points. Points decay over time. When a player's
# total crosses a threshold, that threshold's commands run.
# This is SEPARATE from per-filter punishment commands (which run instantly).
# ============================================================
punishments:
  # How many points a player loses per minute of good behaviour
  point-decay-per-minute: 2
  # Minimum seconds between punishment commands for the same player.
  # Stops a spammer from triggering dozens of punishments in seconds.
  punishment-cooldown-seconds: 3
  thresholds:
    15:
      commands:
        - "ccwarn %player% Repeated chat violations"
    30:
      commands:
        - "tempmute %player% 10m Repeated chat violations"
    50:
      commands:
        - "tempmute %player% 1h Excessive chat violations"

# ============================================================
# CHAT CONTROL
# Server-wide controls that run before the filters.
# ============================================================
chat-control:
  # Seconds a player must wait between messages. 0 disables it.
  # Bypass: chatcop.bypass.slowmode
  slowmode-seconds: 0
  # Seconds a player must be connected before they may chat.
  # Very effective against bot raids. 0 disables it.
  # Bypass: chatcop.bypass.joindelay
  first-join-delay-seconds: 0
  # Start with chat locked (staff with chatcop.chatlock.bypass can still talk)
  locked-on-start: false

# ============================================================
# COMMAND FILTERING
# Without this, every filter is one /msg away from being bypassed.
# ============================================================
command-filter:
  enabled: true
  # Commands whose text is run through the chat filters.
  # Format "<command>:<args-before-message>" - /msg <player> <message>
  # has one argument before the message, /me <message> has none.
  filtered:
    - "msg:1"
    - "tell:1"
    - "whisper:1"
    - "w:1"
    - "m:1"
    - "t:1"
    - "r:0"
    - "reply:0"
    - "me:0"
    - "say:0"
    - "mail:1"
    - "broadcast:0"
  # Commands a muted player may not use at all.
  blocked-when-muted:
    - "msg"
    - "tell"
    - "whisper"
    - "w"
    - "m"
    - "r"
    - "reply"
    - "me"
    - "mail"
    - "say"
    - "broadcast"

# ============================================================
# EXTRA SURFACES
# The other places players can write text.
# ============================================================
extras:
  filter-signs: true
  filter-books: true
  filter-anvil: true

# ============================================================
# MUTES
# ============================================================
mutes:
  # Keep mutes across restarts
  persistent: true
  # Where mutes are stored (relative to the ChatCop plugin folder)
  storage-file: "data/mutes.yml"

# ============================================================
# PLAYER DATA
# Violation points, warning counts and history.
# ============================================================
player-data:
  # Keep them across restarts. Turn off to make them session-only.
  persistent: true

filters:

  # -- SPAM FILTER --------------------------------------------
  spam:
    enabled: true
    # Violation points awarded when this filter is triggered
    points: 4
    # How many seconds a message is remembered for duplicate checks
    duplicate-content-expiry: 8
    # How many similar messages are allowed before blocking
    duplicate-threshold: 4
    # Max number of messages allowed within the flood window
    flood-messages: 6
    # Time window in seconds to track message flooding
    flood-window: 3
    # How similar two messages must be to count as duplicate (0.0 - 1.0)
    # 1.0 = identical only, 0.8 = 80% similar
    similarity-threshold: 0.80
    # Percentage of capital letters to trigger caps warning (0 - 100)
    caps-threshold: 70
    # Minimum message length before the caps check applies
    caps-min-length: 12
    # Points awarded for excessive caps (usually lower than main points)
    caps-points: 2
    # Block messages with a character repeated too many times ("heeellooo")
    repeated-chars: true
    repeated-chars-threshold: 10
    # Catches the same line arriving from several accounts at once, which is
    # what a bot raid looks like. Per-player tracking cannot see this, because
    # each account only sends the message once.
    cross-player:
      enabled: true
      # How many different players must send it within the window
      player-threshold: 4
      # Window in seconds
      window: 10
      # How similar the messages must be (0.0 - 1.0)
      similarity: 0.90
      points: 6
    punishment:
      # Commands to run when this filter is triggered (leave empty [] for none)
      commands: []

  # -- ADVERTISING FILTER -------------------------------------
  advertising:
    enabled: true
    points: 10
    # Block raw IP addresses (e.g. 192.168.1.1)
    block-ips: true
    # Block URLs, domains and Discord invites
    block-urls: true
    # Extra domains to block. A plain word is matched as a whole word;
    # anything containing regex characters is treated as a regex.
    blocked-domains: []
    # Domains that are always allowed (put your own server domains here)
    whitelist-domains: []
    punishment:
      commands: []

  # -- TOXICITY FILTER ----------------------------------------
  toxicity:
    enabled: true
    points: 8
    # Ghost/shadow mode: flagged messages are hidden from everyone EXCEPT the
    # sender, so they think it sent fine and don't try to bypass.
    shadow-mode: false
    # Built-in list of racial and identity slurs
    block-slurs: true
    # Built-in list of sexual content (reported separately from slurs)
    block-sexual-content: true
    # Smart detection sees through leet speak, symbols and letter spacing
    smart-detection: true
    # Your own phrases. A plain word matches as a whole word, so "nega" will
    # NOT flag "negative". Use regex if you want partial matching.
    blocked-phrases: []
    # Phrases that should never be flagged by this filter
    whitelisted-phrases: []
    punishment:
      commands: []

  # -- THREAT FILTER ------------------------------------------
  threats:
    enabled: true
    points: 12
    shadow-mode: false
    blocked-phrases:
      - "i will leak your ip"
      - "i will ddos"
      - "i will doxx"
    whitelisted-phrases: []
    punishment:
      commands: []

  # -- PROFANITY FILTER ---------------------------------------
  profanity:
    enabled: true
    points: 3
    # Censor mode replaces bad words instead of blocking the message.
    # If a message can't be censored safely (spaced-out obfuscation, for
    # example) it is blocked rather than sent through uncensored.
    censor-mode: true
    # Character used to replace bad words
    censor-char: "*"
    # Points awarded when a message is censored rather than blocked
    censor-points: 1
    # How many profane words are allowed before blocking the message entirely
    max-per-message: 3
    blocked-phrases: []
    whitelisted-phrases: []
    punishment:
      commands: []

# ============================================================
# DISCORD WEBHOOK
# ============================================================
discord:
  enabled: false
  # Your Discord webhook URL (channel settings > integrations)
  webhook-url: ""
  # Also post manual staff actions (mutes, unmutes, warns)
  staff-actions: true
  # Colour for staff action embeds
  action-color: 3447003
  # Alerts are queued and sent one at a time so a spam wave doesn't
  # trip Discord's rate limit.
  send-interval-seconds: 2
  # Maximum queued alerts before the oldest are dropped
  queue-limit: 50
  filters:
    # Each filter can be individually enabled/disabled for webhook alerts.
    # Color is decimal - use https://www.spycolor.com to convert from hex.
    Spam:
      enabled: false
      color: 16776960
    Advertising:
      enabled: true
      color: 16753920
    Toxicity:
      enabled: true
      color: 16711680
    Threats:
      enabled: true
      color: 9109504
    Profanity:
      enabled: false
      color: 16755200
  # Fallback color if the filter name doesn't match any above
  default-color: 16711680
  # URL to an image shown as the footer icon (leave empty to disable)
  footer-icon: ""
  # URL to an image shown as the embed thumbnail (leave empty to disable)
  thumbnail: ""

# ============================================================
# STAFF NOTIFICATIONS (in-game alerts)
# ============================================================
notifications:
  # Send in-game alerts to players with chatcop.notify
  staff-alerts: true
  # Also announce manual staff actions (mute, unmute, warn)
  staff-action-alerts: true
  # Mirror alerts to the server console
  log-to-console: true
  # Send the alert to the offending player too (useful when testing)
  notify-offender: false
  # Trim the quoted message in alerts to this many characters
  max-message-length: 50
  alert-format: "&8[&cAlert&8] &7%player% &8| &f%filter% &8| &7\"%message%\""
  action-format: "&8[&bChatCop&8] &7%actor% &f%action% &7%target%&f %detail%"
  # Play a sound to staff when an alert is sent
  alert-sound: true
  # Either a Bukkit sound name (BLOCK_NOTE_BLOCK_PLING) or a namespaced
  # key (block.note_block.pling). Both work on every supported version.
  alert-sound-type: "BLOCK_NOTE_BLOCK_PLING"

# ============================================================
# MESSAGES
# Supports & color codes and &#RRGGBB hex. Write && for a literal &.
# Both {name} and %name% placeholders work.
# ============================================================
messages:
  blocked: "&cYour message was blocked. Reason: &f{reason}"
  censored: "&eYour message contained inappropriate language and was censored."
  muted: "&cYou are muted. &7Time remaining: &f{time} &8| &7Reason: &f{reason}"
  muted-permanent: "&cYou are permanently muted. &7Reason: &f{reason}"
  unmuted: "&aYou are no longer muted."
  warned: "&eWarning &7({count}): &f{reason}"
  mute-success: "&aMuted &f{player} &afor &f{duration}&a: &f{reason}"
  unmute-success: "&aSuccessfully unmuted &f{player}&a."
  warn-success: "&aWarned &f{player} &7({count})&a: &f{reason}"
  already-muted: "&c{player} is already muted."
  not-muted: "&c{player} is not muted."
  mute-exempt: "&c{player} cannot be muted."
  slowmode: "&cSlowmode is on. &7Wait &f{time} &7before chatting again."
  join-delay: "&cYou just joined. &7You can chat in &f{time}&7."
  chat-locked: "&cChat is currently locked by staff."
  chat-lock-on: "&cChat has been locked by staff."
  chat-lock-off: "&aChat has been unlocked."
  reload-success: "&aChatCop configuration reloaded."
  player-not-found: "&cPlayer not found: &f{player}"
  no-permission: "&cYou don't have permission to do that."
 

▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬​

Need help, or want a feature?

Join the Discord — https://discord.gg/6YMprsqNTT

Bugs and suggestions are welcome in the discussion tab. If ChatCop keeps your chat clean, a review helps a lot.​

Commands

Plugin details

Read from the plugin's own plugin.yml.

Quick facts

Install steps are the general flow for this file type — How to install Minecraft Java mods & modpacks walks through it step by step.

ChatCop | Auto Chat Moderation | 1.21-26.1 | Folia Support is a free Minecraft Java mod. Compatible with Minecraft 1.21, 26.1, 26.2. Downloaded 172 times (via Spigot). Download it and open it directly in the game.

Explore more