Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

微调 #55

Merged
merged 11 commits into from
Nov 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ private static Method initTeleportAsync() {
}

public static void teleport(Player player, Location location) {
if (location == null || location.getWorld() == null) return;
if (!folia) {
player.teleport(location);
return;
Expand Down
19 changes: 5 additions & 14 deletions src/main/java/cc/baka9/catseedlogin/bukkit/CatSeedLogin.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,8 @@
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

import cc.baka9.catseedlogin.bukkit.command.CommandBindEmail;
import cc.baka9.catseedlogin.bukkit.command.CommandCatSeedLogin;
import cc.baka9.catseedlogin.bukkit.command.CommandChangePassword;
import cc.baka9.catseedlogin.bukkit.command.CommandLogin;
import cc.baka9.catseedlogin.bukkit.command.CommandRegister;
import cc.baka9.catseedlogin.bukkit.command.CommandResetPassword;
import cc.baka9.catseedlogin.bukkit.database.Cache;
import cc.baka9.catseedlogin.bukkit.database.MySQL;
import cc.baka9.catseedlogin.bukkit.database.SQL;
import cc.baka9.catseedlogin.bukkit.database.SQLite;
import cc.baka9.catseedlogin.bukkit.command.*;
import cc.baka9.catseedlogin.bukkit.database.*;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper;
import cc.baka9.catseedlogin.bukkit.task.Task;
import cn.handyplus.lib.adapter.HandySchedulerUtil;
Expand Down Expand Up @@ -140,8 +132,7 @@ private void registerCommands() {
return Collections.emptyList();
});

PluginCommand catseedlogin = getServer().getPluginCommand("catseedlogin");
catseedlogin.setExecutor(new CommandCatSeedLogin());
getServer().getPluginCommand("catseedlogin").setExecutor(new CommandCatSeedLogin());
}

@EventHandler
Expand Down Expand Up @@ -169,7 +160,7 @@ public void onDisable() {
});

try {
if (sql.getConnection() != null) { // 检查连接不为null
if (sql.getConnection() != null) {
sql.getConnection().close();
}
} catch (Exception e) {
Expand All @@ -181,7 +172,7 @@ public void onDisable() {
}

public void runTaskAsync(Runnable runnable) {
if (runnable != null) { // 添加空值检查
if (runnable != null) {
CatScheduler.runTaskAsync(runnable);
}
}
Expand Down
163 changes: 81 additions & 82 deletions src/main/java/cc/baka9/catseedlogin/bukkit/Communication.java
Original file line number Diff line number Diff line change
@@ -1,74 +1,83 @@
package cc.baka9.catseedlogin.bukkit;

import cc.baka9.catseedlogin.bukkit.database.Cache;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayer;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper;
import cc.baka9.catseedlogin.util.CommunicationAuth;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import cc.baka9.catseedlogin.bukkit.database.Cache;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayer;
import cc.baka9.catseedlogin.bukkit.object.LoginPlayerHelper;
import cc.baka9.catseedlogin.util.CommunicationAuth;

/**
* bukkit 与 bc 的通讯交流
*/
public class Communication {
private static ServerSocket serverSocket;
private static final ExecutorService executorService = Executors.newCachedThreadPool();

/**
* 异步关闭 socket server
*/
public static void socketServerStopAsync() {
CatSeedLogin.instance.runTaskAsync(Communication::socketServerStop);
}

public static synchronized void socketServerStop() {
closeServerSocket(serverSocket);
public static void socketServerStop() {

if (serverSocket != null && !serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

/**
* 异步启动 socket server 监听bc端发来的请求
*/
public static void socketServerStartAsync() {
CatSeedLogin.instance.runTaskAsync(Communication::socketServerStart);
}

private static synchronized void socketServerStart() {
try {
InetAddress inetAddress = InetAddress.getByName(Config.BungeeCord.Host);
serverSocket = new ServerSocket(Integer.parseInt(Config.BungeeCord.Port), 50, inetAddress);
acceptConnections(serverSocket);
} catch (UnknownHostException e) {
CatSeedLogin.instance.getLogger().warning("无法解析域名或IP地址: " + e.getMessage());
} catch (IOException e) {
CatSeedLogin.instance.getLogger().warning("启动Socket服务器时发生错误: " + e.getMessage());
}
}

private static void acceptConnections(ServerSocket serverSocket) {
while (!serverSocket.isClosed()) {
/**
* 启动 socket server 监听bc端发来的请求
*/
private static void socketServerStart() {
try {
Socket socket = serverSocket.accept();
executorService.submit(() -> handleRequest(socket));
} catch (IOException e) {
if (serverSocket.isClosed()) {
break;
InetAddress inetAddress = InetAddress.getByName(Config.BungeeCord.Host);
serverSocket = new ServerSocket(Integer.parseInt(Config.BungeeCord.Port), 50, inetAddress);
while (!serverSocket.isClosed()) {
Socket socket;
try {
socket = serverSocket.accept();
handleRequest(socket);
} catch (IOException e) {
break;
}
}
CatSeedLogin.instance.getLogger().warning("接受Socket连接时发生错误: " + e.getMessage());
} catch (UnknownHostException e) {
CatSeedLogin.instance.getLogger().warning("无法解析域名或IP地址");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


private static void handleRequest(Socket socket) {
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**
* 处理请求
*/
private static void handleRequest(Socket socket) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requestType = bufferedReader.readLine();
if (requestType == null) {
return;
}
String playerName = bufferedReader.readLine();
switch (requestType) {
case "Connect":
Expand All @@ -78,60 +87,50 @@ private static void handleRequest(Socket socket) {
String time = bufferedReader.readLine();
String sign = bufferedReader.readLine();
handleKeepLoggedInRequest(playerName, time, sign);
socket.close();
break;
default:
String sanitizedRequestType = requestType.replace("\n", "").replace("\r", "");
CatSeedLogin.instance.getLogger().warning("未知请求类型: " + sanitizedRequestType);
break;
}
} catch (IOException e) {
CatSeedLogin.instance.getLogger().warning("处理请求时发生错误: " + e.getMessage());
}
}

private static void handleKeepLoggedInRequest(String playerName, String time, String sign) {
if (CommunicationAuth.encryption(playerName, time, Config.BungeeCord.AuthKey).equals(sign)) {
CatScheduler.runTask(() -> {
LoginPlayer lp = Cache.getIgnoreCase(playerName);
if (lp != null) {
LoginPlayerHelper.add(lp);
Player player = Bukkit.getPlayerExact(playerName);
if (player != null) {
player.updateInventory();
private static void handleKeepLoggedInRequest(String playerName, String time, String sign) {
// 验证请求的合法性
// 对比玩家名,时间戳,和authKey加密的结果(加密是因为如果登录服不在内网环境下,则可能会被人使用这个功能给发包来直接绕过登录)
if (CommunicationAuth.encryption(playerName, time, Config.BungeeCord.AuthKey).equals(sign)) {
// 切换主线程给予登录状态
Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> {
LoginPlayer lp = Cache.getIgnoreCase(playerName);
if (lp != null) {
LoginPlayerHelper.add(lp);
Player player = Bukkit.getPlayerExact(playerName);
if (player != null) {
player.updateInventory();
}
}
} else {
String sanitizedPlayerName = playerName.replace("\n", "").replace("\r", "");
CatSeedLogin.instance.getLogger().warning("玩家 " + sanitizedPlayerName + " 未找到在缓存中。");
}
});

});
}
}
}

private static void handleConnectRequest(Socket socket, String playerName) {
CatScheduler.runTask(() -> {
// 切换主线程获取是否已登录
Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> {
boolean result = LoginPlayerHelper.isLogin(playerName);
sendConnectResultAsync(socket, result);
});
}

private static void sendConnectResultAsync(Socket socket, boolean result) {
executorService.submit(() -> {
try (Socket autoCloseSocket = socket) {
autoCloseSocket.getOutputStream().write(result ? 1 : 0);
autoCloseSocket.getOutputStream().flush();
} catch (IOException e) {
CatSeedLogin.instance.getLogger().warning("发送连接结果时发生错误: " + e.getMessage());
}
// 切换异步线程返回结果
CatSeedLogin.instance.runTaskAsync(() -> {
try {
socket.getOutputStream().write(result ? 1 : 0);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}

});

});
}

private static void closeServerSocket(ServerSocket serverSocket) {
if (serverSocket != null && !serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
CatSeedLogin.instance.getLogger().warning("关闭Socket服务器时发生错误: " + e.getMessage());
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,19 @@
import org.bukkit.entity.Player;

public class ProtocolLibListeners extends PacketAdapter {

public static void enable(){
public static void enable() {
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
protocolManager.addPacketListener(new ProtocolLibListeners());
}


public ProtocolLibListeners(){
public ProtocolLibListeners() {
super(CatSeedLogin.instance, ListenerPriority.HIGHEST,
PacketType.Play.Server.SET_SLOT,
PacketType.Play.Server.WINDOW_ITEMS
);

PacketType.Play.Server.WINDOW_ITEMS);
}

@Override
public void onPacketSending(PacketEvent event){
public void onPacketSending(PacketEvent event) {
PacketType packetType = event.getPacketType();
if (packetType == PacketType.Play.Server.SET_SLOT || packetType == PacketType.Play.Server.WINDOW_ITEMS) {
Player player = event.getPlayer();
Expand All @@ -40,8 +36,6 @@ public void onPacketSending(PacketEvent event){
}

@Override
public void onPacketReceiving(PacketEvent event){
public void onPacketReceiving(PacketEvent event) {
}


}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package cc.baka9.catseedlogin.bukkit.command;

import java.util.Optional;

import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import cc.baka9.catseedlogin.bukkit.CatSeedLogin;
import cc.baka9.catseedlogin.bukkit.Config;
import cc.baka9.catseedlogin.bukkit.database.Cache;
Expand All @@ -25,9 +23,7 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
Player player = (Player) sender;
String name = player.getName();

if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) {
return true;
}
if (Config.Settings.BedrockLoginBypass && LoginPlayerHelper.isFloodgatePlayer(player)) return true;

LoginPlayer lp = Cache.getIgnoreCase(name);
if (lp == null) {
Expand Down Expand Up @@ -93,11 +89,10 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
private void sendEmailCode(CommandSender sender, String name, String mail, EmailCode bindEmail) {
CatSeedLogin.instance.runTaskAsync(() -> {
try {
Mail.sendMail(mail, "邮箱绑定",
"你的验证码是 <strong>" + bindEmail.getCode() + "</strong>" +
"<br/>在服务器中使用帐号 " + name + " 输入指令<strong>/bindemail verify " + bindEmail.getCode() + "</strong> 来绑定邮箱" +
"<br/>绑定邮箱之后可用于忘记密码时重置自己的密码" +
"<br/>此验证码有效期为 " + (bindEmail.getDurability() / (1000 * 60)) + "分钟");
Mail.sendMail(mail, "邮箱绑定", "你的验证码是 <strong>" + bindEmail.getCode() + "</strong>" +
"<br/>在服务器中使用帐号 " + name + " 输入指令<strong>/bindemail verify " + bindEmail.getCode() + "</strong> 来绑定邮箱" +
"<br/>绑定邮箱之后可用于忘记密码时重置自己的密码" +
"<br/>此验证码有效期为 " + (bindEmail.getDurability() / (1000 * 60)) + "分钟");
Bukkit.getScheduler().runTask(CatSeedLogin.instance, () -> {
sender.sendMessage("§6已经向邮箱 " + mail + " 发送了一串绑定验证码,请检查你的邮箱的收件箱");
sender.sendMessage("§c如果未收到,请检查邮箱的垃圾箱!");
Expand Down
Loading
Loading