diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLog.java b/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLog.java index df260e7..ddc9257 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLog.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLog.java @@ -1,6 +1,8 @@ package com.alttd.chat.objects.chat_log; import com.alttd.chat.objects.BatchInsertable; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogTypeMapper; import lombok.AllArgsConstructor; import lombok.Getter; import net.kyori.adventure.text.Component; diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogHandler.java b/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogHandler.java index 9764447..f63d820 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogHandler.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogHandler.java @@ -2,6 +2,8 @@ package com.alttd.chat.objects.chat_log; import com.alttd.chat.config.Config; import com.alttd.chat.database.ChatLogQueries; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogTypeMapper; import com.alttd.chat.util.ALogger; import lombok.extern.slf4j.Slf4j; import net.kyori.adventure.text.Component; @@ -18,7 +20,7 @@ import java.util.concurrent.*; @Slf4j public class ChatLogHandler { - private final ChatLogWebHandler chatLogWebHandler = new ChatLogWebHandler(); + private final WebHandler webHandler = new WebHandler(); private static ChatLogHandler instance = null; private ScheduledExecutorService executorService = null; @@ -156,7 +158,7 @@ public class ChatLogHandler { blocked ); addLog(chatLog); - chatLogWebHandler.forwardChatLogToWeb(chatLog); + webHandler.forwardChatLogToWeb(chatLog); } public CompletableFuture> retrieveChatLogs(UUID uuid, Duration duration, String server) { diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/SilentApiHandler.java b/api/src/main/java/com/alttd/chat/objects/chat_log/SilentApiHandler.java new file mode 100644 index 0000000..48a69bb --- /dev/null +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/SilentApiHandler.java @@ -0,0 +1,31 @@ +package com.alttd.chat.objects.chat_log; + +import com.alttd.altitudeweb.invoker.ApiCallback; +import com.alttd.altitudeweb.invoker.ApiException; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; +import java.util.Map; + +@Slf4j +public class SilentApiHandler implements ApiCallback { + + @Override + public void onFailure(ApiException e, int statusCode, Map> responseHeaders) { + log.error("Failed to update server states", e); + } + + @Override + public void onSuccess(Void result, int statusCode, Map> responseHeaders) { + + } + + @Override + public void onUploadProgress(long bytesWritten, long contentLength, boolean done) { + } + + @Override + public void onDownloadProgress(long bytesRead, long contentLength, boolean done) { + } + +} diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogWebHandler.java b/api/src/main/java/com/alttd/chat/objects/chat_log/WebHandler.java similarity index 82% rename from api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogWebHandler.java rename to api/src/main/java/com/alttd/chat/objects/chat_log/WebHandler.java index c8e7697..a2b1f02 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogWebHandler.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/WebHandler.java @@ -5,9 +5,11 @@ import com.alttd.altitudeweb.invoker.ApiClient; import com.alttd.altitudeweb.invoker.ApiException; import com.alttd.altitudeweb.model.ChatMessageDto; import com.alttd.chat.config.Config; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogMapper; +import com.alttd.chat.objects.chat_log.mapper.server_state.ServerMapper; import com.alttd.chat.util.ALogger; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; @@ -17,17 +19,17 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -public class ChatLogWebHandler { +@Slf4j +public class WebHandler { private static final int MAX_QUEUE_SIZE = 100; - private static final Logger log = LoggerFactory.getLogger(ChatLogWebHandler.class); private final Queue queue = new ConcurrentLinkedQueue<>(); private final ExecutorService executor = Executors.newSingleThreadExecutor(); private final ChatApi chatApi; - public ChatLogWebHandler() { + public WebHandler() { ApiClient apiClient = new ApiClient(); apiClient.setBasePath(Config.CHAT_WEB_SERVER_BASE_URL); @@ -46,6 +48,14 @@ public class ChatLogWebHandler { triggerSend(); } + public void updateServerState(String serverName, List playerList) { + try { + chatApi.updateServerStatesAsync(ServerMapper.toDto(serverName, playerList), new SilentApiHandler()); + } catch (ApiException e) { + log.error("Failed to update server state", e); + } + } + private void triggerSend() { if (sending) { return; diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogMapper.java b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogMapper.java similarity index 94% rename from api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogMapper.java rename to api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogMapper.java index 3ab446c..b751a0c 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogMapper.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogMapper.java @@ -1,6 +1,7 @@ -package com.alttd.chat.objects.chat_log; +package com.alttd.chat.objects.chat_log.mapper.chat_log; import com.alttd.altitudeweb.model.ChatMessageDto; +import com.alttd.chat.objects.chat_log.ChatLog; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validation; import jakarta.validation.Validator; diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogType.java b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogType.java similarity index 62% rename from api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogType.java rename to api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogType.java index dfd3771..ec36435 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogType.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogType.java @@ -1,4 +1,4 @@ -package com.alttd.chat.objects.chat_log; +package com.alttd.chat.objects.chat_log.mapper.chat_log; public enum ChatLogType { PUBLIC, diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogTypeMapper.java b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogTypeMapper.java similarity index 96% rename from api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogTypeMapper.java rename to api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogTypeMapper.java index 941fb23..17e7b60 100644 --- a/api/src/main/java/com/alttd/chat/objects/chat_log/ChatLogTypeMapper.java +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/chat_log/ChatLogTypeMapper.java @@ -1,4 +1,4 @@ -package com.alttd.chat.objects.chat_log; +package com.alttd.chat.objects.chat_log.mapper.chat_log; import com.alttd.altitudeweb.model.ChatMessageDto; import lombok.experimental.UtilityClass; diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/ServerMapper.java b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/ServerMapper.java new file mode 100644 index 0000000..9e50a35 --- /dev/null +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/ServerMapper.java @@ -0,0 +1,23 @@ +package com.alttd.chat.objects.chat_log.mapper.server_state; + +import com.alttd.altitudeweb.model.ServerDto; +import com.alttd.altitudeweb.model.ServerStateDto; +import lombok.experimental.UtilityClass; +import org.bukkit.entity.Player; + +import java.util.List; + +@UtilityClass +public class ServerMapper { + + public static ServerStateDto toDto(String serverName, List playerList) { + ServerStateDto serverStateDto = new ServerStateDto(); + ServerDto serverDto = new ServerDto(); + + serverDto.setName(serverName); + serverDto.setPlayers(playerList.stream().map(UserMapper::toDto).toList()); + serverStateDto.setServers(List.of(serverDto)); + return serverStateDto; + } + +} diff --git a/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/UserMapper.java b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/UserMapper.java new file mode 100644 index 0000000..addbaaa --- /dev/null +++ b/api/src/main/java/com/alttd/chat/objects/chat_log/mapper/server_state/UserMapper.java @@ -0,0 +1,17 @@ +package com.alttd.chat.objects.chat_log.mapper.server_state; + +import com.alttd.altitudeweb.model.UserDto; +import lombok.experimental.UtilityClass; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import org.bukkit.entity.Player; + +@UtilityClass +public class UserMapper { + public static UserDto toDto(Player player) { + UserDto userDto = new UserDto(); + userDto.setName(player.getName()); + userDto.setUuid(player.getUniqueId()); + userDto.setStyledName(GsonComponentSerializer.gson().serialize(player.displayName())); + return userDto; + } +} diff --git a/galaxy/src/main/java/com/alttd/chat/chat_web/ChatMessageSender.java b/galaxy/src/main/java/com/alttd/chat/chat_web/ChatMessageSender.java index eea4983..105b78d 100644 --- a/galaxy/src/main/java/com/alttd/chat/chat_web/ChatMessageSender.java +++ b/galaxy/src/main/java/com/alttd/chat/chat_web/ChatMessageSender.java @@ -8,7 +8,7 @@ import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.FilterType; import com.alttd.chat.objects.ModifiableString; import com.alttd.chat.objects.chat_log.ChatLogHandler; -import com.alttd.chat.objects.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; import com.alttd.chat.util.ALogger; import com.alttd.chat.util.GalaxyUtility; import com.alttd.chat.util.ServerName; diff --git a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java index 327d5a6..ef0dbeb 100755 --- a/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java +++ b/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java @@ -9,7 +9,7 @@ import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.ModifiableString; import com.alttd.chat.objects.channels.CustomChannel; import com.alttd.chat.objects.chat_log.ChatLogHandler; -import com.alttd.chat.objects.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; import com.alttd.chat.util.ALogger; import com.alttd.chat.util.GalaxyUtility; import com.alttd.chat.util.ServerName; diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/PlayerListener.java b/galaxy/src/main/java/com/alttd/chat/listeners/PlayerListener.java index e748e0e..b82544b 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/PlayerListener.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/PlayerListener.java @@ -8,6 +8,7 @@ import com.alttd.chat.managers.RegexManager; import com.alttd.chat.objects.ChatUser; import com.alttd.chat.objects.ModifiableString; import com.alttd.chat.objects.Toggleable; +import com.alttd.chat.objects.chat_log.WebHandler; import com.alttd.chat.util.GalaxyUtility; import com.alttd.chat.util.Utility; import net.kyori.adventure.text.Component; @@ -30,6 +31,7 @@ import org.jetbrains.annotations.NotNull; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.HashMap; import java.util.Stack; import java.util.UUID; @@ -38,6 +40,7 @@ import java.util.concurrent.TimeUnit; public class PlayerListener implements Listener { private final ServerConfig serverConfig; + private final WebHandler webHandler; public PlayerListener(ServerConfig serverConfig) { this.serverConfig = serverConfig; @@ -50,13 +53,16 @@ public class PlayerListener implements Listener { UUID uuid = player.getUniqueId(); Toggleable.disableToggles(uuid); - if (serverConfig.FIRST_JOIN_MESSAGES && (!player.hasPlayedBefore() || System.currentTimeMillis() - player.getFirstPlayed() < TimeUnit.SECONDS.toMillis(10))) { - Bukkit.broadcast(MiniMessage.miniMessage().deserialize(Config.FIRST_JOIN, Placeholder.parsed("player", player.getName()))); + if (serverConfig.FIRST_JOIN_MESSAGES && (!player.hasPlayedBefore() || System.currentTimeMillis() - player.getFirstPlayed() < TimeUnit.SECONDS.toMillis( + 10))) { + Bukkit.broadcast(MiniMessage.miniMessage() + .deserialize(Config.FIRST_JOIN, Placeholder.parsed("player", player.getName()))); } ChatUser user = ChatUserManager.getChatUser(uuid); - if(user != null) return; - + if (user != null) { + return; + } // user failed to load - create a new one ChatUser chatUser = new ChatUser(uuid, -1, null); @@ -64,6 +70,7 @@ public class PlayerListener implements Listener { Queries.saveUser(chatUser); //TODO load player on other servers with plugin message? + updateServerState(event.getPlayer(), true); } @EventHandler @@ -71,8 +78,24 @@ public class PlayerListener implements Listener { UUID uuid = event.getPlayer().getUniqueId(); ChatUser user = ChatUserManager.getChatUser(uuid); ChatUserManager.removeUser(user); + updateServerState(event.getPlayer(), false); } + private void updateServerState(Player triggerPlayer, boolean add) { + ArrayList playerList = new ArrayList<>(Bukkit.getOnlinePlayers()); + if (add) { + if (playerList.stream() + .filter(player -> player.getUniqueId().equals(triggerPlayer.getUniqueId())) + .findFirst() + .isEmpty()) { + playerList.add(triggerPlayer); + } + } else { + playerList.removeIf(player -> player.getUniqueId().equals(triggerPlayer.getUniqueId())); + } + String name = Bukkit.getServer().getName(); + webHandler.updateServerState(name, playerList); + } @EventHandler(ignoreCancelled = true) // untested public void onSignChangeE(SignChangeEvent event) { @@ -88,7 +111,8 @@ public class PlayerListener implements Listener { GalaxyUtility.sendBlockedNotification("Sign Language", player, Utility.parseMiniMessage(Utility.parseColors(modifiableString.string())), - ""); + "" + ); } component = modifiableString.component() == null ? Component.empty() : modifiableString.component(); @@ -99,6 +123,7 @@ public class PlayerListener implements Listener { } private final HashMap> sendPlayerDeaths = new HashMap<>(); + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPlayerDeath(@NotNull PlayerDeathEvent event) { UUID uuid = event.getPlayer().getUniqueId(); @@ -113,7 +138,7 @@ public class PlayerListener implements Listener { event.deathMessage(Component.empty()); return; } - Component component = event.deathMessage(); + Component component = event.deathMessage(); playerDeathsStack.push(Instant.now()); if (component == null) { @@ -132,7 +157,9 @@ public class PlayerListener implements Listener { .build(); component = component.replaceText(killerReplacement); } - component = MiniMessage.miniMessage().deserialize("[] ").append(component); + component = MiniMessage.miniMessage() + .deserialize("[] ") + .append(component); component = component.style(Style.style(TextColor.color(255, 155, 48), TextDecoration.ITALIC)); event.deathMessage(component); } diff --git a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java index 1bb5713..02329df 100755 --- a/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java +++ b/galaxy/src/main/java/com/alttd/chat/listeners/PluginMessage.java @@ -11,7 +11,7 @@ import com.alttd.chat.objects.PartyUser; import com.alttd.chat.objects.channels.Channel; import com.alttd.chat.objects.channels.CustomChannel; import com.alttd.chat.objects.chat_log.ChatLogHandler; -import com.alttd.chat.objects.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; import com.alttd.chat.util.ALogger; import com.alttd.chat.util.ServerName; import com.alttd.chat.util.Utility; diff --git a/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java b/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java index 0e64c54..5a614ea 100755 --- a/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java +++ b/velocity/src/main/java/com/alttd/velocitychat/handlers/ChatHandler.java @@ -7,7 +7,7 @@ import com.alttd.chat.managers.PartyManager; import com.alttd.chat.managers.RegexManager; import com.alttd.chat.objects.*; import com.alttd.chat.objects.chat_log.ChatLogHandler; -import com.alttd.chat.objects.chat_log.ChatLogType; +import com.alttd.chat.objects.chat_log.mapper.chat_log.ChatLogType; import com.alttd.chat.util.ALogger; import com.alttd.chat.util.Utility; import com.alttd.velocitychat.VelocityChat;