Tags
Creators
Details
All versions
1.1.2
Release
LSD 1.1.2last month 12
Compatibility
Minecraft: Java Edition
26.2
Platform
Paper
Changes
[1.1.2]
Fixed
- Build threaded Discord webhook message URLs from parsed URI components so edit and delete endpoints place
/messages/{id}before existing query parameters, while preserving query values and handling trailing slashes correctly. - Shut synchronization down cleanly by invalidating in-flight state mutations, dropping queued and retry work, cancelling delayed retries, and force-stopping the webhook HTTP client so late completions cannot write stale runtime state.
- Move player-list sorting, activity classification, Discord formatting, escaping, and pagination off the Minecraft server thread. Synchronization now captures only Bukkit-owned player/configuration data synchronously into immutable records before rendering and sending asynchronously.
- Keep normal edit-only synchronizations write-free when managed Discord message IDs are unchanged. Generated message state remains outside
config.ymlin atomicmessage-state.json, preventing synchronization from overwriting unrelated administrator configuration edits. - Centralize startup and reload validation for webhook, activity, scheduling, debounce, toggle, header, and legacy message-ID settings. Invalid scalar values now produce field-specific safe warnings, scheduling values are bounded before tick conversion, invalid timestamp sources fall back to
LAST_SEEN, and malformed or duplicate stored IDs cannot enter active state. - Preserve version 1/2
message-state.jsonIDs and deferred legacy IDs from older configuration while binding them to the first valid configured webhook identity instead of discarding tracked messages. - Retain existing tracked message state when the webhook is temporarily blank, placeholder, or otherwise unconfigured so restoring the same destination does not create duplicate messages.
- Include
thread_idin the non-secret webhook state identity, including percent-encoded query-name forms, so changing Discord threads starts a separate managed message lifecycle while webhook token rotation preserves the existing one.
Changed
- Configure Dependabot to keep Gradle and GitHub Actions dependencies current on
dev, while leaving the Paper API pinned for manual updates. - Debounce join and quit synchronization requests with a configurable trailing-edge window so bursts of player activity produce one final update.
updates.event-debounce-secondsdefaults to 5 seconds, is clamped to 0-60 seconds, and can be set to 0 to disable debouncing;/lsd syncremains immediate.
Added
- Add deterministic loopback HTTP integration tests for the real webhook client, covering request construction, top-level message-ID parsing, Discord unknown-message recovery, rate-limit delays, and controllable delayed responses without contacting Discord.
- Add configuration boundary and migration regression tests covering legacy settings, scheduling limits, invalid timestamp values, webhook-secret redaction, and malformed or duplicate message IDs.
Dependencies
- Update
io.papermc.paper:paper-apito26.2.build.121-stable - Update
com.google.code.gson:gsonto2.14.0 - Update
org.junit:junit-bomto6.1.3 - Update
gradle-wrapperto9.7.1 - Update
actions/checkoutto7.0.1 - Update
actions/setup-javato6.0.0 - Update
gradle/actions/setup-gradleto6.3.0 - Update
actions/upload-artifactto7.0.1
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:Nuf4Ur89:Z1HxWv9m"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:Nuf4Ur89:Z1HxWv9m"
}

