From fcfd299807746651e376bc68a1478e5348c32d21 Mon Sep 17 00:00:00 2001 From: mlus <1319237806@qq.com> Date: Wed, 12 Jun 2024 19:44:07 +0800 Subject: [PATCH] new method to sync chat --- .../fubuki/playersync/config/JdbcConfig.java | 8 ++ .../vip/fubuki/playersync/sync/ChatSync.java | 127 +++++++++++++----- 2 files changed, 99 insertions(+), 36 deletions(-) diff --git a/src/main/java/vip/fubuki/playersync/config/JdbcConfig.java b/src/main/java/vip/fubuki/playersync/config/JdbcConfig.java index 7193036..310affe 100644 --- a/src/main/java/vip/fubuki/playersync/config/JdbcConfig.java +++ b/src/main/java/vip/fubuki/playersync/config/JdbcConfig.java @@ -18,6 +18,10 @@ public class JdbcConfig { public static ForgeConfigSpec.ConfigValue> SYNC_WORLD; public static ForgeConfigSpec.BooleanValue USE_SSL; public static ForgeConfigSpec.BooleanValue SYNC_CHAT; + public static ForgeConfigSpec.BooleanValue IS_CHAT_SERVER; + public static ForgeConfigSpec.ConfigValue CHAT_SERVER_IP; + public static ForgeConfigSpec.IntValue CHAT_SERVER_PORT; + public static ForgeConfigSpec.IntValue CHAT_CLIENT_PORT; public static ForgeConfigSpec.ConfigValue SERVER_ID; @@ -34,6 +38,10 @@ public class JdbcConfig { SERVER_ID = COMMON_BUILDER.comment("the server id should be unique").define("Server_id", new Random().nextInt(1,Integer.MAX_VALUE-1)); SYNC_WORLD = COMMON_BUILDER.comment("The worlds that will be synchronized.If running in server it is supposed to have only one").define("sync_world", new ArrayList<>()); SYNC_CHAT= COMMON_BUILDER.comment("Whether synchronize chat").define("sync_chat", true); + IS_CHAT_SERVER = COMMON_BUILDER.comment("Whether recieve messages from other servers as host").define("IsChatServer",false); + CHAT_SERVER_IP = COMMON_BUILDER.define("ChatServerIP","127.0.0.1"); + CHAT_SERVER_PORT = COMMON_BUILDER.defineInRange("ChatServerPort",7900,0,65535); + CHAT_CLIENT_PORT = COMMON_BUILDER.defineInRange("ChatClientPort",7980,0,655535); COMMON_BUILDER.pop(); COMMON_CONFIG = COMMON_BUILDER.build(); } diff --git a/src/main/java/vip/fubuki/playersync/sync/ChatSync.java b/src/main/java/vip/fubuki/playersync/sync/ChatSync.java index 21fd0bd..215119d 100644 --- a/src/main/java/vip/fubuki/playersync/sync/ChatSync.java +++ b/src/main/java/vip/fubuki/playersync/sync/ChatSync.java @@ -6,45 +6,115 @@ import net.minecraft.server.players.PlayerList; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; -import vip.fubuki.playersync.util.JDBCsetUp; +import vip.fubuki.playersync.config.JdbcConfig; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; import java.util.Objects; +import java.util.Scanner; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class ChatSync { - static int tick = 0; - static long current = System.currentTimeMillis(); static PlayerList playerList; + static ServerSocket serverSocket; + static Socket clientSocket; + static Set SocketList; + static ExecutorService executorService = Executors.newCachedThreadPool(); + public static void register(){ + if(JdbcConfig.IS_CHAT_SERVER.get()) + new Thread(ChatSync::ServerSocket).start(); + ClientSocket(); MinecraftForge.EVENT_BUS.register(ChatSync.class); } - @SubscribeEvent - public static void onPlayerChat(net.minecraftforge.event.ServerChatEvent event) throws SQLException { - String sql = "INSERT INTO chat (player, message, timestamp) VALUES (?, ?, ?)"; - try (Connection connection = JDBCsetUp.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement(sql)) { - preparedStatement.setString(1, event.getUsername()); - preparedStatement.setString(2, event.getMessage()); - preparedStatement.setLong(3, current); - preparedStatement.executeUpdate(); + + private static void ServerSocket() { + try { + serverSocket = new ServerSocket(JdbcConfig.CHAT_SERVER_PORT.get()); + while (true) { + Socket newSocket = serverSocket.accept(); + SocketList.add(newSocket); + executorService.submit(() -> handleClient(newSocket)); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } - @SubscribeEvent - public static void Tick(net.minecraftforge.event.TickEvent.ServerTickEvent event) throws SQLException { - tick++; - if(tick == 20) { - ReadMessage(playerList); + private static void handleClient(Socket socket) { + try (InputStream inputStream = socket.getInputStream()) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + String message = new String(buffer, 0, bytesRead); + broadcastMessage(socket, message); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + SocketList.remove(socket); + try { + socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } + private static void broadcastMessage(Socket sender, String message) { + for (Socket socket : SocketList) { + if (!socket.equals(sender)) { + try { + OutputStream outputStream = socket.getOutputStream(); + outputStream.write(message.getBytes()); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + private static void ClientSocket() { + try { + clientSocket = new Socket(JdbcConfig.CHAT_SERVER_IP.get(), JdbcConfig.CHAT_SERVER_PORT.get()); + Scanner scanner = new Scanner(clientSocket.getInputStream()); + while (scanner.hasNextLine()) { + String line = scanner.nextLine(); + Component textComponents = Component.nullToEmpty(line); + playerList.broadcastMessage(textComponents, ChatType.CHAT, UUID.randomUUID()); + } + } catch (IOException e) { + e.printStackTrace(); + reconnectClient(); + } + } + + private static void reconnectClient() { + //TODO + } + + @SubscribeEvent + public static void onPlayerChat(net.minecraftforge.event.ServerChatEvent event) throws IOException { + String message= event.getUsername()+":"+event.getMessage(); + OutputStream outputStream = clientSocket.getOutputStream(); + outputStream.write(message.getBytes()); + } + @SubscribeEvent public static void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event){ playerList= Objects.requireNonNull(event.getPlayer().getServer()).getPlayerList(); @@ -54,19 +124,4 @@ public class ChatSync { public static void onPlayerLeave(PlayerEvent.PlayerLoggedOutEvent event){ playerList= Objects.requireNonNull(event.getPlayer().getServer()).getPlayerList(); } - - public static void ReadMessage(PlayerList playerList) throws SQLException { - JDBCsetUp.QueryResult queryResult=JDBCsetUp.executeQuery("SELECT * FROM chat WHERE timestamp > " + current); - ResultSet resultSet= queryResult.getResultSet(); - current = System.currentTimeMillis(); - tick = 0; - while(resultSet.next()) { - String player = resultSet.getString("player"); - String message = resultSet.getString("message"); - Component textComponents = Component.nullToEmpty(player+": "+message); - playerList.broadcastMessage(textComponents, ChatType.CHAT, UUID.nameUUIDFromBytes(player.getBytes())); - } - resultSet.close(); - queryResult.getConnection().close(); - } }