1.7.1 - Anti-Caps Filter & Discord Code-Span Escaping Fix
1.7.1 Changelog
New Features
- Anti-Caps filter: A new chat moderation filter that flags messages with too much uppercase. Configurable under a newanti-caps:section inconfig.yml. Defaults: enabled,action: block,min-length: 8,max-uppercase-percent: 70. Action can be set tolowercaseto silently transform offending messages instead of rejecting them. The ratio is measured against letters only, so punctuation, digits, and emoji do not dilute the count, and short messages like "OK" or "HI" pass through unaffected. Mirrors the existing anti-flood / anti-spam structure and gets its ownanti-caps: truetoggle insideprivate-messages:so admins can apply it independently to global chat and PMs.
Fixes
Affected templates
- Fixed Discord bridge rendering a literal backslash for player-controlled placeholders wrapped in backticks. Templates like `
{name}: {message}previously sent`leo\_parti`because the markdown-escape pass ran even when the placeholder sat inside an inline code span; Discord doesn't honor backslash escapes inside code spans, so the backslash showed up verbatim. The template renderer is now code-span aware: outside code spans, full markdown escaping still applies (so a player can't injectboldor> quote`); inside a code span, only backticks are neutralized (replaced with U+02CBˋ) so a player can't break out.- Fixed
@Plugin(version = ...)annotation lagging the Gradle version. Velocity's annotation processor bakes this string into the runtimevelocity-plugin.json, so 1.7.0 was reporting itself as 1.6.0 in proxy logs and/velocity plugins. Annotation is now sourced from the same release as Gradle.
Configuration
- Any
events.*.formatindiscord.ymlthat wraps{name},{message},{sender}, or{receiver}in single, double, or triple backticks.- No config migration needed - existing templates keep working and now render as intended.
- New
anti-caps:section inconfig.yml(andprivate-messages.anti-capstoggle). Smart Config Updater inserts both into existing user configs on upgrade.- New
anti-capslocale key added to all 18 bundled locale files. Existing user locale files have the key auto-added by the runtime locale updater on first start after the upgrade.
---
1.7.0 - Multi-Proxy Bridge
1.7.0 Changelog
New Features
Failure Modes
- Multi-Proxy Bridge: Share global chat,
/nmsg,/nr, online roster, and the global-chat toggle across multiple Velocity proxies via Redis. Off by default; opt-in through a newmulti-proxy:section inconfig.yml.- Per-feature toggles: independently enable/disable cross-proxy chat, private messages, online roster, toggle-state sync, and cooldown sync. Cooldown is opt-in (adds one Redis round-trip per chat send).
- Discord-aware dedupe: run identical
discord.ymlon every proxy. Outbound (MC -> Discord) is origin-only; inbound (Discord -> MC) uses a SETNX lock keyed by Discord message ID so the message bridges to MC exactly once.- Cross-proxy
/nmsgand/nr: tab completion includes players on other proxies; replies route to the recipient's current proxy.- Persistent toggle: a player's global-chat toggle follows them across proxies (stored in Redis as a set, restored on join).
- Pre-rendered chat templates: the origin proxy resolves placeholders (rank, custom name, server alias) before publishing, so visual output is identical across the cluster even when LuckPerms data only exists on one proxy.
Configuration
- Redis unreachable at startup: bridge logs a warning and stays inactive; local chat keeps working.
- Redis dies mid-session: publishes silently degrade (debug-logged); subscriber reconnects with capped exponential backoff (1s -> 30s); roster gracefully expires via TTL.
- Discord inbound: if Redis is unreachable while the dedupe lock is being acquired, each proxy processes the message locally without re-publishing - users see one copy, no duplicates after Redis recovers.
- A proxy crashes: its players auto-evict from the cross-proxy roster after
3 x heartbeat-intervalseconds.
Dependencies
- New
multi-proxy:section inconfig.yml, fully documented inline.- New file written on first start (when bridge enabled):
plugins/nexusshout/proxy-id.txt(auto-generated UUID, override viamulti-proxy.proxy-id).- Smart Config Updater inserts the new section into existing
config.ymlfiles on upgrade.
Notes
- Jedis 5.2.0 (relocated; shaded under
com.nexus.shout.libs.jedis).- Apache Commons Pool 2 (transitive; relocated under
com.nexus.shout.libs.commonspool2).
- Treat your Redis instance as trusted: anyone with network access can publish into the chat-bridge channels. Use AUTH and a private network.
- All proxies must share the same
chat-formatfor visually consistent output (the origin pre-renders the template)./nshoutreloadcleanly tears down and recreates the Jedis pool.
New Features
- Bot (uses a Discord Bot Token, powered by JDA). Required for inbound and supports embeds.
- Discord Integration: bridge Minecraft global chat (and join/leave/server-switch/PMs) to Discord, with optional Discord -> Minecraft inbound bridge.
- Two transports, choose per event:
- Webhook (no library; pure HTTP). Outbound only. Per-channel webhook URL with custom username and avatar.
- Inbound role gate: restrict who in a Discord channel can bridge to MC by Discord role IDs. Empty list = everyone in the channel.
- Per-server channel routing: map each proxy server to a different Discord channel/webhook; falls back to a default route.
- Player head avatars via Crafatar when using webhooks.
- Markdown <-> MiniMessage translation between Discord and MC.
- Mention sanitizer: prevents Everyone/here abuse, replaces <@id> with Name.
Configuration
- New file: plugins/nexusshout/discord.yml, fully documented inline.
- All Discord settings live there so credentials and routing can be managed independently (and easily excluded from version control).
Dependencies
- JDA 5.2.1 (relocated; shaded).
- OkHttp 4.12.0 (relocated; shaded).
Notes
- The bot needs the MESSAGE CONTENT and SERVER MEMBERS privileged intents only when inbound is enabled (toggle these in the Discord Developer Portal).
- Built-in safety: inbound messages are pushed via a dedicated path that does not loop back into Discord.
Default configuration available at https://github.com/Nexus-Craft/NexusShout-Resources
1.5.0 Changelog
Default config.yml and locale files:
https://github.com/Nexus-Craft/NexusShout-Resources
New Features
- Global Private Messaging: Added
/nmsg(aliases:/nms) and/nr(aliases:/nreply) for cross-server communication (disabled by default to avoid conflicts).- UNTESTED Vanish Integration: Privacy support for PremiumVanish and SayanVanish. Vanished players appear "not found" to senders without bypass permissions (
nshout.vanish.see).
Security & Moderation
- Mute Support: Private messages strictly respect LiteBans and LibertyBans mutes (or you can add the commands to LiteBans/LibertyBans config mute blacklist).
- Anti-Abuse: Applied global Anti-Spam and Anti-Flood filters to private messaging.
- Access Control: Added configurable permissions and separate cooldowns for private messages in
config.yml.
Configuration & System
Localization
- Smart Config Updater: Completely refactored the auto-updater to support nested configuration paths, ensuring new features are added safely without breaking existing configs.
- Locale Auto-Updater: The plugin now automatically appends missing translation keys to your locale files while preserving your custom edits and comments.
- Live Command Reload: Command registration is now dynamic; toggling features or changing aliases in
config.ymlapplies instantly via/nshoutreloadwithout needing a proxy restart.
- Full Language Support: Added private messaging, error, and moderation messages to all 18 supported languages (includingpm-mutednotifications).
Bug Fixes
- Event Priority: Added a configurable
chat-listener-priorityoption toconfig.ymlto resolve conflicts with low-level packet modification plugins.- Global Chat Leak: Fixed an issue where blocked global messages (e.g., due to cooldown or permission checks) would leak to the backend server.
1.4.1 Changelog
Fixes
- Fixed a critical bug in the config auto-updater where it would fail to copy the content of new configuration sections (like anti-flood/anti-spam settings) or insert them incorrectly nested inside other sections.
1.4.0 Changelog
New Features
- Anti-Flood: Prevents players from sending messages with excessive repetitive characters (e.g., "loooooool").
- Anti-Spam: Prevents players from sending similar messages consecutively using Levenshtein distance check.
- Mute Support: Integrated with LiteBans and LibertyBans to block muted players from using global chat. You can also adds the blacklist command on LiteBans/LibertyBans config to prevent muted players from executing the commands.
Configuration
- Added anti-flood section: max-consecutive-chars (default: 5)
- Added anti-spam section: similarity-threshold (default: 0.85)
- Added hooks section: Toggle litebans and libertybans integration
- Config auto-updater: Automatically adds new sections to existing config.yml
Localization
- Added anti-abuse and mute messages for all 18 supported languages
1.3.1 Changelog
New Features
- Start with Global Chat: Addedcommands.start-with-global-chatoption (default:false).
- Iftrue, players automatically join with Global Chat enabled.
Changes
- Improved config auto-updater.
1.3.0 Changelog
New Features
- Persistent Global Chat Toggle: Type
/gchat(no args) to toggle global chat mode on/off- Config Auto-Update: New settings are automatically added to existing configs
Configuration
- Addedcommands.enable-chat-toggleoption (default: true)
Localization
- Added the toggle messages for all 18 supported languages
