Unofficial site, not affiliated with modrinth.com.What is this?
Плагины/Zenith-Mod
Zenith-Mod

Zenith-Mod

Advanced moderation plugin with ban/mute systems, escalation templates, offline support, and Web-API integration for professional server management.

354
2
Все версииZenith-Mod 1.2.2

Zenith-Mod 1.2.2

Release6 мес. назад

Список изменений

Zenith-Mod v1.2.2 Release Notes

Update Notification System & Critical Bug Fixes

🔔 Update Notification System

  • Added: Automatic update checking for new plugin versions
  • Added: Players with zenith.update.notify permission get notified when a new version is available
  • Added: Clickable green "Modrinth" link that opens the download page
  • Features:
    • Async version checking via Modrinth API
    • Non-blocking update checks
    • Clean notification message with clickable link
    • Permission-based notification system (default: OP only)
  • Result: Staff members are automatically notified of new versions when joining the server

🔓 Unmute System Fix

  • Fixed: active_case now correctly set to null after unmute (instead of unmute case ID)
  • Fixed: ip_muted status now properly cleared when unmuting IP-muted players
  • Fixed: IPMUTE recognition (without underscore) in unmute operations
  • Added: Support for both IP_MUTE and IPMUTE punishment types in unmute logic
  • Changed: updatePlayerMuteStatus now sets active_case to null instead of unmute case ID
  • Result: Unmuted players have correct status flags, allowing them to be muted again if needed

⏱️ IP-Mute Duration Display Fix

  • Fixed: "Unknown" or "Permanent" duration display for IP-muted players
  • Fixed: Correct remaining duration calculation for IP_MUTE and IPMUTE types
  • Changed: JSON parsing now supports both "expiry_time" and "expiryTime" formats
  • Changed: Staff notifications now show accurate remaining mute time for IP-muted players
  • Result: Staff see correct remaining time (e.g., "45 minutes") instead of "Unknown" or "Permanent"

🎯 Offense Counter Fix

  • Fixed: Offense counting now works per template/reason instead of globally
  • Fixed: Different templates (e.g., "Doxx Threats", "Cheating") are counted separately
  • Changed: SQL query now filters by reason base (e.g., "Doxx Threats%") instead of all offenses
  • Changed: Template-based offense tracking prevents cross-template contamination
  • Result: Correct escalation levels per template (1st/2nd/3rd offense per specific reason)

🚀 Player Join Optimization & Mute Command Fix

  • Fixed: "Player not found in database" error when muting freshly joined players
  • Fixed: Race condition between player join and mute commands
  • Changed: Intelligent player database handling on join (existing vs new players)
  • Changed: Synchronous database creation for new players to prevent race conditions
  • Changed: Asynchronous updates for existing players (last_seen, IP) for performance
  • Added: Fallback mechanism for database errors during player join
  • Result: Mute commands work immediately after player join, no more "not found" errors

What Changed?

Before:

  • ❌ No automatic update notifications for staff
  • ❌ Players had to manually check for new versions
  • active_case set to unmute case ID prevented re-muting players
  • ip_muted status not cleared after unmuting IP-muted players
  • ❌ Staff notifications showed "Unknown" or "Permanent" for IP-muted players
  • ❌ Duration calculation failed for IP_MUTE and IPMUTE types
  • ❌ JSON parsing only checked for "expiryTime" format
  • ❌ Offense counting was global across all templates
  • ❌ Different templates contaminated each other's offense counts
  • ❌ Players got wrong escalation levels (e.g., "2nd Offense" when it was their first)
  • ❌ "Player not found in database" error when muting freshly joined players
  • ❌ Race condition between player join and mute commands
  • ❌ All player joins used asynchronous database operations

After:

  • ✅ Automatic update notifications when joining server
  • ✅ Clickable Modrinth link for easy download access
  • ✅ Permission-based notification system
  • active_case correctly set to null after unmute
  • ip_muted status properly cleared after unmuting IP-muted players
  • ✅ Both IP_MUTE and IPMUTE supported in unmute operations (I dont even know why I did IP_MUTE and IPMUTE in the first place 😭)
  • ✅ Accurate remaining duration shown in staff notifications
  • ✅ Supports both "expiry_time" and "expiryTime" JSON formats
  • ✅ Correct duration calculation for all mute types
  • ✅ Offense counting works per template/reason
  • ✅ Each template tracks offenses independently
  • ✅ Correct escalation levels per specific reason
  • ✅ Mute commands work immediately after player join
  • ✅ No more "Player not found in database" errors
  • ✅ Intelligent player database handling (existing vs new players)
  • ✅ Synchronous database creation for new players prevents race conditions

Technical Details

Update Notification System

  • UpdateChecker.java: New utility class for checking Modrinth API for updates
  • UpdateCheckListener.java: Event listener that checks for updates on player join
  • API Integration: Fetches version list from https://api.modrinth.com/v2/project/z-mod/version
  • Version Comparison: Semantic versioning comparison (MAJOR.MINOR.PATCH)
  • Notification: Adventure API message with clickable link using ClickEvent.OPEN_URL
  • Permission: zenith.update.notify (default: OP only)
  • Thread Safety: Async operations prevent blocking server thread

Unmute System Fix

  • MuteManager.unmutePlayerWithCaseId(): Now checks for MUTE, IP_MUTE, and IPMUTE types
  • MuteManager.unmuteOfflinePlayerWithCaseId(): Same fixes for offline unmute operations
  • PlayerRepository.updatePlayerMuteStatus(): Sets active_case to null instead of unmute case ID
  • PlayerRepository.setIpMuted(): Clears ip_muted status when unmuting IP-muted players
  • Case ID Tracking: Original mute case ID stored in additional_data for audit trail
  • Discord Logging: Original case ID displayed in unmute embeds

IP-Mute Duration Display Fix

  • MuteHandler.sendStaffNotificationForIpMutedChat(): Fixed JSON parsing for expiry time
  • JSON Parsing: Supports both "expiry_time" (underscore) and "expiryTime" (no underscore)
  • String Parsing: Proper extraction of expiry_time value from JSON strings
  • Duration Calculation: remainingSeconds = (expiryTime - currentTime) / 1000
  • Format Display: Uses DurationParser.formatDuration() for readable time display
  • Punishment Type Support: Recognizes both IP_MUTE and IPMUTE types

Offense Counter Fix

  • HistoryRepository.getOffenseCountByType(): Now filters by reason base instead of all offenses
  • Template Integration: Loads BanTemplate to get correct default reason for filtering
  • SQL Query: reason LIKE baseReason + "%" instead of reason LIKE "%(%"
  • Cross-Template Prevention: Different templates (e.g., "Doxx Threats", "Cheating") counted separately
  • Escalation Accuracy: Each template maintains independent offense counts
  • Backward Compatibility: Existing history entries remain unchanged

Player Join Optimization & Mute Command Fix

  • PlayerJoinHandler.continueNormalJoinProcess(): Intelligent player database handling
  • PlayerRepository.updatePlayerLastSeenAndIp(): New method for updating existing players
  • Synchronous Database Creation: New players created synchronously to prevent race conditions
  • Asynchronous Updates: Existing players updated asynchronously for performance
  • MuteCommand.handleOfflineManualMute(): Online player detection prevents database lookup errors
  • Race Condition Prevention: Eliminates timing issues between join and mute commands
  • Fallback Mechanism: Graceful error handling with async fallback

Compatibility

Update Notification System

  • ✅ Fully backward compatible
  • ✅ No configuration required
  • ✅ Permission-based access control
  • ✅ Works with all server types (Paper/Purpur)
  • ✅ Graceful handling of API failures

Unmute System

  • ✅ Fully backward compatible with existing unmutes
  • ✅ No database migration required
  • ✅ Works with all mute types (MUTE, IP_MUTE, IPMUTE)
  • ✅ Complete audit trail maintained
  • ✅ Discord logging shows original case ID

IP-Mute Duration Display

  • ✅ Fully backward compatible
  • ✅ Supports both JSON formats for expiry time
  • ✅ Handles missing or malformed JSON gracefully
  • ✅ Accurate duration calculation for all mute scenarios
  • ✅ Staff notifications work for all mute types

Offense Counter Fix

  • ✅ Fully backward compatible with existing history entries
  • ✅ No database migration required
  • ✅ Works with all ban/mute templates
  • ✅ Template-based offense tracking
  • ✅ Correct escalation levels per reason

Player Join Optimization & Mute Command Fix

  • ✅ Fully backward compatible with existing player data
  • ✅ No database migration required
  • ✅ Works with all server types (Paper/Purpur)
  • ✅ Minimal performance impact (only new players affected)
  • ✅ Graceful fallback for database errors

Changelog Summary

Added

  • 🔔 Update notification system for staff members
  • 🔔 Permission zenith.update.notify for update notifications
  • 🔗 Clickable Modrinth download link in notifications
  • 🔗 Async version checking via Modrinth API

Fixed

  • 🔓 active_case now correctly set to null after unmute
  • 🔓 ip_muted status now properly cleared after unmuting IP-muted players
  • 🔓 Both IP_MUTE and IPMUTE supported in unmute operations
  • ⏱️ Accurate duration display for IP-muted players in staff notifications
  • ⏱️ JSON parsing for "expiry_time" format (with underscore)
  • ⏱️ Duration calculation for all IP-mute types
  • 🎯 Offense counting now works per template instead of globally
  • 🎯 Different templates tracked independently (no cross-contamination)
  • 🎯 Correct escalation levels per specific reason
  • 🚀 "Player not found in database" error when muting freshly joined players
  • 🚀 Race condition between player join and mute commands

Changed

  • 🔔 Update checks are async and non-blocking
  • 🔓 Unmute operations now clear all mute flags correctly
  • ⏱️ Duration display uses proper JSON parsing for all formats
  • 🎯 SQL queries now filter by reason base instead of all offenses
  • 🎯 Template-based offense tracking prevents cross-contamination
  • 🚀 Player join handling now uses intelligent database operations
  • 🚀 New players created synchronously, existing players updated asynchronously
  • 🚀 Mute command detects online players to prevent database lookup errors

Version: 1.2.2
Released: January 17, 2025
Platform: Paper 1.21.4+

Файлы

Zenith-Mod-1.2.2.jar(667.31 KiB)
Основной
Скачать

Метаданные

Канал релиза

Release

Номер версии

1.2.2

Загрузчики

Paper
Purpur

Версии игры

1.19.4–1.21.10

Загрузок

35

Дата публикации

6 мес. назад

Загрузил

ID версии

Главная