From 0539a878e6b18dee3a2d0ebc4bed720d662c713d Mon Sep 17 00:00:00 2001 From: 401Unauthorized Date: Sat, 17 Jun 2023 11:49:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20make=20server=20text=20clic?= =?UTF-8?q?kable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adaptors/velocity/VelocityAdaptor.java | 81 +++++++++++++------ .../adaptors/velocity/VelocityComponent.java | 43 ++++++++++ .../zhanganzhi/chathub/command/Command.java | 21 +---- .../com/zhanganzhi/chathub/core/Config.java | 42 +++------- 4 files changed, 114 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityComponent.java diff --git a/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityAdaptor.java b/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityAdaptor.java index 8b4208f..7f82c0a 100644 --- a/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityAdaptor.java +++ b/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityAdaptor.java @@ -53,8 +53,16 @@ private void sendMessage(Component component, String... ignoredServers) { @Override public void onUserChat(MessageEvent event) { + String server = event.getServerName(); + String user = event.user(); + Boolean isClickable = event.platform() == Platform.VELOCITY; Arrays.stream(event.content().split("\n")).forEach(msg -> { - Component component = Component.text(config.getMinecraftChatMessage(event.getServerName(), event.user(), msg)); + Component component = new VelocityComponent(config.getMinecraftChatTamplate()) + .replaceServer("server", server, config.getServername(server), isClickable) + .replaceServer("plainServer", server, config.getPlainServername(server), isClickable) + .replaceString("name", user) + .replaceString("message", msg) + .asComponent(); // check complete takeover mode for message from velocity if (event.platform() == Platform.VELOCITY && !config.isCompleteTakeoverMode()) { sendMessage(component, event.server()); @@ -66,17 +74,35 @@ public void onUserChat(MessageEvent event) { @Override public void onJoinServer(ServerChangeEvent event) { - sendMessage(Component.text(config.getMinecraftJoinMessage(event.server, event.player.getUsername()))); + String server = event.server; + Component component = new VelocityComponent(config.getMinecraftJoinTamplate()) + .replaceServer("server", server, config.getServername(server)) + .replaceServer("plainServer", server, config.getPlainServername(server)) + .replaceString("name", event.player.getUsername()) + .asComponent(); + sendMessage(component); } @Override public void onLeaveServer(ServerChangeEvent event) { - sendMessage(Component.text(config.getMinecraftLeaveMessage(event.player.getUsername()))); + Component component = new VelocityComponent(config.getMinecraftLeaveTamplate()) + .replaceString("name", event.player.getUsername()) + .asComponent(); + sendMessage(component); } @Override public void onSwitchServer(ServerChangeEvent event) { - sendMessage(Component.text(config.getMinecraftSwitchMessage(event.player.getUsername(), event.serverPrev, event.server))); + String serverFrom = event.serverPrev; + String serverTo = event.server; + Component component = new VelocityComponent(config.getMinecraftSwitchTamplate()) + .replaceServer("serverFrom", serverFrom, config.getServername(serverFrom)) + .replaceServer("plainServerFrom", serverFrom, config.getPlainServername(serverFrom)) + .replaceServer("serverTo", serverTo, config.getServername(serverTo)) + .replaceServer("plainServerTo", serverTo, config.getPlainServername(serverTo)) + .replaceString("name", event.player.getUsername()) + .asComponent(); + sendMessage(component); } @Subscribe @@ -114,28 +140,37 @@ public void onPlayerDisconnect(DisconnectEvent event) { eventHub.onLeaveServer(new ServerChangeEvent(event)); } - @Override - public void sendListMessage(String source) { - boolean isListEmpty = true; + public Component getListComponent() { + if (proxyServer.getPlayerCount() == 0) { + return Component.text(config.getMinecraftListEmptyMessage()); + } + + Component result = Component.empty(); for (RegisteredServer registeredServer : proxyServer.getAllServers()) { - if (registeredServer.getPlayersConnected().size() > 0) { - isListEmpty = false; - proxyServer.getPlayer(source).ifPresent( - player -> player.sendMessage( - Component.text(config.getMinecraftListMessage( - registeredServer.getServerInfo().getName(), - registeredServer.getPlayersConnected().size(), - registeredServer.getPlayersConnected().stream().map(Player::getUsername).toArray(String[]::new) - )) - ) - ); + int playerCount = registeredServer.getPlayersConnected().size(); + if (playerCount > 0) { + result = result.append(Component.text("\n")); + String template = config.getMinecraftListTamplate(); + String server = registeredServer.getServerInfo().getName(); + String[] players = registeredServer.getPlayersConnected() + .stream().map(Player::getUsername).toArray(String[]::new); + Component line = new VelocityComponent(template) + .replaceServer("server", server, config.getServername(server)) + .replaceServer("plainServer", server, config.getPlainServername(server)) + .replaceString("count", String.valueOf(playerCount)) + .replaceString("playerList", String.join(", ", players)) + .asComponent(); + result = result.append(line); } } - if (isListEmpty) { - proxyServer.getPlayer(source).ifPresent( - player -> player.sendMessage(Component.text(config.getMinecraftListEmptyMessage())) - ); - } + return result; + } + + @Override + public void sendListMessage(String source) { + proxyServer.getPlayer(source).ifPresent(player -> { + player.sendMessage(getListComponent()); + }); } @Override diff --git a/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityComponent.java b/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityComponent.java new file mode 100644 index 0000000..7264ad3 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/adaptors/velocity/VelocityComponent.java @@ -0,0 +1,43 @@ +package com.zhanganzhi.chathub.adaptors.velocity; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TextReplacementConfig; +import net.kyori.adventure.text.event.ClickEvent; + +public class VelocityComponent { + private Component component; + + public VelocityComponent(String rawText) { + component = Component.text(rawText); + } + + public VelocityComponent replaceComponent(String field, ComponentLike replaceTarget) { + TextReplacementConfig replacementConfig = TextReplacementConfig + .builder() + .match("\\{"+ field +"\\}") + .replacement(replaceTarget) + .build(); + component = component.replaceText(replacementConfig); + return this; + } + + public VelocityComponent replaceString(String field, String replacement) { + return replaceComponent(field, Component.text(replacement)); + } + + public VelocityComponent replaceServer(String field, String server, String serverText, Boolean clickable) { + Component serverComponent = Component.text(serverText); + if (clickable) + serverComponent.clickEvent(ClickEvent.runCommand("/server " + server)); + return replaceComponent(field, serverComponent); + } + + public VelocityComponent replaceServer(String field, String server, String serverText) { + return replaceServer(field, server, serverText, true); + } + + public Component asComponent() { + return component; + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/command/Command.java b/src/main/java/com/zhanganzhi/chathub/command/Command.java index cbaa539..e587ee7 100644 --- a/src/main/java/com/zhanganzhi/chathub/command/Command.java +++ b/src/main/java/com/zhanganzhi/chathub/command/Command.java @@ -13,9 +13,8 @@ import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.command.SimpleCommand; import com.velocitypowered.api.proxy.ConsoleCommandSource; -import com.velocitypowered.api.proxy.server.RegisteredServer; - import com.zhanganzhi.chathub.ChatHub; +import com.zhanganzhi.chathub.adaptors.velocity.VelocityAdaptor; import com.zhanganzhi.chathub.core.Config; import com.zhanganzhi.chathub.entity.Platform; @@ -35,22 +34,8 @@ public void execute(final Invocation invocation) { Config config = Config.getInstance(); if (args.length == 1 && args[0].equals("list")) { - boolean isListEmpty = true; - for (RegisteredServer registeredServer : proxyServer.getAllServers()) { - if (registeredServer.getPlayersConnected().size() > 0) { - isListEmpty = false; - source.sendMessage(Component.text( - config.getMinecraftListMessage( - registeredServer.getServerInfo().getName(), - registeredServer.getPlayersConnected().size(), - registeredServer.getPlayersConnected().stream().map(Player::getUsername).toArray(String[]::new) - ) - )); - } - } - if (isListEmpty) { - source.sendMessage(Component.text(config.getMinecraftListEmptyMessage())); - } + VelocityAdaptor adaptor = (VelocityAdaptor) chatHub.getEventHub().getAdaptor(Platform.VELOCITY); + source.sendMessage(adaptor.getListComponent()); } else if (args.length == 1 && args[0].equals("reloadKook")) { if (source instanceof ConsoleCommandSource) { if (Config.getInstance().isKookEnabled()) { diff --git a/src/main/java/com/zhanganzhi/chathub/core/Config.java b/src/main/java/com/zhanganzhi/chathub/core/Config.java index f8b181b..e127d3a 100644 --- a/src/main/java/com/zhanganzhi/chathub/core/Config.java +++ b/src/main/java/com/zhanganzhi/chathub/core/Config.java @@ -57,37 +57,20 @@ public String getPlainServername(String server) { return getServername(server).replaceAll("ยง.", ""); } - public String getMinecraftChatMessage(String server, String name, String message) { - return configToml - .getString("minecraft.message.chat") - .replace("{server}", getServername(server)) - .replace("{plainServer}", getPlainServername(server)) - .replace("{name}", name) - .replace("{message}", message); + public String getMinecraftChatTamplate() { + return configToml.getString("minecraft.message.chat"); } - public String getMinecraftJoinMessage(String server, String name) { - return configToml - .getString("minecraft.message.join") - .replace("{server}", getServername(server)) - .replace("{plainServer}", getPlainServername(server)) - .replace("{name}", name); + public String getMinecraftJoinTamplate() { + return configToml.getString("minecraft.message.join"); } - public String getMinecraftLeaveMessage(String name) { - return configToml - .getString("minecraft.message.leave") - .replace("{name}", name); + public String getMinecraftLeaveTamplate() { + return configToml.getString("minecraft.message.leave"); } - public String getMinecraftSwitchMessage(String name, String serverFrom, String serverTo) { - return configToml - .getString("minecraft.message.switch") - .replace("{name}", name) - .replace("{serverFrom}", getServername(serverFrom)) - .replace("{plainServerFrom}", getPlainServername(serverFrom)) - .replace("{serverTo}", getServername(serverTo)) - .replace("{plainServerTo}", getPlainServername(serverTo)); + public String getMinecraftSwitchTamplate() { + return configToml.getString("minecraft.message.switch"); } public String getMinecraftMsgSenderMessage(String target, String message) { @@ -104,13 +87,8 @@ public String getMinecraftMsgTargetMessage(String sender, String message) { .replace("{message}", message); } - public String getMinecraftListMessage(String server, int count, String[] playerList) { - return configToml - .getString("minecraft.message.list") - .replace("{server}", getServername(server)) - .replace("{plainServer}", getPlainServername(server)) - .replace("{count}", String.valueOf(count)) - .replace("{playerList}", String.join(", ", playerList)); + public String getMinecraftListTamplate() { + return configToml.getString("minecraft.message.list"); } public String getMinecraftListEmptyMessage() {