From 1f5428ccdc0694b872211c7ff596d672c4d62286 Mon Sep 17 00:00:00 2001 From: carm Date: Tue, 2 Jun 2020 12:14:50 +0800 Subject: [PATCH] =?UTF-8?q?Cn2b2t=E6=B7=BB=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2b2t-core/pom.xml | 6 + .../src/main/java/org.cn2b2t.core/Main.java | 14 +- .../listener/ServersUpdateListener.java | 38 ++++ .../managers/utils/DataManager.java | 22 +- .../managers/utils/ServersManager.java | 195 +++++++++++++----- .../modules/DataServerInfo.java | 61 ++++++ .../modules/LocalServerInfo.java | 59 ++++++ 7 files changed, 337 insertions(+), 58 deletions(-) create mode 100644 2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java create mode 100644 2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java create mode 100644 2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java diff --git a/2b2t-core/pom.xml b/2b2t-core/pom.xml index ca83c1e..bb6c2ad 100644 --- a/2b2t-core/pom.xml +++ b/2b2t-core/pom.xml @@ -56,6 +56,12 @@ ${basedir}/../_lib/spigot.jar system + + org.cn2b2t + 2b2t-proxy + 1.0-SNAPSHOT + compile + diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/Main.java b/2b2t-core/src/main/java/org.cn2b2t.core/Main.java index 777fe80..279a837 100644 --- a/2b2t-core/src/main/java/org.cn2b2t.core/Main.java +++ b/2b2t-core/src/main/java/org.cn2b2t.core/Main.java @@ -9,7 +9,10 @@ import org.cn2b2t.core.commands.Kar; import org.cn2b2t.core.listener.JoinListener; import org.cn2b2t.core.listener.TabCompleteListener; import org.cn2b2t.core.managers.users.UserValueManager; -import org.cn2b2t.core.managers.utils.*; +import org.cn2b2t.core.managers.utils.ConfigManager; +import org.cn2b2t.core.managers.utils.DataManager; +import org.cn2b2t.core.managers.utils.MessagerManager; +import org.cn2b2t.core.managers.utils.ServersManager; import org.cn2b2t.core.utils.ColorParser; import java.util.logging.Level; @@ -38,6 +41,15 @@ public class Main extends JavaPlugin { // log("&7├ &f启用跨服管理器..."); ServersManager.init(); + if (Main.getInstance().getConfig().getBoolean("Servers.auto-register", true)) { + log("&7├ &f检测到启用自动注册,即将尝试向 SYSTEM.CONENCTION 注册。"); + ServersManager.registerServer( + "single-" + Integer.toHexString(Bukkit.getPort()), + (Bukkit.getServer().getIp() == null || Bukkit.getServer().getIp().equalsIgnoreCase("") ? "127.0.0.1" : Bukkit.getServer().getIp()), + Bukkit.getPort(), + "cn2b2t" + ); + } log("&7├ &f启用用户Value管理器...."); UserValueManager.init(); diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java b/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java new file mode 100644 index 0000000..4365690 --- /dev/null +++ b/2b2t-core/src/main/java/org.cn2b2t.core/listener/ServersUpdateListener.java @@ -0,0 +1,38 @@ +package org.cn2b2t.core.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.cn2b2t.core.Main; +import org.cn2b2t.core.managers.utils.ServersManager; + +public class ServersUpdateListener implements Listener { + + + @EventHandler + public static void onJoin(PlayerJoinEvent e) { + if (ServersManager.getLocalRegisteredServer() != null) { + new BukkitRunnable() { + @Override + public void run() { + ServersManager.getLocalRegisteredServer().writeInfo(); + } + }.runTaskLaterAsynchronously(Main.getInstance(), 10L); + } + } + + @EventHandler + public static void onQuit(PlayerQuitEvent e) { + ServersManager.requests.remove(e.getPlayer()); + if (ServersManager.getLocalRegisteredServer() != null) { + new BukkitRunnable() { + @Override + public void run() { + ServersManager.getLocalRegisteredServer().writeInfo(); + } + }.runTaskLaterAsynchronously(Main.getInstance(), 10L); + } + } +} diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java index be0d37b..8719f79 100644 --- a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java +++ b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/DataManager.java @@ -6,22 +6,38 @@ import org.cn2b2t.core.managers.utils.database.Connection; public class DataManager { private static Connection connection; + private static Connection tempConnection; public static void init() { connection = new Connection( ConfigManager.config.getString("Database.host", "127.0.0.1"), ConfigManager.config.getInt("Database.port", 3306), - ConfigManager.config.getString("Database.data", "guiying"), - ConfigManager.config.getString("Database.user", "guiying"), - ConfigManager.config.getString("Database.password", "guiying")); + ConfigManager.config.getString("Database.data", "moci"), + ConfigManager.config.getString("Database.user", "moci"), + ConfigManager.config.getString("Database.password", "moci")); + tempConnection = new Connection( + ConfigManager.config.getString("Database.host", "127.0.0.1"), + ConfigManager.config.getInt("Database.port", 3306), + ConfigManager.config.getString("Database.tempdata", "temp"), + ConfigManager.config.getString("Database.user", "moci"), + ConfigManager.config.getString("Database.password", "moci")); if (connection.connect()) { Main.log("&7├ └ &a数据库连接成功!"); } else { Main.log("&7├ └ &c数据库连接失败!"); } + if (tempConnection.connect()) { + Main.log("&7├ └ &a临时数据库连接成功!"); + } else { + Main.log("&7├ └ &c临时数据库连接失败!"); + } } + public static Connection getTempConnection() { + return tempConnection; + } + public static Connection getConnection() { return connection; } diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java index 25955b0..2875cc6 100644 --- a/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java +++ b/2b2t-core/src/main/java/org.cn2b2t.core/managers/utils/ServersManager.java @@ -4,68 +4,114 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.cn2b2t.core.Main; -import org.cn2b2t.core.managers.users.UserValueManager; +import org.cn2b2t.core.listener.ServersUpdateListener; +import org.cn2b2t.core.modules.DataServerInfo; +import org.cn2b2t.core.modules.LocalServerInfo; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -public class ServersManager -// implements PluginMessageListener -{ - +public class ServersManager { public static List requests = new ArrayList<>(); - public static List allPlayers = new ArrayList<>(); + + public static String databaseTable = "game_servers"; + public static String messageChannel = "serversmanager"; + + private static LocalServerInfo localRegisteredServer; + + private static Map dataServers = new HashMap<>(); + + private static BukkitRunnable updateRunnable; public static void init() { - Main.getInstance().getServer().getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BungeeCord"); - Bukkit.getMessenger().registerOutgoingPluginChannel(Main.getInstance(), "BeeSwitch"); -// Core.getInstance().getServer().getMessenger().registerIncomingPluginChannel(Core.getInstance(), "BungeeCord", new ServersManager()); -// new BukkitRunnable() { -// @Override -// public void run() { -// if (Bukkit.getOnlinePlayers().size() < 1) return; -// sendGetPlayerList(); -// -// } -// }.runTaskTimer(Core.getInstance(), 60L, 200L); + Main.regListener(new ServersUpdateListener()); + + + + updateRunnable = new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getOnlinePlayers().size() > 0) updateDataServers(); + } + }; + + getUpdateRunnable().runTaskTimer(Main.getInstance(), 20L, 100L); } -// public static void sendGetPlayerList() { -// ByteArrayOutputStream b = new ByteArrayOutputStream(); -// DataOutputStream out = new DataOutputStream(b); -// try { -// out.writeUTF("PlayerList"); -// out.writeUTF("ALL"); -// } catch (IOException ex) { -// Logger.getLogger(Core.class.getName()).log(Level.SEVERE, null, ex); -// } -// Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null); -// if (player != null) { -// player.sendPluginMessage(Core.getInstance(), "BungeeCord", b.toByteArray()); -// } -// } -// -// @Override -// public void onPluginMessageReceived(String tag, Player player, byte[] data) { -// if (!tag.equals("BungeeCord")) return; -// -// ByteArrayDataInput in = ByteStreams.newDataInput(data); -// String server = in.readUTF(); -// -// if (server.equals("ALL")) { -// String[] players = in.readUTF().split(", "); -// allPlayers = Arrays.stream(players).collect(Collectors.toList()); -// } else { -// return; -// } -// } + public static void registerServer(String serverID, String hostName, int port, String serverGroup) { + localRegisteredServer = new LocalServerInfo(serverID, hostName, port, serverGroup); + localRegisteredServer.register(); + } + + public static void unregisterServer() { + if (getLocalRegisteredServer() != null) { + getLocalRegisteredServer().unregister(); + localRegisteredServer = null; + } + } + + public static void updateDataServers() { + Map tempDataServers = new HashMap<>(); + ResultSet rs = DataManager.getConnection().SQLqueryInTable(ServersManager.databaseTable); + try { + if (rs != null) { + while (rs.next()) { + String serverID = rs.getString("serverid"); + String hostName = rs.getString("hostname"); + String serverGroup = rs.getString("servergroup"); + int players = rs.getInt("players"); + int port = rs.getInt("port"); + tempDataServers.put(serverID, new DataServerInfo(serverID, hostName, port, serverGroup, players)); + } + rs.close(); + } + } catch (SQLException e) { + DataManager.getConnection().info(e.getLocalizedMessage()); + Bukkit.getLogger().log(Level.WARNING, "code: {0}", rs); + } + dataServers = tempDataServers; + } + + public static Map getDataServers() { + return dataServers; + } + + public static Integer getPlayers(String serverName) { + return getPlayers(serverName, false); + } + + public static Integer getPlayers(String server, boolean isGroup) { + if (server.equalsIgnoreCase("#ALL") || server.equalsIgnoreCase("#AII")) { + return getDataServers().keySet().stream() + .mapToInt(s -> getDataServers().getOrDefault(s, new DataServerInfo(null, null, -1, null, 0)).getPlayers()) + .sum(); + } else { + if (isGroup) { + return getDataServers().keySet().stream() + .filter(s -> getDataServers().get(s).getServerGroup().equalsIgnoreCase(server)) + .mapToInt(s -> getDataServers().getOrDefault(s, new DataServerInfo(null, null, -1, null, 0)).getPlayers()) + .sum(); + } else { + return getDataServers().getOrDefault(server, new DataServerInfo(null, null, -1, null, 0)).getPlayers(); + } + } + + } + + public static BukkitRunnable getUpdateRunnable() { + return updateRunnable; + } public static void teleport(Player p, String server) { ByteArrayOutputStream b = new ByteArrayOutputStream(); @@ -73,6 +119,7 @@ public class ServersManager try { out.writeUTF("ConnectOther"); out.writeUTF(p.getName()); +// out.writeUTF("Connect"); out.writeUTF(server); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); @@ -80,33 +127,73 @@ public class ServersManager p.sendPluginMessage(Main.getInstance(), "BungeeCord", b.toByteArray()); } - public static void teleport(Player player, String server, int t) { - requests.add(player); + public static void teleport(Player p, String server, int t) { + requests.add(p); new BukkitRunnable() { @Override public void run() { - if (requests.contains(player) && player.isOnline()) { - teleport(player, server); - requests.remove(player); + if (requests.contains(p) && p.isOnline()) { + teleport(p, server); + requests.remove(p); } cancel(); } }.runTaskLater(Main.getInstance(), 20L * t); } + public static void backToLobby(Player p) { + teleport(p, "SYSTEM.MAINLOBBY"); + } public static void goAFK(Player p) { - teleport(p, "SYSTEM.LIMBO"); + + DataServerInfo targetServer = getServerInfo("LIMBO"); + if (targetServer != null) { + teleport(p, targetServer.getServerID()); + } else { + p.sendMessage("§7暂无可用挂机服务器。"); + } + + } - public static void backToLobby(Player p) { - teleport(p, "lobby"); + + public static DataServerInfo getServerInfo(String name) { + if (getDataServers().containsKey(name)) { + return getDataServers().get(name); + } else { + for (DataServerInfo info : getDataServers().values()) { + if (info.getServerGroup().equalsIgnoreCase(name)) { + return info; + } + } + return null; + } + } + + + public static LocalServerInfo getLocalRegisteredServer() { + return localRegisteredServer; } public static void switchServer(Player p, String targetServerIp) { p.sendPluginMessage(Main.getInstance(), "BeeSwitch", targetServerIp.getBytes(StandardCharsets.UTF_8)); } + public enum Operation { + ADD, + REMOVE; + + public static Operation tryRead(String name) { + for (Operation value : Operation.values()) { + if (value.name().equalsIgnoreCase(name)) { + return value; + } + } + return null; + } + } + } diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java b/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java new file mode 100644 index 0000000..61f6181 --- /dev/null +++ b/2b2t-core/src/main/java/org.cn2b2t.core/modules/DataServerInfo.java @@ -0,0 +1,61 @@ +package org.cn2b2t.core.modules; + +public class DataServerInfo { + + private String serverID; + private String hostName; + private int port; + private String serverGroup; + + private int players; + + public DataServerInfo(String serverID, String hostName, int port, String serverGroup, int players) { + this.serverGroup = serverGroup; + this.serverID = serverID; + this.hostName = hostName; + this.port = port; + + this.players = players; + } + + public int getPlayers() { + return players; + } + + public void setPlayers(int players) { + this.players = players; + } + + public String getServerID() { + return serverID; + } + + public void setServerID(String serverID) { + this.serverID = serverID; + } + + public String getServerGroup() { + return serverGroup; + } + + public void setServerGroup(String serverGroup) { + this.serverGroup = serverGroup; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + +} diff --git a/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java b/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java new file mode 100644 index 0000000..0531553 --- /dev/null +++ b/2b2t-core/src/main/java/org.cn2b2t.core/modules/LocalServerInfo.java @@ -0,0 +1,59 @@ +package org.cn2b2t.core.modules; + +import org.bukkit.Bukkit; +import org.cn2b2t.core.managers.utils.DataManager; +import org.cn2b2t.core.managers.utils.ServersManager; + +public class LocalServerInfo extends DataServerInfo { + public LocalServerInfo(String serverID, String hostName, int port, String serverGroup) { + super(serverID, hostName, port, serverGroup, Bukkit.getOnlinePlayers().size()); + + + } + + @Override + public int getPlayers() { + return Bukkit.getOnlinePlayers().size(); + } + + public void register() { + writeInfo(); + if (!this.getServerGroup().equalsIgnoreCase("SYSTEM")) { + sendRegisterRequest(); + } + + } + + public void unregister() { + deleteInfo(); + if (!this.getServerGroup().equalsIgnoreCase("SYSTEM")) { + sendUnregisterRequest(); + } + } + + public void writeInfo() { + DataManager.getConnection().update(ServersManager.databaseTable, + new String[]{"servergroup", "hostname", "port", "players"}, + new Object[]{LocalServerInfo.this.getServerGroup(), LocalServerInfo.this.getHostName(), LocalServerInfo.this.getPort(), getPlayers()}, + new String[]{"serverid"}, new Object[]{LocalServerInfo.this.getServerID()}); + } + + public void deleteInfo() { + DataManager.getConnection().delete(ServersManager.databaseTable, "serverid", LocalServerInfo.this.getServerID()); + } + + + public void sendRegisterRequest() { + DataManager.getTempConnection().insert("messager_" + ServersManager.messageChannel, + new String[]{"start", "lasttime", "sign", "message"}, + new Object[]{System.currentTimeMillis(), 1500, ServersManager.messageChannel, ServersManager.Operation.ADD.name() + ":" + LocalServerInfo.this.getServerID()}); + } + + public void sendUnregisterRequest() { + DataManager.getTempConnection().insert("messager_" + ServersManager.messageChannel, + new String[]{"start", "lasttime", "sign", "message"}, + new Object[]{System.currentTimeMillis(), 1500, ServersManager.messageChannel, ServersManager.Operation.REMOVE.name() + ":" + LocalServerInfo.this.getServerID()}); + } + + +}