
ChatControl
Take control of your chat. Toggle, filter, slowmode, hide spam, LuckPerms support & more! Formerly vChatUtils.
Оцените первым
1.1K
3
Список изменений
1.2.0 - Tons of changesa and additions!
New Features
- Filter Punishments: Configure console commands to execute when a message triggers the filter — supports
%player%and%message%placeholders. Set["[none]"]to skip punishment. Runs async-safe. - German, French, Spanish Language Files: Added
messages-de.yml,messages-fr.yml,messages-es.yml— reviewed by native speakers - PlaceholderAPI Expansion: Registered
%chatcontrol_*%placeholders (prefix,version,chat_enabled) for use in other plugins - Message PlaceholderAPI Resolution: All lang file messages now resolve PlaceholderAPI placeholders (
%player_name%, etc.) when sent to players - Chat Format PlaceholderAPI: Chat format now supports any PlaceholderAPI placeholder via direct API (was reflection)
- Private Messaging: Full
/msg,/tell,/pm,/r(reply),/togglepm,/socialspysystem with per-player toggle and admin spy - Anti-Spam: Repeated and similar message detection with configurable thresholds
- Caps Filter: Blocks messages exceeding configurable uppercase ratio (default 70%)
- Max Line Length: Blocks messages exceeding configurable character limit (default 256)
Changes
- Chat filter: Fixed regex pattern matching - patterns are now compiled as regex directly (was using
Pattern.quote()which broke regex) - Chat filter: Invalid patterns are logged instead of crashing the filter loop
- Config: Chat filter expanded with categorized sections: Curse Words, Slurs, NSFW, Scams, Advertising, Personal Info, Spam
- Config: Added
enable-anti-spam,enable-caps-filter,enable-max-line-lengthsections - Version Support: Confirmed compatibility with Paper 1.21.x through 26.2
Improvements
- Cleaned up PAPI reflection in ChatManager - uses direct API call via
compileOnlydependency sendAll()now resolves PAPI placeholders per-player instead of sending the same string to everyone
Bug Fixes
- /chatcontrol help: The about page advertised
/chatcontrol help for commandsbut the subcommand was never handled — it now shows the command list and is public like the about page - Chat filter performance: Filter patterns are compiled once per config load instead of on every chat message (the hot path was recompiling every pattern per message, and an invalid pattern re-warned on every message)
- Filter punishments: Console now shows why a punishment command failed (added the exception message to the warning)
- Config migration: File copy failures now log through the plugin logger with a timestamp instead of raw
System.err - LuckPerms status:
getBypassGroups()failure now logs the cause to the console instead of silently returning "Error fetching groups" - Chat format: Fixed crash when a LuckPerms prefix/suffix mixes legacy codes with MiniMessage tags (e.g.
§8[<gradient:#4A4A4A:#D9D9D9>Member</gradient>§8]) —ParsingException: Legacy formatting codes have been detected. Legacy codes are now converted to MiniMessage tags while existing tags are preserved, across chat format, join/leave/advancement messages, and lang messages - Slowmode bypass:
chatcontrol.bypasspermission now skips slowmode cooldown (was only bypassing disabled-chat check) - Java version: Java 21 bytecode target — runs on Java 21 (Paper 1.21.x) and Java 25 (Paper 26.x) servers from a single jar
- Paper API: Built against the 1.21 API (
1.21.1-R0.1-SNAPSHOT) withapi-version: "1.21", so the jar loads on every server from 1.21.x through 26.2
API (Event-Driven Integration)
- Public API package:
xyz.vprolabs.chatcontrol.apiwithChatControlAPIutility class and three cancellable events:ChatControlJoinEvent— fired when a player joins, allows cancelling or modifying the join message formatChatControlLeaveEvent— fired when a player quits, allows cancelling or modifying the leave message format (use case: vanish plugins suppress real quits and callChatControlAPI.sendFakeLeaveMessage())ChatControlChatEvent— fired after all ChatControl checks pass, allows modifying or cancelling a chat message
- ChatControlAPI.sendFakeJoinMessage(Player), sendFakeLeaveMessage(Player) — send formatted join/leave with full rank-based formatting from external plugins
- ChatControlAPI.isChatEnabled() — check global chat toggle from other plugins
- All events extend
Event implements Cancellablefor full Bukkit event API compatibility
Permissions
- Granular bypass permissions: Added
chatcontrol.bypass.chatdisabled,.slowmode,.maxlength,.caps,.filter,.allowedchars,.antispam— each grants targeted bypass without the masterchatcontrol.bypass. Master bypass still covers all. - Chat color perms: Added
chatcontrol.color,.color.rgb,.format.gradient,.format.magic— by default players can't use any color/format codes. Strip logic runs onHIGHESTpriority before any other check.chatcontrol.adminbypasses all. - Custom join/leave/advancement messages: Added
enable-custom-join-messages,enable-custom-leave-messages,enable-custom-advancement-messageswith fully customizable MiniMessage formats. Supports%player%,%displayname%,%world%,%prefix%,%suffix%placeholders. LuckPerms rank-specific formats viajoin-formats-by-rank/leave-formats-by-rank— group name as key, MiniMessage as value. Falls back to default format when group is unlisted. - Ignore system: Added
chatcontrol.ignorepermission (default: true) and three commands:/ignore <player>(alias/block),/unignore <player>(alias/unblock),/ignorelist(alias/ignored,/ignores). Persists per session. Blocked senders getpm.ignore.blockedmessage.
Production Hardening
- Config versioning: Added
config-version: 1to config.yml. ConfigMigrator now reads version and runs migration paths automatically — future config schema changes apply cleanly without manual edits. - Auto-config migration:
fillMissingDefaults()ensures new config keys from jar defaults are added to existing config files on every startup. Old vChatUtils configs are migrated, backed up, and removed. - Thread safety:
ChatManager.lastMessages,ChatManager.repeatCounts,PrivateMessageManager.lastSenders,pmBlocked,socialSpies, andignoredPlayersall useConcurrentHashMap/ConcurrentHashMap.newKeySet()instead ofHashMap. Fixes data races from async chat event access. - Folia scheduler support: New
SchedulerAdapterruntime-detects Folia viaRegionizedServerclass check. Falls back to Bukkit scheduler on Paper/Spigot. All scheduler calls inChatManagerandBugReportuse the adapter. - Full tab completion:
CommandHandler.onTabCompletenow suggestsinfoalongsidestatus,--confirmfor reload, and online player names for clear. Private messaging tab completion enhanced. - Reload command:
/chatcontrol reload(alias/cc reload) reloads config, language files, and LuckPerms hook. Already existed; verified functional.
Файлы
ChatControl-1.2.0.jar(62.74 KiB)
ОсновнойМетаданные
Канал релиза
Release
Номер версии
1.2.0
Загрузчики
BukkitFoliaPaperPurpurSpigot
Версии игры
1.21–26.2
Загрузок
30
Дата публикации
06.08.2026
