GH-930 Msg placeholders & Async placeholder for future #1203
GH-930 Msg placeholders & Async placeholder for future #1203
Conversation
* Register new placeholders for `msg_toggle` and `socialspy_status` in `MsgPlaceholderSetup`. * Extend `MsgMessages` with a `Placeholders` interface and implement language-specific placeholder formats in `ENMsgMessages` and `PLMsgMessages`.
* Add caching logic for `msg_toggle` state in `MsgPlaceholderSetup`. * Introduce new formatted placeholders for `msg_toggle` and `socialspy_status`. * Extend `MsgMessages.Placeholders` to support a loading state with translations.
…erAPI` * Adjust cache duration in `MsgPlaceholderSetup` from 200ms to 5s. * Rename `msg_toggle` placeholders to `msg_status` for consistency. * Extend `ENPlaceholders` and `PLPlaceholders` with `OkaeriConfig`. * Add `PlaceholderAPI` dependency in `runServer` task configuration.
* Replace existing cache in `MsgPlaceholderSetup` with `AsyncPlaceholderCached`. * Introduce `AsyncPlaceholderCacheRegistry` for managing placeholder caches. * Add `AsyncPlaceholderCacheController` to handle cache invalidation on player quit. * Simplify placeholder logic and remove redundant caching methods.
…derCacheRegistry` * Replace individual `stateCache` with dynamically registered cache in the `AsyncPlaceholderCacheRegistry`. * Simplify placeholder setup logic and adjust `MsgToggleService` to utilize the registry for cache management.
…lidation * Add `Subscribe` annotations to invalidate cache on `EternalReloadEvent` and `EternalShutdownEvent`.
* Rename `onEternalDisable` to `onDisable` and `onReload`.
There was a problem hiding this comment.
Code Review
This pull request introduces a new asynchronous caching mechanism for placeholders and integrates it with the messaging feature. The changes include a new AsyncPlaceholderCacheRegistry and AsyncPlaceholderCached for managing async data loading, new placeholders for message and social spy status, and refactoring MsgToggleServiceImpl to use the new caching system. The overall implementation is good, but I've found a few areas for improvement. There's a race condition in AsyncPlaceholderCached that could lead to multiple concurrent loads for the same data, some code duplication in MsgPlaceholderSetup when defining similar placeholders, and a minor inconsistency in a comment in one of the message files. I've left specific comments with suggestions on how to address these points.
...alcore-core/src/main/java/com/eternalcode/core/placeholder/cache/AsyncPlaceholderCached.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/messages/ENMsgMessages.java
Show resolved
Hide resolved
...nalcore-core/src/main/java/com/eternalcode/core/feature/msg/toggle/MsgToggleServiceImpl.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
...alcore-core/src/main/java/com/eternalcode/core/placeholder/cache/AsyncPlaceholderCached.java
Outdated
Show resolved
Hide resolved
...core/src/main/java/com/eternalcode/core/placeholder/cache/AsyncPlaceholderCacheRegistry.java
Outdated
Show resolved
Hide resolved
...nalcore-core/src/main/java/com/eternalcode/core/feature/msg/toggle/MsgToggleServiceImpl.java
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/messages/PLMsgMessages.java
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/messages/ENMsgMessages.java
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/MsgPlaceholderSetup.java
Outdated
Show resolved
Hide resolved
eternalcore-core/src/main/java/com/eternalcode/core/feature/msg/messages/ENMsgMessages.java
Show resolved
Hide resolved
Rollczi
left a comment
There was a problem hiding this comment.
1 komentarz na razie bo może być dużo do przerobienia
...nalcore-core/src/main/java/com/eternalcode/core/feature/msg/toggle/MsgToggleServiceImpl.java
Outdated
Show resolved
Hide resolved
|
nic się nie dzieje to zrobiłem commita |
# Conflicts: # eternalcore-core/src/main/java/com/eternalcode/core/bridge/BridgeManager.java # eternalcore-core/src/main/java/com/eternalcode/core/bridge/placeholderapi/PlaceholderAPIPlaceholder.java # eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholderBukkitRegistryImpl.java # eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholderRaw.java # eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholderRegistry.java # eternalcore-core/src/main/java/com/eternalcode/core/placeholder/PlaceholderReplacer.java # eternalcore-plugin/build.gradle.kts
CitralFlo
left a comment
There was a problem hiding this comment.
-- Polish below --
For me using watcher is a little counterintuitive.
We are using cache in PlaceholderAsync, so maybe moving it to the PlaceholderSetup.class would be a better option.
My idea is creating a interface or abstract that needs to be implemented in PlaceholderSetup for AsyncPlaceholder. Instead of putting the watcher in Repo and then using Repo in setup class. I would suggest using predefined standards with cache (required) in class method for refresh and method used in Service that would update / call update for specific player. Additional fallback option that would display some text before accessing value in db ex. "Loading..." it would not be a problem if the player will get answer from server in next message - when placeholder is ready.
PL:
Tak jak patrze to i tak opiera sie na cache.
Może jakiś standard do tego cache i wołanie do placeholderów z update z serwisu, dodatkowo jakis fallback jakby nie bylo. Raczej nie problem jak sie wyswietli "Loading..." a potem poprawna wartosc w następnej wiadomości.
Tylko wiesz np jako abstract albo interfejs dla PlaceholderAsync. Że wymaga tego placeholder i wszystkie warunki do trzymania tych danych są spełnione
napisze to w review.
| } | ||
|
|
||
| static <T> Placeholder async( | ||
| String target, |
There was a problem hiding this comment.
I would rename target to sth like "placeholderName"
Tested with love for OpenSource 💕
https://medal.tv/pl/games/minecraft/clips/lhPGLpi6DGCYMFpSd?invite=cr-MSxmazgsNDI2MDIzOTA4&