Перейти к содержимому
Mineforgian

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

bStats


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

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

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

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

  1. Updated Velocity plugin version strings

The Velocity plugin metadata and @Plugin annotation 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

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

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

  1. Fixed /banlist, /mutelist, /history, and /blame showing duplicate entries

A LEFT JOIN on the login history table was multiplying each punishment row by the number of times the player had logged in.

  1. Fixed /check <player> saying "No punishment found with that ID" for short usernames

Names like Connor were being mistaken for punishment IDs. /check now also works on offline players, not just online ones.

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

  1. Fixed /freeze showing raw <#FF6B6B>FROZEN color tags

The status string was passed through without parsing its MiniMessage tags.

  1. Fixed /ipban and /ipmute saying "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.

  1. 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 г.
  1. 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.

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

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

  4. 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!

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

  1. made the gui 10X better
  2. 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> to ConcurrentHashMap.newKeySet() for thread-safe alt collection across async database futures.
  • Fixed offline player unjail trap. Players unjailed while offline are now flagged with pending_unjail in 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() from CompletableFuture.supplyAsync() to scheduler.callSync() to comply with Paper/Folia thread safety rules.
  • Fixed database thread pool overflow risk. Replaced CallerRunsPolicy with 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 lastMessageTime and lastReportTime maps.
  • 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 ...) with LEFT JOIN controlbans_history across 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 manual if (maxPage == 0) maxPage = 1 to Math.max(1, (int) Math.ceil(...)) for consistency with AltsGuiManager.
  • Fixed missing return statement in PlayerJoinListener blacklist check. Added explicit return after event.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.admin will be notified in-game on join if a new version is available
  • fixed /unipban and /unipmute now accepting a player name instead of requiring the raw IP address
  • added missing /unipmute command 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 /unipban tab completer returning nothing — now suggests player names
  • fixed premature "Banning..." message sending before the player lookup even completes
  • fixed stale javadoc in IdUtil still saying 6-character IDs

Комментарии

Загружаем…