feat: 优化结构

This commit is contained in:
2023-11-12 16:19:30 +08:00
parent ade2853125
commit a47e821868
5 changed files with 76 additions and 71 deletions

View File

@@ -146,7 +146,7 @@ public abstract class BallAPI {
} }
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(BALL_CHANNEL, new BallMessage(BallActions.ServerOffline.name(), new ServerOfflineEvent(getLocalServerId())), true);
try (Connection connection = getDatasource().getConnection()) { try (Connection connection = getDatasource().getConnection()) {
try (PreparedStatement statement = connection.prepareStatement( try (PreparedStatement statement = connection.prepareStatement(
@@ -203,11 +203,8 @@ public abstract class BallAPI {
* @param message 消息 * @param message 消息
*/ */
public void broadcastPlayerMessage(@NotNull DisplayMessage message) { public void broadcastPlayerMessage(@NotNull DisplayMessage message) {
sendBallMessage(new BallMessage( sendBallMessage(BALL_CHANNEL, new BallMessage(
BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY,
getLocalServerId(),
null,
BallServerType.PROXY,
BallActions.BroadcastPlayerMessage.name(), BallActions.BroadcastPlayerMessage.name(),
CoreAPI.getInstance().getGson().toJsonTree( CoreAPI.getInstance().getGson().toJsonTree(
new BroadcastPlayerMessageEvent(message) new BroadcastPlayerMessageEvent(message)
@@ -223,11 +220,8 @@ public abstract class BallAPI {
* @param command 命令内容 * @param command 命令内容
*/ */
public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) { public void dispatchConsoleCommand(@Nullable BallServerType type, @Nullable String serverID, @NotNull String command) {
sendBallMessage(new BallMessage( sendBallMessage(BALL_CHANNEL, new BallMessage(
BALL_CHANNEL, getLocalServerId(), null, BallServerType.GAME,
getLocalServerId(),
null,
BallServerType.GAME,
BallActions.DispatchConsoleCommand.name(), BallActions.DispatchConsoleCommand.name(),
CoreAPI.getInstance().getGson().toJsonTree( CoreAPI.getInstance().getGson().toJsonTree(
new DispatchConsoleCommandEvent(type, serverID, command) new DispatchConsoleCommandEvent(type, serverID, command)
@@ -243,11 +237,8 @@ public abstract class BallAPI {
* @param command 命令内容 * @param command 命令内容
*/ */
public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) { public void dispatchPlayerCommand(@Nullable BallServerType type, @Nullable UUID uuid, @NotNull String command) {
sendBallMessage(new BallMessage( sendBallMessage(BALL_CHANNEL, new BallMessage(
BALL_CHANNEL, getLocalServerId(), null, BallServerType.GAME,
getLocalServerId(),
null,
BallServerType.GAME,
BallActions.DispatchPlayerCommand.name(), BallActions.DispatchPlayerCommand.name(),
CoreAPI.getInstance().getGson().toJsonTree( CoreAPI.getInstance().getGson().toJsonTree(
new DispatchPlayerCommandEvent(type, uuid, command) new DispatchPlayerCommandEvent(type, uuid, command)
@@ -272,11 +263,8 @@ public abstract class BallAPI {
* @param reason 原因 * @param reason 原因
*/ */
public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) { public void kickPlayer(@NotNull UUID uuid, @NotNull Component reason) {
sendBallMessage(new BallMessage( sendBallMessage(BALL_CHANNEL, new BallMessage(
BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY,
getLocalServerId(),
null,
BallServerType.PROXY,
BallActions.KickPlayer.name(), BallActions.KickPlayer.name(),
CoreAPI.getInstance().getGson().toJsonTree( CoreAPI.getInstance().getGson().toJsonTree(
new KickPlayerEvent(uuid, reason) new KickPlayerEvent(uuid, reason)
@@ -322,11 +310,8 @@ public abstract class BallAPI {
} }
} }
} }
sendBallMessage(new BallMessage( sendBallMessage(BALL_CHANNEL, new BallMessage(
BALL_CHANNEL, getLocalServerId(), null, BallServerType.PROXY,
getLocalServerId(),
null,
BallServerType.PROXY,
BallActions.SendMessageToPlayer.name(), BallActions.SendMessageToPlayer.name(),
CoreAPI.getInstance().getGson().toJsonTree( CoreAPI.getInstance().getGson().toJsonTree(
new SendMessageToPlayerEvent(new HashSet<>(receivers), message) new SendMessageToPlayerEvent(new HashSet<>(receivers), message)
@@ -403,7 +388,7 @@ public abstract class BallAPI {
* @param action 执行动作 * @param action 执行动作
*/ */
public void sendBallMessage(@NotNull String channel, @NotNull String action) { public void sendBallMessage(@NotNull String channel, @NotNull String action) {
sendBallMessage(new BallMessage(channel, action)); sendBallMessage(channel, new BallMessage(action));
} }
/** /**
@@ -414,35 +399,36 @@ public abstract class BallAPI {
* @param content 附加参数 * @param content 附加参数
*/ */
public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { public void sendBallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) {
sendBallMessage(new BallMessage(channel, action, content)); sendBallMessage(channel, new BallMessage(action, content));
} }
/** /**
* 发送自定义消息 * 发送自定义消息
* *
* @param messageInfo 消息内容 * @param message 消息内容
*/ */
public void sendBallMessage(@NotNull BallMessage messageInfo) { public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message) {
sendBallMessage(messageInfo, false); sendBallMessage(channel, message, false);
} }
/** /**
* 自定义服务消息信息并发送 * 自定义服务消息信息并发送
* *
* @param ballMessage 消息内容 * @param channel 消息标签
* @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出) * @param message 消息内容
* @param block 是否阻塞(设置为 true 则必须等待消息写入网络的操作完成后,该方法才会退出)
*/ */
public void sendBallMessage(@NotNull BallMessage ballMessage, boolean block) { public void sendBallMessage(@NotNull String channel, @NotNull BallMessage message, boolean block) {
String string = CoreAPI.getInstance().getGson().toJson(ballMessage); String string = CoreAPI.getInstance().getGson().toJson(message);
if (block) { if (block) {
pubConnection.sync().publish(BALL_CHANNEL, ballMessage); pubConnection.sync().publish(BALL_CHANNEL, message);
eventBus.post(new MessageSentEvent(ballMessage)); eventBus.post(new MessageSentEvent(channel, message));
} else { } else {
pubConnection.async().publish(BALL_CHANNEL, ballMessage).whenComplete((aLong, throwable) -> { pubConnection.async().publish(BALL_CHANNEL, message).whenComplete((aLong, throwable) -> {
if (throwable != null) { if (throwable != null) {
return; return;
} }
eventBus.post(new MessageSentEvent(ballMessage)); eventBus.post(new MessageSentEvent(channel, message));
}); });
} }
} }

View File

@@ -9,6 +9,7 @@ import com.google.gson.JsonObject;
import io.lettuce.core.codec.RedisCodec; import io.lettuce.core.codec.RedisCodec;
import io.lettuce.core.codec.StringCodec; import io.lettuce.core.codec.StringCodec;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -21,6 +22,7 @@ import java.util.UUID;
* 服务消息 * 服务消息
*/ */
@Data @Data
@NoArgsConstructor
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BallMessage { public class BallMessage {
/** /**
@@ -71,11 +73,6 @@ public class BallMessage {
*/ */
@Nullable @Nullable
private BallServerType receiverType; private BallServerType receiverType;
/**
* 消息的频道
*/
@NotNull
private String channel;
/** /**
* 消息动作 * 消息动作
* <p> * <p>
@@ -90,22 +87,19 @@ public class BallMessage {
*/ */
private JsonElement content; private JsonElement content;
public BallMessage(@NotNull String channel, @NotNull String action) { public BallMessage(@NotNull String action) {
senderID = BallAPI.getInstance().getLocalServerId(); senderID = BallAPI.getInstance().getLocalServerId();
this.channel = channel;
this.action = action; this.action = action;
} }
public BallMessage(@NotNull String channel, @NotNull String action, @NotNull Object content) { public BallMessage(@NotNull String action, @NotNull Object content) {
this.channel = channel;
senderID = BallAPI.getInstance().getLocalServerId(); senderID = BallAPI.getInstance().getLocalServerId();
this.action = action; this.action = action;
this.content = CoreAPI.getInstance().getGson().toJsonTree(content); this.content = CoreAPI.getInstance().getGson().toJsonTree(content);
} }
public BallMessage(@NotNull String channel, @NotNull String senderID, @Nullable String receiverID, public BallMessage(@NotNull String senderID, @Nullable String receiverID,
@Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) { @Nullable BallServerType receiverType, @NotNull String action, @Nullable JsonElement content) {
this.channel = channel;
this.senderID = senderID; this.senderID = senderID;
this.receiverID = receiverID; this.receiverID = receiverID;
this.receiverType = receiverType; this.receiverType = receiverType;
@@ -121,7 +115,6 @@ public class BallMessage {
@NotNull @NotNull
public JsonObject toJson() { public JsonObject toJson() {
JsonObject object = new JsonObject(); JsonObject object = new JsonObject();
object.addProperty("channel", channel);
object.addProperty("senderID", senderID); object.addProperty("senderID", senderID);
if (receiverID != null) { if (receiverID != null) {
object.addProperty("toServer", receiverID); object.addProperty("toServer", receiverID);

View File

@@ -3,9 +3,19 @@ package cn.hamster3.mc.plugin.ball.common.event.message;
import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import cn.hamster3.mc.plugin.ball.common.data.BallMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import org.jetbrains.annotations.NotNull;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
public class MessageReceivedEvent { public class MessageReceivedEvent {
/**
* 消息的频道
*/
@NotNull
private String channel;
/**
* 消息的内容
*/
@NotNull
private BallMessage message; private BallMessage message;
} }

View File

@@ -3,9 +3,19 @@ package cn.hamster3.mc.plugin.ball.common.event.message;
import cn.hamster3.mc.plugin.ball.common.data.BallMessage; import cn.hamster3.mc.plugin.ball.common.data.BallMessage;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import org.jetbrains.annotations.NotNull;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
public class MessageSentEvent { public class MessageSentEvent {
/**
* 消息的频道
*/
@NotNull
private String channel;
/**
* 消息的内容
*/
@NotNull
private BallMessage message; private BallMessage message;
} }

View File

@@ -19,97 +19,104 @@ public class BallRedisListener implements RedisPubSubListener<String, BallMessag
@Override @Override
public void message(String channel, BallMessage ballMessage) { public void message(String channel, BallMessage ballMessage) {
BallAPI.getInstance().getEventBus().post(new MessageReceivedEvent(ballMessage)); BallAPI api = BallAPI.getInstance();
if (!BallAPI.BALL_CHANNEL.equals(ballMessage.getChannel())) { if (ballMessage.getReceiverType() != null && ballMessage.getReceiverType() != api.getLocalServerInfo().getType()) {
return;
}
if (ballMessage.getReceiverID() != null && !api.isLocalServer(ballMessage.getReceiverID())) {
return;
}
api.getEventBus().post(new MessageReceivedEvent(channel, ballMessage));
if (!BallAPI.BALL_CHANNEL.equals(channel)) {
return; return;
} }
switch (BallActions.valueOf(ballMessage.getAction())) { switch (BallActions.valueOf(ballMessage.getAction())) {
case BroadcastPlayerMessage: { case BroadcastPlayerMessage: {
BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BroadcastPlayerMessageEvent.class); BroadcastPlayerMessageEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BroadcastPlayerMessageEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case DispatchConsoleCommand: { case DispatchConsoleCommand: {
DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchConsoleCommandEvent.class); DispatchConsoleCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchConsoleCommandEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case DispatchPlayerCommand: { case DispatchPlayerCommand: {
DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchPlayerCommandEvent.class); DispatchPlayerCommandEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), DispatchPlayerCommandEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case KickPlayer: { case KickPlayer: {
KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), KickPlayerEvent.class); KickPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), KickPlayerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case SendMessageToPlayer: { case SendMessageToPlayer: {
SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendMessageToPlayerEvent.class); SendMessageToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendMessageToPlayerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case SendPlayerToLocation: { case SendPlayerToLocation: {
SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToLocationEvent.class); SendPlayerToLocationEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToLocationEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case SendPlayerToPlayer: { case SendPlayerToPlayer: {
SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToPlayerEvent.class); SendPlayerToPlayerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), SendPlayerToPlayerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerPreLogin: { case BallPlayerPreLogin: {
BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreLoginEvent.class); BallPlayerPreLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreLoginEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerLogin: { case BallPlayerLogin: {
BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLoginEvent.class); BallPlayerLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLoginEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerPostLogin: { case BallPlayerPostLogin: {
BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostLoginEvent.class); BallPlayerPostLoginEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostLoginEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerPreConnectServer: { case BallPlayerPreConnectServer: {
BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreConnectServerEvent.class); BallPlayerPreConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPreConnectServerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerConnectServer: { case BallPlayerConnectServer: {
BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerConnectServerEvent.class); BallPlayerConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerConnectServerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerPostConnectServer: { case BallPlayerPostConnectServer: {
BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostConnectServerEvent.class); BallPlayerPostConnectServerEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerPostConnectServerEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerLogout: { case BallPlayerLogout: {
BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLogoutEvent.class); BallPlayerLogoutEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerLogoutEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case BallPlayerInfoUpdate: { case BallPlayerInfoUpdate: {
BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerInfoUpdateEvent.class); BallPlayerInfoUpdateEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), BallPlayerInfoUpdateEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case ServerOffline: { case ServerOffline: {
ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOfflineEvent.class); ServerOfflineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOfflineEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
case ServerOnline: { case ServerOnline: {
ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOnlineEvent.class); ServerOnlineEvent event = CoreAPI.getInstance().getGson().fromJson(ballMessage.getContent(), ServerOnlineEvent.class);
BallAPI.getInstance().getEventBus().post(event); api.getEventBus().post(event);
break; break;
} }
} }
@@ -123,7 +130,6 @@ public class BallRedisListener implements RedisPubSubListener<String, BallMessag
@Override @Override
public void subscribed(String channel, long count) { public void subscribed(String channel, long count) {
BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel); BallAPI.getInstance().getLogger().info("已订阅 redis 频道: " + channel);
} }
@Override @Override