From f748262ada4318e7fd5e803c93f57ea99a816392 Mon Sep 17 00:00:00 2001 From: Andy Zhang <37402126+AnzhiZhang@users.noreply.github.com> Date: Fri, 16 Dec 2022 02:37:01 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=89=20initial=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ZhuRuoLing --- .gitignore | 5 + ChatHub.iml | 13 ++ pom.xml | 73 +++++++++ .../java/com/zhanganzhi/chathub/ChatHub.java | 95 ++++++++++++ .../zhanganzhi/chathub/command/Command.java | 62 ++++++++ .../com/zhanganzhi/chathub/core/Config.java | 144 ++++++++++++++++++ .../com/zhanganzhi/chathub/core/EventHub.java | 47 ++++++ .../chathub/kook/MessageCardGenerator.java | 66 ++++++++ .../chathub/receiver/KookReceiver.java | 23 +++ .../chathub/receiver/VelocityReceiver.java | 62 ++++++++ .../zhanganzhi/chathub/sender/ISender.java | 11 ++ .../zhanganzhi/chathub/sender/KookSender.java | 47 ++++++ .../chathub/sender/VelocitySender.java | 60 ++++++++ src/main/resources/config.toml | 32 ++++ 14 files changed, 740 insertions(+) create mode 100644 .gitignore create mode 100644 ChatHub.iml create mode 100644 pom.xml create mode 100644 src/main/java/com/zhanganzhi/chathub/ChatHub.java create mode 100644 src/main/java/com/zhanganzhi/chathub/command/Command.java create mode 100644 src/main/java/com/zhanganzhi/chathub/core/Config.java create mode 100644 src/main/java/com/zhanganzhi/chathub/core/EventHub.java create mode 100644 src/main/java/com/zhanganzhi/chathub/kook/MessageCardGenerator.java create mode 100644 src/main/java/com/zhanganzhi/chathub/receiver/KookReceiver.java create mode 100644 src/main/java/com/zhanganzhi/chathub/receiver/VelocityReceiver.java create mode 100644 src/main/java/com/zhanganzhi/chathub/sender/ISender.java create mode 100644 src/main/java/com/zhanganzhi/chathub/sender/KookSender.java create mode 100644 src/main/java/com/zhanganzhi/chathub/sender/VelocitySender.java create mode 100644 src/main/resources/config.toml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..929e10a --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# idea +/.idea/ + +# maven +/target/ diff --git a/ChatHub.iml b/ChatHub.iml new file mode 100644 index 0000000..b9d6621 --- /dev/null +++ b/ChatHub.iml @@ -0,0 +1,13 @@ + + + + + + + VELOCITY + ADVENTURE + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3af25ea --- /dev/null +++ b/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + com.zhanganzhi.chathub + ChatHub + 1.0.0 + + + 17 + 17 + UTF-8 + + + + + papermc + https://repo.papermc.io/repository/maven-public/ + + + + + + com.velocitypowered + velocity-api + 3.1.1 + provided + + + net.deechael + khl + 1.09.0 + compile + + + org.slf4j + slf4j-api + + + com.google.guava + guava + + + com.google.code.gson + gson + + + + + + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + + + + + diff --git a/src/main/java/com/zhanganzhi/chathub/ChatHub.java b/src/main/java/com/zhanganzhi/chathub/ChatHub.java new file mode 100644 index 0000000..061c3f2 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/ChatHub.java @@ -0,0 +1,95 @@ +package com.zhanganzhi.chathub; + +import java.io.File; +import java.util.HashSet; +import java.nio.file.Path; +import java.lang.reflect.Field; + +import org.slf4j.Logger; +import com.google.inject.Inject; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import net.deechael.khl.bot.KaiheilaBot; +import net.deechael.khl.bot.KaiheilaBotBuilder; +import net.deechael.khl.event.MessageHandler; + +import com.zhanganzhi.chathub.core.Config; +import com.zhanganzhi.chathub.core.EventHub; +import com.zhanganzhi.chathub.command.Command; +import com.zhanganzhi.chathub.receiver.VelocityReceiver; +import com.zhanganzhi.chathub.receiver.KookReceiver; + +@Plugin( + id = "chathub", + name = "ChatHub", + version = "1.0.0", + url = "https://github.com/AnzhiZhang/ChatHub", + description = "Chat hub for servers under velocity proxy", + authors = {"Andy Zhang", "ZhuRuoLing"} +) +public class ChatHub { + private final ProxyServer server; + private final Path dataDirectory; + private KaiheilaBot kaiheilaBot; + + @Inject + public ChatHub(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { + this.server = server; + this.dataDirectory = dataDirectory; + } + + public ProxyServer getServer() { + return server; + } + + public KaiheilaBot getKaiheilaBot() { + return kaiheilaBot; + } + + @Subscribe + public void onInitialize(ProxyInitializeEvent event) { + // core + Config.getInstance().loadConfig(dataDirectory); + kaiheilaBot = (KaiheilaBot) KaiheilaBotBuilder.builder().createDefault(Config.getInstance().getKookToken()).build(); + EventHub eventHub = new EventHub(this); + + // command + server.getCommandManager().register( + server.getCommandManager().metaBuilder("chathub").plugin(this).build(), + new Command(server) + ); + + // velocity receiver + server.getEventManager().register(this, new VelocityReceiver(eventHub)); + + // kook receiver + if (Config.getInstance().isKookEnabled()) { + new Thread(() -> { + try { + Field messageHandlersField = ChatHub.this.kaiheilaBot.getEventManager().getClass().getDeclaredField("messageHandlers"); + messageHandlersField.setAccessible(true); + messageHandlersField.set(ChatHub.this.kaiheilaBot.getEventManager(), new HashSet()); + } catch (Exception exception) { + throw new RuntimeException(exception); + } + ChatHub.this.kaiheilaBot.getEventManager().registerMessageHandler(new KookReceiver(eventHub)); + ChatHub.this.kaiheilaBot.start(); + }).start(); + } + } + + @Subscribe + public void onProxyShutdown(ProxyShutdownEvent event) { + if (Config.getInstance().isKookEnabled()) { + kaiheilaBot.shutdown(); + File sessionFile = new File("session.dat"); + if (sessionFile.exists()) { + sessionFile.delete(); + } + } + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/command/Command.java b/src/main/java/com/zhanganzhi/chathub/command/Command.java new file mode 100644 index 0000000..22695e6 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/command/Command.java @@ -0,0 +1,62 @@ +package com.zhanganzhi.chathub.command; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import net.kyori.adventure.text.Component; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.SimpleCommand; +import com.velocitypowered.api.proxy.server.RegisteredServer; + +import com.zhanganzhi.chathub.core.Config; + +public final class Command implements SimpleCommand { + ProxyServer server; + + public Command(ProxyServer proxyServer) { + server = proxyServer; + } + + @Override + public void execute(final Invocation invocation) { + CommandSource source = invocation.source(); + String[] args = invocation.arguments(); + Config config = Config.getInstance(); + + if (args.length == 1 && args[0].equals("list")) { + for (RegisteredServer registeredServer : server.getAllServers()) { + source.sendMessage(Component.text( + config.getMinecraftListMessage( + registeredServer.getServerInfo().getName(), + registeredServer.getPlayersConnected().size(), + registeredServer.getPlayersConnected().stream().map(Player::getUsername).toArray(String[]::new) + ) + )); + } + } else if (args.length == 3 && args[0].equals("msg")) { + Optional optionalPlayer = server.getPlayer(args[1]); + if (optionalPlayer.isPresent()) { + String senderName = source instanceof Player ? ((Player) source).getUsername() : "Server"; + source.sendMessage(Component.text(config.getMinecraftMsgSenderMessage(args[1], args[2]))); + optionalPlayer.get().sendMessage(Component.text(config.getMinecraftMsgTargetMessage(senderName, args[2]))); + } else { + source.sendMessage(Component.text("Player \"" + args[1] + "\" does not online!")); + } + } + } + + @Override + public List suggest(final Invocation invocation) { + String[] args = invocation.arguments(); + if (args.length <= 1) { + return Stream.of("list", "msg").filter(s -> s.startsWith(args.length > 0 ? args[0] : "")).toList(); + } else if (args.length == 2 && args[0].equals("msg")) { + return server.getAllPlayers().stream().map(Player::getUsername).filter(s -> s.startsWith(args[1])).toList(); + } else { + return List.of(); + } + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/core/Config.java b/src/main/java/com/zhanganzhi/chathub/core/Config.java new file mode 100644 index 0000000..15583ee --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/core/Config.java @@ -0,0 +1,144 @@ +package com.zhanganzhi.chathub.core; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + +import com.moandjiezana.toml.Toml; + +public class Config { + private static final Config config = new Config(); + private Toml configToml; + + private Config() { + } + + public static Config getInstance() { + return config; + } + + public void loadConfig(Path dataDirectory) { + // check data directory + if (!dataDirectory.toFile().exists()) { + dataDirectory.toFile().mkdir(); + } + + // check file exists + File configFile = new File(dataDirectory.toAbsolutePath().toString(), "config.toml"); + if (!configFile.exists()) { + try { + Files.copy(Objects.requireNonNull(getClass().getClassLoader().getResourceAsStream("config.toml")), configFile.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + configToml = new Toml().read(configFile); + } + + public boolean isCompleteTakeoverMode() { + return configToml.getBoolean("minecraft.completeTakeoverMode"); + } + + public String getServername(String server) { + String servername = configToml.getString("servername." + server); + return servername != null ? servername : server; + } + + 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("{name}", name) + .replace("{message}", message); + } + + public String getMinecraftJoinMessage(String server, String name) { + return configToml + .getString("minecraft.message.join") + .replace("{server}", getServername(server)) + .replace("{name}", name); + } + + public String getMinecraftLeaveMessage(String name) { + return configToml + .getString("minecraft.message.leave") + .replace("{name}", name); + } + + public String getMinecraftSwitchMessage(String name, String serverFrom, String serverTo) { + return configToml + .getString("minecraft.message.switch") + .replace("{name}", name) + .replace("{serverFrom}", getServername(serverFrom)) + .replace("{serverTo}", getServername(serverTo)); + } + + public String getMinecraftMsgSenderMessage(String target, String message) { + return configToml + .getString("minecraft.message.msgSender") + .replace("{target}", target) + .replace("{message}", message); + } + + public String getMinecraftMsgTargetMessage(String sender, String message) { + return configToml + .getString("minecraft.message.msgTarget") + .replace("{sender}", sender) + .replace("{message}", message); + } + + public String getMinecraftListMessage(String server, int count, String[] playerList) { + return configToml + .getString("minecraft.message.list") + .replace("{server}", getServername(server)) + .replace("{count}", String.valueOf(count)) + .replace("{playerList}", String.join(", ", playerList)); + } + + public boolean isKookEnabled() { + return configToml.getBoolean("kook.enable"); + } + + public String getKookToken() { + return configToml.getString("kook.token"); + } + + public String getKookChannelId() { + return configToml.getString("kook.channelId"); + } + + public String getKookChatMessage(String server, String name) { + return configToml + .getString("kook.message.chat") + .replace("{server}", getPlainServername(server)) + .replace("{name}", name); + } + + public String getKookJoinMessage(String server, String name) { + return configToml + .getString("kook.message.join") + .replace("{server}", getPlainServername(server)) + .replace("{name}", name); + } + + public String getKookLeaveMessage(String name) { + return configToml + .getString("kook.message.leave") + .replace("{name}", name); + } + + public String getKookSwitchMessage(String name, String serverFrom, String serverTo) { + return configToml + .getString("kook.message.switch") + .replace("{name}", name) + .replace("{serverFrom}", getPlainServername(serverFrom)) + .replace("{serverTo}", getPlainServername(serverTo)); + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/core/EventHub.java b/src/main/java/com/zhanganzhi/chathub/core/EventHub.java new file mode 100644 index 0000000..453c341 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/core/EventHub.java @@ -0,0 +1,47 @@ +package com.zhanganzhi.chathub.core; + +import com.zhanganzhi.chathub.ChatHub; +import com.zhanganzhi.chathub.sender.KookSender; +import com.zhanganzhi.chathub.sender.VelocitySender; + +public class EventHub { + private final VelocitySender velocitySender; + private final KookSender kookSender; + + public EventHub(ChatHub chatHub) { + velocitySender = new VelocitySender(chatHub); + kookSender = new KookSender(chatHub); + } + + public void onMinecraftMessage(String server, String name, String message) { + velocitySender.sendChatMessage(server, name, message); + if (Config.getInstance().isKookEnabled()) { + kookSender.sendChatMessage(server, name, message); + } + } + + public void onMinecraftJoinServer(String server, String name) { + velocitySender.sendJoinMessage(server, name); + if (Config.getInstance().isKookEnabled()) { + kookSender.sendJoinMessage(server, name); + } + } + + public void onMinecraftLeaveServer(String name) { + velocitySender.sendLeaveMessage(name); + if (Config.getInstance().isKookEnabled()) { + kookSender.sendLeaveMessage(name); + } + } + + public void onMinecraftSwitchServer(String name, String serverFrom, String serverTo) { + velocitySender.sendSwitchMessage(name, serverFrom, serverTo); + if (Config.getInstance().isKookEnabled()) { + kookSender.sendSwitchMessage(name, serverFrom, serverTo); + } + } + + public void onKookMessage(String name, String message) { + velocitySender.sendChatMessage("kook", name, message); + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/kook/MessageCardGenerator.java b/src/main/java/com/zhanganzhi/chathub/kook/MessageCardGenerator.java new file mode 100644 index 0000000..ab5fd2b --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/kook/MessageCardGenerator.java @@ -0,0 +1,66 @@ +package com.zhanganzhi.chathub.kook; + +import net.deechael.khl.message.cardmessage.Card; +import net.deechael.khl.message.cardmessage.CardMessage; +import net.deechael.khl.message.cardmessage.Size; +import net.deechael.khl.message.cardmessage.element.Image; +import net.deechael.khl.message.cardmessage.element.PlainText; +import net.deechael.khl.message.cardmessage.module.Divider; +import net.deechael.khl.message.cardmessage.module.Module; +import net.deechael.khl.message.cardmessage.module.Section; + +import com.zhanganzhi.chathub.core.Config; + +public class MessageCardGenerator { + private static Card getCard() { + Card card = new Card(); + card.setSize(Size.SM); + return card; + } + + private static Card getCard(Module module) { + Card card = getCard(); + card.append(module); + return card; + } + + private static Section getPlainTextSection(String content) { + Section section = new Section(); + PlainText text = new PlainText(); + text.setContent(content); + section.setText(text); + return section; + } + + public static CardMessage getChatCardMessage(String avatarUrl, String server, String name, String message) { + Card card = getCard(); + + // first module + Section firstModule = getPlainTextSection(Config.getInstance().getKookChatMessage(server, name)); + firstModule.setMode(Section.Mode.LEFT); + Image image = new Image(); + image.setSrc(avatarUrl); + firstModule.setAccessory(image); + card.append(firstModule); + + // second module + card.append(new Divider()); + + // third module + card.append(getPlainTextSection(message)); + + return new CardMessage().append(card); + } + + public static CardMessage getJoinCardMessage(String server, String name) { + return new CardMessage().append(getCard(getPlainTextSection(Config.getInstance().getKookJoinMessage(server, name)))); + } + + public static CardMessage getLeaveCardMessage(String name) { + return new CardMessage().append(getCard(getPlainTextSection(Config.getInstance().getKookLeaveMessage(name)))); + } + + public static CardMessage getSwitchMessage(String name, String serverFrom, String serverTo) { + return new CardMessage().append(getCard(getPlainTextSection(Config.getInstance().getKookSwitchMessage(name, serverFrom, serverTo)))); + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/receiver/KookReceiver.java b/src/main/java/com/zhanganzhi/chathub/receiver/KookReceiver.java new file mode 100644 index 0000000..4d9532a --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/receiver/KookReceiver.java @@ -0,0 +1,23 @@ +package com.zhanganzhi.chathub.receiver; + +import java.util.Objects; + +import net.deechael.khl.event.MessageHandler; +import net.deechael.khl.message.ReceivedChannelMessage; + +import com.zhanganzhi.chathub.core.Config; +import com.zhanganzhi.chathub.core.EventHub; + +public class KookReceiver extends MessageHandler { + private final EventHub eventHub; + + public KookReceiver(EventHub eventHub) { + this.eventHub = eventHub; + } + + public void onKMarkdown(ReceivedChannelMessage message) { + if (message.getChannel() != null && Objects.equals(message.getChannel().getId(), Config.getInstance().getKookChannelId())) { + eventHub.onKookMessage(message.getAuthor().getUsername(), message.getMessage().getContent()); + } + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/receiver/VelocityReceiver.java b/src/main/java/com/zhanganzhi/chathub/receiver/VelocityReceiver.java new file mode 100644 index 0000000..1112f5a --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/receiver/VelocityReceiver.java @@ -0,0 +1,62 @@ +package com.zhanganzhi.chathub.receiver; + +import java.util.Optional; + +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.player.PlayerChatEvent; +import com.velocitypowered.api.event.player.ServerConnectedEvent; +import com.velocitypowered.api.event.connection.DisconnectEvent; + +import com.zhanganzhi.chathub.core.Config; +import com.zhanganzhi.chathub.core.EventHub; + +public class VelocityReceiver { + private final EventHub eventHub; + + public VelocityReceiver(EventHub eventHub) { + this.eventHub = eventHub; + } + + @Subscribe + public void onPlayerChatEvent(PlayerChatEvent event) { + Player player = event.getPlayer(); + player.getCurrentServer().ifPresent( + serverConnection -> { + eventHub.onMinecraftMessage( + serverConnection.getServerInfo().getName(), + player.getUsername(), + event.getMessage() + ); + + // denied message if complete takeover mode enabled + if (Config.getInstance().isCompleteTakeoverMode()) { + event.setResult(PlayerChatEvent.ChatResult.denied()); + } + } + ); + } + + @Subscribe + public void onServerConnectedEvent(ServerConnectedEvent event) { + String name = event.getPlayer().getUsername(); + String server = event.getServer().getServerInfo().getName(); + Optional optionalPreviousServer = event.getPreviousServer(); + boolean isSwitchEvent = optionalPreviousServer.isPresent(); + if (isSwitchEvent) { + eventHub.onMinecraftSwitchServer( + name, + optionalPreviousServer.get().getServerInfo().getName(), + server + ); + } else { + eventHub.onMinecraftJoinServer(server, name); + } + } + + @Subscribe + public void onPlayerDisconnect(DisconnectEvent event) { + eventHub.onMinecraftLeaveServer(event.getPlayer().getUsername()); + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/sender/ISender.java b/src/main/java/com/zhanganzhi/chathub/sender/ISender.java new file mode 100644 index 0000000..25eed44 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/sender/ISender.java @@ -0,0 +1,11 @@ +package com.zhanganzhi.chathub.sender; + +public interface ISender { + void sendChatMessage(String server, String name, String message); + + void sendJoinMessage(String server, String name); + + void sendLeaveMessage(String name); + + void sendSwitchMessage(String name, String serverFrom, String serverTo); +} diff --git a/src/main/java/com/zhanganzhi/chathub/sender/KookSender.java b/src/main/java/com/zhanganzhi/chathub/sender/KookSender.java new file mode 100644 index 0000000..9ed0179 --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/sender/KookSender.java @@ -0,0 +1,47 @@ +package com.zhanganzhi.chathub.sender; + +import com.velocitypowered.api.proxy.ProxyServer; +import net.deechael.khl.bot.KaiheilaBot; +import net.deechael.khl.message.cardmessage.CardMessage; + +import com.zhanganzhi.chathub.ChatHub; +import com.zhanganzhi.chathub.core.Config; +import com.zhanganzhi.chathub.kook.MessageCardGenerator; + +public class KookSender implements ISender { + private final ProxyServer proxyServer; + private final KaiheilaBot kaiheilaBot; + + public KookSender(ChatHub chatHub) { + proxyServer = chatHub.getServer(); + kaiheilaBot = chatHub.getKaiheilaBot(); + } + + private String getAvatarUrl(String name) { + return proxyServer.getPlayer(name).map(player -> "https://mc-heads.net/avatar/" + player.getUniqueId().toString() + "/nohelm").orElse(null); + } + + private void sendMessage(CardMessage cardMessage) { + kaiheilaBot.getChannel(Config.getInstance().getKookChannelId()).sendMessage(cardMessage); + } + + @Override + public void sendChatMessage(String server, String name, String message) { + sendMessage(MessageCardGenerator.getChatCardMessage(getAvatarUrl(name), server, name, message)); + } + + @Override + public void sendJoinMessage(String server, String name) { + sendMessage(MessageCardGenerator.getJoinCardMessage(server, name)); + } + + @Override + public void sendLeaveMessage(String name) { + sendMessage(MessageCardGenerator.getLeaveCardMessage(name)); + } + + @Override + public void sendSwitchMessage(String name, String serverFrom, String serverTo) { + sendMessage(MessageCardGenerator.getSwitchMessage(name, serverFrom, serverTo)); + } +} diff --git a/src/main/java/com/zhanganzhi/chathub/sender/VelocitySender.java b/src/main/java/com/zhanganzhi/chathub/sender/VelocitySender.java new file mode 100644 index 0000000..8c1f8cc --- /dev/null +++ b/src/main/java/com/zhanganzhi/chathub/sender/VelocitySender.java @@ -0,0 +1,60 @@ +package com.zhanganzhi.chathub.sender; + +import java.util.Arrays; + +import net.kyori.adventure.text.Component; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.server.RegisteredServer; + +import com.zhanganzhi.chathub.ChatHub; +import com.zhanganzhi.chathub.core.Config; + +public class VelocitySender implements ISender { + private final ProxyServer proxyServer; + private final Config config = Config.getInstance(); + + public VelocitySender(ChatHub chatHub) { + proxyServer = chatHub.getServer(); + } + + private void sendMessage(Component component, String... ignoredServers) { + for (RegisteredServer registeredServer : proxyServer.getAllServers()) { + // ignore server + if (Arrays.asList(ignoredServers).contains(registeredServer.getServerInfo().getName())) { + continue; + } + + // foreach players + for (Player player : registeredServer.getPlayersConnected()) { + player.sendMessage(component); + } + } + } + + @Override + public void sendChatMessage(String server, String name, String message) { + Component component = Component.text(config.getMinecraftChatMessage(server, name, message)); + // check complete takeover mode + if (config.isCompleteTakeoverMode()) { + sendMessage(component); + } else { + sendMessage(component, server); + } + } + + @Override + public void sendJoinMessage(String server, String name) { + sendMessage(Component.text(config.getMinecraftJoinMessage(server, name))); + } + + @Override + public void sendLeaveMessage(String name) { + sendMessage(Component.text(config.getMinecraftLeaveMessage(name))); + } + + @Override + public void sendSwitchMessage(String name, String serverFrom, String serverTo) { + sendMessage(Component.text(config.getMinecraftSwitchMessage(name, serverFrom, serverTo))); + } +} diff --git a/src/main/resources/config.toml b/src/main/resources/config.toml new file mode 100644 index 0000000..1b06d72 --- /dev/null +++ b/src/main/resources/config.toml @@ -0,0 +1,32 @@ +[servername] +lobby = '§f§l大厅服' +survival = '§2§l生存服' +creative = '§6§l创造服' +kook = '§a§lKOOK' +qq = '§5§l群聊天' + +[minecraft] +completeTakeoverMode = false + +[minecraft.message] +chat = '§7[{server}§7]§e{name}§r: {message}' +join = '§8[§a+§8] §7[{server}§7] §e{name}' +leave = '§8[§c-§8] §e{name}' +switch = '§8[§b❖§8] §e{name}§r: §7«{serverFrom}§7» §6➟ §7«{serverTo}§7»' +msgSender = '§7§o你悄悄地对{target}说: {message}' +msgTarget = '§7§o{sender}悄悄地对你说: {message}' +list = '§8§l» §7[{server}§7]当前共有§6{count}§7名玩家在线: §e{playerList}' + +[kook] +enable = false +token = '' +channelId = '' + +[kook.message] +chat = '[{server}] <{name}>' +join = '<{name}> 加入了 [{server}]' +leave = '<{name}> 退出了游戏' +switch = '<{name}>: [{serverFrom}] ➟ [{serverTo}]' + +[qq] +enable = false