Skip to content

feat!: v8 major release — MiniMessage migration, Component-first architecture#1063

Open
confuser wants to merge 4 commits intomasterfrom
feat/v8-minimessage-migration
Open

feat!: v8 major release — MiniMessage migration, Component-first architecture#1063
confuser wants to merge 4 commits intomasterfrom
feat/v8-minimessage-migration

Conversation

@confuser
Copy link
Copy Markdown
Member

Summary

Major version bump to BanManager v8 with a full architectural migration to MiniMessage and Component-first message handling.

Breaking Changes

  • Java 17 minimum required across all modules (was Java 8)
  • Adventure API upgraded from 4.9.3 to 4.21.0 with MiniMessage + PlainText serializer support
  • Message templates now use MiniMessage format (<tag>) — legacy &-codes in messages.yml are hard-rejected with bundled defaults used as fallback
  • Message.set() creates MiniMessage TagResolvers instead of [token] bracket replacement
  • Removed deprecated APIs: Message.load(), CommonServer.broadcastJSON(), WebhookConfig.getType()
  • CommonSender.sendMessage(Message) and CommonPlayer.sendMessage(Message) are now default interface methods routing through Component
  • Message.toString() callers migrated to Message.sendTo(sender)

New Features

  • MessageRenderer: central MiniMessage rendering, legacy conversion, tag escaping, plain text & JSON serialization
  • Message.component(key): static convenience for resolving to Component
  • Message.resolveComponent(): full Component pipeline with PAPI escaping (prevents injection from external placeholder plugins)
  • PaperAdventureHelper: zero-overhead native Adventure delivery on Paper servers (detects Paper at runtime, falls back to JSON bridging on Spigot)
  • NotificationsConfig: configurable staff notification channels — chat, actionbar, title, sound per event type
  • PaginatedView: Component-based pagination with clickable prev/next navigation
  • ConfirmationManager: timed action confirmation system with /bm confirm and /bm cancel
  • Duration tab-complete presets for temp punishment commands
  • Static tokens support in messages.yml (custom reusable placeholders)
  • Platform adapters: sendActionBar(), showTitle(), playSound() implemented on all 7 platforms

Scope

  • 119 files changed in BanManager core (+4,923 / -3,870 lines)
  • All platform adapters updated: Bukkit, Bungee, Velocity, Fabric, Sponge, Sponge7
  • All tests updated and passing
  • Full build verified across all modules

Test plan

  • ./gradlew build passes across all modules (81 tasks)
  • ./gradlew :BanManagerCommon:test — all unit tests pass
  • WebEnhancer builds and tests pass against v8 (separate PR)
  • E2E testing on each platform
  • Verify legacy &-code rejection logs appropriate warnings
  • Verify Paper native Adventure path vs Spigot JSON fallback
  • Test per-player locale resolution with MiniMessage templates

…itecture

BREAKING CHANGES:

- Java 17 minimum required across all modules (was Java 8)
- Adventure API upgraded from 4.9.3 to 4.21.0 with MiniMessage support
- Message templates now use MiniMessage format (<tag>) instead of legacy &-codes
- Message.set() creates MiniMessage TagResolvers instead of [token] bracket replacement
- Legacy &-code formatting in messages.yml is hard-rejected (bundled defaults used)
- Removed deprecated APIs: Message.load(), CommonServer.broadcastJSON(),
  WebhookConfig.getType()
- CommonSender.sendMessage(Message) and CommonPlayer.sendMessage(Message) are now
  default interface methods routing through Component
- CommonPlayer.kick(Message) routes through Component
- Message.toString() callers migrated to Message.sendTo(sender)

New features:

- MessageRenderer: central MiniMessage rendering, legacy conversion, tag escaping
- Message.component(key): static convenience for resolving to Component
- Message.getRawTemplate(): access unrendered template strings
- Message.resolveComponent(): full Component pipeline with PAPI escaping
- PaperAdventureHelper: zero-overhead native Adventure on Paper servers
- NotificationsConfig: configurable staff notification channels (chat/actionbar/title/sound)
- NotificationUtils: unified staff notification delivery
- PaginatedView: Component-based pagination with clickable navigation
- ConfirmationManager: timed action confirmation system
- BmCommand: /bm confirm, /bm cancel, /bm dashboard subcommands
- Duration tab-complete presets for temp punishment commands
- Static tokens support in messages.yml
- Platform adapters: sendActionBar(), showTitle(), playSound() on all platforms
@confuser confuser force-pushed the feat/v8-minimessage-migration branch from 1f073ea to 647738c Compare April 12, 2026 13:20
- Fix static tokens (e.g. <appeal_url>) not resolving on ban screen by
  resetting tokens before loading locale files instead of after
- Use double quotes instead of single quotes in MiniMessage click/hover
  arguments so inner tags and placeholders resolve correctly
- Fix report action commands using /report instead of /reports for
  assign, close, and tp subcommands
- Fix dashboard openReports using /reports 1 instead of /reports list 1
- Fix PaginatedView hover text not parsing color tags (single quotes)
- Fix actionbar mute message missing player context
- Remove messages.yml from platform plugin configs array to avoid
  confusion with messages/messages_en.yml
MiniMessage Placeholder.unparsed() creates inserting tags that produce
Components, but click/hover event arguments need plain strings. This
caused <player> and other tokens inside click:run_command to be left
as literal text (e.g. /bminfo <player> instead of /bminfo Steve).

Switch to raw string replacement with tag escaping before MiniMessage
parsing so tokens resolve correctly everywhere, including inside
click and hover arguments.
…confirmation system

- Add [Info] click buttons to kick notify messages for consistency
  with ban/mute/warn notifications
- Wire up report.actions (assign/close/tp) buttons in InfoSubCommand
  so they display after viewing report details
- Remove dead confirmation system: ConfirmSubCommand, CancelSubCommand,
  ConfirmationManager, and related messages — nothing ever called
  ConfirmationManager.submit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant