
ControlBans
Feature compact punishment system. free and open sourced.
- Загрузки
- 853
- Подписчики
- 8
- Обновлён
- 28 июня 2026 г.
- Лицензия
- TruthfulandFaithful
Опубликован 20 октября 2025 г.
ControlBans
The moderation suite that doesn't compromise.
Free. Open source. Built for networks that actually care about performance.
ControlBans is a fully async, production-hardened punishment system for Paper, Folia, BungeeCord, and Velocity. No premium tier. No paywalled commands. The whole thing — source code and all — is right here.
⚡ Performance First
Every punishment, history lookup, and cache operation runs off the main thread via a CompletableFuture pipeline. Your TPS doesn't budge when a moderator bans someone. Caffeine caching sits in front of your database so repeat lookups — join checks, mute enforcement, alt detection — never hit storage twice.
🛡️ Punishment System
A complete moderation toolkit, no third-party dependencies required.
| Command | Description |
|---|---|
/ban, /tempban, /unban |
Permanent and temporary bans |
/mute, /tempmute, /unmute |
Permanent and temporary mutes |
/shadowmute |
Player sees their own messages. Nobody else does. |
/ipmute, /ipmute, /unipban |
IP-level bans and mutes |
/warn |
Warns with configurable escalation templates |
/kick |
Kick with reason and silent flag |
/note |
Private staff notes attached to a player profile |
/freeze |
Lock a player in place for screenshare — auto-bans on quit |
/voidjail, /unvoidjail |
Trap players in an inescapable void dimension |
/banskin, /unbanskin |
Force-revert inappropriate skins to default instantly |
/voicemute, /tempvoicemute |
Mute players natively in Simple Voice Chat |
/punish |
Click-through GUI for quick punishments without typing |
/history, /check, /alts |
Player lookup, punishment timeline, alt account detection |
/banlist, /mutelist, /blame |
Browse active punishments and staff activity |
/report, /reports |
Player reports with staff resolution workflow |
/appeal |
In-game mute appeals with cooldown + submission limits |
/chat lock, /chat slow, /chat clear |
Global chat management |
/staff |
View currently online staff members |
All commands support a -s silent flag. Staff with controlbans.notify.silent see the action — nobody else does.
🤖 AutoMod
Regex-based automated chat filtering that runs before any human has to act.
- Block — cancel the message and notify the player
- Shadow — message appears only to the sender and staff, silently logged
- Spam detection with configurable thresholds
- Caps normalization with bypass permissions per-rank
- Staff alerts on every triggered rule
💾 Database Support
Pick whatever fits your stack.
- MySQL / MariaDB / PostgreSQL — full relational support via HikariCP connection pooling
- MongoDB — NoSQL document storage
- SQLite / H2 — zero-config local file storage, perfect for single servers
Expired punishments are automatically purged on a configurable schedule. Your database won't rot after years of operation.
🔁 Redis Sync
Running a network? Configure Redis and bans, mutes, and unbans propagate across every node via Pub/Sub the instant they're issued. No polling. No delay.
Supports both BungeeCord and Velocity.
📦 Migrate From Another Plugin
Switching is a single command. ControlBans ships with a throttled, lag-safe importer for:
- LiteBans
- AdvancedBan
- Essentials
Run /cb import <source> and walk away.
🔌 Integrations
| Integration | What it does |
|---|---|
| Simple Voice Chat | /voicemute silences players in proximity voice — fully synced |
| DiscordSRV | Punishment alerts forwarded to your Discord channels automatically |
| Floodgate / Bedrock | Bedrock players via Geyser are detected and handled correctly |
🌍 10 Languages
Ships with full locale files for English, German, Spanish, French, Italian, Japanese, Dutch, Portuguese, Russian, and Turkish. Every message is MiniMessage-formatted and fully configurable.
🏗️ Built With
- Paper 1.20+ native API — no legacy hacks
- Folia supported — regionized multithreading compatible
- PacketEvents 2.x for packet-level operations
- Adventure / MiniMessage for all text rendering
- Caffeine for in-memory caching
- HikariCP for database connection pooling
📊 Stats
Discord · Source Code · Issues & Bug Reports
Made by tawny · Free forever · No premium tier
Ченджлог
5.9Релиз26.1.1, 26.1.2, 26.2 · 28 июня 2026 г.
ControlBans v5.9
Velocity proxy support fixes.
Fixes
- Fixed duplicate broadcast messages on Velocity networks
The proxy was rebroadcasting punishments to all players including the ones on the server that issued the punishment, so players saw everything 2-3 times. The proxy now skips players on the source server since they already got the message from their backend.
- Fixed staff alerts not reaching other servers
Staff alerts were only sent to players on the same backend server. The alert is now relayed to the proxy so staff on other servers see it too.
- Fixed proxy plugin messages silently failing on Paper
Server.sendPluginMessage()was being used to send cross-server messages but it silently does nothing on Paper for custom channels. This meant kicks, broadcasts, and cache invalidations never actually reached the proxy. Messages are now always sent through a player connection instead.
- Updated Velocity plugin version strings
The Velocity plugin metadata and
@Pluginannotation were showing version 5.0/5.2 instead of the actual version.
Upgrade
Drop the JAR in plugins/ on both your Velocity proxy and your backend servers, then restart everything.
5.8Релиз26.1.1, 26.1.2, 26.2 · 27 июня 2026 г.
ControlBans v5.8
Fixes
- Fixed Japanese and Russian locales breaking on startup
Corrupted bytes in the locale files caused YAML parsing to fail, then the plugin would silently overwrite them with English, losing the original translations. Both are repaired and the loader now skips broken files instead of overwriting them.
- Fixed "missing locale keys" spamming the console on every startup
The validator had a broken recursive check that reported every key as missing even when they were all there.
- Fixed
/banlist,/mutelist,/history, and/blameshowing duplicate entries
A
LEFT JOINon the login history table was multiplying each punishment row by the number of times the player had logged in.
- Fixed
/check <player>saying "No punishment found with that ID" for short usernames
Names like
Connorwere being mistaken for punishment IDs./checknow also works on offline players, not just online ones.
- Fixed first chat after join being silently swallowed for non-muted players
The mute cache was empty on join, so the chat listener cancelled the message for everyone and only echoed it back to the speaker as plain text.
- Fixed
/freezeshowing raw<#FF6B6B>FROZENcolor tags
The status string was passed through without parsing its MiniMessage tags.
- Fixed
/ipbanand/ipmutesaying "Player not found" when the IP was local
The local IP safety check was failing silently and the command translated that into the wrong error. It now clearly says the IP is on the protected blocklist.
- Fixed "Player '' is already banned" showing the literal text
<player>
The placeholder was never being filled in with the actual name. Same bug hit the "already muted" and "already voice muted" messages.
Escalation
The #template and escalation: systems were verified. Offense counts advance correctly, levels clamp properly at the max configured level, and durations are applied as configured.
3 new test templates were added to the default config (test-extortion, test-minor-spam, test-grief-ban). Safe to keep or remove.
Upgrade
Drop the JAR in plugins/ and restart. No config migration needed. If your ja.yml or ru.yml got overwritten with English by the previous version, delete the file before restarting and a fresh copy will be extracted.
5.7Релиз26.1.1, 26.1.2, 26.2 · 24 июня 2026 г.
Bedrock Player UUID Lookup: Fixed PlayerResolver.java so it now gracefully falls back to the local database if FloodgateApi can't find an offline player, fixing the "Player not found" issue when trying to punish Bedrock players.
Blocked Commands for Muted Players: Added the blocked-commands feature into config.yml (defaulting to blocking commands like /msg, /w, /me, etc.) and added an interceptor in PlayerChatListener to stop them and show the mute screen.
Blocked Signs and Books: Added block-signs: true into the config. If a muted player writes in a book or on a sign, their text will be immediately replaced with [MUTED].
Discord Webhooks: Added the webhook-url setting in the discord block of config.yml. The plugin actually had full built-in support for standard webhooks via IntegrationService.java, but the configuration property was accidentally left out. You can now use standard webhooks without DiscordSRV!
Local Punishments Broadcast: Updated NotificationService.java so that it broadcasts punishments locally to all online players and console (using the existing broadcast config toggles) instead of exclusively pushing them out via the Bungee proxy channel.
5.6Релиз26.1.1, 26.1.2, 26.2 · 22 июня 2026 г.
I'm in the hospital by the way :P
change-logs:
- revamped the escalation system to be more better and more informative of errors
- fixed a weird little bypass with temp voice mute so now they can bypass it
- I did some more optimization to the caffeinated database system so hopefully this addresses some weird latency with bans
5.5Релиз26.1, 26.1.1, 26.1.2 · 1 июня 2026 г.
changelog
punishment GUI and escalation overhaul
- made the gui 10X better
- escalation overhaul deleted the old system and changed it to the new one. now you can do it like this for templates and escalation automatically (/ban player67 #Hacking) (/tempban Steve193 #extreme-jokes)
5.4Релиз26.1, 26.1.1, 26.1.2 · 26 мая 2026 г.
Changelog:
- remove auto mod entirely
- fixed performance on the newest version of folia
- fixed a potential error on load with velocity
5.3Релиз26.1, 26.1.1, 26.1.2 · 19 мая 2026 г.
🔴 Critical Fixes
- Fixed main thread blocking from
.join()calls in ReportsCommand, NoteCommand, and MyReportsGuiManager. All database operations now use async callbacks with scheduler dispatch. - Fixed synchronous Mojang API lookups in AltsCommand, HistoryCommand, ReportCommand, PunishCommand, and UnvoidJailCommand. Replaced deprecated
Bukkit.getOfflinePlayer(String)with async UUID resolution using database cache and UuidUtil fallback. - Fixed ConcurrentModificationException in AltService. Changed
HashSet<UUID>toConcurrentHashMap.newKeySet()for thread-safe alt collection across async database futures. - Fixed offline player unjail trap. Players unjailed while offline are now flagged with
pending_unjailin void-jail.yml and automatically teleported to their return location on next login.
🟠 High Priority Fixes
- Fixed async Bukkit API call in PunishmentService. Moved
Bukkit.getOfflinePlayer()fromCompletableFuture.supplyAsync()toscheduler.callSync()to comply with Paper/Folia thread safety rules. - Fixed database thread pool overflow risk. Replaced
CallerRunsPolicywith a custom rejection handler that logs a warning and discards tasks instead of executing them on the caller thread (which could be the main server thread). - Fixed fail-open mute bypass in PlayerChatListener. On cache miss, chat messages are now cancelled while the async mute lookup completes. Messages are re-sent only if the player is confirmed unmuted.
🟡 Medium Priority Fixes
- Fixed memory leaks in ChatManager and ReportService. Added PlayerQuitEvent listeners to remove disconnected players from
lastMessageTimeandlastReportTimemaps. - Fixed settings GUI triggering full plugin reloads on the main thread. Config save and
plugin.reload()now run asynchronously, with GUI reopen dispatched back to the main thread. - Fixed inefficient N+1 subqueries in PunishmentDao. Replaced correlated subqueries
(SELECT name FROM controlbans_history WHERE uuid = t.uuid ...)withLEFT JOIN controlbans_historyacross getRecentPunishments, getPunishmentHistory, getPunishmentById, and getAllPunishments.
🟢 Low Priority Fixes
- Fixed void jail command whitelist edge case. Added length check before
event.getMessage().substring(1)to prevent issues when a player types only/. - Fixed GUI cooldown feedback ignored in GuiListener. The report GUI now checks the
submitReport()return value and displays a cooldown message if the report fails. - Fixed brittle YAML string parsing in ConfigUpdater. Replaced primitive
.replace("\"", "\\\"")with proper YAML escaping that handles special characters, multiline strings, booleans, numbers, and lists. - Fixed zero-size pagination inconsistency in HistoryGuiManager. Changed
Math.ceil(...)with manualif (maxPage == 0) maxPage = 1toMath.max(1, (int) Math.ceil(...))for consistency with AltsGuiManager. - Fixed missing return statement in PlayerJoinListener blacklist check. Added explicit
returnafterevent.disallow()to prevent execution continuation and potential future bugs.
5.2Релиз26.1, 26.1.1, 26.1.2 · 17 мая 2026 г.
fixes & additions
- added modrinth update checker — staff with
controlbans.adminwill be notified in-game on join if a new version is available - fixed
/unipbanand/unipmutenow accepting a player name instead of requiring the raw IP address - added missing
/unipmutecommand entirely - fixed IP address being exposed raw in staff alerts — now masked as
192.168.*.* - fixed IP address being broadcast publicly in unban announcements — now staff-only
- fixed silent no-op when IP banning a player with no join history — now sends a proper error message
- fixed database executor being unbounded — now capped with backpressure to prevent thread storms under load
- fixed janitor not cleaning old kicks, warnings, and resolved reports — now purges all types on schedule
- fixed MongoDB having no janitor at all — expired records were accumulating forever
- fixed
/unipbantab completer returning nothing — now suggests player names - fixed premature "Banning..." message sending before the player lookup even completes
- fixed stale javadoc in
IdUtilstill saying 6-character IDs
Комментарии
Загружаем…