Skip to content

Commit

Permalink
feat: ✨ make server text clickable
Browse files Browse the repository at this point in the history
  • Loading branch information
401U committed Jun 21, 2023
1 parent b7cf675 commit 0539a87
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
21 changes: 3 additions & 18 deletions src/main/java/com/zhanganzhi/chathub/command/Command.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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()) {
Expand Down
42 changes: 10 additions & 32 deletions src/main/java/com/zhanganzhi/chathub/core/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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() {
Expand Down

0 comments on commit 0539a87

Please sign in to comment.