SpyCord v2.0.0 — Internal Rework
What's new
This release doesn't add new features — it's a full internal rebuild to make SpyCord stable, maintainable, and ready for everything coming next. If you're a server admin, the plugin works exactly the same as before. If you're a developer or you've been running into weird edge cases, this one's for you.
For server admins
Nothing breaking. Your config.yml is unchanged, your commands are the same, and your webhook still works. Drop in the new JAR and you're done.
Two separate JARs now. SpyCord now ships as two distinct builds: one for Paper servers and one for Spigot/Bukkit. Make sure you're using the right one for your platform — running the wrong JAR on the wrong server will cause a clean error on startup rather than silent weirdness.
Discord messages are no longer blocking. Previously, every log event waited for Discord's API to respond before continuing. On slow connections or during Discord outages, this could cause the server to hitch. Webhook calls are now fully async — fire and forget. If Discord is down, SpyCord logs the failure quietly and moves on.
Bug: version check no longer stalls startup. The GitHub version check was running on the main thread in some cases, which could slow down server startup by a second or two on bad network days. It now runs entirely in the background.
For developers
This release rewrites the internals from scratch as a three-module Gradle project: common/, bukkit/, and paper/.
common/ is now the brain. All business logic — what gets logged, when, and how — lives in pure Java with zero Bukkit or Paper imports. The EventPipeline is the single place where "should this be logged?" decisions get made. If you want to understand what SpyCord does, EventPipeline.java is the file to read.
Listeners are now just translators. In the old code, listeners were doing filtering, config reads, and logging calls all mixed together. Now they have one job: translate a Bukkit/Paper event into a platform-agnostic SpyEvent and hand it to the pipeline. No logic lives in listeners anymore.
Log sinks are composable. The old Logger class was formatting, writing to disk, and sending to Discord all in one method. That's been split into FileLogSink, DiscordLogSink, and CompositeLogSink — each doing one thing. Adding a new log destination in the future is a single class and one line in ServiceRegistry.
No more statics. SpyCord.getInstance() and SpyCord.getDiscord() are gone. Everything flows through a ServiceRegistry that gets constructed in onEnable() and passed down by reference. This makes the codebase significantly easier to reason about and opens the door for proper unit tests down the line.
Paper extends Bukkit. SpyCordPaper extends SpyCordBukkit, so all listener and service wiring is shared. Paper just layers Brigadier commands and the async version checker on top. This means bug fixes to core behaviour automatically apply to both platforms.
Full change list
Added
common/module — platform-agnostic core with interfaces, events, pipeline, and sinksbukkit/module — Spigot/Bukkit 1.13+ implementationpaper/module — Paper 1.21+ implementation, extends bukkitIPluginConfig,IDiscordClient,ILogSinkinterfacesSpyEventdomain event types:CommandExecutedEvent,GameModeChangedEvent,PlayerConnectionEventEventPipeline— centralised log filtering and dispatchCompositeLogSink— fan-out to multiple log destinationsFileLogSinkandDiscordLogSinkas separate, composable sinksServiceRegistry— dependency wiring without statics- Tab completion for all
/spycordsubcommands on Bukkit
Changed
- Discord webhook calls are now fully asynchronous (no more main-thread blocking)
- GitHub version check runs off the main thread via async scheduler
VersionNotifierno longer owns its ownBukkitRunnable— the platform schedules itSpyCordPapernow extendsSpyCordBukkitinstead ofJavaPlugindirectly- Brigadier command classes each live in their own file (previously one monolithic class)
Removed
- Static
SpyCord.getInstance()andSpyCord.getDiscord()accessors - Monolithic
Loggerclass (replaced by composable sinks) - Mixed business logic in listener classes
Fixed
- Version check blocking server startup on slow network connections
- Discord send failures causing unhandled exceptions on the main thread
- Commands without explicit permission checks silently succeeding for non-ops
Updating from v1.1a
- Stop your server
- Remove
SpyCord-1.1a-paper.jarfromplugins/ - Add the correct JAR for your platform (
-paperor-bukkit) - Start your server — your existing
config.ymlwill be picked up automatically - No config changes needed
If anything behaves unexpectedly after updating, please open an issue here with your server version and platform.
Thanks for using SpyCord.
Information
| Published on | February 24, 2026 |
|---|---|
| Downloads | 0 |