Skip to content

Conversation

@mydelkonivea
Copy link
Contributor

@mydelkonivea mydelkonivea commented Jul 21, 2025

Fixes: #1041

@mydelkonivea mydelkonivea requested a review from a team as a code owner July 21, 2025 19:48
@coderabbitai

This comment was marked as spam.

@github-actions
Copy link

github-actions bot commented Jul 21, 2025

📦 Development Build Ready

Warning

Do not use this build in production. It is for testing purposes only and may be unstable.

👉 Click here to download the JAR

@mydelkonivea mydelkonivea changed the title upgrade admin chat command GH-1041 upgrade admin chat command Jul 21, 2025
@vLuckyyy vLuckyyy linked an issue Jul 21, 2025 that may be closed by this pull request
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (5)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java (3)

12-12: Consider reducing the task frequency

Running every second seems too frequent for a simple notification. Consider running every 10-30 seconds instead to reduce server load.

-@Task(period = 1, delay = 1, unit = TimeUnit.SECONDS)
+@Task(period = 10, delay = 1, unit = TimeUnit.SECONDS)

28-32: Add null safety after online check

The player retrieval looks good, but consider storing the player reference to avoid multiple lookups.

-        for (UUID enabledChatPlayerUUID : this.adminChatService.getAdminChatEnabledPlayers()) {
-
-            if (this.server.getPlayer(enabledChatPlayerUUID) == null) {
-                continue;
-            }
+        for (UUID enabledChatPlayerUUID : this.adminChatService.getAdminChatEnabledPlayers()) {
+            var player = this.server.getPlayer(enabledChatPlayerUUID);
+            if (player == null) {
+                continue;
+            }

12-12: Consider increasing the notification interval for better performance.

Running this task every second might be too frequent for spy notifications. Consider increasing to 30 seconds or 1 minute to reduce server load.

-@Task(period = 1, delay = 1, unit = TimeUnit.SECONDS)
+@Task(period = 30, delay = 1, unit = TimeUnit.SECONDS)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (2)

34-36: Consider thread safety for concurrent access.

The HashSet isn't thread-safe, which could cause issues if multiple threads access the service simultaneously. Consider using ConcurrentHashMap.newKeySet() instead.

-private final Collection<UUID> persistentAdminChatPlayers = new HashSet<>();
+private final Collection<UUID> persistentAdminChatPlayers = ConcurrentHashMap.newKeySet();

12-36: Note: Spy settings won't persist across restarts.

The current implementation keeps spy settings in memory only. Consider if persistence is needed for better user experience.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f533904 and 892ed93.

📒 Files selected for processing (8)
  • eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java (3 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatManagerController.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1 hunks)
🧰 Additional context used
🧠 Learnings (5)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1)

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatManagerController.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

🔇 Additional comments (14)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1)

7-9: Clean interface additions for spy mode messaging

The new methods follow the existing pattern and provide clear messaging support for the admin chat spy feature.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java (1)

47-54: Good spy mode toggle implementation

The service integration and conditional messaging work well together. The logic clearly toggles spy mode and provides appropriate feedback.

eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1)

1-33: Well-designed service interface

Clean interface with clear method signatures and comprehensive documentation. The toggle method returning the new state is particularly well thought out.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatManagerController.java (1)

41-43: Good early return pattern

Clean check for spy mode with early return keeps the method readable.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1)

18-26: Good Polish translations for spy mode

The messages are clear and follow the existing styling pattern. Using actionbar for the notification reminder is a nice touch.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (3)

17-25: Clean message implementation

The new spy-related messages are well-designed with clear wording and consistent formatting. Good choice using action bar for ongoing status notifications.


17-21: Well-designed spy toggle messages.

The enable/disable messages are clear and use consistent styling with the green arrow prefix.


23-24: Perfect choice for action bar notification.

Using an action bar notice for the spy status is ideal - it's visible but not intrusive for ongoing notifications.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (4)

18-26: Clean toggle implementation

The toggle logic is well-designed and returns the new state clearly. Good approach for boolean toggle operations.


34-36: Good defensive programming

Returning an unmodifiable collection prevents external modification. Well done!


12-12: Good choice using HashSet for UUID storage.

HashSet provides fast lookups and automatically handles duplicates for the spy player collection.


18-26: Clean toggle logic with helpful return value.

The toggle method correctly adds/removes players and returns the new state, making it easy for callers to show appropriate messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java (2)

30-32: Good null check for offline players.

The null check prevents errors when players go offline between getting the UUID list and checking their online status.


34-37: Clean notification implementation.

The notice creation and sending logic is well-structured and properly uses the translation system.

Copy link
Member

@P1otrulla P1otrulla left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job! 😎

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1)

18-18: Thread safety issue already identified

This was already flagged in a previous review - HashSet needs to be replaced with a thread-safe collection.

🧹 Nitpick comments (2)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java (1)

32-32: Small formatting fix needed

Remove the extra space before the parenthesis.

-    void onAdminChat (AsyncPlayerChatEvent event) {
+    void onAdminChat(AsyncPlayerChatEvent event) {
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1)

27-35: Simplify the toggle method

You can make this cleaner by using the return value of remove().

 @Override
 public boolean toggleChatPersistent(UUID playerUuid) {
-    if (this.persistentAdminChatPlayers.contains(playerUuid)) {
-        this.persistentAdminChatPlayers.remove(playerUuid);
-        return false;
-    } else {
-        this.persistentAdminChatPlayers.add(playerUuid);
-        return true;
-    }
+    if (this.persistentAdminChatPlayers.remove(playerUuid)) {
+        return false;
+    }
+    this.persistentAdminChatPlayers.add(playerUuid);
+    return true;
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c7ad18b and 64f5817.

📒 Files selected for processing (9)
  • eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java (3 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1 hunks)
🧠 Learnings (4)
📓 Common learnings
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.
Learnt from: Rollczi
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (5)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: vLuckyyy
PR: #856
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java:19-20
Timestamp: 2025-01-12T13:03:07.239Z
Learning: Configuration classes in EternalCore (those implementing ReloadableConfig and annotated with @ConfigurationFile) don't need thread-safe collections as they are managed by the configuration system which handles synchronization.

Learnt from: vLuckyyy
PR: #865
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveService.java:0-0
Timestamp: 2024-10-14T20:11:13.610Z
Learning: In the 'EternalCore' project, avoid using null in method signatures in Java code.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleServiceImpl.java:24-27
Timestamp: 2025-01-28T21:35:47.750Z
Learning: In EternalCore, async operations using CompletableFuture should remain non-blocking. Avoid using .join() or similar blocking operations to maintain better performance and scalability.

🚧 Files skipped from review as they are similar to previous changes (6)
  • eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.
Learnt from: Rollczi
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (5)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: vLuckyyy
PR: #856
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java:19-20
Timestamp: 2025-01-12T13:03:07.239Z
Learning: Configuration classes in EternalCore (those implementing ReloadableConfig and annotated with @ConfigurationFile) don't need thread-safe collections as they are managed by the configuration system which handles synchronization.

Learnt from: vLuckyyy
PR: #865
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveService.java:0-0
Timestamp: 2024-10-14T20:11:13.610Z
Learning: In the 'EternalCore' project, avoid using null in method signatures in Java code.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleServiceImpl.java:24-27
Timestamp: 2025-01-28T21:35:47.750Z
Learning: In EternalCore, async operations using CompletableFuture should remain non-blocking. Avoid using .join() or similar blocking operations to maintain better performance and scalability.

🔇 Additional comments (1)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (1)

1-13: Looks good!

Nice and clean permission constant with proper documentation.

@Rollczi
Copy link
Member

Rollczi commented Jul 22, 2025

jednak może lepiej wyogólnić tą nazwę i nie dodawać tam persistent

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1)

22-22: Use a thread-safe collection for concurrent access

The HashSet isn't thread-safe, but this service is accessed from multiple threads. This could cause issues.

-    private final Collection<UUID> playersWithEnabledChat = new HashSet<>();
+    private final Collection<UUID> playersWithEnabledChat = ConcurrentHashMap.newKeySet();
🧹 Nitpick comments (2)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1)

7-9: Consider more specific method names for clarity.

The method names enabled(), disabled(), and enabledReminder() are quite generic. Consider renaming to be more specific about persistent admin chat functionality:

-    Notice enabled();
-    Notice disabled();  
-    Notice enabledReminder();
+    Notice persistentChatEnabled();
+    Notice persistentChatDisabled();
+    Notice persistentChatReminder();
eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1)

1-1: Consider moving service interface to appropriate package.

The service interface is located in an "event" package, but this appears to be a core service. Consider moving it to a more appropriate package like com.eternalcode.core.feature.adminchat or com.eternalcode.core.feature.adminchat.service.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 241b134 and 290cb6e.

📒 Files selected for processing (9)
  • eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (1 hunks)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1 hunks)
🧠 Learnings (7)
📓 Common learnings
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.
Learnt from: Rollczi
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (3)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (3)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (5)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: vLuckyyy
PR: #856
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java:19-20
Timestamp: 2025-01-12T13:03:07.239Z
Learning: Configuration classes in EternalCore (those implementing ReloadableConfig and annotated with @ConfigurationFile) don't need thread-safe collections as they are managed by the configuration system which handles synchronization.

Learnt from: vLuckyyy
PR: #865
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveService.java:0-0
Timestamp: 2024-10-14T20:11:13.610Z
Learning: In the 'EternalCore' project, avoid using null in method signatures in Java code.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleServiceImpl.java:24-27
Timestamp: 2025-01-28T21:35:47.750Z
Learning: In EternalCore, async operations using CompletableFuture should remain non-blocking. Avoid using .join() or similar blocking operations to maintain better performance and scalability.

🚧 Files skipped from review as they are similar to previous changes (3)
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatCommand.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPersistentController.java
  • eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminTask.java
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.
Learnt from: CitralFlo
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.
Learnt from: Rollczi
PR: EternalCodeTeam/EternalCore#896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/AdminChatMessages.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (3)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (3)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: Rollczi
PR: #896
File: eternalcore-api/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatState.java:6-16
Timestamp: 2025-02-13T19:26:59.343Z
Learning: In the PrivateChatState enum, ENABLE means private messages are blocked (msgToggle is ON) and DISABLE means private messages are allowed (msgToggle is OFF). The enum values represent the state of the msgToggle feature itself, not the state of receiving messages.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (2)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (5)

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:92-102
Timestamp: 2025-01-28T21:37:36.945Z
Learning: In the EternalCore plugin's private chat feature, PrivateChatToggleState.ON means message blocking is enabled (no messages will be received), while PrivateChatToggleState.OFF means messages are allowed.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleCommand.java:1-1
Timestamp: 2025-01-30T19:49:57.192Z
Learning: In the EternalCore project's private chat toggle feature, PrivateChatToggleState.ON means messages are blocked, while OFF means messages are allowed.

Learnt from: vLuckyyy
PR: #856
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/warp/data/WarpDataConfig.java:19-20
Timestamp: 2025-01-12T13:03:07.239Z
Learning: Configuration classes in EternalCore (those implementing ReloadableConfig and annotated with @ConfigurationFile) don't need thread-safe collections as they are managed by the configuration system which handles synchronization.

Learnt from: vLuckyyy
PR: #865
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/essentials/item/give/GiveService.java:0-0
Timestamp: 2024-10-14T20:11:13.610Z
Learning: In the 'EternalCore' project, avoid using null in method signatures in Java code.

Learnt from: CitralFlo
PR: #896
File: eternalcore-core/src/main/java/com/eternalcode/core/feature/privatechat/toggle/PrivateChatToggleServiceImpl.java:24-27
Timestamp: 2025-01-28T21:35:47.750Z
Learning: In EternalCore, async operations using CompletableFuture should remain non-blocking. Avoid using .join() or similar blocking operations to maintain better performance and scalability.

🔇 Additional comments (5)
eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatPermissionConstant.java (1)

5-21: Good permission constant design with appropriate deprecation.

The transition from "spy" to "see" terminology is much clearer for admin chat functionality. The deprecation notice and documentation annotations are well-implemented.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/ENAdminChatMessages.java (1)

17-21: Clear and well-styled user messages.

The messages effectively communicate the persistent admin chat state with consistent styling and appropriate message types (chat vs actionbar).

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/messages/PLAdminChatMessages.java (1)

17-21: Good Polish localization with consistent styling.

The translations maintain the same user experience as the English version with appropriate Polish terminology.

eternalcore-api/src/main/java/com/eternalcode/core/feature/adminchat/event/AdminChatService.java (1)

15-25: Well-designed interface with clear documentation.

The method signatures and JavaDoc documentation clearly define the persistent admin chat functionality.

eternalcore-core/src/main/java/com/eternalcode/core/feature/adminchat/AdminChatServiceImpl.java (1)

47-50: Good use of defensive programming!

Returning an unmodifiable collection prevents external modification of the internal state.

Copy link
Contributor

@igoyek igoyek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 😎

@vLuckyyy vLuckyyy changed the title GH-1041 upgrade admin chat command GH-1041 Refactor AdminChat command to support admin chat channel. Jul 31, 2025
@vLuckyyy vLuckyyy merged commit cea8351 into master Jul 31, 2025
2 checks passed
@vLuckyyy vLuckyyy deleted the upgrade-adminchat branch July 31, 2025 20:32
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.

Enhance AdminChat Features and UX

9 participants