Skip to content

Commit 38ddf7f

Browse files
committed
优化日志输出,重构代码结构,提高代码可读性和性能。
1 parent 6fb4bff commit 38ddf7f

File tree

4 files changed

+42
-78
lines changed

4 files changed

+42
-78
lines changed

src/main/java/cc/baka9/catseedlogin/bungee/Commands.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public class Commands extends net.md_5.bungee.api.plugin.Command {
66

77
public Commands(String name, String permission, String... aliases) {
88
super(name, permission, aliases);
9+
Config.load(); // 加载配置
910
}
1011

1112
@Override
@@ -14,4 +15,4 @@ public void execute(CommandSender commandSender, String[] args) {
1415
Config.load();
1516
}
1617
}
17-
}
18+
}

src/main/java/cc/baka9/catseedlogin/bungee/Communication.java

+11-14
Original file line numberDiff line numberDiff line change
@@ -12,50 +12,45 @@
1212
* bc 与 bukkit 的通讯交流
1313
*/
1414
public class Communication {
15+
private static final String HOST = Config.Host;
16+
private static final int PORT = Config.Port;
1517

1618
public static int sendConnectRequest(String playerName) {
1719
try (Socket socket = getSocket(); BufferedWriter bufferedWriter = getSocketBufferedWriter(socket)) {
18-
// 请求类型
1920
bufferedWriter.write("Connect");
2021
bufferedWriter.newLine();
21-
// 玩家名
2222
bufferedWriter.write(playerName);
2323
bufferedWriter.newLine();
24-
2524
bufferedWriter.flush();
2625
return socket.getInputStream().read();
2726
} catch (IOException e) {
28-
e.printStackTrace();
27+
handleIOException(e);
2928
}
3029
return 0;
3130
}
3231

3332
public static void sendKeepLoggedInRequest(String playerName) {
3433
try (Socket socket = getSocket(); BufferedWriter bufferedWriter = getSocketBufferedWriter(socket)) {
35-
// 请求类型
3634
bufferedWriter.write("KeepLoggedIn");
3735
bufferedWriter.newLine();
38-
// 玩家名
3936
bufferedWriter.write(playerName);
4037
bufferedWriter.newLine();
41-
// 时间戳
42-
String time = String.valueOf(System.currentTimeMillis());
38+
long currentTime = System.currentTimeMillis();
39+
String time = String.valueOf(currentTime);
4340
bufferedWriter.write(time);
4441
bufferedWriter.newLine();
45-
// 根据玩家名,时间戳,和authKey加密的结果(加密是因为如果登录服不在内网环境下,则可能会被人使用这个功能给发包来绕过登录)
4642
String sign = CommunicationAuth.encryption(playerName, time, Config.AuthKey);
4743
bufferedWriter.write(sign);
4844
bufferedWriter.newLine();
49-
5045
bufferedWriter.flush();
5146
} catch (IOException e) {
52-
e.printStackTrace();
47+
handleIOException(e);
5348
}
5449
}
5550

5651
private static Socket getSocket() throws IOException {
5752
try {
58-
return new Socket(Config.Host, Config.Port);
53+
return new Socket(HOST, PORT);
5954
} catch (IOException e) {
6055
ProxyServer.getInstance().getLogger().warning("§c请检查装载登录插件的子服是否在 bungeecord.yml 中开启了bungeecord功能,以及Host和Port是否与bc端的配置相同");
6156
throw new IOException(e);
@@ -66,5 +61,7 @@ private static BufferedWriter getSocketBufferedWriter(Socket socket) throws IOEx
6661
return new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
6762
}
6863

69-
70-
}
64+
private static void handleIOException(IOException e) {
65+
ProxyServer.getInstance().getLogger().severe("发生 I/O 异常: " + e.getMessage());
66+
}
67+
}

src/main/java/cc/baka9/catseedlogin/bungee/Config.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.io.IOException;
99
import java.io.InputStream;
1010
import java.nio.file.Files;
11+
import java.util.logging.Logger;
1112

1213
public class Config {
1314

@@ -16,11 +17,10 @@ public class Config {
1617
public static int Port;
1718
public static String LoginServerName;
1819
public static String AuthKey;
20+
private static Logger logger = PluginMain.instance.getLogger();
1921

2022
public static void load() {
21-
2223
File dataFolder = PluginMain.instance.getDataFolder();
23-
2424
if (!dataFolder.exists()) {
2525
dataFolder.mkdir();
2626
}
@@ -43,15 +43,15 @@ public static void load() {
4343
Port = config.getInt("Port");
4444
LoginServerName = config.getString("LoginServerName");
4545
AuthKey = config.getString("AuthKey");
46-
PluginMain.instance.getLogger().info("Host:" + Host);
47-
PluginMain.instance.getLogger().info("Port:" + Port);
48-
PluginMain.instance.getLogger().info("LoginServerName:" + LoginServerName);
46+
47+
// 合并日志输出
48+
StringBuilder logBuilder = new StringBuilder();
49+
logBuilder.append("Host: ").append(Host).append("\n");
50+
logBuilder.append("Port: ").append(Port).append("\n");
51+
logBuilder.append("LoginServerName: ").append(LoginServerName);
52+
logger.info(logBuilder.toString());
4953
} catch (IOException e) {
5054
e.printStackTrace();
5155
}
52-
53-
5456
}
55-
56-
57-
}
57+
}

src/main/java/cc/baka9/catseedlogin/bungee/Listeners.java

+19-53
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import net.md_5.bungee.api.plugin.Listener;
1010
import net.md_5.bungee.event.EventHandler;
1111

12-
import java.util.ArrayList;
12+
import java.util.concurrent.CopyOnWriteArrayList;
1313
import java.util.List;
1414

1515
/**
@@ -19,7 +19,7 @@ public class Listeners implements Listener {
1919

2020
private final ProxyServer proxyServer = ProxyServer.getInstance();
2121

22-
private final List<String> loggedInPlayerList = new ArrayList<>();
22+
private final List<String> loggedInPlayerList = new CopyOnWriteArrayList<>();
2323

2424
/**
2525
* 登录之前不能输入bc指令
@@ -30,62 +30,45 @@ public void onChat(ChatEvent event) {
3030
if (!event.isProxyCommand() || !(sender instanceof ProxiedPlayer)) return;
3131
ProxiedPlayer proxiedPlayer = (ProxiedPlayer) sender;
3232
String message = event.getMessage();
33-
boolean loggedIn;
3433
String playerName = proxiedPlayer.getName();
35-
synchronized (loggedInPlayerList) {
36-
loggedIn = loggedInPlayerList.contains(playerName);
37-
}
38-
if (!loggedIn) {
34+
35+
if (!loggedInPlayerList.contains(playerName)) {
3936
event.setCancelled(true);
4037

4138
PluginMain.runAsync(() -> {
4239
if (Communication.sendConnectRequest(playerName) == 1) {
43-
synchronized (loggedInPlayerList) {
44-
loggedInPlayerList.add(playerName);
45-
}
46-
PluginMain.instance.getProxy().getPluginManager().dispatchCommand(proxiedPlayer, message.substring(1));
40+
loggedInPlayerList.add(playerName);
41+
proxyServer.getPluginManager().dispatchCommand(proxiedPlayer, message.substring(1));
4742
}
4843
});
4944
}
50-
51-
5245
}
5346

5447
/**
5548
* 玩家切换子服时,检查bc端该玩家的登录状态,
56-
* 如果没有登录,就请求登录服获取登录状态然后更新bc端该玩家的登录状态
57-
* 如果登录服获取结果还是没有登录,就强制把切换目标服务器改为登录服
49+
* 如果没有登录,在登录服获取登录状态后更新bc端该玩家的登录状态
50+
* 如果登录服依然未登录,强制切换目标服务器为登录服
5851
*/
5952
@EventHandler
6053
public void onServerConnect(ServerConnectEvent event) {
6154
ServerInfo target = event.getTarget();
6255
if (event.isCancelled() || target.getName().equals(Config.LoginServerName)) return;
6356
ProxiedPlayer player = event.getPlayer();
64-
boolean loggedIn;
65-
synchronized (loggedInPlayerList) {
66-
loggedIn = loggedInPlayerList.contains(player.getName());
67-
}
68-
if (!loggedIn) {
57+
58+
if (!loggedInPlayerList.contains(player.getName())) {
6959
PluginMain.runAsync(() -> {
7060
if (Communication.sendConnectRequest(player.getName()) == 1) {
71-
synchronized (loggedInPlayerList) {
72-
loggedInPlayerList.add(player.getName());
73-
player.connect(target);
74-
}
61+
loggedInPlayerList.add(player.getName());
62+
player.connect(target);
7563
}
7664
});
7765

7866
event.setTarget(proxyServer.getServerInfo(Config.LoginServerName));
79-
80-
8167
}
82-
8368
}
8469

85-
8670
/**
87-
* 玩家切换到登录服务之后,如果bc端是已登录的状态,就使用bc端的登录状态去更新子服的登录状态,
88-
* 避免使玩家每次切换到登录服时需要重新进行登录
71+
* 玩家切换到登录服务之后,如果bc端已登录模式,使用登录状态更新子服务器登录状态,避免玩家需要重新登录
8972
*/
9073
@EventHandler
9174
public void onServerConnected(ServerConnectedEvent event) {
@@ -94,49 +77,32 @@ public void onServerConnected(ServerConnectedEvent event) {
9477
String playerName = player.getName();
9578

9679
PluginMain.runAsync(() -> {
97-
boolean loggedIn;
98-
synchronized (loggedInPlayerList) {
99-
loggedIn = loggedInPlayerList.contains(playerName);
100-
}
101-
if (loggedIn) {
80+
if (loggedInPlayerList.contains(playerName)) {
10281
Communication.sendKeepLoggedInRequest(playerName);
10382
}
104-
10583
});
10684
}
107-
10885
}
10986

11087
/**
111-
* 玩家离线时,删除玩家在bc端的登录状态
88+
* 玩家离线时,从bc端删除玩家的登录状态
11289
*/
11390
@EventHandler
11491
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
11592
ProxiedPlayer player = event.getPlayer();
11693
String playerName = player.getName();
117-
PluginMain.runAsync(() -> {
118-
synchronized (loggedInPlayerList) {
119-
loggedInPlayerList.remove(playerName);
120-
}
121-
});
94+
loggedInPlayerList.remove(playerName);
12295
}
12396

12497
/**
125-
* 玩家在登录之前,检查bc端和子服的登录状态,如果是其中一项是已登录,则禁止连接
98+
* 玩家在登录前,检查bc端和子服务器的登录状态,如果任一已登录,阻止连接
12699
*/
127100
@EventHandler
128101
public void onPreLogin(PreLoginEvent event) {
129102
String playerName = event.getConnection().getName();
130-
boolean loggedIn;
131-
synchronized (loggedInPlayerList) {
132-
loggedIn = loggedInPlayerList.contains(playerName);
133-
}
134-
if (loggedIn || Communication.sendConnectRequest(playerName) == 1) {
103+
if (loggedInPlayerList.contains(playerName) || Communication.sendConnectRequest(playerName) == 1) {
135104
event.setCancelReason(new TextComponent(""));
136105
event.setCancelled(true);
137106
}
138-
139107
}
140-
141-
142-
}
108+
}

0 commit comments

Comments
 (0)