feat: 新增频道分组功能

This commit is contained in:
2023-11-20 14:44:36 +08:00
parent 5616117c94
commit 1d1339c2e9
6 changed files with 58 additions and 45 deletions

View File

@@ -4,7 +4,9 @@ import cn.hamster3.mc.plugin.ball.bukkit.api.BallBukkitAPI;
import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook; import cn.hamster3.mc.plugin.ball.bukkit.hook.PlaceholderHook;
import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener; import cn.hamster3.mc.plugin.ball.bukkit.listener.BallBukkitListener;
import cn.hamster3.mc.plugin.ball.bukkit.listener.UpdatePlayerInfoListener; import cn.hamster3.mc.plugin.ball.bukkit.listener.UpdatePlayerInfoListener;
import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils;
import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo;
import cn.hamster3.mc.plugin.ball.common.event.BallActions; import cn.hamster3.mc.plugin.ball.common.event.BallActions;
import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent; import cn.hamster3.mc.plugin.ball.common.event.server.ServerOnlineEvent;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -65,6 +67,16 @@ public class HamsterBallPlugin extends JavaPlugin {
Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this); Bukkit.getPluginManager().registerEvents(UpdatePlayerInfoListener.INSTANCE, this);
BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE); BallAPI.getInstance().getEventBus().register(UpdatePlayerInfoListener.INSTANCE);
logger.info("已注册监听器 UpdatePlayerInfoListener"); logger.info("已注册监听器 UpdatePlayerInfoListener");
// 移除失效的在线玩家
BallAPI.getInstance().getAllPlayerInfo().values()
.stream()
.filter(BallPlayerInfo::isOnline)
.filter(o -> BallAPI.getInstance().isLocalServer(o.getGameServer()))
.forEach(playerInfo -> {
playerInfo.setOnline(false);
BallBukkitUtils.uploadPlayerInfo(playerInfo);
});
} }
sync(() -> { sync(() -> {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {

View File

@@ -1,22 +1,16 @@
package cn.hamster3.mc.plugin.ball.bukkit.listener; package cn.hamster3.mc.plugin.ball.bukkit.listener;
import cn.hamster3.mc.plugin.ball.bukkit.util.BallBukkitUtils;
import cn.hamster3.mc.plugin.ball.common.api.BallAPI; import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo; import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo;
import cn.hamster3.mc.plugin.ball.common.event.BallActions;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLoginEvent;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent; import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerLogoutEvent;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.jetbrains.annotations.NotNull;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -29,31 +23,6 @@ public class UpdatePlayerInfoListener implements Listener {
private UpdatePlayerInfoListener() { private UpdatePlayerInfoListener() {
} }
public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) {
CoreAPI.getInstance().getExecutorService().execute(() -> {
try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(
"REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);"
)) {
statement.setString(1, playerInfo.getUuid().toString());
statement.setString(2, playerInfo.getName());
statement.setString(3, playerInfo.getGameServer());
statement.setString(4, playerInfo.getProxyServer());
statement.setBoolean(5, playerInfo.isOnline());
statement.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
BallAPI.getInstance().sendBallMessage(
BallAPI.PLAYER_INFO_UPDATE_CHANNEL,
BallActions.BallPlayerInfoUpdate.name(),
new BallPlayerInfoUpdateEvent(playerInfo),
false
);
});
}
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
@@ -64,7 +33,7 @@ public class UpdatePlayerInfoListener implements Listener {
PLAYER_PROXY_SERVER.getOrDefault(player.getUniqueId(), "unknown"), PLAYER_PROXY_SERVER.getOrDefault(player.getUniqueId(), "unknown"),
true true
); );
uploadPlayerInfo(playerInfo); BallBukkitUtils.uploadPlayerInfo(playerInfo);
} }
@Subscribe @Subscribe
@@ -80,6 +49,6 @@ public class UpdatePlayerInfoListener implements Listener {
return; return;
} }
playerInfo.setOnline(false); playerInfo.setOnline(false);
uploadPlayerInfo(playerInfo); BallBukkitUtils.uploadPlayerInfo(playerInfo);
} }
} }

View File

@@ -1,11 +1,20 @@
package cn.hamster3.mc.plugin.ball.bukkit.util; package cn.hamster3.mc.plugin.ball.bukkit.util;
import cn.hamster3.mc.plugin.ball.common.api.BallAPI;
import cn.hamster3.mc.plugin.ball.common.entity.BallPlayerInfo;
import cn.hamster3.mc.plugin.ball.common.event.BallActions;
import cn.hamster3.mc.plugin.ball.common.event.player.BallPlayerInfoUpdateEvent;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariConfig;
import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariDataSource; import cn.hamster3.mc.plugin.core.lib.com.zaxxer.hikari.HikariDataSource;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public final class BallBukkitUtils { public final class BallBukkitUtils {
private BallBukkitUtils() { private BallBukkitUtils() {
@@ -38,4 +47,28 @@ public final class BallBukkitUtils {
return null; return null;
} }
} }
public static void uploadPlayerInfo(@NotNull BallPlayerInfo playerInfo) {
CoreAPI.getInstance().getExecutorService().execute(() -> {
try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(
"REPLACE INTO `hamster_ball_player_info` VALUES(?, ?, ?, ?, ?);"
)) {
statement.setString(1, playerInfo.getUuid().toString());
statement.setString(2, playerInfo.getName());
statement.setString(3, playerInfo.getGameServer());
statement.setString(4, playerInfo.getProxyServer());
statement.setBoolean(5, playerInfo.isOnline());
statement.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
BallAPI.getInstance().sendBallMessage(
BallAPI.PLAYER_INFO_UPDATE_CHANNEL,
BallActions.BallPlayerInfoUpdate.name(),
new BallPlayerInfoUpdateEvent(playerInfo)
);
});
}
} }

View File

@@ -52,10 +52,8 @@ public class HamsterBallPlugin extends Plugin {
logger.info("已注册监听器 BallBungeeListener"); logger.info("已注册监听器 BallBungeeListener");
BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE); BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE);
logger.info("已注册监听器 BallBungeeListenerV2"); logger.info("已注册监听器 BallBungeeListenerV2");
if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) { ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE);
ProxyServer.getInstance().getPluginManager().registerListener(this, UpdatePlayerInfoListener.INSTANCE); logger.info("已注册监听器 UpdatePlayerInfoListener");
logger.info("已注册监听器 UpdatePlayerInfoListener");
}
BallAPI.getInstance().sendBallMessage( BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(), BallAPI.BALL_CHANNEL, BallActions.ServerOnline.name(),
new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()), new ServerOnlineEvent(BallAPI.getInstance().getLocalServerInfo()),

View File

@@ -50,12 +50,13 @@ public final class BallBungeeCordUtils {
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
} }
BallAPI.getInstance().sendBallMessage( if (!BallAPI.getInstance().getBallConfig().isGameServerUpdatePlayerInfo()) {
BallAPI.PLAYER_INFO_UPDATE_CHANNEL, BallAPI.getInstance().sendBallMessage(
BallActions.BallPlayerInfoUpdate.name(), BallAPI.PLAYER_INFO_UPDATE_CHANNEL,
new BallPlayerInfoUpdateEvent(playerInfo), BallActions.BallPlayerInfoUpdate.name(),
false new BallPlayerInfoUpdateEvent(playerInfo)
); );
}
}); });
} }

View File

@@ -18,6 +18,6 @@ public class BallDebugListener {
@Subscribe @Subscribe
public void onMessageSent(MessageSentEvent event) { public void onMessageSent(MessageSentEvent event) {
BallAPI.getInstance().getLogger().info(" " + event.getChannel() + " 发送了一条消息: " + event.getMessage()); BallAPI.getInstance().getLogger().info(" " + event.getChannel() + " 发送了一条消息: " + event.getMessage());
} }
} }