1
mirror of https://github.com/CarmJos/cn2b2t-project.git synced 2024-09-19 22:05:45 +00:00

Cn2b2t添加注册指令

This commit is contained in:
carm 2020-06-02 12:14:50 +08:00
parent 4df7c31eb9
commit 1f5428ccdc
7 changed files with 337 additions and 58 deletions

View File

@ -56,6 +56,12 @@
<systemPath>${basedir}/../_lib/spigot.jar</systemPath>
<scope>system</scope>
</dependency>
<dependency>
<groupId>org.cn2b2t</groupId>
<artifactId>2b2t-proxy</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>

View File

@ -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();

View File

@ -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);
}
}
}

View File

@ -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;
}

View File

@ -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<Player> requests = new ArrayList<>();
public static List<String> allPlayers = new ArrayList<>();
public static String databaseTable = "game_servers";
public static String messageChannel = "serversmanager";
private static LocalServerInfo localRegisteredServer;
private static Map<String/*serverID*/, DataServerInfo> 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<String, DataServerInfo> 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<String, DataServerInfo> 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;
}
}
}

View File

@ -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;
}
}

View File

@ -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()});
}
}