feat: 使用 guava 的 EventBus

This commit is contained in:
2023-11-11 18:39:20 +08:00
parent a5c2eec5e5
commit d70841167f
6 changed files with 119 additions and 93 deletions

View File

@@ -6,7 +6,7 @@ dependencies {
api(project(":ball-common")) { isTransitive = false } api(project(":ball-common")) { isTransitive = false }
compileOnly("net.md-5:bungeecord-api:+") compileOnly("net.md-5:bungeecord-api:+")
compileOnly("cn.hamster3.mc.plugin:core-bungeecord:+") compileOnly("cn.hamster3.mc.plugin:core-bungee:+")
implementation("io.lettuce:lettuce-core:+") implementation("io.lettuce:lettuce-core:+")
} }

View File

@@ -5,7 +5,8 @@ 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 cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI; import cn.hamster3.mc.plugin.core.bungee.api.BallBungeeCordAPI;
import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeCordListener; import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListener;
import cn.hamster3.mc.plugin.core.bungee.listener.BallBungeeListenerV2;
import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils; import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
@@ -46,9 +47,10 @@ public class HamsterBallPlugin extends Plugin {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeCordListener.INSTANCE); ProxyServer.getInstance().getPluginManager().registerListener(this, BallBungeeListener.INSTANCE);
BallAPI.getInstance().getEventBus().register(BallBungeeCordListener.INSTANCE);
logger.info("已注册 BallBungeeCordListener"); logger.info("已注册 BallBungeeCordListener");
BallAPI.getInstance().getEventBus().register(BallBungeeListenerV2.INSTANCE);
logger.info("已注册 BallBungeeListenerV2");
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

@@ -0,0 +1,88 @@
package cn.hamster3.mc.plugin.core.bungee.listener;
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.*;
import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
public final class BallBungeeListener implements Listener {
public static final BallBungeeListener INSTANCE = new BallBungeeListener();
private BallBungeeListener() {
}
@EventHandler(priority = EventPriority.HIGH)
public void onPreLogin(PreLoginEvent event) {
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(),
new BallPlayerPreLoginEvent(event.getConnection().getName())
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onLogin(LoginEvent event) {
if (event.isCancelled()) {
return;
}
PendingConnection connection = event.getConnection();
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(),
new BallPlayerLoginEvent(new BallPlayerInfo(
connection.getUniqueId(), connection.getName(), "connecting",
BallAPI.getInstance().getLocalServerId(), true
))
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onPostLogin(PostLoginEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(),
new BallPlayerPostLoginEvent(playerInfo)
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onServerConnect(ServerConnectEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
playerInfo.setGameServer(event.getTarget().getName());
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(),
new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName())
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
}
@EventHandler(priority = EventPriority.HIGH)
public void onServerConnected(ServerConnectedEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
playerInfo.setGameServer(event.getServer().getInfo().getName());
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL,
BallActions.BallPlayerPostConnectServer.name(),
new BallPlayerPostConnectServerEvent(playerInfo)
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
}
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false);
BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(),
new BallPlayerLogoutEvent(playerInfo)
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
}
}

View File

@@ -1,13 +1,9 @@
package cn.hamster3.mc.plugin.core.bungee.listener; package cn.hamster3.mc.plugin.core.bungee.listener;
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.BallServerType; import cn.hamster3.mc.plugin.ball.common.entity.BallServerType;
import cn.hamster3.mc.plugin.ball.common.event.BallActions;
import cn.hamster3.mc.plugin.ball.common.event.operate.*; import cn.hamster3.mc.plugin.ball.common.event.operate.*;
import cn.hamster3.mc.plugin.ball.common.event.player.*;
import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin; import cn.hamster3.mc.plugin.core.bungee.HamsterBallPlugin;
import cn.hamster3.mc.plugin.core.bungee.util.BallBungeeCordUtils;
import cn.hamster3.mc.plugin.core.common.api.CoreAPI; import cn.hamster3.mc.plugin.core.common.api.CoreAPI;
import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.audience.Audience;
import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import cn.hamster3.mc.plugin.core.lib.net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
@@ -15,87 +11,14 @@ import com.google.common.eventbus.Subscribe;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.*;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
import java.util.UUID; import java.util.UUID;
public final class BallBungeeCordListener implements Listener { public class BallBungeeListenerV2 {
public static final BallBungeeCordListener INSTANCE = new BallBungeeCordListener(); public static final BallBungeeListenerV2 INSTANCE = new BallBungeeListenerV2();
private BallBungeeCordListener() { private BallBungeeListenerV2() {
}
@EventHandler(priority = EventPriority.HIGH)
public void onPreLogin(PreLoginEvent event) {
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreLogin.name(),
new BallPlayerPreLoginEvent(event.getConnection().getName())
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onLogin(LoginEvent event) {
if (event.isCancelled()) {
return;
}
PendingConnection connection = event.getConnection();
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogin.name(),
new BallPlayerLoginEvent(new BallPlayerInfo(
connection.getUniqueId(), connection.getName(), "connecting",
BallAPI.getInstance().getLocalServerId(), true
))
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onPostLogin(PostLoginEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPostLogin.name(),
new BallPlayerPostLoginEvent(playerInfo)
);
}
@EventHandler(priority = EventPriority.HIGH)
public void onServerConnect(ServerConnectEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
playerInfo.setGameServer(event.getTarget().getName());
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL, BallActions.BallPlayerPreConnectServer.name(),
new BallPlayerPreConnectServerEvent(playerInfo, playerInfo.getGameServer(), event.getTarget().getName())
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
}
@EventHandler(priority = EventPriority.HIGH)
public void onServerConnected(ServerConnectedEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, true);
playerInfo.setGameServer(event.getServer().getInfo().getName());
BallAPI.getInstance().sendBallMessage(
BallAPI.BALL_CHANNEL,
BallActions.BallPlayerPostConnectServer.name(),
new BallPlayerPostConnectServerEvent(playerInfo)
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
}
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerDisconnect(PlayerDisconnectEvent event) {
ProxiedPlayer player = event.getPlayer();
BallPlayerInfo playerInfo = BallBungeeCordUtils.getPlayerInfo(player, false);
BallAPI.getInstance().sendBallMessage(BallAPI.BALL_CHANNEL, BallActions.BallPlayerLogout.name(),
new BallPlayerLogoutEvent(playerInfo)
);
BallBungeeCordUtils.uploadPlayerInfo(playerInfo);
} }
@Subscribe @Subscribe

View File

@@ -77,7 +77,7 @@ public abstract class BallAPI {
protected void enable() throws SQLException, InterruptedException { protected void enable() throws SQLException, InterruptedException {
BallServerInfo localInfo = getLocalServerInfo(); BallServerInfo localInfo = getLocalServerInfo();
try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { try (Connection connection = getDatasource().getConnection()) {
try (Statement statement = connection.createStatement()) { try (Statement statement = connection.createStatement()) {
statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_player_info`(" + statement.execute("CREATE TABLE IF NOT EXISTS `hamster_ball_player_info`(" +
"`uuid` CHAR(36) PRIMARY KEY," + "`uuid` CHAR(36) PRIMARY KEY," +
@@ -142,13 +142,13 @@ public abstract class BallAPI {
} }
RedisClient client = getRedisClient(); RedisClient client = getRedisClient();
subConnection.addListener(BallRedisListener.INSTANCE); subConnection.addListener(BallRedisListener.INSTANCE);
subConnection.async().subscribe(BALL_CHANNEL); subscribe(BALL_CHANNEL);
} }
protected void disable() throws SQLException, InterruptedException { protected void disable() throws SQLException, InterruptedException {
sendBallMessage(new BallMessage(BALL_CHANNEL, BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true); sendBallMessage(new BallMessage(BALL_CHANNEL, BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true);
try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { try (Connection connection = getDatasource().getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
"DELETE FROM `hamster_ball_server_info` WHERE `id`=?;" "DELETE FROM `hamster_ball_server_info` WHERE `id`=?;"
)) { )) {
@@ -309,7 +309,7 @@ public abstract class BallAPI {
if (info != null && info.isOnline()) { if (info != null && info.isOnline()) {
continue; continue;
} }
try (Connection connection = BallAPI.getInstance().getDatasource().getConnection()) { try (Connection connection = getDatasource().getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
"INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);" "INSERT INTO `hamster_ball_cached_message` VALUES(?, ?);"
)) { )) {
@@ -447,6 +447,22 @@ public abstract class BallAPI {
} }
} }
public void subscribe(@NotNull String... channel) {
subConnection.sync().subscribe(channel);
}
public void subscribePatterns(@NotNull String patterns) {
subConnection.sync().psubscribe(patterns);
}
public void unsubscribe(@NotNull String... channel) {
subConnection.sync().unsubscribe(channel);
}
public void unsubscribePatterns(@NotNull String patterns) {
subConnection.sync().punsubscribe(patterns);
}
/** /**
* 获取本地服务器ID * 获取本地服务器ID
* *

View File

@@ -5,7 +5,7 @@ plugins {
} }
group = "cn.hamster3.mc.plugin" group = "cn.hamster3.mc.plugin"
version = "1.1.0-SNAPSHOT" version = "1.2.0-DEV"
subprojects { subprojects {
apply { apply {
@@ -64,10 +64,7 @@ subprojects {
} }
repositories { repositories {
maven { maven {
val releasesRepoUrl = uri("https://maven.airgame.net/maven-releases/") url = uri("https://maven.airgame.net/maven-airgame")
val snapshotsRepoUrl = uri("https://maven.airgame.net/maven-snapshots/")
url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl
credentials { credentials {
username = rootProject.properties.getOrDefault("maven_username", "").toString() username = rootProject.properties.getOrDefault("maven_username", "").toString()