
ConsoleDiscord
Mirrors your Paper server console log to a Discord channel and lets you run Minecraft console commands from Discord via /mc or !mc, with access control and configurable log batching.
[2.0.1] - 2026-06-05 — Bugfix, Tests & Setup Guide
Backport of the v1.4.2 fixes to the Minecraft 26.x / Java 25 line.
Bugfixes
- Fixed Discord showing "command failed" for vanilla commands that actually ran —
Bukkit.dispatchCommand()'s unreliable return value is no longer treated as success/failure; only a thrown exception counts as a failure. The audit log now records the real execution status. - Fixed the
RateLimitermemory leak for good — removed the self-defeating empty-entry churn (entries were removed and immediately re-added) and added a periodicpurgeExpired()that runs automatically every 100 commands, keeping the tracking map bounded on busy public servers. - Fixed
HttpURLConnectionnot being released inModrinthUpdateChecker—disconnect()is now called in afinallyblock.
Improvements
- The plugin no longer forwards its own log messages to Discord, preventing echo/feedback noise (e.g. repeated send-error warnings looping back into the log channel).
- Added a JUnit 5 test suite (21 tests) covering
CommandSecurity,RateLimiterand the update-checker version comparison; tests run on every build via Surefire. - Added a bundled
SETUP.mdguide (installation + step-by-step Discord bot creation), automatically exported next toconfig.ymlon first start.
- Fixed Discord showing "command failed" for vanilla commands that actually ran —
[1.4.2] - 2026-06-05 — Bugfix, Tests & Setup Guide
Bugfixes
- Fixed Discord showing "command failed" for vanilla commands that actually ran —
Bukkit.dispatchCommand()'s unreliable return value is no longer treated as success/failure; only a thrown exception counts as a failure. The audit log now records the real execution status. - Fixed the
RateLimitermemory leak for good — removed the self-defeating empty-entry churn (entries were removed and immediately re-added) and added a periodicpurgeExpired()that runs automatically every 100 commands, keeping the tracking map bounded on busy public servers. - Fixed
HttpURLConnectionnot being released inModrinthUpdateChecker—disconnect()is now called in afinallyblock.
Improvements
- The plugin no longer forwards its own log messages to Discord, preventing echo/feedback noise (e.g. repeated send-error warnings looping back into the log channel).
- Added a JUnit 5 test suite (21 tests) covering
CommandSecurity,RateLimiterand the update-checker version comparison; tests run on every build via Surefire. - Added a bundled
SETUP.mdguide (installation + step-by-step Discord bot creation), automatically exported next toconfig.ymlon first start. - bStats metrics integration for anonymous usage statistics (moved here — the commit landed after the 1.4.1 release).
- Aligned
@versionJavaDoc tags across classes and corrected placeholder GitHub links in the README.
- Fixed Discord showing "command failed" for vanilla commands that actually ran —
[2.0.0] - 2026-05-03 — Minecraft 26 Edition
Port of v1.4.1 to Minecraft 26.x with Java 25. Functionally identical to v1.4.1.
- Java 25 target (was Java 21)
- Paper API 26.1.2 (was 1.21.4)
- api-version: 26.1 (was 1.21)
- bStats metrics integration
Build: Java 25 | Paper 26.1.2 | JDA 6.1.0 | Folia supported
[1.4.1] - 2026-05-03 — Bugfix & Quality Release
Bugfixes
- Fixed
NullPointerExceptionwhen audit logging is disabled - Fixed rate limiter not updating on config reload
- Fixed
allowed-user-idsnot working with unquoted numeric IDs - Fixed default config re-adding placeholder user IDs
- Fixed token placeholder check (now recognizes EN + DE placeholders)
- Fixed resource leak in
ModrinthUpdateChecker(try-with-resources) - Fixed
LogFilterregex usingmatches()instead offind()— patterns no longer need.*wrapping - Fixed
RateLimitermemory leak on public servers (auto-cleanup of empty entries) - Fixed update checker notifying about incompatible Java/MC versions
- Fixed language files not receiving new message keys on update (auto-merge added)
Improvements
- Log queue: O(1) size tracking via
AtomicInteger - Async audit log file writing (dedicated daemon thread)
- Bulk delete for message cleanup (Discord API, < 14 days)
- Command aliases pointing to blocked commands are rejected on load
- Performance alerts (TPS/Memory) now fully localized (EN/DE)
- Update checker filters by Minecraft version via Modrinth API
- Language files auto-merge new keys (like
config.ymlalready did) - Deprecated API calls replaced (
URLconstructor, Reflection for TPS) - bStats metrics integration
Build: Java 21 | Paper 1.21 - 1.21.11 | JDA 6.1.0 | Folia supported Migration: Drop-in replacement — just swap the JAR.
- Fixed
[1.4.0] - 2026-04-10 🚀 Folia Support & Stability Release
✨ New Features
Folia Compatibility ⭐
- Full Folia support - Plugin now works on both Paper and Folia servers
- Automatic detection - Detects server type and uses appropriate scheduler API
- Zero configuration - Works out of the box on both platforms
- Region-aware scheduling - Uses global region scheduler for console commands on Folia
- Async scheduler migration - All async tasks use Folia's new scheduler when available
Modrinth Update Checker ⭐
- Automatically checks for new versions on startup via Modrinth API
- Notification in server console and optionally in Discord channel
- Configurable:
update-checker.enabled
Config Auto-Merge ⭐
- New config options from updates are automatically added to existing config
- User values are never overwritten - only missing keys are added
- No more manual config migration needed after updates
🐛 Bugfixes
- Fixed:
MAX_EMBED_SIZE_EXCEEDEDerror - Embeds are now split into groups that respect Discord's 6000 character total limit per message. Previously, multiple embeds could exceed this limit and causeErrorResponseException: 50035 - Fixed:
Thread.sleep(1000)blocking server shutdown - Removed unnecessary sleep inonDisable(). The shutdown notification already uses blockingcomplete()call - Fixed:
CommandSecurityrace condition - Static fields are now thread-safe usingAtomicBooleanandAtomicReference. Config reloads during command checks no longer cause inconsistent state - Fixed:
SchedulerAdapter.isCancelled()always returningfalse- Folia tasks now properly track cancel state viaAtomicBoolean, Paper tasks delegate toBukkitTask.isCancelled() - Fixed: Potential
NullPointerExceptioninMessageCleanup- Added null-safety check forjda.getSelfUser()during message cleanup - Fixed: Fragile JSON parsing in
ModrinthUpdateChecker- Replaced manualindexOf()/substring()parsing with Gson for robust Modrinth API response handling
🔄 Changes
Scheduler Refactoring
- New
SchedulerAdapterclass provides unified API for Paper and Folia - Replaced all
Bukkit.getScheduler()calls with adapter methods - Console commands now use
GlobalRegionScheduleron Folia - Removed busy-wait loops when cancelling tasks (cleaner shutdown)
Code Cleanup
- Removed legacy
org.examplepackage (outdated duplicate code from pre-1.3.0) - Added Gson as provided dependency (shipped by Paper at runtime)
Technical Details
- Auto-detection via
io.papermc.paper.threadedregions.RegionizedServerclass check folia-supported: trueflag in plugin.yml- Backwards compatible with Paper/Spigot servers
📦 Build Information
JAR File:
consolediscord-1.4.0.jarSize: ~16 MB (with JDA shaded) Java Version: 21 Paper Version: 1.21.4-R0.1-SNAPSHOT (also supports Folia) JDA Version: 6.1.0
Migration Guide from 1.3.0 → 1.4.0
✅ Automatic Migration
All changes are 100% backwards compatible. Simply replace the JAR file!
New config options (like
update-checker) are automatically merged into your existingconfig.ymlon first startup - no manual editing needed.[1.3.0] - 2026-03-10 🎉 The Big Feature Update
✨ New Features
📋 Intelligent Log Forwarding
1. Discord Embeds instead of Code Blocks
- Color-coded embeds for better readability (Green=INFO, Orange=WARN, Red=ERROR)
- Structured presentation with timestamps
- Batch processing: Up to 10 log lines per embed
- Configurable:
log-formatting.use-embeds
2. Emoji Encoding for Log Levels
- 💀 FATAL - Critical errors
- ❌ ERROR - Errors
- ⚠️ WARN - Warnings
- ℹ️ INFO - Information
- 🔍 DEBUG - Debug output
- 🔬 TRACE - Trace logs
- Configurable:
log-formatting.use-emojis
3. Log-Level Filtering
- Send only specific log levels to Discord
- Default: INFO, WARN, ERROR, FATAL
- Configurable:
log-levels: [INFO, WARN, ERROR]
4. Regex Filters for Logs
- Filter out annoying spam logs ("Can't keep up", UUID warnings)
- Unlimited regex patterns
- Configurable:
log-filters.ignore-patterns
5. Log Categories with Separate Channels
- Security logs in separate channel (op, ban, kick, etc.)
- Performance logs in separate channel (TPS, Memory)
- Unlimited categories definable
- Pattern-based routing
- Configurable:
log-categories
🎮 Remote Commands
6. Command Autocomplete
- Intelligent suggestions while typing
- Pre-configured common commands (gamemode, weather, time, difficulty, etc.)
- Also shows command aliases
- Automatic Discord slash command integration
7. Command Aliases
- Define shortcuts:
tps→spark tps - Unlimited aliases
- Autocomplete shows aliases with arrow:
tps → spark tps - Configurable:
command-aliases.aliases
🔒 Security & Monitoring
8. Command Audit Logging
- Logs every command with user, timestamp, and status
- File-based:
plugins/ConsoleDiscord/audit.log - Optionally also in Discord channel
- Format:
[2026-03-10 19:30:45] User#123 (Name) executed: cmd [SUCCESS] - Configurable:
command-audit
9. Performance Alerts
- TPS warning at < 15.0 TPS (adjustable)
- Memory warning at > 90% RAM (adjustable)
- Cooldown system prevents spam (default: 5min)
- Color-coded embeds: 🟡 Warning / 🔴 Critical
- Configurable:
performance-alerts
🛠️ Management
10. Startup/Shutdown Notifications
- 🟢 Server Start: Shows version & plugin count
- 🔴 Server Stop: Shows uptime
- Beautiful embeds with timestamp
- Configurable:
notifications.startup¬ifications.shutdown
11. Auto-Cleanup for Old Messages
- Automatically deletes old log messages
- Default: After 7 days (adjustable)
- Check every 24 hours (adjustable)
- Only bot's own messages are deleted
- Configurable:
auto-cleanup
12. Batch Embeds
- Groups up to 10 log lines per embed
- Discord limit: Max 10 embeds per message
- Reduces API calls and rate limits
- Better performance with many logs
- Configurable:
log-formatting.embed-batch-size
13. Configurable Command Blacklist ⭐
- Fully customizable: You decide which commands to block
- Default recommendation: Only
opanddeopblocked (changeable) - Flexible: Add commands like
stop,restart,whitelistas needed - Disableable: Security can be completely turned off
- Namespace protection: Prefixes like
minecraft:,bukkit:are always blocked - Configurable:
command-security.enabled&command-security.blocked-commands
🔄 Changes
Package Refactoring
Before: org.example Now: dev.boondocksulfur.consolediscordNew Package Structure:
dev.boondocksulfur.consolediscord- Main plugindev.boondocksulfur.consolediscord.audit- Audit loggingdev.boondocksulfur.consolediscord.cleanup- Message cleanupdev.boondocksulfur.consolediscord.i18n- Internationalizationdev.boondocksulfur.consolediscord.listener- Discord eventsdev.boondocksulfur.consolediscord.logging- Log appender & formatterdev.boondocksulfur.consolediscord.performance- Performance monitoringdev.boondocksulfur.consolediscord.security- Security & rate limiting
Maven Configuration
- groupId:
dev.boondocksulfur(previously:org.example) - artifactId:
consolediscord(previously:console-discord) - JDA relocation adjusted
Config Extensions
The
config.ymlhas been extended with 58 new options:- Advanced logging options (17 options)
- Command features (10 options)
- Performance alerts (4 options)
- Notifications & cleanup (5 options)
📚 Documentation
- JavaDoc: Complete documentation for all classes and methods
- README.md: Completely revised with feature matrix and examples
- CHANGELOG.md: Detailed changelog with migration guide
🐛 Improvements
- Better error messages with i18n support
- More informative Discord responses (emojis for feedback)
- Cleaner code structure with separation of concerns
- Improved type safety with proper generics
- More consistent logging practices
- Optimized performance through batch processing
- NEW: Thread-safe reconnect logic with synchronized lock - no more race conditions
- NEW: Discord bot token format validation on startup
- NEW: Configurable command blacklist - you decide which commands to block
🔒 Security
- Blocks execution of server-critical commands
- Prevents command spam via rate limiting
- Validates user permissions before execution
- Filters commands with namespace prefixes
- Audit trail for all commands
- NEW: Configurable command blacklist - blocks only dangerous operations you specify
- NEW: Discord bot token validation - checks format and length on startup
- NEW: Race condition protection for Discord reconnects through synchronized lock
📦 Build Information
JAR File:
consolediscord-1.3.0.jarSize: ~8 MB (with JDA shaded) Java Version: 21 Paper Version: 1.21.4-R0.1-SNAPSHOT JDA Version: 6.1.0
Migration Guide from 1.2.0 → 1.3.0
✅ Automatic Migration
Most changes are backwards compatible. Your old
config.ymlwill continue to work!📝 New Config Options
On first startup with 1.3.0, these options will be automatically added:
# New options with defaults language: "en" max-commands-per-minute: 5 command-security: enabled: true blocked-commands: ["op", "deop"] log-levels: [INFO, WARN, ERROR, FATAL] log-formatting: use-embeds: true use-emojis: true embed-batch-size: 10 log-filters: ignore-patterns: [] log-categories: enabled: false command-aliases: enabled: true aliases: {} command-audit: enabled: true log-file: "audit.log" performance-alerts: enabled: true low-tps-threshold: 15.0 high-memory-threshold: 90 notifications: startup: true shutdown: true auto-cleanup: enabled: false⚙️ Recommended Post-Migration Steps
-
Enable Discord Embeds:
log-formatting: use-embeds: true use-emojis: true -
Filter Spam Logs:
log-filters: ignore-patterns: - "Can't keep up! Is the server overloaded\\?" -
Configure Command Aliases:
command-aliases: enabled: true aliases: tps: "spark tps" save: "save-all" -
Reload Plugin:
/cdr reload
⚠️ Breaking Changes
None! All changes are backwards compatible.
[1.2.0] - 2025-01-22
Bugfixes
-
Discord Slash-Command Interaction Fix: Behoben, dass beim Ausführen von
/mc cdr reloadder FehlerIllegalStateException: This interaction has already been acknowledgedauftrat- Slash-Commands verwenden jetzt
deferReply()um Discord sofort zu bestätigen - Antworten werden nun über
getHook().sendMessage()gesendet - JDA-Status wird geprüft bevor Antworten gesendet werden, um Race Conditions beim Reload zu vermeiden
- Slash-Commands verwenden jetzt
-
Verbesserte Fehlerbehandlung: Alle Discord-API-Aufrufe haben jetzt Error-Handler, die Fehler loggen statt Exceptions zu werfen
Technische Details
DiscordListener.java: Refactoring derrunMinecraftCommand()Methode- Neue Helper-Methode
sendResponse()für saubere Trennung von Slash-Command und Message-Antworten
[1.1.0] - Initiale Version
Features
- Server-Konsolen-Logs werden automatisch in einen Discord-Channel gepostet
- Minecraft-Befehle können über Discord ausgeführt werden:
/mc <befehl>- Slash-Command!mc <befehl>- Text-Prefix
- Konfigurierbare Berechtigungen (User-IDs)
- Optionaler Command-Channel für eingeschränkte Nutzung
- Watchdog für automatische JDA-Reconnects
- Debug-Modus für JDA-Status-Logging
-
Changelog
Fixed an issue where ConsoleDiscord could throw an IllegalStateException: zip file closed when handling the Discord WebSocket shutdown.
Improved plugin classloader handling to prevent crashes and unnecessary error stacktraces in the console.
Нет описания изменений
