diff --git a/commons/build.gradle.kts b/commons/build.gradle.kts index 3742a2043..828815d35 100644 --- a/commons/build.gradle.kts +++ b/commons/build.gradle.kts @@ -15,6 +15,7 @@ java { } dependencies { + implementation(libs.json) implementation(libs.snakeyaml) implementation(project(":packer")) implementation(libs.mongodb.bson) @@ -32,6 +33,13 @@ dependencies { implementation(libs.configurate.yaml) implementation(libs.javapoet) + + testImplementation("org.junit.jupiter:junit-jupiter:6.0.3") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.test { + useJUnitPlatform() } sourceSets { diff --git a/commons/src/generated/java/net/swofty/commons/skyblock/item/ItemType.java b/commons/src/generated/java/net/swofty/commons/skyblock/item/ItemType.java index d1b807584..cb7ae1bf5 100644 --- a/commons/src/generated/java/net/swofty/commons/skyblock/item/ItemType.java +++ b/commons/src/generated/java/net/swofty/commons/skyblock/item/ItemType.java @@ -876,15 +876,15 @@ public enum ItemType { DIAMOND_BLOCK(Material.DIAMOND_BLOCK, Rarity.COMMON), - DIAMOND_BOOTS(Material.DIAMOND_BOOTS, Rarity.COMMON), + DIAMOND_BOOTS(Material.DIAMOND_BOOTS, Rarity.RARE), - DIAMOND_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.COMMON), + DIAMOND_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.RARE), - DIAMOND_HELMET(Material.DIAMOND_HELMET, Rarity.COMMON), + DIAMOND_HELMET(Material.DIAMOND_HELMET, Rarity.RARE), DIAMOND_HOE(Material.DIAMOND_HOE, Rarity.COMMON), - DIAMOND_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.COMMON), + DIAMOND_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.RARE), DIAMOND_MAGMAFISH(Material.PLAYER_HEAD, Rarity.COMMON), diff --git a/commons/src/main/java/net/swofty/commons/friend/Friend.java b/commons/src/main/java/net/swofty/commons/friend/Friend.java index 1340223e6..43b00fc5d 100644 --- a/commons/src/main/java/net/swofty/commons/friend/Friend.java +++ b/commons/src/main/java/net/swofty/commons/friend/Friend.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import net.swofty.commons.protocol.Serializer; @@ -16,7 +18,12 @@ public class Friend { private boolean bestFriend; private final long addedTimestamp; - public Friend(UUID uuid, String nickname, boolean bestFriend, long addedTimestamp) { + @JsonCreator + public Friend( + @JsonProperty("uuid") UUID uuid, + @JsonProperty("nickname") String nickname, + @JsonProperty("bestFriend") boolean bestFriend, + @JsonProperty("addedTimestamp") long addedTimestamp) { this.uuid = uuid; this.nickname = nickname; this.bestFriend = bestFriend; diff --git a/commons/src/main/java/net/swofty/commons/friend/FriendData.java b/commons/src/main/java/net/swofty/commons/friend/FriendData.java index d349391f4..2cdc228d2 100644 --- a/commons/src/main/java/net/swofty/commons/friend/FriendData.java +++ b/commons/src/main/java/net/swofty/commons/friend/FriendData.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import net.swofty.commons.protocol.Serializer; @@ -17,7 +19,11 @@ public class FriendData { @Setter private FriendSettings settings; - public FriendData(UUID playerUuid, List friends, FriendSettings settings) { + @JsonCreator + public FriendData( + @JsonProperty("playerUuid") UUID playerUuid, + @JsonProperty("friends") List friends, + @JsonProperty("settings") FriendSettings settings) { this.playerUuid = playerUuid; this.friends = friends; this.settings = settings; diff --git a/commons/src/main/java/net/swofty/commons/friend/FriendEvent.java b/commons/src/main/java/net/swofty/commons/friend/FriendEvent.java index df7b2a6a4..af1d22f44 100644 --- a/commons/src/main/java/net/swofty/commons/friend/FriendEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/FriendEvent.java @@ -1,7 +1,11 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.Getter; import lombok.NonNull; +import net.swofty.commons.friend.events.*; +import net.swofty.commons.friend.events.response.*; import net.swofty.commons.protocol.Serializer; import java.util.Arrays; @@ -9,6 +13,20 @@ import java.util.UUID; @Getter +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = FriendAcceptRequestEvent.class), + @JsonSubTypes.Type(value = FriendAddRequestEvent.class), + @JsonSubTypes.Type(value = FriendDenyRequestEvent.class), + @JsonSubTypes.Type(value = FriendListRequestEvent.class), + @JsonSubTypes.Type(value = FriendRemoveAllRequestEvent.class), + @JsonSubTypes.Type(value = FriendRemoveRequestEvent.class), + @JsonSubTypes.Type(value = FriendRequestsListEvent.class), + @JsonSubTypes.Type(value = FriendSetNicknameRequestEvent.class), + @JsonSubTypes.Type(value = FriendToggleBestRequestEvent.class), + @JsonSubTypes.Type(value = FriendToggleSettingRequestEvent.class), + @JsonSubTypes.Type(value = FriendResponseEvent.class) +}) public abstract class FriendEvent { public FriendEvent() { } diff --git a/commons/src/main/java/net/swofty/commons/friend/FriendResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/FriendResponseEvent.java index ae2237714..ef0371507 100644 --- a/commons/src/main/java/net/swofty/commons/friend/FriendResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/FriendResponseEvent.java @@ -1,5 +1,26 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import net.swofty.commons.friend.events.response.*; + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = FriendAddedResponseEvent.class), + @JsonSubTypes.Type(value = FriendBestToggledResponseEvent.class), + @JsonSubTypes.Type(value = FriendDeniedResponseEvent.class), + @JsonSubTypes.Type(value = FriendJoinNotificationEvent.class), + @JsonSubTypes.Type(value = FriendLeaveNotificationEvent.class), + @JsonSubTypes.Type(value = FriendListResponseEvent.class), + @JsonSubTypes.Type(value = FriendNicknameSetResponseEvent.class), + @JsonSubTypes.Type(value = FriendRemoveAllResponseEvent.class), + @JsonSubTypes.Type(value = FriendRemovedResponseEvent.class), + @JsonSubTypes.Type(value = FriendRequestExpiredResponseEvent.class), + @JsonSubTypes.Type(value = FriendRequestReceivedResponseEvent.class), + @JsonSubTypes.Type(value = FriendRequestSentResponseEvent.class), + @JsonSubTypes.Type(value = FriendRequestsListResponseEvent.class), + @JsonSubTypes.Type(value = FriendSettingToggledResponseEvent.class) +}) public abstract class FriendResponseEvent extends FriendEvent { public FriendResponseEvent() { super(); diff --git a/commons/src/main/java/net/swofty/commons/friend/FriendSettings.java b/commons/src/main/java/net/swofty/commons/friend/FriendSettings.java index bf1d4ee02..3e96e150a 100644 --- a/commons/src/main/java/net/swofty/commons/friend/FriendSettings.java +++ b/commons/src/main/java/net/swofty/commons/friend/FriendSettings.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,10 @@ public class FriendSettings { private boolean acceptingRequests; private boolean joinLeaveNotifications; - public FriendSettings(boolean acceptingRequests, boolean joinLeaveNotifications) { + @JsonCreator + public FriendSettings( + @JsonProperty("acceptingRequests") boolean acceptingRequests, + @JsonProperty("joinLeaveNotifications") boolean joinLeaveNotifications) { this.acceptingRequests = acceptingRequests; this.joinLeaveNotifications = joinLeaveNotifications; } diff --git a/commons/src/main/java/net/swofty/commons/friend/PendingFriendRequest.java b/commons/src/main/java/net/swofty/commons/friend/PendingFriendRequest.java index 29789d81d..af8a042d9 100644 --- a/commons/src/main/java/net/swofty/commons/friend/PendingFriendRequest.java +++ b/commons/src/main/java/net/swofty/commons/friend/PendingFriendRequest.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -15,7 +17,13 @@ public class PendingFriendRequest { private final String toName; private final long timestamp; - public PendingFriendRequest(UUID from, UUID to, String fromName, String toName, long timestamp) { + @JsonCreator + public PendingFriendRequest( + @JsonProperty("from") UUID from, + @JsonProperty("to") UUID to, + @JsonProperty("fromName") String fromName, + @JsonProperty("toName") String toName, + @JsonProperty("timestamp") long timestamp) { this.from = from; this.to = to; this.fromName = fromName; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendAcceptRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendAcceptRequestEvent.java index d5a32447c..e3f766a09 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendAcceptRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendAcceptRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendAcceptRequestEvent extends FriendEvent { private final UUID accepter; private final UUID requester; - public FriendAcceptRequestEvent(UUID accepter, UUID requester) { + @JsonCreator + public FriendAcceptRequestEvent(@JsonProperty("accepter") UUID accepter, @JsonProperty("requester") UUID requester) { super(); this.accepter = accepter; this.requester = requester; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendAddRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendAddRequestEvent.java index c4b412472..c8b0b6499 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendAddRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendAddRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendAddRequestEvent extends FriendEvent { private final UUID sender; private final UUID target; - public FriendAddRequestEvent(UUID sender, UUID target) { + @JsonCreator + public FriendAddRequestEvent(@JsonProperty("sender") UUID sender, @JsonProperty("target") UUID target) { super(); this.sender = sender; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendDenyRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendDenyRequestEvent.java index 6278d4110..1f9471b91 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendDenyRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendDenyRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendDenyRequestEvent extends FriendEvent { private final UUID denier; private final UUID requester; - public FriendDenyRequestEvent(UUID denier, UUID requester) { + @JsonCreator + public FriendDenyRequestEvent(@JsonProperty("denier") UUID denier, @JsonProperty("requester") UUID requester) { super(); this.denier = denier; this.requester = requester; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendListRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendListRequestEvent.java index 52cb9c013..da60bea92 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendListRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendListRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendListRequestEvent extends FriendEvent { private final int page; private final boolean bestOnly; - public FriendListRequestEvent(UUID player, int page, boolean bestOnly) { + @JsonCreator + public FriendListRequestEvent(@JsonProperty("player") UUID player, @JsonProperty("page") int page, @JsonProperty("bestOnly") boolean bestOnly) { super(); this.player = player; this.page = page; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveAllRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveAllRequestEvent.java index 144ce4347..ea84ad532 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveAllRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveAllRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -12,7 +14,8 @@ public class FriendRemoveAllRequestEvent extends FriendEvent { private final UUID player; - public FriendRemoveAllRequestEvent(UUID player) { + @JsonCreator + public FriendRemoveAllRequestEvent(@JsonProperty("player") UUID player) { super(); this.player = player; } diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveRequestEvent.java index ddc4b946b..9806a28a3 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendRemoveRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendRemoveRequestEvent extends FriendEvent { private final UUID remover; private final UUID target; - public FriendRemoveRequestEvent(UUID remover, UUID target) { + @JsonCreator + public FriendRemoveRequestEvent(@JsonProperty("remover") UUID remover, @JsonProperty("target") UUID target) { super(); this.remover = remover; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendRequestsListEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendRequestsListEvent.java index 4cb09be55..e70fd689b 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendRequestsListEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendRequestsListEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendRequestsListEvent extends FriendEvent { private final UUID player; private final int page; - public FriendRequestsListEvent(UUID player, int page) { + @JsonCreator + public FriendRequestsListEvent(@JsonProperty("player") UUID player, @JsonProperty("page") int page) { super(); this.player = player; this.page = page; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendSetNicknameRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendSetNicknameRequestEvent.java index 9a7ebdcd5..f3e301292 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendSetNicknameRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendSetNicknameRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendSetNicknameRequestEvent extends FriendEvent { private final UUID target; private final String nickname; - public FriendSetNicknameRequestEvent(UUID player, UUID target, String nickname) { + @JsonCreator + public FriendSetNicknameRequestEvent(@JsonProperty("player") UUID player, @JsonProperty("target") UUID target, @JsonProperty("nickname") String nickname) { super(); this.player = player; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleBestRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleBestRequestEvent.java index fbd9f3155..9bffd85fd 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleBestRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleBestRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendToggleBestRequestEvent extends FriendEvent { private final UUID player; private final UUID target; - public FriendToggleBestRequestEvent(UUID player, UUID target) { + @JsonCreator + public FriendToggleBestRequestEvent(@JsonProperty("player") UUID player, @JsonProperty("target") UUID target) { super(); this.player = player; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleSettingRequestEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleSettingRequestEvent.java index ba3e30c5c..5075a0bf3 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleSettingRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/FriendToggleSettingRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.friend.FriendSettingType; @@ -14,7 +16,8 @@ public class FriendToggleSettingRequestEvent extends FriendEvent { private final UUID player; private final FriendSettingType settingType; - public FriendToggleSettingRequestEvent(UUID player, FriendSettingType settingType) { + @JsonCreator + public FriendToggleSettingRequestEvent(@JsonProperty("player") UUID player, @JsonProperty("settingType") FriendSettingType settingType) { super(); this.player = player; this.settingType = settingType; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendAddedResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendAddedResponseEvent.java index bf0340efd..930a0dc8e 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendAddedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendAddedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -15,7 +17,8 @@ public class FriendAddedResponseEvent extends FriendResponseEvent { private final String player1Name; private final String player2Name; - public FriendAddedResponseEvent(UUID player1, UUID player2, String player1Name, String player2Name) { + @JsonCreator + public FriendAddedResponseEvent(@JsonProperty("player1") UUID player1, @JsonProperty("player2") UUID player2, @JsonProperty("player1Name") String player1Name, @JsonProperty("player2Name") String player2Name) { super(); this.player1 = player1; this.player2 = player2; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendBestToggledResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendBestToggledResponseEvent.java index 1408bbc0d..43bdfe48e 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendBestToggledResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendBestToggledResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -15,7 +17,8 @@ public class FriendBestToggledResponseEvent extends FriendResponseEvent { private final String targetName; private final boolean isBest; - public FriendBestToggledResponseEvent(UUID player, UUID target, String targetName, boolean isBest) { + @JsonCreator + public FriendBestToggledResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("target") UUID target, @JsonProperty("targetName") String targetName, @JsonProperty("isBest") boolean isBest) { super(); this.player = player; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendDeniedResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendDeniedResponseEvent.java index 84a3c665b..3edec7a9c 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendDeniedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendDeniedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendDeniedResponseEvent extends FriendResponseEvent { private final UUID requester; private final String denierName; - public FriendDeniedResponseEvent(UUID denier, UUID requester, String denierName) { + @JsonCreator + public FriendDeniedResponseEvent(@JsonProperty("denier") UUID denier, @JsonProperty("requester") UUID requester, @JsonProperty("denierName") String denierName) { super(); this.denier = denier; this.requester = requester; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendJoinNotificationEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendJoinNotificationEvent.java index 2c860eb7d..b02dcc2d7 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendJoinNotificationEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendJoinNotificationEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendJoinNotificationEvent extends FriendResponseEvent { private final UUID friend; private final String friendName; - public FriendJoinNotificationEvent(UUID player, UUID friend, String friendName) { + @JsonCreator + public FriendJoinNotificationEvent(@JsonProperty("player") UUID player, @JsonProperty("friend") UUID friend, @JsonProperty("friendName") String friendName) { super(); this.player = player; this.friend = friend; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendLeaveNotificationEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendLeaveNotificationEvent.java index cd00b3c1e..0cd735b07 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendLeaveNotificationEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendLeaveNotificationEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendLeaveNotificationEvent extends FriendResponseEvent { private final UUID friend; private final String friendName; - public FriendLeaveNotificationEvent(UUID player, UUID friend, String friendName) { + @JsonCreator + public FriendLeaveNotificationEvent(@JsonProperty("player") UUID player, @JsonProperty("friend") UUID friend, @JsonProperty("friendName") String friendName) { super(); this.player = player; this.friend = friend; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendListResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendListResponseEvent.java index fd5d0097d..80a33e6c5 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendListResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendListResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -18,7 +20,8 @@ public class FriendListResponseEvent extends FriendResponseEvent { private final int totalPages; private final boolean bestOnly; - public FriendListResponseEvent(UUID player, List friends, int page, int totalPages, boolean bestOnly) { + @JsonCreator + public FriendListResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("friends") List friends, @JsonProperty("page") int page, @JsonProperty("totalPages") int totalPages, @JsonProperty("bestOnly") boolean bestOnly) { super(); this.player = player; this.friends = friends; @@ -108,7 +111,8 @@ public static class FriendListEntry { private final long friendSince; private final String server; - public FriendListEntry(UUID uuid, String name, String nickname, boolean isBest, boolean isOnline, long lastSeen, long friendSince, String server) { + @JsonCreator + public FriendListEntry(@JsonProperty("uuid") UUID uuid, @JsonProperty("name") String name, @JsonProperty("nickname") String nickname, @JsonProperty("isBest") boolean isBest, @JsonProperty("isOnline") boolean isOnline, @JsonProperty("lastSeen") long lastSeen, @JsonProperty("friendSince") long friendSince, @JsonProperty("server") String server) { this.uuid = uuid; this.name = name; this.nickname = nickname; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendNicknameSetResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendNicknameSetResponseEvent.java index 86944da10..0f7bcea73 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendNicknameSetResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendNicknameSetResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -15,7 +17,8 @@ public class FriendNicknameSetResponseEvent extends FriendResponseEvent { private final String targetName; private final String nickname; - public FriendNicknameSetResponseEvent(UUID player, UUID target, String targetName, String nickname) { + @JsonCreator + public FriendNicknameSetResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("target") UUID target, @JsonProperty("targetName") String targetName, @JsonProperty("nickname") String nickname) { super(); this.player = player; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemoveAllResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemoveAllResponseEvent.java index 15cf88ee3..95ac65804 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemoveAllResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemoveAllResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -13,7 +15,8 @@ public class FriendRemoveAllResponseEvent extends FriendResponseEvent { private final UUID player; private final int removedCount; - public FriendRemoveAllResponseEvent(UUID player, int removedCount) { + @JsonCreator + public FriendRemoveAllResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("removedCount") int removedCount) { super(); this.player = player; this.removedCount = removedCount; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemovedResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemovedResponseEvent.java index b1d0d1dab..e8ceeb569 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemovedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRemovedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendRemovedResponseEvent extends FriendResponseEvent { private final UUID removed; private final String removerName; - public FriendRemovedResponseEvent(UUID remover, UUID removed, String removerName) { + @JsonCreator + public FriendRemovedResponseEvent(@JsonProperty("remover") UUID remover, @JsonProperty("removed") UUID removed, @JsonProperty("removerName") String removerName) { super(); this.remover = remover; this.removed = removed; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestExpiredResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestExpiredResponseEvent.java index 83195b4d7..29050cc34 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestExpiredResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestExpiredResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -15,7 +17,8 @@ public class FriendRequestExpiredResponseEvent extends FriendResponseEvent { private final String senderName; private final String targetName; - public FriendRequestExpiredResponseEvent(UUID sender, UUID target, String senderName, String targetName) { + @JsonCreator + public FriendRequestExpiredResponseEvent(@JsonProperty("sender") UUID sender, @JsonProperty("target") UUID target, @JsonProperty("senderName") String senderName, @JsonProperty("targetName") String targetName) { super(); this.sender = sender; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestReceivedResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestReceivedResponseEvent.java index 601295625..0c19b1962 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestReceivedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestReceivedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendRequestReceivedResponseEvent extends FriendResponseEvent { private final UUID target; private final String senderName; - public FriendRequestReceivedResponseEvent(UUID sender, UUID target, String senderName) { + @JsonCreator + public FriendRequestReceivedResponseEvent(@JsonProperty("sender") UUID sender, @JsonProperty("target") UUID target, @JsonProperty("senderName") String senderName) { super(); this.sender = sender; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestSentResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestSentResponseEvent.java index 246480da7..b786468d2 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestSentResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestSentResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -14,7 +16,8 @@ public class FriendRequestSentResponseEvent extends FriendResponseEvent { private final UUID target; private final String targetName; - public FriendRequestSentResponseEvent(UUID sender, UUID target, String targetName) { + @JsonCreator + public FriendRequestSentResponseEvent(@JsonProperty("sender") UUID sender, @JsonProperty("target") UUID target, @JsonProperty("targetName") String targetName) { super(); this.sender = sender; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestsListResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestsListResponseEvent.java index 8391a742e..1d301dd1c 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestsListResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendRequestsListResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -17,7 +19,8 @@ public class FriendRequestsListResponseEvent extends FriendResponseEvent { private final int page; private final int totalPages; - public FriendRequestsListResponseEvent(UUID player, List requests, int page, int totalPages) { + @JsonCreator + public FriendRequestsListResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("requests") List requests, @JsonProperty("page") int page, @JsonProperty("totalPages") int totalPages) { super(); this.player = player; this.requests = requests; @@ -89,7 +92,8 @@ public static class FriendRequestEntry { private final String senderName; private final long timestamp; - public FriendRequestEntry(UUID senderUuid, String senderName, long timestamp) { + @JsonCreator + public FriendRequestEntry(@JsonProperty("senderUuid") UUID senderUuid, @JsonProperty("senderName") String senderName, @JsonProperty("timestamp") long timestamp) { this.senderUuid = senderUuid; this.senderName = senderName; this.timestamp = timestamp; diff --git a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendSettingToggledResponseEvent.java b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendSettingToggledResponseEvent.java index 0ab6aafb1..a85f0f040 100644 --- a/commons/src/main/java/net/swofty/commons/friend/events/response/FriendSettingToggledResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/friend/events/response/FriendSettingToggledResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.friend.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.friend.FriendResponseEvent; import net.swofty.commons.friend.FriendSettingType; @@ -15,7 +17,8 @@ public class FriendSettingToggledResponseEvent extends FriendResponseEvent { private final FriendSettingType settingType; private final boolean newValue; - public FriendSettingToggledResponseEvent(UUID player, FriendSettingType settingType, boolean newValue) { + @JsonCreator + public FriendSettingToggledResponseEvent(@JsonProperty("player") UUID player, @JsonProperty("settingType") FriendSettingType settingType, @JsonProperty("newValue") boolean newValue) { super(); this.player = player; this.settingType = settingType; diff --git a/commons/src/main/java/net/swofty/commons/party/FullParty.java b/commons/src/main/java/net/swofty/commons/party/FullParty.java index 007be4e87..23327e7c6 100644 --- a/commons/src/main/java/net/swofty/commons/party/FullParty.java +++ b/commons/src/main/java/net/swofty/commons/party/FullParty.java @@ -1,5 +1,7 @@ package net.swofty.commons.party; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import net.swofty.commons.StringUtility; @@ -16,7 +18,10 @@ public class FullParty implements Party { private final UUID uuid; private final List members; - private FullParty(UUID uuid, List members) { + @JsonCreator + public FullParty( + @JsonProperty("uuid") UUID uuid, + @JsonProperty("members") List members) { this.uuid = uuid; this.members = members; } @@ -93,7 +98,11 @@ public static class Member { private Role role; private boolean joined; - public Member(UUID uuid, Role role, boolean joined) { + @JsonCreator + public Member( + @JsonProperty("uuid") UUID uuid, + @JsonProperty("role") Role role, + @JsonProperty("joined") boolean joined) { this.uuid = uuid; this.role = role; this.joined = joined; diff --git a/commons/src/main/java/net/swofty/commons/party/Party.java b/commons/src/main/java/net/swofty/commons/party/Party.java index 3931a10b7..556edfe7a 100644 --- a/commons/src/main/java/net/swofty/commons/party/Party.java +++ b/commons/src/main/java/net/swofty/commons/party/Party.java @@ -1,10 +1,17 @@ package net.swofty.commons.party; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import net.swofty.commons.protocol.Serializer; import java.util.List; import java.util.UUID; +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = FullParty.class, name = "FullParty"), + @JsonSubTypes.Type(value = PendingParty.class, name = "PendingParty") +}) public interface Party { Serializer getSerializer(); diff --git a/commons/src/main/java/net/swofty/commons/party/PartyEvent.java b/commons/src/main/java/net/swofty/commons/party/PartyEvent.java index 37db42a6b..447a422aa 100644 --- a/commons/src/main/java/net/swofty/commons/party/PartyEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/PartyEvent.java @@ -1,7 +1,11 @@ package net.swofty.commons.party; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import lombok.Getter; import lombok.NonNull; +import net.swofty.commons.party.events.*; +import net.swofty.commons.party.events.response.*; import net.swofty.commons.protocol.Serializer; import java.util.Arrays; @@ -9,6 +13,24 @@ import java.util.UUID; @Getter +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = PartyAcceptInviteEvent.class), + @JsonSubTypes.Type(value = PartyChatMessageEvent.class), + @JsonSubTypes.Type(value = PartyDemoteRequestEvent.class), + @JsonSubTypes.Type(value = PartyDisbandRequestEvent.class), + @JsonSubTypes.Type(value = PartyHijackRequestEvent.class), + @JsonSubTypes.Type(value = PartyInviteEvent.class), + @JsonSubTypes.Type(value = PartyKickRequestEvent.class), + @JsonSubTypes.Type(value = PartyLeaveRequestEvent.class), + @JsonSubTypes.Type(value = PartyPlayerDisconnectEvent.class), + @JsonSubTypes.Type(value = PartyPlayerRejoinEvent.class), + @JsonSubTypes.Type(value = PartyPlayerSwitchedServerEvent.class), + @JsonSubTypes.Type(value = PartyPromoteRequestEvent.class), + @JsonSubTypes.Type(value = PartyTransferRequestEvent.class), + @JsonSubTypes.Type(value = PartyWarpRequestEvent.class), + @JsonSubTypes.Type(value = PartyResponseEvent.class) +}) public abstract class PartyEvent { private final Party party; diff --git a/commons/src/main/java/net/swofty/commons/party/PartyResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/PartyResponseEvent.java index 06eb41086..39c620c4d 100644 --- a/commons/src/main/java/net/swofty/commons/party/PartyResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/PartyResponseEvent.java @@ -1,5 +1,27 @@ package net.swofty.commons.party; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import net.swofty.commons.party.events.response.*; + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = PartyChatMessageResponseEvent.class), + @JsonSubTypes.Type(value = PartyDisbandResponseEvent.class), + @JsonSubTypes.Type(value = PartyInviteExpiredResponseEvent.class), + @JsonSubTypes.Type(value = PartyInviteResponseEvent.class), + @JsonSubTypes.Type(value = PartyLeaderTransferResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberDisconnectTimeoutResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberDisconnectedResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberJoinResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberKickResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberLeaveResponseEvent.class), + @JsonSubTypes.Type(value = PartyMemberRejoinedResponseEvent.class), + @JsonSubTypes.Type(value = PartyPlayerSwitchedServerResponseEvent.class), + @JsonSubTypes.Type(value = PartyPromotionResponseEvent.class), + @JsonSubTypes.Type(value = PartyWarpOverviewResponseEvent.class), + @JsonSubTypes.Type(value = PartyWarpResponseEvent.class) +}) public abstract class PartyResponseEvent extends PartyEvent { public PartyResponseEvent(Party party) { super(party); diff --git a/commons/src/main/java/net/swofty/commons/party/PendingParty.java b/commons/src/main/java/net/swofty/commons/party/PendingParty.java index e95c2bdca..28aba5e59 100644 --- a/commons/src/main/java/net/swofty/commons/party/PendingParty.java +++ b/commons/src/main/java/net/swofty/commons/party/PendingParty.java @@ -1,5 +1,7 @@ package net.swofty.commons.party; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -13,7 +15,11 @@ public class PendingParty implements Party { public final UUID invitee; public final UUID leader; - public PendingParty(UUID resultPartyUUID, UUID invitee, UUID leader) { + @JsonCreator + public PendingParty( + @JsonProperty("resultPartyUUID") UUID resultPartyUUID, + @JsonProperty("invitee") UUID invitee, + @JsonProperty("leader") UUID leader) { this.resultPartyUUID = resultPartyUUID; this.invitee = invitee; this.leader = leader; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyAcceptInviteEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyAcceptInviteEvent.java index 385b8c3b8..7eaa48058 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyAcceptInviteEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyAcceptInviteEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyAcceptInviteEvent extends PartyEvent { private final UUID accepter; private final UUID inviter; - public PartyAcceptInviteEvent(UUID accepter, UUID inviter) { + @JsonCreator + public PartyAcceptInviteEvent(@JsonProperty("accepter") UUID accepter, @JsonProperty("inviter") UUID inviter) { super(null); this.accepter = accepter; this.inviter = inviter; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyChatMessageEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyChatMessageEvent.java index 7358b2ec7..e05a9a0b9 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyChatMessageEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyChatMessageEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyChatMessageEvent extends PartyEvent { private final UUID player; private final String message; - public PartyChatMessageEvent(UUID player, String message) { + @JsonCreator + public PartyChatMessageEvent(@JsonProperty("player") UUID player, @JsonProperty("message") String message) { super(null); this.player = player; this.message = message; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyDemoteRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyDemoteRequestEvent.java index 6a6053055..0af4cba18 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyDemoteRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyDemoteRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyDemoteRequestEvent extends PartyEvent { private final UUID demoter; private final UUID target; - public PartyDemoteRequestEvent(UUID demoter, UUID target) { + @JsonCreator + public PartyDemoteRequestEvent(@JsonProperty("demoter") UUID demoter, @JsonProperty("target") UUID target) { super(null); this.demoter = demoter; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyDisbandRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyDisbandRequestEvent.java index a17614e64..7f0abaadb 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyDisbandRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyDisbandRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyDisbandRequestEvent extends PartyEvent { private final UUID disbander; - public PartyDisbandRequestEvent(UUID disbander) { + @JsonCreator + public PartyDisbandRequestEvent(@JsonProperty("disbander") UUID disbander) { super(null); this.disbander = disbander; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyHijackRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyHijackRequestEvent.java index fa3cabcbc..97f2ad840 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyHijackRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyHijackRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyHijackRequestEvent extends PartyEvent { private final UUID hijacker; private final UUID target; - public PartyHijackRequestEvent(UUID hijacker, UUID target) { + @JsonCreator + public PartyHijackRequestEvent(@JsonProperty("hijacker") UUID hijacker, @JsonProperty("target") UUID target) { super(null); this.hijacker = hijacker; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyInviteEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyInviteEvent.java index 9e0f7fbeb..a20aed9f7 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyInviteEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyInviteEvent.java @@ -1,12 +1,15 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.PendingParty; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; public class PartyInviteEvent extends PartyEvent { - public PartyInviteEvent(PendingParty party) { + @JsonCreator + public PartyInviteEvent(@JsonProperty("party") PendingParty party) { super(party); } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyKickRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyKickRequestEvent.java index 7c2abaaed..d001e9a51 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyKickRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyKickRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyKickRequestEvent extends PartyEvent { private final UUID kicker; private final UUID target; - public PartyKickRequestEvent(UUID kicker, UUID target) { + @JsonCreator + public PartyKickRequestEvent(@JsonProperty("kicker") UUID kicker, @JsonProperty("target") UUID target) { super(null); this.kicker = kicker; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyLeaveRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyLeaveRequestEvent.java index 6825f1a9b..f9cfcaa37 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyLeaveRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyLeaveRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyLeaveRequestEvent extends PartyEvent { private final UUID leaver; - public PartyLeaveRequestEvent(UUID leaver) { + @JsonCreator + public PartyLeaveRequestEvent(@JsonProperty("leaver") UUID leaver) { super(null); this.leaver = leaver; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerDisconnectEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerDisconnectEvent.java index 5cfdf99ca..7fc60f8ea 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerDisconnectEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerDisconnectEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyPlayerDisconnectEvent extends PartyEvent { private final UUID disconnectedPlayer; - public PartyPlayerDisconnectEvent(UUID disconnectedPlayer) { + @JsonCreator + public PartyPlayerDisconnectEvent(@JsonProperty("disconnectedPlayer") UUID disconnectedPlayer) { super(null); this.disconnectedPlayer = disconnectedPlayer; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerRejoinEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerRejoinEvent.java index 7c57e035e..8c31b1470 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerRejoinEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerRejoinEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyPlayerRejoinEvent extends PartyEvent { private final UUID rejoinedPlayer; - public PartyPlayerRejoinEvent(UUID rejoinedPlayer) { + @JsonCreator + public PartyPlayerRejoinEvent(@JsonProperty("rejoinedPlayer") UUID rejoinedPlayer) { super(null); this.rejoinedPlayer = rejoinedPlayer; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerSwitchedServerEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerSwitchedServerEvent.java index c7a13dd1b..e0a484495 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerSwitchedServerEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyPlayerSwitchedServerEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyPlayerSwitchedServerEvent extends PartyEvent { private final UUID mover; - public PartyPlayerSwitchedServerEvent(UUID mover) { + @JsonCreator + public PartyPlayerSwitchedServerEvent(@JsonProperty("mover") UUID mover) { super(null); this.mover = mover; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyPromoteRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyPromoteRequestEvent.java index 4d828f5f9..7dd330e36 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyPromoteRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyPromoteRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyPromoteRequestEvent extends PartyEvent { private final UUID promoter; private final UUID target; - public PartyPromoteRequestEvent(UUID promoter, UUID target) { + @JsonCreator + public PartyPromoteRequestEvent(@JsonProperty("promoter") UUID promoter, @JsonProperty("target") UUID target) { super(null); this.promoter = promoter; this.target = target; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyTransferRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyTransferRequestEvent.java index cf0fa3e9d..4a2f4d551 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyTransferRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyTransferRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -11,7 +13,8 @@ public class PartyTransferRequestEvent extends PartyEvent { private final UUID currentLeader; private final UUID newLeader; - public PartyTransferRequestEvent(UUID currentLeader, UUID newLeader) { + @JsonCreator + public PartyTransferRequestEvent(@JsonProperty("currentLeader") UUID currentLeader, @JsonProperty("newLeader") UUID newLeader) { super(null); this.currentLeader = currentLeader; this.newLeader = newLeader; diff --git a/commons/src/main/java/net/swofty/commons/party/events/PartyWarpRequestEvent.java b/commons/src/main/java/net/swofty/commons/party/events/PartyWarpRequestEvent.java index 132e0aed1..6db10ed32 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/PartyWarpRequestEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/PartyWarpRequestEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -10,7 +12,8 @@ public class PartyWarpRequestEvent extends PartyEvent { private final UUID warper; - public PartyWarpRequestEvent(UUID warper) { + @JsonCreator + public PartyWarpRequestEvent(@JsonProperty("warper") UUID warper) { super(null); this.warper = warper; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyChatMessageResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyChatMessageResponseEvent.java index 9bcd47a8b..257e579dd 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyChatMessageResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyChatMessageResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -12,7 +14,8 @@ public class PartyChatMessageResponseEvent extends PartyResponseEvent { private final String message; private final FullParty party; - public PartyChatMessageResponseEvent(FullParty party, UUID player, String message) { + @JsonCreator + public PartyChatMessageResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("player") UUID player, @JsonProperty("message") String message) { super(party); this.player = player; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyDisbandResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyDisbandResponseEvent.java index e4ac3c63d..b1ace5627 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyDisbandResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyDisbandResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -12,7 +14,8 @@ public class PartyDisbandResponseEvent extends PartyResponseEvent { private final String reason; private final FullParty party; - public PartyDisbandResponseEvent(FullParty party, UUID disbander, String reason) { + @JsonCreator + public PartyDisbandResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("disbander") UUID disbander, @JsonProperty("reason") String reason) { super(party); this.disbander = disbander; this.reason = reason; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteExpiredResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteExpiredResponseEvent.java index ed63d6992..a5f9de4e0 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteExpiredResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteExpiredResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.Party; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.party.PendingParty; @@ -12,7 +14,8 @@ public class PartyInviteExpiredResponseEvent extends PartyResponseEvent { private final UUID inviter; private final UUID invitee; - public PartyInviteExpiredResponseEvent(Party party, UUID inviter, UUID invitee) { + @JsonCreator + public PartyInviteExpiredResponseEvent(@JsonProperty("party") Party party, @JsonProperty("inviter") UUID inviter, @JsonProperty("invitee") UUID invitee) { super(party); this.inviter = inviter; this.invitee = invitee; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteResponseEvent.java index 3739ffd52..6ef4871ba 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyInviteResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.party.PendingParty; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,8 @@ public class PartyInviteResponseEvent extends PartyResponseEvent { private final UUID inviter; private final UUID invitee; - public PartyInviteResponseEvent(PendingParty party) { + @JsonCreator + public PartyInviteResponseEvent(@JsonProperty("party") PendingParty party) { super(party); this.inviter = party.getLeader(); this.invitee = party.getInvitee(); diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyLeaderTransferResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyLeaderTransferResponseEvent.java index dd019c910..108a3986a 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyLeaderTransferResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyLeaderTransferResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,8 @@ public class PartyLeaderTransferResponseEvent extends PartyResponseEvent { private final UUID oldLeader; private final UUID newLeader; - public PartyLeaderTransferResponseEvent(FullParty party, UUID oldLeader, UUID newLeader) { + @JsonCreator + public PartyLeaderTransferResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("oldLeader") UUID oldLeader, @JsonProperty("newLeader") UUID newLeader) { super(party); this.oldLeader = oldLeader; this.newLeader = newLeader; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectTimeoutResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectTimeoutResponseEvent.java index 5c0f919dd..b1d8e2bd6 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectTimeoutResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectTimeoutResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,8 @@ public class PartyMemberDisconnectTimeoutResponseEvent extends PartyResponseEven private final UUID timedOutPlayer; private final boolean wasLeader; - public PartyMemberDisconnectTimeoutResponseEvent(FullParty party, UUID timedOutPlayer, boolean wasLeader) { + @JsonCreator + public PartyMemberDisconnectTimeoutResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("timedOutPlayer") UUID timedOutPlayer, @JsonProperty("wasLeader") boolean wasLeader) { super(party); this.timedOutPlayer = timedOutPlayer; this.wasLeader = wasLeader; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectedResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectedResponseEvent.java index 59747810e..1daebe126 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberDisconnectedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,8 @@ public class PartyMemberDisconnectedResponseEvent extends PartyResponseEvent { private final UUID disconnectedPlayer; private final long timeoutSeconds; - public PartyMemberDisconnectedResponseEvent(FullParty party, UUID disconnectedPlayer, long timeoutSeconds) { + @JsonCreator + public PartyMemberDisconnectedResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("disconnectedPlayer") UUID disconnectedPlayer, @JsonProperty("timeoutSeconds") long timeoutSeconds) { super(party); this.disconnectedPlayer = disconnectedPlayer; this.timeoutSeconds = timeoutSeconds; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberJoinResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberJoinResponseEvent.java index 73ce61d10..6b4f7311d 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberJoinResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberJoinResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; @@ -14,7 +16,8 @@ public class PartyMemberJoinResponseEvent extends PartyResponseEvent { private final UUID inviter; private final UUID joiner; - public PartyMemberJoinResponseEvent(FullParty party, UUID inviter, UUID joiner) { + @JsonCreator + public PartyMemberJoinResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("inviter") UUID inviter, @JsonProperty("joiner") UUID joiner) { super(party); this.party = party; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberKickResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberKickResponseEvent.java index 0a6de9906..5d4c951e0 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberKickResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberKickResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -11,7 +13,8 @@ public class PartyMemberKickResponseEvent extends PartyResponseEvent { private final UUID kicker; private final UUID kicked; - public PartyMemberKickResponseEvent(FullParty party, UUID kicker, UUID kicked) { + @JsonCreator + public PartyMemberKickResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("kicker") UUID kicker, @JsonProperty("kicked") UUID kicked) { super(party); this.kicker = kicker; this.kicked = kicked; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberLeaveResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberLeaveResponseEvent.java index 93355c1c9..d8625a7d0 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberLeaveResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberLeaveResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -10,7 +12,8 @@ public class PartyMemberLeaveResponseEvent extends PartyResponseEvent { private final UUID leaver; - public PartyMemberLeaveResponseEvent(FullParty party, UUID leaver) { + @JsonCreator + public PartyMemberLeaveResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("leaver") UUID leaver) { super(party); this.leaver = leaver; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberRejoinedResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberRejoinedResponseEvent.java index 26fafa241..7786d37df 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberRejoinedResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyMemberRejoinedResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -10,7 +12,8 @@ public class PartyMemberRejoinedResponseEvent extends PartyResponseEvent { private final UUID rejoinedPlayer; - public PartyMemberRejoinedResponseEvent(FullParty party, UUID rejoinedPlayer) { + @JsonCreator + public PartyMemberRejoinedResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("rejoinedPlayer") UUID rejoinedPlayer) { super(party); this.rejoinedPlayer = rejoinedPlayer; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyPlayerSwitchedServerResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyPlayerSwitchedServerResponseEvent.java index 7ced13b29..8220774a3 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyPlayerSwitchedServerResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyPlayerSwitchedServerResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -10,7 +12,8 @@ public class PartyPlayerSwitchedServerResponseEvent extends PartyResponseEvent { private final UUID mover; - public PartyPlayerSwitchedServerResponseEvent(FullParty party, UUID mover) { + @JsonCreator + public PartyPlayerSwitchedServerResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("mover") UUID mover) { super(party); this.mover = mover; } diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyPromotionResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyPromotionResponseEvent.java index be35581de..d85fa15f6 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyPromotionResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyPromotionResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -12,7 +14,8 @@ public class PartyPromotionResponseEvent extends PartyResponseEvent { private final UUID promoted; private final FullParty.Role newRole; - public PartyPromotionResponseEvent(FullParty party, UUID promoter, UUID promoted, FullParty.Role newRole) { + @JsonCreator + public PartyPromotionResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("promoter") UUID promoter, @JsonProperty("promoted") UUID promoted, @JsonProperty("newRole") FullParty.Role newRole) { super(party); this.promoter = promoter; this.promoted = promoted; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpOverviewResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpOverviewResponseEvent.java index ae8f96b75..061ffe5f7 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpOverviewResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpOverviewResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -20,7 +22,8 @@ public PartyWarpOverviewResponseEvent(FullParty party, UUID warper, List s this(party, warper, successfullyWarped, failedToWarp, new HashMap<>()); } - public PartyWarpOverviewResponseEvent(FullParty party, UUID warper, List successfullyWarped, List failedToWarp, Map failureReasons) { + @JsonCreator + public PartyWarpOverviewResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("warper") UUID warper, @JsonProperty("successfullyWarped") List successfullyWarped, @JsonProperty("failedToWarp") List failedToWarp, @JsonProperty("failureReasons") Map failureReasons) { super(party); this.warper = warper; this.successfullyWarped = successfullyWarped; diff --git a/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpResponseEvent.java b/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpResponseEvent.java index b43e4931d..f36d8ace6 100644 --- a/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpResponseEvent.java +++ b/commons/src/main/java/net/swofty/commons/party/events/response/PartyWarpResponseEvent.java @@ -1,5 +1,7 @@ package net.swofty.commons.party.events.response; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyResponseEvent; import net.swofty.commons.protocol.Serializer; @@ -10,7 +12,8 @@ public class PartyWarpResponseEvent extends PartyResponseEvent { private final UUID warper; - public PartyWarpResponseEvent(FullParty party, UUID warper) { + @JsonCreator + public PartyWarpResponseEvent(@JsonProperty("party") FullParty party, @JsonProperty("warper") UUID warper) { super(party); this.warper = warper; } diff --git a/commons/src/main/java/net/swofty/commons/presence/PresenceInfo.java b/commons/src/main/java/net/swofty/commons/presence/PresenceInfo.java index 1c8b09291..cacacd1f0 100644 --- a/commons/src/main/java/net/swofty/commons/presence/PresenceInfo.java +++ b/commons/src/main/java/net/swofty/commons/presence/PresenceInfo.java @@ -1,5 +1,7 @@ package net.swofty.commons.presence; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; @@ -14,7 +16,13 @@ public class PresenceInfo { private final String serverId; private final long lastSeen; - public PresenceInfo(UUID uuid, boolean online, String serverType, String serverId, long lastSeen) { + @JsonCreator + public PresenceInfo( + @JsonProperty("uuid") UUID uuid, + @JsonProperty("online") boolean online, + @JsonProperty("serverType") String serverType, + @JsonProperty("serverId") String serverId, + @JsonProperty("lastSeen") long lastSeen) { this.uuid = uuid; this.online = online; this.serverType = serverType; @@ -54,4 +62,3 @@ public PresenceInfo clone(PresenceInfo value) { }; } } - diff --git a/commons/src/main/java/net/swofty/commons/protocol/JacksonSerializer.java b/commons/src/main/java/net/swofty/commons/protocol/JacksonSerializer.java index 200ea01e6..be1f785de 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/JacksonSerializer.java +++ b/commons/src/main/java/net/swofty/commons/protocol/JacksonSerializer.java @@ -1,36 +1,39 @@ package net.swofty.commons.protocol; -import lombok.SneakyThrows; -import tools.jackson.databind.DeserializationFeature; -import tools.jackson.databind.SerializationFeature; +import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.json.JsonMapper; public class JacksonSerializer implements Serializer { - private final JsonMapper mapper; - private final Class clazz; + private static final ObjectMapper MAPPER = JsonMapper.builder() + .findAndAddModules() + .build(); - public JacksonSerializer(Class clazz) { - this.mapper = JsonMapper.builder() - .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .build(); - this.clazz = clazz; + private final Class type; + + public JacksonSerializer(Class type) { + this.type = type; } - @SneakyThrows @Override public String serialize(T value) { - return mapper.writeValueAsString(value); + try { + return MAPPER.writeValueAsString(value); + } catch (Exception e) { + throw new RuntimeException("Failed to serialize " + type.getSimpleName(), e); + } } - @SneakyThrows @Override public T deserialize(String json) { - return mapper.readValue(json, clazz); + try { + return MAPPER.readValue(json, type); + } catch (Exception e) { + throw new RuntimeException("Failed to deserialize " + type.getSimpleName() + ": " + json, e); + } } @Override public T clone(T value) { - return value; + return deserialize(serialize(value)); } -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/ServicePushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/ServicePushProtocol.java new file mode 100644 index 000000000..3cc25f164 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/ServicePushProtocol.java @@ -0,0 +1,21 @@ +package net.swofty.commons.protocol; + +public abstract class ServicePushProtocol extends ProtocolObject { + private final JacksonSerializer requestSerializer; + private final JacksonSerializer responseSerializer; + + protected ServicePushProtocol(Class requestType, Class responseType) { + this.requestSerializer = new JacksonSerializer<>(requestType); + this.responseSerializer = new JacksonSerializer<>(responseType); + } + + @Override + public Serializer getSerializer() { + return requestSerializer; + } + + @Override + public Serializer getReturnSerializer() { + return responseSerializer; + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/PingProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/PingProtocolObject.java index 5d4fb6667..59f8645d4 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/PingProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/PingProtocolObject.java @@ -1,5 +1,6 @@ package net.swofty.commons.protocol.objects; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; @@ -9,42 +10,12 @@ public class PingProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(EmptyMessage value) { - return ""; - } - - @Override - public EmptyMessage deserialize(String json) { - return new EmptyMessage(); - } - - @Override - public EmptyMessage clone(EmptyMessage value) { - return new EmptyMessage(); - } - }; + return new JacksonSerializer<>(EmptyMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(EmptyMessage value) { - return ""; - } - - @Override - public EmptyMessage deserialize(String json) { - return new EmptyMessage(); - } - - @Override - public EmptyMessage clone(EmptyMessage value) { - return new EmptyMessage(); - } - }; + return new JacksonSerializer<>(EmptyMessage.class); } public record EmptyMessage() {} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/api/APIAuthenticateCodeProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/api/APIAuthenticateCodeProtocolObject.java index 36f2a0eac..8a708541e 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/api/APIAuthenticateCodeProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/api/APIAuthenticateCodeProtocolObject.java @@ -1,10 +1,9 @@ package net.swofty.commons.protocol.objects.api; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -13,67 +12,15 @@ public class APIAuthenticateCodeProtocolObject extends ProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuthenticateCodeMessage value) { - JSONObject json = new JSONObject(); - json.put("auth-code", value.authCode); - json.put("player-name", value.playerName); - json.put("player-uuid", value.playerUUID); - return json.toString(); - } - - @Override - public AuthenticateCodeMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - AuthenticateCodeMessage message = new AuthenticateCodeMessage(); - message.authCode = jsonObject.getString("auth-code"); - message.playerName = jsonObject.getString("player-name"); - message.playerUUID = UUID.fromString(jsonObject.getString("player-uuid")); - return message; - } - - @Override - public AuthenticateCodeMessage clone(AuthenticateCodeMessage value) { - return new AuthenticateCodeMessage(value.authCode, value.playerName, value.playerUUID); - } - }; + return new JacksonSerializer<>(AuthenticateCodeMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - public String serialize(AuthenticateCodeResponse value) { - JSONObject json = new JSONObject(); - json.put("successful", value.successful); - return json.toString(); - } - - public AuthenticateCodeResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - AuthenticateCodeResponse message = new AuthenticateCodeResponse(); - message.successful = jsonObject.getBoolean("successful"); - return message; - } - - public AuthenticateCodeResponse clone(AuthenticateCodeResponse value) { - return new AuthenticateCodeResponse(value.successful); - } - }; + return new JacksonSerializer<>(AuthenticateCodeResponse.class); } - @AllArgsConstructor - @NoArgsConstructor - public static class AuthenticateCodeMessage { - public String authCode; - public String playerName; - public UUID playerUUID; - } + public record AuthenticateCodeMessage(String authCode, String playerName, UUID playerUUID) {} - @AllArgsConstructor - @NoArgsConstructor - public static class AuthenticateCodeResponse { - public boolean successful; - } + public record AuthenticateCodeResponse(boolean success, @Nullable String error) {} } - diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionAddItemProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionAddItemProtocolObject.java index 14e73dfef..1990ca6c4 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionAddItemProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionAddItemProtocolObject.java @@ -1,13 +1,13 @@ package net.swofty.commons.protocol.objects.auctions; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.skyblock.auctions.AuctionCategories; import net.swofty.commons.skyblock.auctions.AuctionItem; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import net.swofty.commons.protocol.serializers.AuctionItemSerializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class AuctionAddItemProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionAddItemMessage value) { - JSONObject json = new JSONObject(); - json.put("item", new AuctionItemSerializer<>().serialize(value.item)); - json.put("category", value.category.name()); - return json.toString(); - } - - @Override - public AuctionAddItemMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - AuctionItem item = new AuctionItemSerializer<>().deserialize(jsonObject.getString("item")); - AuctionCategories category = AuctionCategories.valueOf(jsonObject.getString("category")); - return new AuctionAddItemMessage(item, category); - } - - @Override - public AuctionAddItemMessage clone(AuctionAddItemMessage value) { - return new AuctionAddItemMessage(value.item, value.category); - } - }; + return new JacksonSerializer<>(AuctionAddItemMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionAddItemResponse value) { - return value.uuid.toString(); - } - - @Override - public AuctionAddItemResponse deserialize(String json) { - return new AuctionAddItemResponse(UUID.fromString(json)); - } - - @Override - public AuctionAddItemResponse clone(AuctionAddItemResponse value) { - return new AuctionAddItemResponse(value.uuid); - } - }; + return new JacksonSerializer<>(AuctionAddItemResponse.class); } - public record AuctionAddItemMessage(AuctionItem item, AuctionCategories category) { } + public record AuctionAddItemMessage(AuctionItem item, AuctionCategories category) {} - public record AuctionAddItemResponse(UUID uuid) { } + public record AuctionAddItemResponse(UUID uuid, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemProtocolObject.java index 4e9bbbea2..aee64d73f 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemProtocolObject.java @@ -1,11 +1,12 @@ package net.swofty.commons.protocol.objects.auctions; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.skyblock.auctions.AuctionItem; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import net.swofty.commons.protocol.serializers.AuctionItemSerializer; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class AuctionFetchItemProtocolObject extends ProtocolObject< AuctionFetchItemProtocolObject.AuctionFetchItemMessage, @@ -13,45 +14,15 @@ public class AuctionFetchItemProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionFetchItemMessage value) { - return value.uuid.toString(); - } - - @Override - public AuctionFetchItemMessage deserialize(String json) { - return new AuctionFetchItemMessage(UUID.fromString(json)); - } - - @Override - public AuctionFetchItemMessage clone(AuctionFetchItemMessage value) { - return new AuctionFetchItemMessage(value.uuid); - } - }; + return new JacksonSerializer<>(AuctionFetchItemMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionFetchItemResponse value) { - return new AuctionItemSerializer<>().serialize(value.item); - } - - @Override - public AuctionFetchItemResponse deserialize(String json) { - return new AuctionFetchItemResponse(new AuctionItemSerializer<>().deserialize(json)); - } - - @Override - public AuctionFetchItemResponse clone(AuctionFetchItemResponse value) { - return new AuctionFetchItemResponse(value.item); - } - }; + return new JacksonSerializer<>(AuctionFetchItemResponse.class); } - public record AuctionFetchItemMessage(UUID uuid) { } + public record AuctionFetchItemMessage(UUID uuid) {} - public record AuctionFetchItemResponse(AuctionItem item) { } + public record AuctionFetchItemResponse(AuctionItem item, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemsProtocolObject.java index 8838bea53..4376c6d33 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/auctions/AuctionFetchItemsProtocolObject.java @@ -1,15 +1,15 @@ package net.swofty.commons.protocol.objects.auctions; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.skyblock.auctions.AuctionCategories; -import net.swofty.commons.skyblock.auctions.AuctionItem; import net.swofty.commons.skyblock.auctions.AuctionsFilter; import net.swofty.commons.skyblock.auctions.AuctionsSorting; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import net.swofty.commons.protocol.serializers.AuctionItemListSerializer; -import org.json.JSONObject; +import net.swofty.commons.skyblock.auctions.AuctionItem; import java.util.List; +import org.jetbrains.annotations.Nullable; public class AuctionFetchItemsProtocolObject extends ProtocolObject< AuctionFetchItemsProtocolObject.AuctionFetchItemsMessage, @@ -17,59 +17,23 @@ public class AuctionFetchItemsProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionFetchItemsMessage value) { - JSONObject json = new JSONObject(); - json.put("sorting", value.sorting.name()); - json.put("filter", value.filter.name()); - json.put("category", value.category.name()); - return json.toString(); - } - - @Override - public AuctionFetchItemsMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - AuctionsSorting sorting = AuctionsSorting.valueOf(jsonObject.getString("sorting")); - AuctionsFilter filter = AuctionsFilter.valueOf(jsonObject.getString("filter")); - AuctionCategories category = AuctionCategories.valueOf(jsonObject.getString("category")); - return new AuctionFetchItemsMessage(sorting, filter, category); - } - - @Override - public AuctionFetchItemsMessage clone(AuctionFetchItemsMessage value) { - return new AuctionFetchItemsMessage(value.sorting, value.filter, value.category); - } - }; + return new JacksonSerializer<>(AuctionFetchItemsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(AuctionFetchItemsResponse value) { - return new AuctionItemListSerializer().serialize(value.items); - } - - @Override - public AuctionFetchItemsResponse deserialize(String json) { - return new AuctionFetchItemsResponse(new AuctionItemListSerializer().deserialize(json)); - } - - @Override - public AuctionFetchItemsResponse clone(AuctionFetchItemsResponse value) { - return new AuctionFetchItemsResponse(value.items); - } - }; + return new JacksonSerializer<>(AuctionFetchItemsResponse.class); } public record AuctionFetchItemsMessage( AuctionsSorting sorting, AuctionsFilter filter, AuctionCategories category - ) { } + ) {} public record AuctionFetchItemsResponse( - List items - ) { } + List items, + boolean success, + @Nullable String error + ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarBuyProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarBuyProtocolObject.java index 0a6f3f4c0..6b13837f2 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarBuyProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarBuyProtocolObject.java @@ -1,10 +1,9 @@ package net.swofty.commons.protocol.objects.bazaar; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -13,75 +12,15 @@ public class BazaarBuyProtocolObject extends ProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarBuyMessage value) { - JSONObject json = new JSONObject(); - json.put("item-name", value.itemName); - json.put("player-uuid", value.playerUUID); - json.put("profile-uuid", value.profileUUID); - json.put("price", value.price); - json.put("amount", value.amount); - return json.toString(); - } - - @Override - public BazaarBuyMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - BazaarBuyMessage message = new BazaarBuyMessage(); - message.itemName = jsonObject.getString("item-name"); - message.playerUUID = UUID.fromString(jsonObject.getString("player-uuid")); - message.profileUUID = UUID.fromString(jsonObject.getString("profile-uuid")); - message.price = jsonObject.getDouble("price"); - message.amount = jsonObject.getInt("amount"); - return message; - } - - @Override - public BazaarBuyMessage clone(BazaarBuyMessage value) { - return new BazaarBuyMessage(value.itemName, value.amount, value.price, value.playerUUID, value.profileUUID); - } - }; + return new JacksonSerializer<>(BazaarBuyMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarBuyResponse value) { - JSONObject json = new JSONObject(); - json.put("successful", value.successful); - return json.toString(); - } - - @Override - public BazaarBuyResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - BazaarBuyResponse message = new BazaarBuyResponse(); - message.successful = jsonObject.getBoolean("successful"); - return message; - } - - @Override - public BazaarBuyResponse clone(BazaarBuyResponse value) { - return new BazaarBuyResponse(value.successful); - } - }; + return new JacksonSerializer<>(BazaarBuyResponse.class); } - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarBuyMessage { - public String itemName; - public int amount; - public double price; - public UUID playerUUID; - public UUID profileUUID; - } + public record BazaarBuyMessage(String itemName, int amount, double price, UUID playerUUID, UUID profileUUID) {} - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarBuyResponse { - public boolean successful; - } + public record BazaarBuyResponse(boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarCancelProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarCancelProtocolObject.java index c92eb32fa..1f3fe2252 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarCancelProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarCancelProtocolObject.java @@ -1,10 +1,9 @@ package net.swofty.commons.protocol.objects.bazaar; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -14,61 +13,15 @@ public class BazaarCancelProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(CancelMessage v) { - JSONObject o = new JSONObject(); - o.put("order-id", v.orderId.toString()); - o.put("player-uuid", v.playerUuid.toString()); - o.put("profile-uuid", v.profileUuid.toString()); - return o.toString(); - } - @Override - public CancelMessage deserialize(String json) { - JSONObject o = new JSONObject(json); - return new CancelMessage( - UUID.fromString(o.getString("order-id")), - UUID.fromString(o.getString("player-uuid")), - UUID.fromString(o.getString("profile-uuid")) - ); - } - @Override - public CancelMessage clone(CancelMessage v) { - return new CancelMessage(v.orderId, v.playerUuid, v.profileUuid); - } - }; + return new JacksonSerializer<>(CancelMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(CancelResponse v) { - JSONObject o = new JSONObject(); - o.put("successful", v.successful); - return o.toString(); - } - @Override - public CancelResponse deserialize(String json) { - boolean ok = new JSONObject(json).getBoolean("successful"); - return new CancelResponse(ok); - } - @Override - public CancelResponse clone(CancelResponse v) { - return new CancelResponse(v.successful); - } - }; + return new JacksonSerializer<>(CancelResponse.class); } - @AllArgsConstructor @NoArgsConstructor - public static class CancelMessage { - public UUID orderId; - public UUID playerUuid; - public UUID profileUuid; - } + public record CancelMessage(UUID orderId, UUID playerUuid, UUID profileUuid) {} - @AllArgsConstructor @NoArgsConstructor - public static class CancelResponse { - public boolean successful; - } + public record CancelResponse(boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetItemProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetItemProtocolObject.java index a9584dbed..6eef19f80 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetItemProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetItemProtocolObject.java @@ -1,60 +1,25 @@ package net.swofty.commons.protocol.objects.bazaar; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import com.google.gson.Gson; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class BazaarGetItemProtocolObject extends ProtocolObject< BazaarGetItemProtocolObject.BazaarGetItemMessage, BazaarGetItemProtocolObject.BazaarGetItemResponse> { - private static final Gson gson = new Gson(); - @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetItemMessage value) { - return value.itemName; - } - - @Override - public BazaarGetItemMessage deserialize(String json) { - return new BazaarGetItemMessage(json); - } - - @Override - public BazaarGetItemMessage clone(BazaarGetItemMessage value) { - return new BazaarGetItemMessage(value.itemName); - } - }; + return new JacksonSerializer<>(BazaarGetItemMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetItemResponse value) { - return gson.toJson(value); - } - - @Override - public BazaarGetItemResponse deserialize(String json) { - return gson.fromJson(json, BazaarGetItemResponse.class); - } - - @Override - public BazaarGetItemResponse clone(BazaarGetItemResponse value) { - return new BazaarGetItemResponse( - value.itemName, - List.copyOf(value.buyOrders), - List.copyOf(value.sellOrders) - ); - } - }; + return new JacksonSerializer<>(BazaarGetItemResponse.class); } public record BazaarGetItemMessage(String itemName) {} @@ -62,7 +27,9 @@ public record BazaarGetItemMessage(String itemName) {} public record BazaarGetItemResponse( String itemName, List buyOrders, - List sellOrders + List sellOrders, + boolean success, + @Nullable String error ) {} public record OrderRecord( @@ -71,4 +38,4 @@ public record OrderRecord( double price, double amount ) {} -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingOrdersProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingOrdersProtocolObject.java index 809e27c18..c3c12b2c7 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingOrdersProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingOrdersProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.bazaar; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; public class BazaarGetPendingOrdersProtocolObject extends ProtocolObject< @@ -16,91 +15,24 @@ public class BazaarGetPendingOrdersProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetPendingOrdersMessage v) { - JSONObject o = new JSONObject(); - o.put("player-uuid", v.playerUUID.toString()); - o.put("profile-uuid", v.profileUUID.toString()); - return o.toString(); - } - - @Override - public BazaarGetPendingOrdersMessage deserialize(String json) { - JSONObject o = new JSONObject(json); - return new BazaarGetPendingOrdersMessage( - UUID.fromString(o.getString("player-uuid")), - UUID.fromString(o.getString("profile-uuid")) - ); - } - - @Override - public BazaarGetPendingOrdersMessage clone(BazaarGetPendingOrdersMessage v) { - return new BazaarGetPendingOrdersMessage(v.playerUUID, v.profileUUID); - } - }; + return new JacksonSerializer<>(BazaarGetPendingOrdersMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetPendingOrdersResponse v) { - JSONArray arr = new JSONArray(v.orders.stream().map(order -> { - JSONObject o = new JSONObject(); - o.put("order-id", order.orderId.toString()); - o.put("item-name", order.itemName); - o.put("side", order.side); - o.put("price", order.price); - o.put("amount", order.amount); - o.put("profile-uuid", order.profileUUID.toString()); - return o; - }).collect(Collectors.toList())); - return arr.toString(); - } - - @Override - public BazaarGetPendingOrdersResponse deserialize(String json) { - JSONArray arr = new JSONArray(json); - var list = arr.toList().stream().map(obj -> { - JSONObject o = new JSONObject((java.util.Map)obj); - return new PendingOrder( - UUID.fromString(o.getString("order-id")), - o.getString("item-name"), - o.getString("side"), - o.getDouble("price"), - o.getDouble("amount"), - UUID.fromString(o.getString("profile-uuid")) - ); - }).collect(Collectors.toList()); - return new BazaarGetPendingOrdersResponse(list); - } - - @Override - public BazaarGetPendingOrdersResponse clone(BazaarGetPendingOrdersResponse v) { - return new BazaarGetPendingOrdersResponse(v.orders); - } - }; + return new JacksonSerializer<>(BazaarGetPendingOrdersResponse.class); } - @lombok.AllArgsConstructor - public static class BazaarGetPendingOrdersMessage { - public UUID playerUUID; - public UUID profileUUID; - } + public record BazaarGetPendingOrdersMessage(UUID playerUUID, UUID profileUUID) {} public record PendingOrder( - UUID orderId, + UUID orderId, String itemName, String side, double price, double amount, - UUID profileUUID + UUID profileUUID ) {} - /** Response is just a list of those. */ - @lombok.AllArgsConstructor - public static class BazaarGetPendingOrdersResponse { - public List orders; - } + public record BazaarGetPendingOrdersResponse(List orders, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingTransactionsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingTransactionsProtocolObject.java index 795dc60c8..4d06f9150 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingTransactionsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarGetPendingTransactionsProtocolObject.java @@ -1,15 +1,14 @@ package net.swofty.commons.protocol.objects.bazaar; -import lombok.AllArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; public class BazaarGetPendingTransactionsProtocolObject extends ProtocolObject< BazaarGetPendingTransactionsProtocolObject.BazaarGetPendingTransactionsMessage, @@ -17,95 +16,22 @@ public class BazaarGetPendingTransactionsProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetPendingTransactionsMessage v) { - JSONObject o = new JSONObject(); - o.put("player-uuid", v.playerUUID.toString()); - o.put("profile-uuid", v.profileUUID.toString()); - return o.toString(); - } - - @Override - public BazaarGetPendingTransactionsMessage deserialize(String json) { - JSONObject o = new JSONObject(json); - return new BazaarGetPendingTransactionsMessage( - UUID.fromString(o.getString("player-uuid")), - UUID.fromString(o.getString("profile-uuid")) - ); - } - - @Override - public BazaarGetPendingTransactionsMessage clone(BazaarGetPendingTransactionsMessage v) { - return new BazaarGetPendingTransactionsMessage(v.playerUUID, v.profileUUID); - } - }; + return new JacksonSerializer<>(BazaarGetPendingTransactionsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarGetPendingTransactionsResponse v) { - JSONArray arr = new JSONArray(); - for (PendingTransactionInfo transaction : v.transactions) { - JSONObject o = new JSONObject(); - o.put("id", transaction.id); - o.put("transaction-type", transaction.transactionType); - o.put("transaction-data", transaction.transactionData); - o.put("created-at", transaction.createdAt.toString()); - arr.put(o); - } - return arr.toString(); - } - - @Override - public BazaarGetPendingTransactionsResponse deserialize(String json) { - JSONArray arr = new JSONArray(json); - var list = arr.toList().stream().map(obj -> { - JSONObject o = new JSONObject((java.util.Map) obj); - return new PendingTransactionInfo( - o.getString("id"), - o.getString("transaction-type"), - o.getJSONObject("transaction-data"), - Instant.parse(o.getString("created-at")) - ); - }).collect(Collectors.toList()); - return new BazaarGetPendingTransactionsResponse(list); - } - - @Override - public BazaarGetPendingTransactionsResponse clone(BazaarGetPendingTransactionsResponse v) { - return new BazaarGetPendingTransactionsResponse(v.transactions); - } - }; + return new JacksonSerializer<>(BazaarGetPendingTransactionsResponse.class); } - @AllArgsConstructor - public static class BazaarGetPendingTransactionsMessage { - public UUID playerUUID; - public UUID profileUUID; - } - - @AllArgsConstructor - public static class BazaarGetPendingTransactionsResponse { - public List transactions; - } + public record BazaarGetPendingTransactionsMessage(UUID playerUUID, UUID profileUUID) {} - /** - * Represents a pending transaction for protocol transfer - */ - public static class PendingTransactionInfo { - public String id; - public String transactionType; - public JSONObject transactionData; - public Instant createdAt; + public record BazaarGetPendingTransactionsResponse(List transactions, boolean success, @Nullable String error) {} - public PendingTransactionInfo(String id, String transactionType, JSONObject transactionData, Instant createdAt) { - this.id = id; - this.transactionType = transactionType; - this.transactionData = transactionData; - this.createdAt = createdAt; - } - } -} \ No newline at end of file + public record PendingTransactionInfo( + String id, + String transactionType, + Map transactionData, + Instant createdAt + ) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarProcessPendingTransactionsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarProcessPendingTransactionsProtocolObject.java index 66dc542d3..fc4380784 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarProcessPendingTransactionsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarProcessPendingTransactionsProtocolObject.java @@ -1,15 +1,12 @@ package net.swofty.commons.protocol.objects.bazaar; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; +import org.jetbrains.annotations.Nullable; public class BazaarProcessPendingTransactionsProtocolObject extends ProtocolObject< BazaarProcessPendingTransactionsProtocolObject.BazaarProcessPendingTransactionsMessage, @@ -17,110 +14,15 @@ public class BazaarProcessPendingTransactionsProtocolObject extends ProtocolObje @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarProcessPendingTransactionsMessage v) { - JSONObject o = new JSONObject(); - o.put("player-uuid", v.playerUUID.toString()); - o.put("profile-uuid", v.profileUUID.toString()); - - JSONArray arr = new JSONArray(); - v.transactionIds.forEach(arr::put); - o.put("transaction-ids", arr); - - return o.toString(); - } - - @Override - public BazaarProcessPendingTransactionsMessage deserialize(String json) { - JSONObject o = new JSONObject(json); - - List transactionIds = o.getJSONArray("transaction-ids") - .toList() - .stream() - .map(Object::toString) - .collect(Collectors.toList()); - - return new BazaarProcessPendingTransactionsMessage( - UUID.fromString(o.getString("player-uuid")), - UUID.fromString(o.getString("profile-uuid")), - transactionIds - ); - } - - @Override - public BazaarProcessPendingTransactionsMessage clone(BazaarProcessPendingTransactionsMessage v) { - return new BazaarProcessPendingTransactionsMessage(v.playerUUID, v.profileUUID, v.transactionIds); - } - }; + return new JacksonSerializer<>(BazaarProcessPendingTransactionsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarProcessPendingTransactionsResponse v) { - JSONObject o = new JSONObject(); - o.put("processed-count", v.processedCount); - o.put("failed-count", v.failedCount); - - JSONArray successArr = new JSONArray(); - v.successfulTransactionIds.forEach(successArr::put); - o.put("successful-transaction-ids", successArr); - - JSONArray failedArr = new JSONArray(); - v.failedTransactionIds.forEach(failedArr::put); - o.put("failed-transaction-ids", failedArr); - - return o.toString(); - } - - @Override - public BazaarProcessPendingTransactionsResponse deserialize(String json) { - JSONObject o = new JSONObject(json); - - List successfulIds = o.getJSONArray("successful-transaction-ids") - .toList() - .stream() - .map(Object::toString) - .collect(Collectors.toList()); - - List failedIds = o.getJSONArray("failed-transaction-ids") - .toList() - .stream() - .map(Object::toString) - .collect(Collectors.toList()); - - return new BazaarProcessPendingTransactionsResponse( - o.getInt("processed-count"), - o.getInt("failed-count"), - successfulIds, - failedIds - ); - } - - @Override - public BazaarProcessPendingTransactionsResponse clone(BazaarProcessPendingTransactionsResponse v) { - return new BazaarProcessPendingTransactionsResponse( - v.processedCount, v.failedCount, v.successfulTransactionIds, v.failedTransactionIds); - } - }; + return new JacksonSerializer<>(BazaarProcessPendingTransactionsResponse.class); } - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarProcessPendingTransactionsMessage { - public UUID playerUUID; - public UUID profileUUID; - public List transactionIds; - } + public record BazaarProcessPendingTransactionsMessage(UUID playerUUID, UUID profileUUID, List transactionIds) {} - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarProcessPendingTransactionsResponse { - public int processedCount; - public int failedCount; - public List successfulTransactionIds; - public List failedTransactionIds; - } -} \ No newline at end of file + public record BazaarProcessPendingTransactionsResponse(int processedCount, int failedCount, List successfulTransactionIds, List failedTransactionIds, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarSellProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarSellProtocolObject.java index db6700979..193f14844 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarSellProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarSellProtocolObject.java @@ -1,10 +1,9 @@ package net.swofty.commons.protocol.objects.bazaar; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; import java.util.UUID; @@ -14,75 +13,15 @@ public class BazaarSellProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarSellMessage value) { - JSONObject json = new JSONObject(); - json.put("item-name", value.itemName); - json.put("player-uuid", value.playerUUID); - json.put("profile-uuid", value.profileUUID); - json.put("price", value.price); - json.put("amount", value.amount); - return json.toString(); - } - - @Override - public BazaarSellMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - BazaarSellMessage message = new BazaarSellMessage(); - message.itemName = jsonObject.getString("item-name"); - message.playerUUID = UUID.fromString(jsonObject.getString("player-uuid")); - message.profileUUID = UUID.fromString(jsonObject.getString("profile-uuid")); - message.price = jsonObject.getDouble("price"); - message.amount = jsonObject.getInt("amount"); - return message; - } - - @Override - public BazaarSellMessage clone(BazaarSellMessage value) { - return new BazaarSellMessage(value.itemName, value.playerUUID, value.profileUUID, value.price, value.amount); - } - }; + return new JacksonSerializer<>(BazaarSellMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(BazaarSellResponse value) { - JSONObject json = new JSONObject(); - json.put("successful", value.successful); - return json.toString(); - } - - @Override - public BazaarSellResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - BazaarSellResponse message = new BazaarSellResponse(); - message.successful = jsonObject.getBoolean("successful"); - return message; - } - - @Override - public BazaarSellResponse clone(BazaarSellResponse value) { - return new BazaarSellResponse(value.successful); - } - }; + return new JacksonSerializer<>(BazaarSellResponse.class); } - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarSellMessage { - public String itemName; - public UUID playerUUID; - public UUID profileUUID; - public Double price; - public int amount; - } + public record BazaarSellMessage(String itemName, UUID playerUUID, UUID profileUUID, Double price, int amount) {} - @AllArgsConstructor - @NoArgsConstructor - public static class BazaarSellResponse { - public boolean successful; - } + public record BazaarSellResponse(boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarTransactionPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarTransactionPushProtocol.java new file mode 100644 index 000000000..311ba02fb --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/bazaar/BazaarTransactionPushProtocol.java @@ -0,0 +1,20 @@ +package net.swofty.commons.protocol.objects.bazaar; + +import net.swofty.commons.protocol.ServicePushProtocol; +import org.jetbrains.annotations.Nullable; + +public class BazaarTransactionPushProtocol + extends ServicePushProtocol { + + public BazaarTransactionPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(String transactionType, String transactionJson) {} + + public record Response(boolean success, boolean buyerHandled, boolean sellerHandled, String transactionId, @Nullable String error) { + public static Response failure(String reason) { + return new Response(false, false, false, null, reason); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java index 1e5a82ac4..cbddc1e1d 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class DarkAuctionEventProtocol extends ProtocolObject< DarkAuctionEventProtocol.DarkAuctionMessage, @@ -103,6 +104,7 @@ public String serialize(DarkAuctionResponse value) { JSONObject json = new JSONObject(); json.put("success", value.success); json.put("playersInAuction", value.playersInAuction); + json.put("error", value.error); return json.toString(); } @@ -111,13 +113,14 @@ public DarkAuctionResponse deserialize(String json) { JSONObject jsonObject = new JSONObject(json); return new DarkAuctionResponse( jsonObject.getBoolean("success"), - jsonObject.getInt("playersInAuction") + jsonObject.getInt("playersInAuction"), + jsonObject.optString("error", null) ); } @Override public DarkAuctionResponse clone(DarkAuctionResponse value) { - return new DarkAuctionResponse(value.success, value.playersInAuction); + return new DarkAuctionResponse(value.success, value.playersInAuction, value.error); } }; } @@ -139,6 +142,7 @@ public record DarkAuctionMessage( public record DarkAuctionResponse( boolean success, - int playersInAuction + int playersInAuction, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventPushProtocol.java new file mode 100644 index 000000000..620db6b04 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventPushProtocol.java @@ -0,0 +1,41 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.List; +import java.util.UUID; + +public class DarkAuctionEventPushProtocol + extends ServicePushProtocol { + + public DarkAuctionEventPushProtocol() { + super(Request.class, Response.class); + } + + public record Request( + String eventType, + String auctionId, + String phase, + int currentRound, + String currentItemType, + long currentBid, + String highestBidderId, + String highestBidderName, + int countdown, + List roundItems, + String refundPlayerId, + long refundAmount, + String newBidderId, + long newBidAmount + ) {} + + public record Response(boolean success, int playersInAuction, String error) { + public static Response success(int playersInAuction) { + return new Response(true, playersInAuction, null); + } + + public static Response failure(String reason) { + return new Response(false, 0, reason); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java index 3c3d37db3..410055545 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetAuctionStateProtocol extends ProtocolObject< GetAuctionStateProtocol.GetAuctionStateMessage, @@ -41,6 +42,8 @@ public Serializer getReturnSerializer() { public String serialize(GetAuctionStateResponse value) { JSONObject json = new JSONObject(); json.put("auctionActive", value.auctionActive); + json.put("success", value.success); + json.put("error", value.error); if (value.auctionActive) { json.put("auctionId", value.auctionId.toString()); json.put("phase", value.phase.toString()); @@ -63,9 +66,12 @@ public String serialize(GetAuctionStateResponse value) { public GetAuctionStateResponse deserialize(String json) { JSONObject jsonObject = new JSONObject(json); boolean auctionActive = jsonObject.getBoolean("auctionActive"); + boolean success = jsonObject.optBoolean("success", true); + String error = jsonObject.optString("error", null); + if ("null".equals(error)) error = null; if (!auctionActive) { - return new GetAuctionStateResponse(false, null, null, 0, null, 0, null, null, List.of()); + return new GetAuctionStateResponse(false, null, null, 0, null, 0, null, null, List.of(), success, error); } UUID auctionId = UUID.fromString(jsonObject.getString("auctionId")); @@ -87,14 +93,15 @@ public GetAuctionStateResponse deserialize(String json) { } return new GetAuctionStateResponse(true, auctionId, DarkAuctionPhase.valueOf(phase), currentRound, currentItemType, - currentBid, highestBidderId, highestBidderName, roundItems); + currentBid, highestBidderId, highestBidderName, roundItems, success, error); } @Override public GetAuctionStateResponse clone(GetAuctionStateResponse value) { return new GetAuctionStateResponse(value.auctionActive, value.auctionId, value.phase, value.currentRound, value.currentItemType, value.currentBid, - value.highestBidderId, value.highestBidderName, new ArrayList<>(value.roundItems)); + value.highestBidderId, value.highestBidderName, new ArrayList<>(value.roundItems), + value.success, value.error); } }; } @@ -110,6 +117,8 @@ public record GetAuctionStateResponse( long currentBid, UUID highestBidderId, String highestBidderName, - List roundItems + List roundItems, + boolean success, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java index 49d18c153..d5d3245b2 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java @@ -5,6 +5,7 @@ import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class PlaceBidProtocol extends ProtocolObject< PlaceBidProtocol.PlaceBidMessage, @@ -49,6 +50,7 @@ public String serialize(PlaceBidResponse value) { JSONObject json = new JSONObject(); json.put("success", value.success); json.put("message", value.message); + json.put("error", value.error); return json.toString(); } @@ -57,13 +59,14 @@ public PlaceBidResponse deserialize(String json) { JSONObject jsonObject = new JSONObject(json); return new PlaceBidResponse( jsonObject.getBoolean("success"), - jsonObject.getString("message") + jsonObject.getString("message"), + jsonObject.optString("error", null) ); } @Override public PlaceBidResponse clone(PlaceBidResponse value) { - return new PlaceBidResponse(value.success, value.message); + return new PlaceBidResponse(value.success, value.message, value.error); } }; } @@ -77,6 +80,7 @@ public record PlaceBidMessage( public record PlaceBidResponse( boolean success, - String message + String message, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java index 848a7c466..c6cb6c604 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java @@ -5,6 +5,7 @@ import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class PlayerLeftAuctionProtocol extends ProtocolObject< PlayerLeftAuctionProtocol.PlayerLeftMessage, @@ -53,6 +54,7 @@ public String serialize(PlayerLeftResponse value) { JSONObject json = new JSONObject(); json.put("success", value.success); json.put("refundAmount", value.refundAmount); + json.put("error", value.error); return json.toString(); } @@ -61,13 +63,14 @@ public PlayerLeftResponse deserialize(String json) { JSONObject jsonObject = new JSONObject(json); return new PlayerLeftResponse( jsonObject.getBoolean("success"), - jsonObject.getLong("refundAmount") + jsonObject.getLong("refundAmount"), + jsonObject.optString("error", null) ); } @Override public PlayerLeftResponse clone(PlayerLeftResponse value) { - return new PlayerLeftResponse(value.success, value.refundAmount); + return new PlayerLeftResponse(value.success, value.refundAmount, value.error); } }; } @@ -80,6 +83,7 @@ public record PlayerLeftMessage( public record PlayerLeftResponse( boolean success, - long refundAmount + long refundAmount, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java index fcfd748e1..78abaaee1 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java @@ -3,6 +3,7 @@ import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class TriggerDarkAuctionProtocol extends ProtocolObject< TriggerDarkAuctionProtocol.TriggerMessage, @@ -42,6 +43,7 @@ public String serialize(TriggerResponse value) { JSONObject json = new JSONObject(); json.put("success", value.success); json.put("message", value.message); + json.put("error", value.error); return json.toString(); } @@ -50,12 +52,14 @@ public TriggerResponse deserialize(String json) { JSONObject jsonObject = new JSONObject(json); boolean success = jsonObject.getBoolean("success"); String message = jsonObject.optString("message", ""); - return new TriggerResponse(success, message); + String error = jsonObject.optString("error", null); + if ("null".equals(error)) error = null; + return new TriggerResponse(success, message, error); } @Override public TriggerResponse clone(TriggerResponse value) { - return new TriggerResponse(value.success, value.message); + return new TriggerResponse(value.success, value.message, value.error); } }; } @@ -66,5 +70,5 @@ public TriggerMessage(long calendarTime) { } } - public record TriggerResponse(boolean success, String message) {} + public record TriggerResponse(boolean success, String message, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/data/GetPlayerDataPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/data/GetPlayerDataPushProtocol.java new file mode 100644 index 000000000..9b6eb3b30 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/data/GetPlayerDataPushProtocol.java @@ -0,0 +1,25 @@ +package net.swofty.commons.protocol.objects.data; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; + +public class GetPlayerDataPushProtocol + extends ServicePushProtocol { + + public GetPlayerDataPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID playerUUID, String dataKey) {} + + public record Response(boolean success, String error, String data, long timestamp) { + public static Response failure(String error) { + return new Response(false, error, null, 0); + } + + public static Response success(String data, long timestamp) { + return new Response(true, null, data, timestamp); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/data/LockPlayerDataPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/data/LockPlayerDataPushProtocol.java new file mode 100644 index 000000000..a21928e82 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/data/LockPlayerDataPushProtocol.java @@ -0,0 +1,25 @@ +package net.swofty.commons.protocol.objects.data; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; + +public class LockPlayerDataPushProtocol + extends ServicePushProtocol { + + public LockPlayerDataPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID playerUUID, String dataKey) {} + + public record Response(boolean success, String error, long lockTime) { + public static Response failure(String error) { + return new Response(false, error, 0); + } + + public static Response success(long lockTime) { + return new Response(true, null, lockTime); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/data/UnlockPlayerDataPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/data/UnlockPlayerDataPushProtocol.java new file mode 100644 index 000000000..7230fa030 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/data/UnlockPlayerDataPushProtocol.java @@ -0,0 +1,22 @@ +package net.swofty.commons.protocol.objects.data; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; +import org.jetbrains.annotations.Nullable; + +public class UnlockPlayerDataPushProtocol + extends ServicePushProtocol { + + public UnlockPlayerDataPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID playerUUID, String dataKey) {} + + public record Response(boolean success, long unlockTime, @Nullable String error) { + public static Response success(long unlockTime) { + return new Response(true, unlockTime, null); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/data/UpdatePlayerDataPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/data/UpdatePlayerDataPushProtocol.java new file mode 100644 index 000000000..88b7f623c --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/data/UpdatePlayerDataPushProtocol.java @@ -0,0 +1,25 @@ +package net.swofty.commons.protocol.objects.data; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; + +public class UpdatePlayerDataPushProtocol + extends ServicePushProtocol { + + public UpdatePlayerDataPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID playerUUID, String dataKey, String newData) {} + + public record Response(boolean success, String error, long timestamp) { + public static Response failure(String error) { + return new Response(false, error, 0); + } + + public static Response success(long timestamp) { + return new Response(true, null, timestamp); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/SynchronizeDataProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/SynchronizeDataProtocolObject.java index 3df7b2803..0d335acfd 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/SynchronizeDataProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/SynchronizeDataProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.datamutex; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class SynchronizeDataProtocolObject extends ProtocolObject< SynchronizeDataProtocolObject.SynchronizeDataRequest, @@ -15,75 +14,12 @@ public class SynchronizeDataProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(SynchronizeDataRequest value) { - JSONObject json = new JSONObject(); - json.put("playerUUID", value.playerUUID.toString()); - json.put("dataKey", value.dataKey); - - JSONArray servers = new JSONArray(); - value.serverUUIDs.forEach(uuid -> servers.put(uuid.toString())); - json.put("serverUUIDs", servers); - - return json.toString(); - } - - @Override - public SynchronizeDataRequest deserialize(String json) { - JSONObject obj = new JSONObject(json); - UUID playerUUID = UUID.fromString(obj.getString("playerUUID")); - String dataKey = obj.getString("dataKey"); - - List serverUUIDs = new ArrayList<>(); - JSONArray servers = obj.getJSONArray("serverUUIDs"); - for (int i = 0; i < servers.length(); i++) { - serverUUIDs.add(UUID.fromString(servers.getString(i))); - } - - return new SynchronizeDataRequest(serverUUIDs, playerUUID, dataKey); - } - - @Override - public SynchronizeDataRequest clone(SynchronizeDataRequest value) { - return new SynchronizeDataRequest( - new ArrayList<>(value.serverUUIDs), - value.playerUUID, - value.dataKey - ); - } - }; + return new JacksonSerializer<>(SynchronizeDataRequest.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(SynchronizeDataResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success); - json.put("message", value.message); - if (value.synchronizedData != null) { - json.put("data", value.synchronizedData); - } - return json.toString(); - } - - @Override - public SynchronizeDataResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new SynchronizeDataResponse( - obj.getBoolean("success"), - obj.getString("message"), - obj.optString("data", null) - ); - } - - @Override - public SynchronizeDataResponse clone(SynchronizeDataResponse value) { - return new SynchronizeDataResponse(value.success, value.message, value.synchronizedData); - } - }; + return new JacksonSerializer<>(SynchronizeDataResponse.class); } public record SynchronizeDataRequest( @@ -94,7 +30,7 @@ public record SynchronizeDataRequest( public record SynchronizeDataResponse( boolean success, - String message, - String synchronizedData + String synchronizedData, + @Nullable String error ) {} -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UnlockDataProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UnlockDataProtocolObject.java index df665fb3c..c29edf17e 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UnlockDataProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UnlockDataProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.datamutex; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class UnlockDataProtocolObject extends ProtocolObject< UnlockDataProtocolObject.UnlockDataRequest, @@ -15,71 +14,12 @@ public class UnlockDataProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(UnlockDataRequest value) { - JSONObject json = new JSONObject(); - json.put("playerUUID", value.playerUUID.toString()); - json.put("dataKey", value.dataKey); - - JSONArray servers = new JSONArray(); - value.serverUUIDs.forEach(uuid -> servers.put(uuid.toString())); - json.put("serverUUIDs", servers); - - return json.toString(); - } - - @Override - public UnlockDataRequest deserialize(String json) { - JSONObject obj = new JSONObject(json); - UUID playerUUID = UUID.fromString(obj.getString("playerUUID")); - String dataKey = obj.getString("dataKey"); - - List serverUUIDs = new ArrayList<>(); - JSONArray servers = obj.getJSONArray("serverUUIDs"); - for (int i = 0; i < servers.length(); i++) { - serverUUIDs.add(UUID.fromString(servers.getString(i))); - } - - return new UnlockDataRequest(serverUUIDs, playerUUID, dataKey); - } - - @Override - public UnlockDataRequest clone(UnlockDataRequest value) { - return new UnlockDataRequest( - new ArrayList<>(value.serverUUIDs), - value.playerUUID, - value.dataKey - ); - } - }; + return new JacksonSerializer<>(UnlockDataRequest.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(UnlockDataResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success); - json.put("message", value.message); - return json.toString(); - } - - @Override - public UnlockDataResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new UnlockDataResponse( - obj.getBoolean("success"), - obj.getString("message") - ); - } - - @Override - public UnlockDataResponse clone(UnlockDataResponse value) { - return new UnlockDataResponse(value.success, value.message); - } - }; + return new JacksonSerializer<>(UnlockDataResponse.class); } public record UnlockDataRequest( @@ -90,6 +30,6 @@ public record UnlockDataRequest( public record UnlockDataResponse( boolean success, - String message + @Nullable String error ) {} -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UpdateSynchronizedDataProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UpdateSynchronizedDataProtocolObject.java index d2119babe..bf5f19c89 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UpdateSynchronizedDataProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/datamutex/UpdateSynchronizedDataProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.datamutex; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class UpdateSynchronizedDataProtocolObject extends ProtocolObject< UpdateSynchronizedDataProtocolObject.UpdateDataRequest, @@ -15,74 +14,12 @@ public class UpdateSynchronizedDataProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(UpdateDataRequest value) { - JSONObject json = new JSONObject(); - json.put("playerUUID", value.playerUUID.toString()); - json.put("dataKey", value.dataKey); - json.put("newData", value.newData); - - JSONArray servers = new JSONArray(); - value.serverUUIDs.forEach(uuid -> servers.put(uuid.toString())); - json.put("serverUUIDs", servers); - - return json.toString(); - } - - @Override - public UpdateDataRequest deserialize(String json) { - JSONObject obj = new JSONObject(json); - UUID playerUUID = UUID.fromString(obj.getString("playerUUID")); - String dataKey = obj.getString("dataKey"); - String newData = obj.getString("newData"); - - List serverUUIDs = new ArrayList<>(); - JSONArray servers = obj.getJSONArray("serverUUIDs"); - for (int i = 0; i < servers.length(); i++) { - serverUUIDs.add(UUID.fromString(servers.getString(i))); - } - - return new UpdateDataRequest(serverUUIDs, playerUUID, dataKey, newData); - } - - @Override - public UpdateDataRequest clone(UpdateDataRequest value) { - return new UpdateDataRequest( - new ArrayList<>(value.serverUUIDs), - value.playerUUID, - value.dataKey, - value.newData - ); - } - }; + return new JacksonSerializer<>(UpdateDataRequest.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(UpdateDataResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success); - json.put("message", value.message); - return json.toString(); - } - - @Override - public UpdateDataResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new UpdateDataResponse( - obj.getBoolean("success"), - obj.getString("message") - ); - } - - @Override - public UpdateDataResponse clone(UpdateDataResponse value) { - return new UpdateDataResponse(value.success, value.message); - } - }; + return new JacksonSerializer<>(UpdateDataResponse.class); } public record UpdateDataRequest( @@ -94,6 +31,6 @@ public record UpdateDataRequest( public record UpdateDataResponse( boolean success, - String message + @Nullable String error ) {} -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/CastVoteProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/CastVoteProtocolObject.java index 3889b23a1..02446ccd7 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/CastVoteProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/CastVoteProtocolObject.java @@ -1,12 +1,12 @@ package net.swofty.commons.protocol.objects.election; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; -import java.util.HashMap; import java.util.Map; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class CastVoteProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(CastVoteMessage value) { - JSONObject json = new JSONObject(); - json.put("accountId", value.accountId().toString()); - json.put("candidateName", value.candidateName()); - return json.toString(); - } - - @Override - public CastVoteMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new CastVoteMessage( - UUID.fromString(obj.getString("accountId")), - obj.getString("candidateName") - ); - } - - @Override - public CastVoteMessage clone(CastVoteMessage value) { - return value; - } - }; + return new JacksonSerializer<>(CastVoteMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(CastVoteResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success()); - json.put("tallies", value.tallies() == null ? null : new JSONObject(value.tallies())); - return json.toString(); - } - - @Override - public CastVoteResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - Map tallies = null; - if (!obj.isNull("tallies")) { - tallies = new HashMap<>(); - JSONObject talliesObject = obj.getJSONObject("tallies"); - for (String key : talliesObject.keySet()) { - tallies.put(key, talliesObject.getLong(key)); - } - } - return new CastVoteResponse( - obj.getBoolean("success"), - tallies - ); - } - - @Override - public CastVoteResponse clone(CastVoteResponse value) { - return value; - } - }; + return new JacksonSerializer<>(CastVoteResponse.class); } public record CastVoteMessage(UUID accountId, String candidateName) {} - public record CastVoteResponse(boolean success, Map tallies) { - } + public record CastVoteResponse(boolean success, Map tallies, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetCandidatesProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetCandidatesProtocolObject.java index b3bffd042..4d6857b15 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetCandidatesProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetCandidatesProtocolObject.java @@ -1,13 +1,11 @@ package net.swofty.commons.protocol.objects.election; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; import java.util.List; +import org.jetbrains.annotations.Nullable; public class GetCandidatesProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetCandidatesMessage value) { - return ""; - } - - @Override - public GetCandidatesMessage deserialize(String json) { - return new GetCandidatesMessage(); - } - - @Override - public GetCandidatesMessage clone(GetCandidatesMessage value) { - return value; - } - }; + return new JacksonSerializer<>(GetCandidatesMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - private final Gson gson = new Gson(); - - @Override - public String serialize(GetCandidatesResponse value) { - JSONObject json = new JSONObject(); - json.put("electionOpen", value.electionOpen()); - json.put("candidates", value.candidates() == null ? null : new JSONArray(gson.toJson(value.candidates()))); - return json.toString(); - } - - @Override - public GetCandidatesResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - boolean open = obj.getBoolean("electionOpen"); - List candidates = List.of(); - if (!obj.isNull("candidates")) { - candidates = gson.fromJson( - obj.getJSONArray("candidates").toString(), - new TypeToken>() {}.getType() - ); - } - return new GetCandidatesResponse(open, candidates); - } - - @Override - public GetCandidatesResponse clone(GetCandidatesResponse value) { - return value; - } - }; + return new JacksonSerializer<>(GetCandidatesResponse.class); } public record GetCandidatesMessage() {} public record GetCandidatesResponse( boolean electionOpen, - List candidates + List candidates, + boolean success, + @Nullable String error ) {} public record CandidateInfo( diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetElectionDataProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetElectionDataProtocolObject.java index 381dd1f3f..c185e54a3 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetElectionDataProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetElectionDataProtocolObject.java @@ -1,8 +1,9 @@ package net.swofty.commons.protocol.objects.election; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class GetElectionDataProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetElectionDataMessage value) { - return ""; - } - - @Override - public GetElectionDataMessage deserialize(String json) { - return new GetElectionDataMessage(); - } - - @Override - public GetElectionDataMessage clone(GetElectionDataMessage value) { - return value; - } - }; + return new JacksonSerializer<>(GetElectionDataMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetElectionDataResponse value) { - JSONObject json = new JSONObject(); - json.put("found", value.found()); - json.put("data", value.serializedData()); - return json.toString(); - } - - @Override - public GetElectionDataResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetElectionDataResponse( - obj.getBoolean("found"), - obj.optString("data", null) - ); - } - - @Override - public GetElectionDataResponse clone(GetElectionDataResponse value) { - return value; - } - }; + return new JacksonSerializer<>(GetElectionDataResponse.class); } public record GetElectionDataMessage() {} public record GetElectionDataResponse( boolean found, - String serializedData + String serializedData, + boolean success, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetPlayerVoteProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetPlayerVoteProtocolObject.java index 1db19f545..a8e8ef013 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetPlayerVoteProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/GetPlayerVoteProtocolObject.java @@ -1,10 +1,11 @@ package net.swofty.commons.protocol.objects.election; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetPlayerVoteProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPlayerVoteMessage value) { - JSONObject json = new JSONObject(); - json.put("accountId", value.accountId().toString()); - return json.toString(); - } - - @Override - public GetPlayerVoteMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetPlayerVoteMessage(UUID.fromString(obj.getString("accountId"))); - } - - @Override - public GetPlayerVoteMessage clone(GetPlayerVoteMessage value) { - return value; - } - }; + return new JacksonSerializer<>(GetPlayerVoteMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPlayerVoteResponse value) { - JSONObject json = new JSONObject(); - json.put("candidateName", value.candidateName()); - return json.toString(); - } - - @Override - public GetPlayerVoteResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetPlayerVoteResponse(obj.optString("candidateName", null)); - } - - @Override - public GetPlayerVoteResponse clone(GetPlayerVoteResponse value) { - return value; - } - }; + return new JacksonSerializer<>(GetPlayerVoteResponse.class); } public record GetPlayerVoteMessage(UUID accountId) {} - public record GetPlayerVoteResponse(String candidateName) {} + public record GetPlayerVoteResponse(String candidateName, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/ResolveElectionProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/ResolveElectionProtocolObject.java index e99f73632..03a6bd3a4 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/ResolveElectionProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/ResolveElectionProtocolObject.java @@ -1,8 +1,9 @@ package net.swofty.commons.protocol.objects.election; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class ResolveElectionProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(ResolveElectionMessage value) { - JSONObject json = new JSONObject(); - json.put("year", value.year()); - return json.toString(); - } - - @Override - public ResolveElectionMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new ResolveElectionMessage(obj.getInt("year")); - } - - @Override - public ResolveElectionMessage clone(ResolveElectionMessage value) { - return value; - } - }; + return new JacksonSerializer<>(ResolveElectionMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(ResolveElectionResponse value) { - JSONObject json = new JSONObject(); - json.put("resolved", value.resolved()); - json.put("serializedData", value.serializedData()); - return json.toString(); - } - - @Override - public ResolveElectionResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new ResolveElectionResponse( - obj.getBoolean("resolved"), - obj.optString("serializedData", null) - ); - } - - @Override - public ResolveElectionResponse clone(ResolveElectionResponse value) { - return value; - } - }; + return new JacksonSerializer<>(ResolveElectionResponse.class); } public record ResolveElectionMessage(int year) {} - public record ResolveElectionResponse(boolean resolved, String serializedData) {} + public record ResolveElectionResponse(boolean resolved, String serializedData, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/election/StartElectionProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/election/StartElectionProtocolObject.java index 7833f2df1..7df2d2d04 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/election/StartElectionProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/election/StartElectionProtocolObject.java @@ -1,8 +1,9 @@ package net.swofty.commons.protocol.objects.election; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class StartElectionProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(StartElectionMessage value) { - JSONObject json = new JSONObject(); - json.put("year", value.year()); - json.put("candidatesJson", value.candidatesJson()); - return json.toString(); - } - - @Override - public StartElectionMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new StartElectionMessage( - obj.getInt("year"), - obj.getString("candidatesJson") - ); - } - - @Override - public StartElectionMessage clone(StartElectionMessage value) { - return value; - } - }; + return new JacksonSerializer<>(StartElectionMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(StartElectionResponse value) { - JSONObject json = new JSONObject(); - json.put("started", value.started()); - json.put("serializedData", value.serializedData()); - return json.toString(); - } - - @Override - public StartElectionResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new StartElectionResponse( - obj.getBoolean("started"), - obj.optString("serializedData", null) - ); - } - - @Override - public StartElectionResponse clone(StartElectionResponse value) { - return value; - } - }; + return new JacksonSerializer<>(StartElectionResponse.class); } public record StartElectionMessage(int year, String candidatesJson) {} - public record StartElectionResponse(boolean started, String serializedData) {} + public record StartElectionResponse(boolean started, String serializedData, boolean success, @Nullable String error) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/AreFriendsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/AreFriendsProtocolObject.java index 9c51468a6..a6b5f2354 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/AreFriendsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/AreFriendsProtocolObject.java @@ -1,10 +1,11 @@ package net.swofty.commons.protocol.objects.friend; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class AreFriendsProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(AreFriendsMessage value) { - JSONObject json = new JSONObject(); - json.put("player1", value.player1.toString()); - json.put("player2", value.player2.toString()); - return json.toString(); - } - - @Override - public AreFriendsMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - return new AreFriendsMessage( - UUID.fromString(jsonObject.getString("player1")), - UUID.fromString(jsonObject.getString("player2")) - ); - } - - @Override - public AreFriendsMessage clone(AreFriendsMessage value) { - return new AreFriendsMessage(value.player1, value.player2); - } - }; + return new JacksonSerializer<>(AreFriendsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(AreFriendsResponse value) { - return value.areFriends ? "true" : "false"; - } - - @Override - public AreFriendsResponse deserialize(String json) { - return new AreFriendsResponse(json.equals("true")); - } - - @Override - public AreFriendsResponse clone(AreFriendsResponse value) { - return new AreFriendsResponse(value.areFriends); - } - }; + return new JacksonSerializer<>(AreFriendsResponse.class); } public record AreFriendsMessage(UUID player1, UUID player2) { } - public record AreFriendsResponse(boolean areFriends) { + public record AreFriendsResponse(boolean areFriends, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/FriendEventPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/FriendEventPushProtocol.java new file mode 100644 index 000000000..c544e891b --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/FriendEventPushProtocol.java @@ -0,0 +1,26 @@ +package net.swofty.commons.protocol.objects.friend; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.List; +import java.util.UUID; + +public class FriendEventPushProtocol + extends ServicePushProtocol { + + public FriendEventPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(String eventType, String eventData, List participants) {} + + public record Response(boolean success, int playersHandled, List playersHandledUUIDs, String error) { + public static Response failure(String reason) { + return new Response(false, 0, List.of(), reason); + } + + public static Response success(int playersHandled, List playersHandledUUIDs) { + return new Response(true, playersHandled, playersHandledUUIDs, null); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetFriendDataProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetFriendDataProtocolObject.java index 100f370ad..a48ad5439 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetFriendDataProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetFriendDataProtocolObject.java @@ -1,11 +1,12 @@ package net.swofty.commons.protocol.objects.friend; import net.swofty.commons.friend.FriendData; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetFriendDataProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetFriendDataMessage value) { - JSONObject json = new JSONObject(); - json.put("playerUuid", value.playerUuid.toString()); - return json.toString(); - } - - @Override - public GetFriendDataMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - UUID playerUuid = UUID.fromString(jsonObject.getString("playerUuid")); - return new GetFriendDataMessage(playerUuid); - } - - @Override - public GetFriendDataMessage clone(GetFriendDataMessage value) { - return new GetFriendDataMessage(value.playerUuid); - } - }; + return new JacksonSerializer<>(GetFriendDataMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetFriendDataResponse value) { - JSONObject json = new JSONObject(); - if (value.friendData != null) { - json.put("friendData", value.friendData.getSerializer().serialize(value.friendData)); - } else { - json.put("friendData", JSONObject.NULL); - } - return json.toString(); - } - - @Override - public GetFriendDataResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - if (jsonObject.isNull("friendData")) { - return new GetFriendDataResponse(null); - } - FriendData friendData = FriendData.getStaticSerializer().deserialize(jsonObject.getString("friendData")); - return new GetFriendDataResponse(friendData); - } - - @Override - public GetFriendDataResponse clone(GetFriendDataResponse value) { - return new GetFriendDataResponse(value.friendData); - } - }; + return new JacksonSerializer<>(GetFriendDataResponse.class); } public record GetFriendDataMessage(UUID playerUuid) { } - public record GetFriendDataResponse(FriendData friendData) { + public record GetFriendDataResponse(FriendData friendData, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetPendingFriendRequestsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetPendingFriendRequestsProtocolObject.java index 6a9bab2ad..17a3a77a8 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetPendingFriendRequestsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/GetPendingFriendRequestsProtocolObject.java @@ -1,14 +1,13 @@ package net.swofty.commons.protocol.objects.friend; import net.swofty.commons.friend.PendingFriendRequest; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetPendingFriendRequestsProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPendingRequestsMessage value) { - JSONObject json = new JSONObject(); - json.put("playerUuid", value.playerUuid.toString()); - return json.toString(); - } - - @Override - public GetPendingRequestsMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - return new GetPendingRequestsMessage( - UUID.fromString(jsonObject.getString("playerUuid")) - ); - } - - @Override - public GetPendingRequestsMessage clone(GetPendingRequestsMessage value) { - return new GetPendingRequestsMessage(value.playerUuid); - } - }; + return new JacksonSerializer<>(GetPendingRequestsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPendingRequestsResponse value) { - JSONObject json = new JSONObject(); - JSONArray requestsArray = new JSONArray(); - Serializer requestSerializer = PendingFriendRequest.getStaticSerializer(); - for (PendingFriendRequest request : value.requests) { - requestsArray.put(requestSerializer.serialize(request)); - } - json.put("requests", requestsArray); - return json.toString(); - } - - @Override - public GetPendingRequestsResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - JSONArray requestsArray = jsonObject.getJSONArray("requests"); - List requests = new ArrayList<>(); - Serializer requestSerializer = PendingFriendRequest.getStaticSerializer(); - for (int i = 0; i < requestsArray.length(); i++) { - requests.add(requestSerializer.deserialize(requestsArray.getString(i))); - } - return new GetPendingRequestsResponse(requests); - } - - @Override - public GetPendingRequestsResponse clone(GetPendingRequestsResponse value) { - return new GetPendingRequestsResponse(new ArrayList<>(value.requests)); - } - }; + return new JacksonSerializer<>(GetPendingRequestsResponse.class); } public record GetPendingRequestsMessage(UUID playerUuid) { } - public record GetPendingRequestsResponse(List requests) { + public record GetPendingRequestsResponse(List requests, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/SendFriendEventToServiceProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/SendFriendEventToServiceProtocolObject.java index adbe6ad0d..0d8ccb924 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/friend/SendFriendEventToServiceProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/friend/SendFriendEventToServiceProtocolObject.java @@ -1,9 +1,10 @@ package net.swofty.commons.protocol.objects.friend; import net.swofty.commons.friend.FriendEvent; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class SendFriendEventToServiceProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(SendFriendEventToServiceMessage value) { - JSONObject json = new JSONObject(); - json.put("event", value.event.getSerializer().serialize(value.event)); - json.put("eventType", value.event.getClass().getSimpleName()); - return json.toString(); - } - - @Override - public SendFriendEventToServiceMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - String eventType = jsonObject.getString("eventType"); - FriendEvent event = FriendEvent.findFromType(eventType); - FriendEvent deserializedEvent = (FriendEvent) event.getSerializer().deserialize(jsonObject.getString("event")); - return new SendFriendEventToServiceMessage(deserializedEvent); - } - - @Override - public SendFriendEventToServiceMessage clone(SendFriendEventToServiceMessage value) { - return new SendFriendEventToServiceMessage(value.event); - } - }; + return new JacksonSerializer<>(SendFriendEventToServiceMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(SendFriendEventToServiceResponse value) { - return value.success ? "true" : "false"; - } - - @Override - public SendFriendEventToServiceResponse deserialize(String json) { - return new SendFriendEventToServiceResponse(json.equals("true")); - } - - @Override - public SendFriendEventToServiceResponse clone(SendFriendEventToServiceResponse value) { - return new SendFriendEventToServiceResponse(value.success); - } - }; + return new JacksonSerializer<>(SendFriendEventToServiceResponse.class); } public record SendFriendEventToServiceMessage(FriendEvent event) { } - public record SendFriendEventToServiceResponse(boolean success) { + public record SendFriendEventToServiceResponse(boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/game/GameInformationPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/game/GameInformationPushProtocol.java new file mode 100644 index 000000000..0eeff3986 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/game/GameInformationPushProtocol.java @@ -0,0 +1,17 @@ +package net.swofty.commons.protocol.objects.game; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; + +public class GameInformationPushProtocol + extends ServicePushProtocol { + + public GameInformationPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID uuid, String gameId) {} + + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/game/InstantiateGamePushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/game/InstantiateGamePushProtocol.java new file mode 100644 index 000000000..356b11048 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/game/InstantiateGamePushProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.game; + +import net.swofty.commons.protocol.ServicePushProtocol; + +public class InstantiateGamePushProtocol + extends ServicePushProtocol { + + public InstantiateGamePushProtocol() { + super(Request.class, Response.class); + } + + public record Request(String gameType, String map) {} + + public record Response(boolean success, String gameId, String map, String gameType, String error) { + public static Response success(String gameId, String map, String gameType) { + return new Response(true, gameId, map, gameType, null); + } + + public static Response failure(String reason) { + return new Response(false, null, null, null, reason); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/gui/KickFromGUIPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/gui/KickFromGUIPushProtocol.java new file mode 100644 index 000000000..be143e9d9 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/gui/KickFromGUIPushProtocol.java @@ -0,0 +1,19 @@ +package net.swofty.commons.protocol.objects.gui; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.List; +import java.util.UUID; +import org.jetbrains.annotations.Nullable; + +public class KickFromGUIPushProtocol + extends ServicePushProtocol { + + public KickFromGUIPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(List playerUUIDs, String guiType) {} + + public record Response(boolean success, List kickedPlayers, int totalKicked, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemRetrieveProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemRetrieveProtocolObject.java index 7d62f2394..38a01f0f8 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemRetrieveProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemRetrieveProtocolObject.java @@ -1,55 +1,25 @@ package net.swofty.commons.protocol.objects.itemtracker; import net.swofty.commons.TrackedItem; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.bson.Document; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class TrackedItemRetrieveProtocolObject extends ProtocolObject { - @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(TrackedItemRetrieveMessage value) { - return value.itemUUID.toString(); - } - - @Override - public TrackedItemRetrieveMessage deserialize(String json) { - return new TrackedItemRetrieveMessage(UUID.fromString(json)); - } - - @Override - public TrackedItemRetrieveMessage clone(TrackedItemRetrieveMessage value) { - return new TrackedItemRetrieveMessage(value.itemUUID); - } - }; + return new JacksonSerializer<>(TrackedItemRetrieveMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(TrackedItemResponse value) { - return value.trackedItem.toDocument().toJson(); - } - - @Override - public TrackedItemResponse deserialize(String json) { - return new TrackedItemResponse(TrackedItem.fromDocument(Document.parse(json))); - } - - @Override - public TrackedItemResponse clone(TrackedItemResponse value) { - return new TrackedItemResponse(value.trackedItem.clone()); - } - }; + return new JacksonSerializer<>(TrackedItemResponse.class); } public record TrackedItemRetrieveMessage(UUID itemUUID) { @@ -58,5 +28,5 @@ public TrackedItemRetrieveMessage(String itemUUID) { } } - public record TrackedItemResponse(TrackedItem trackedItem) { } + public record TrackedItemResponse(TrackedItem trackedItem, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemUpdateProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemUpdateProtocolObject.java index 14efbe9dc..2068bed1f 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemUpdateProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/itemtracker/TrackedItemUpdateProtocolObject.java @@ -1,5 +1,6 @@ package net.swofty.commons.protocol.objects.itemtracker; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; @@ -11,51 +12,12 @@ public class TrackedItemUpdateProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(TrackedItemUpdateMessage value) { - return value.itemUUID.toString() + ";" + - value.attachedPlayerUUID.toString() + ";" + - value.attachedPlayerProfile.toString() + ";" + - value.itemType; - } - - @Override - public TrackedItemUpdateMessage deserialize(String json) { - String[] split = json.split(";"); - return new TrackedItemUpdateMessage( - UUID.fromString(split[0]), - UUID.fromString(split[1]), - UUID.fromString(split[2]), - split[3] - ); - } - - @Override - public TrackedItemUpdateMessage clone(TrackedItemUpdateMessage value) { - return new TrackedItemUpdateMessage(value.itemUUID, value.attachedPlayerUUID, value.attachedPlayerProfile, value.itemType); - } - }; + return new JacksonSerializer<>(TrackedItemUpdateMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(TrackedItemUpdateResponse value) { - return ""; - } - - @Override - public TrackedItemUpdateResponse deserialize(String json) { - return new TrackedItemUpdateResponse(); - } - - @Override - public TrackedItemUpdateResponse clone(TrackedItemUpdateResponse value) { - return new TrackedItemUpdateResponse(); - } - }; + return new JacksonSerializer<>(TrackedItemUpdateResponse.class); } public record TrackedItemUpdateMessage( diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/messaging/SendMessagePushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/messaging/SendMessagePushProtocol.java new file mode 100644 index 000000000..ca89b6c66 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/messaging/SendMessagePushProtocol.java @@ -0,0 +1,18 @@ +package net.swofty.commons.protocol.objects.messaging; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.UUID; +import org.jetbrains.annotations.Nullable; + +public class SendMessagePushProtocol + extends ServicePushProtocol { + + public SendMessagePushProtocol() { + super(Request.class, Response.class); + } + + public record Request(UUID playerUUID, String message) {} + + public record Response(boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/ChooseGameProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/ChooseGameProtocolObject.java index 95168ae6f..9dfb17b31 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/ChooseGameProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/ChooseGameProtocolObject.java @@ -1,11 +1,12 @@ package net.swofty.commons.protocol.objects.orchestrator; import net.swofty.commons.UnderstandableProxyServer; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class ChooseGameProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(ChooseGameMessage value) { - JSONObject json = new JSONObject(); - json.put("uuid", value.player.toString()); - json.put("server", value.server.toJSON()); - json.put("gameId", value.gameId); - return json.toString(); - } - - @Override - public ChooseGameMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new ChooseGameMessage( - UUID.fromString(obj.getString("uuid")), - UnderstandableProxyServer.singleFromJSON(obj.getJSONObject("server")), - obj.getString("gameId") - ); - } - - @Override - public ChooseGameMessage clone(ChooseGameMessage value) { - return new ChooseGameMessage(value.player, value.server, value.gameId); - } - }; + return new JacksonSerializer<>(ChooseGameMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(ChooseGameResponse value) { - JSONObject json = new JSONObject(); - json.put("error", value.error); - return json.toString(); - } - - @Override - public ChooseGameResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new ChooseGameResponse(obj.getBoolean("error")); - } - - @Override - public ChooseGameResponse clone(ChooseGameResponse value) { - return new ChooseGameResponse(value.error); - } - }; + return new JacksonSerializer<>(ChooseGameResponse.class); } public record ChooseGameMessage(UUID player, UnderstandableProxyServer server, String gameId) { } - public record ChooseGameResponse(boolean error) { + public record ChooseGameResponse(boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GameHeartbeatProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GameHeartbeatProtocolObject.java index 45b3ea852..ac9519f78 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GameHeartbeatProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GameHeartbeatProtocolObject.java @@ -2,14 +2,13 @@ import net.swofty.commons.ServerType; import net.swofty.commons.game.Game; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GameHeartbeatProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(HeartbeatMessage value) { - JSONObject json = new JSONObject(); - json.put("uuid", value.uuid.toString()); - json.put("shortName", value.shortName); - json.put("type", value.type.name()); - json.put("maxPlayers", value.maxPlayers); - json.put("onlinePlayers", value.onlinePlayers); - JSONArray games = new JSONArray(); - for (Game game : value.games) { - games.put(game.toJSON()); - } - json.put("games", games); - return json.toString(); - } - - @Override - public HeartbeatMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - UUID uuid = UUID.fromString(obj.getString("uuid")); - String shortName = obj.getString("shortName"); - ServerType type = ServerType.valueOf(obj.getString("type")); - List games = new ArrayList<>(); - JSONArray gamesArray = obj.getJSONArray("games"); - for (int i = 0; i < gamesArray.length(); i++) { - JSONObject game = gamesArray.getJSONObject(i); - games.add(Game.fromJSON(game)); - } - int max = obj.getInt("maxPlayers"); - int online = obj.getInt("onlinePlayers"); - return new HeartbeatMessage(uuid, shortName, type, max, online, games); - } - - @Override - public HeartbeatMessage clone(HeartbeatMessage value) { - return new HeartbeatMessage(value.uuid, value.shortName, value.type, value.maxPlayers, value.onlinePlayers, value.games); - } - }; + return new JacksonSerializer<>(HeartbeatMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(HeartbeatResponse value) { - JSONObject json = new JSONObject(); - json.put("ok", value.ok); - return json.toString(); - } - - @Override - public HeartbeatResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new HeartbeatResponse(obj.getBoolean("ok")); - } - - @Override - public HeartbeatResponse clone(HeartbeatResponse value) { - return new HeartbeatResponse(value.ok); - } - }; + return new JacksonSerializer<>(HeartbeatResponse.class); } public record HeartbeatMessage(UUID uuid, String shortName, ServerType type, int maxPlayers, int onlinePlayers, List games) { } - public record HeartbeatResponse(boolean ok) { } + public record HeartbeatResponse(boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetGameCountsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetGameCountsProtocolObject.java index 05bb2c399..2a608bb73 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetGameCountsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetGameCountsProtocolObject.java @@ -1,9 +1,10 @@ package net.swofty.commons.protocol.objects.orchestrator; import net.swofty.commons.ServerType; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class GetGameCountsProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetGameCountsMessage value) { - JSONObject json = new JSONObject(); - json.put("type", value.type.name()); - if (value.gameTypeName != null) json.put("gameTypeName", value.gameTypeName); - if (value.mapName != null) json.put("mapName", value.mapName); - return json.toString(); - } - - @Override - public GetGameCountsMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetGameCountsMessage( - ServerType.valueOf(obj.getString("type")), - obj.optString("gameTypeName", null), - obj.optString("mapName", null) - ); - } - - @Override - public GetGameCountsMessage clone(GetGameCountsMessage value) { - return new GetGameCountsMessage(value.type, value.gameTypeName, value.mapName); - } - }; + return new JacksonSerializer<>(GetGameCountsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetGameCountsResponse value) { - JSONObject json = new JSONObject(); - json.put("playerCount", value.playerCount); - json.put("gameCount", value.gameCount); - return json.toString(); - } - - @Override - public GetGameCountsResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetGameCountsResponse( - obj.getInt("playerCount"), - obj.getInt("gameCount") - ); - } - - @Override - public GetGameCountsResponse clone(GetGameCountsResponse value) { - return new GetGameCountsResponse(value.playerCount, value.gameCount); - } - }; + return new JacksonSerializer<>(GetGameCountsResponse.class); } public record GetGameCountsMessage(ServerType type, String gameTypeName, String mapName) { } - public record GetGameCountsResponse(int playerCount, int gameCount) { } + public record GetGameCountsResponse(int playerCount, int gameCount, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetMapsProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetMapsProtocolObject.java index ba778c756..6bc7f4232 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetMapsProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetMapsProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.orchestrator; import net.swofty.commons.ServerType; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.Nullable; public class GetMapsProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetMapsMessage value) { - JSONObject json = new JSONObject(); - json.put("type", value.type.name()); - if (value.mode != null) json.put("mode", value.mode); - return json.toString(); - } - - @Override - public GetMapsMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetMapsMessage(ServerType.valueOf(obj.getString("type")), obj.has("mode") ? obj.getString("mode") : null); - } - - @Override - public GetMapsMessage clone(GetMapsMessage value) { - return new GetMapsMessage(value.type, value.mode); - } - }; + return new JacksonSerializer<>(GetMapsMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetMapsResponse value) { - JSONObject json = new JSONObject(); - json.put("maps", new JSONArray(value.maps)); - return json.toString(); - } - - @Override - public GetMapsResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - List maps = new ArrayList<>(); - JSONArray arr = obj.getJSONArray("maps"); - for (int i = 0; i < arr.length(); i++) maps.add(arr.getString(i)); - return new GetMapsResponse(maps); - } - - @Override - public GetMapsResponse clone(GetMapsResponse value) { - return new GetMapsResponse(new ArrayList<>(value.maps)); - } - }; + return new JacksonSerializer<>(GetMapsResponse.class); } public record GetMapsMessage(ServerType type, String mode) { } - public record GetMapsResponse(List maps) { } + public record GetMapsResponse(List maps, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetServerForMapProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetServerForMapProtocolObject.java index a1160e3c5..2c338eb00 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetServerForMapProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/GetServerForMapProtocolObject.java @@ -2,10 +2,10 @@ import net.swofty.commons.ServerType; import net.swofty.commons.UnderstandableProxyServer; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; public class GetServerForMapProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetServerForMapMessage value) { - JSONObject json = new JSONObject(); - json.put("type", value.type.name()); - json.put("map", value.map); - if (value.mode != null) json.put("mode", value.mode); - json.put("neededSlots", value.neededSlots); - return json.toString(); - } - - @Override - public GetServerForMapMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetServerForMapMessage( - ServerType.valueOf(obj.getString("type")), - obj.has("map") ? obj.getString("map") : null, - obj.has("mode") ? obj.getString("mode") : null, - obj.getInt("neededSlots") - ); - } - - @Override - public GetServerForMapMessage clone(GetServerForMapMessage value) { - return new GetServerForMapMessage(value.type, value.map, value.mode, value.neededSlots); - } - }; + return new JacksonSerializer<>(GetServerForMapMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetServerForMapResponse value) { - JSONObject json = new JSONObject(); - if (value.server == null) { - json.put("server", JSONObject.NULL); - json.put("gameId", JSONObject.NULL); - } else { - json.put("server", value.server.toJSON()); - json.put("gameId", value.gameId); - } - return json.toString(); - } - - @Override - public GetServerForMapResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - if (obj.isNull("server")) return new GetServerForMapResponse(null, null); - return new GetServerForMapResponse(UnderstandableProxyServer.singleFromJSON(obj.getJSONObject("server")), obj.getString("gameId")); - } - - @Override - public GetServerForMapResponse clone(GetServerForMapResponse value) { - return new GetServerForMapResponse(value.server, value.gameId); - } - }; + return new JacksonSerializer<>(GetServerForMapResponse.class); } public record GetServerForMapMessage(ServerType type, @Nullable String map, String mode, int neededSlots) { } - public record GetServerForMapResponse(UnderstandableProxyServer server, String gameId) { + public record GetServerForMapResponse(UnderstandableProxyServer server, String gameId, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/RejoinGameProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/RejoinGameProtocolObject.java index 581f2b3f9..5ce367f73 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/RejoinGameProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/orchestrator/RejoinGameProtocolObject.java @@ -1,10 +1,10 @@ package net.swofty.commons.protocol.objects.orchestrator; import net.swofty.commons.UnderstandableProxyServer; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; import java.util.UUID; @@ -14,79 +14,12 @@ public class RejoinGameProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(RejoinGameRequest value) { - JSONObject json = new JSONObject(); - json.put("playerUuid", value.playerUuid.toString()); - return json.toString(); - } - - @Override - public RejoinGameRequest deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new RejoinGameRequest(UUID.fromString(obj.getString("playerUuid"))); - } - - @Override - public RejoinGameRequest clone(RejoinGameRequest value) { - return new RejoinGameRequest(value.playerUuid); - } - }; + return new JacksonSerializer<>(RejoinGameRequest.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(RejoinGameResponse value) { - JSONObject json = new JSONObject(); - json.put("hasActiveGame", value.hasActiveGame); - if (value.hasActiveGame && value.server != null) { - json.put("server", value.server.toJSON()); - json.put("gameId", value.gameId); - json.put("mapName", value.mapName); - json.put("teamName", value.teamName != null ? value.teamName : JSONObject.NULL); - json.put("willBeSpectator", value.willBeSpectator); - } else { - json.put("server", JSONObject.NULL); - json.put("gameId", JSONObject.NULL); - json.put("mapName", JSONObject.NULL); - json.put("teamName", JSONObject.NULL); - json.put("willBeSpectator", false); - } - return json.toString(); - } - - @Override - public RejoinGameResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - boolean hasActiveGame = obj.getBoolean("hasActiveGame"); - if (!hasActiveGame || obj.isNull("server")) { - return new RejoinGameResponse(false, null, null, null, null, false); - } - return new RejoinGameResponse( - true, - UnderstandableProxyServer.singleFromJSON(obj.getJSONObject("server")), - obj.getString("gameId"), - obj.getString("mapName"), - obj.isNull("teamName") ? null : obj.getString("teamName"), - obj.getBoolean("willBeSpectator") - ); - } - - @Override - public RejoinGameResponse clone(RejoinGameResponse value) { - return new RejoinGameResponse( - value.hasActiveGame, - value.server, - value.gameId, - value.mapName, - value.teamName, - value.willBeSpectator - ); - } - }; + return new JacksonSerializer<>(RejoinGameResponse.class); } public record RejoinGameRequest(UUID playerUuid) { @@ -98,7 +31,9 @@ public record RejoinGameResponse( @Nullable String gameId, @Nullable String mapName, @Nullable String teamName, - boolean willBeSpectator + boolean willBeSpectator, + boolean success, + @Nullable String error ) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/party/GetPartyProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/party/GetPartyProtocolObject.java index 2f7d2d093..77f769413 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/party/GetPartyProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/party/GetPartyProtocolObject.java @@ -1,12 +1,12 @@ package net.swofty.commons.protocol.objects.party; -import net.swofty.commons.party.FullParty; import net.swofty.commons.party.Party; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetPartyProtocolObject extends ProtocolObject getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPartyMessage value) { - JSONObject json = new JSONObject(); - json.put("memberUUID", value.memberUuid.toString()); - return json.toString(); - } - - @Override - public GetPartyMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - UUID memberUUID = UUID.fromString(jsonObject.getString("memberUUID")); - return new GetPartyMessage(memberUUID); - } - - @Override - public GetPartyMessage clone(GetPartyMessage value) { - return new GetPartyMessage(value.memberUuid); - } - }; + return new JacksonSerializer<>(GetPartyMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPartyResponse value) { - JSONObject json = new JSONObject(); - Serializer partySerializer = FullParty.getStaticSerializer(); - json.put("party", partySerializer.serialize((FullParty) value.party)); - return json.toString(); - } - - @Override - public GetPartyResponse deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - FullParty party = FullParty.getStaticSerializer().deserialize(jsonObject.getString("party")); - return new GetPartyResponse(party); - } - - @Override - public GetPartyResponse clone(GetPartyResponse value) { - return new GetPartyResponse(value.party); - } - }; + return new JacksonSerializer<>(GetPartyResponse.class); } public record GetPartyMessage(UUID memberUuid) { } - public record GetPartyResponse(Party party) { } + public record GetPartyResponse(Party party, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/party/IsPlayerInPartyProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/party/IsPlayerInPartyProtocolObject.java index aaf8792bc..e0b8f7efa 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/party/IsPlayerInPartyProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/party/IsPlayerInPartyProtocolObject.java @@ -1,63 +1,29 @@ package net.swofty.commons.protocol.objects.party; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class IsPlayerInPartyProtocolObject extends ProtocolObject { - @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(IsPlayerInPartyMessage value) { - JSONObject json = new JSONObject(); - json.put("playerUUID", value.playerUUID.toString()); - return json.toString(); - } - - @Override - public IsPlayerInPartyMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - UUID playerUUID = UUID.fromString(jsonObject.getString("playerUUID")); - return new IsPlayerInPartyMessage(playerUUID); - } - - @Override - public IsPlayerInPartyMessage clone(IsPlayerInPartyMessage value) { - return new IsPlayerInPartyMessage(value.playerUUID); - } - }; + return new JacksonSerializer<>(IsPlayerInPartyMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(IsPlayerInPartyResponse value) { - return value.isInParty ? "true" : "false"; - } - - @Override - public IsPlayerInPartyResponse deserialize(String json) { - return new IsPlayerInPartyResponse(json.equals("true")); - } - - @Override - public IsPlayerInPartyResponse clone(IsPlayerInPartyResponse value) { - return new IsPlayerInPartyResponse(value.isInParty); - } - }; + return new JacksonSerializer<>(IsPlayerInPartyResponse.class); } public record IsPlayerInPartyMessage(UUID playerUUID) { } - public record IsPlayerInPartyResponse(boolean isInParty) { + public record IsPlayerInPartyResponse(boolean isInParty, boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/party/PartyEventPushProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/party/PartyEventPushProtocol.java new file mode 100644 index 000000000..d545c6b12 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/party/PartyEventPushProtocol.java @@ -0,0 +1,36 @@ +package net.swofty.commons.protocol.objects.party; + +import net.swofty.commons.protocol.ServicePushProtocol; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class PartyEventPushProtocol + extends ServicePushProtocol { + + public PartyEventPushProtocol() { + super(Request.class, Response.class); + } + + public record Request(String eventType, String eventData, List participants) {} + + public record Response(boolean success, int playersHandled, List playersHandledUUIDs, String error, + boolean blocked, String blockReason, Map rejectedPlayers) { + public static Response failure(String reason) { + return new Response(false, 0, List.of(), reason, false, null, Map.of()); + } + + public static Response success(int playersHandled, List playersHandledUUIDs) { + return new Response(true, playersHandled, playersHandledUUIDs, null, false, null, Map.of()); + } + + public static Response blocked(String blockReason) { + return new Response(false, 0, List.of(), null, true, blockReason, Map.of()); + } + + public static Response gameWarp(List accepted, Map rejected) { + return new Response(true, accepted.size(), accepted, null, false, null, rejected); + } + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/party/SendPartyEventToServiceProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/party/SendPartyEventToServiceProtocolObject.java index 232da840e..63ea4c840 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/party/SendPartyEventToServiceProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/party/SendPartyEventToServiceProtocolObject.java @@ -1,65 +1,28 @@ package net.swofty.commons.protocol.objects.party; import net.swofty.commons.party.PartyEvent; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class SendPartyEventToServiceProtocolObject extends ProtocolObject { - @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(SendPartyEventToServiceMessage value) { - JSONObject json = new JSONObject(); - json.put("event", value.event.getSerializer().serialize(value.event)); - json.put("eventType", value.event.getClass().getSimpleName()); - return json.toString(); - } - - @Override - public SendPartyEventToServiceMessage deserialize(String json) { - JSONObject jsonObject = new JSONObject(json); - String eventType = jsonObject.getString("eventType"); - PartyEvent event = PartyEvent.findFromType(eventType); - PartyEvent deserializedEvent = (PartyEvent) event.getSerializer().deserialize(jsonObject.getString("event")); - return new SendPartyEventToServiceMessage(deserializedEvent); - } - - @Override - public SendPartyEventToServiceMessage clone(SendPartyEventToServiceMessage value) { - return new SendPartyEventToServiceMessage(value.event); - } - }; + return new JacksonSerializer<>(SendPartyEventToServiceMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(SendPartyEventToServiceResponse value) { - return value.success ? "true" : "false"; - } - - @Override - public SendPartyEventToServiceResponse deserialize(String json) { - return new SendPartyEventToServiceResponse(json.equals("true")); - } - - @Override - public SendPartyEventToServiceResponse clone(SendPartyEventToServiceResponse value) { - return new SendPartyEventToServiceResponse(value.success); - } - }; + return new JacksonSerializer<>(SendPartyEventToServiceResponse.class); } public record SendPartyEventToServiceMessage(PartyEvent event) { } - public record SendPartyEventToServiceResponse(boolean success) { + public record SendPartyEventToServiceResponse(boolean success, @Nullable String error) { } } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/presence/GetPresenceBulkProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/presence/GetPresenceBulkProtocolObject.java index 7bb662339..9bc062307 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/presence/GetPresenceBulkProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/presence/GetPresenceBulkProtocolObject.java @@ -1,14 +1,13 @@ package net.swofty.commons.protocol.objects.presence; import net.swofty.commons.presence.PresenceInfo; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONArray; -import org.json.JSONObject; -import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.jetbrains.annotations.Nullable; public class GetPresenceBulkProtocolObject extends ProtocolObject< GetPresenceBulkProtocolObject.GetPresenceBulkMessage, @@ -16,70 +15,15 @@ public class GetPresenceBulkProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPresenceBulkMessage value) { - JSONArray array = new JSONArray(); - for (UUID uuid : value.uuids) { - array.put(uuid.toString()); - } - JSONObject json = new JSONObject(); - json.put("uuids", array); - return json.toString(); - } - - @Override - public GetPresenceBulkMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - JSONArray array = obj.getJSONArray("uuids"); - List ids = new ArrayList<>(); - for (int i = 0; i < array.length(); i++) { - ids.add(UUID.fromString(array.getString(i))); - } - return new GetPresenceBulkMessage(ids); - } - - @Override - public GetPresenceBulkMessage clone(GetPresenceBulkMessage value) { - return new GetPresenceBulkMessage(new ArrayList<>(value.uuids)); - } - }; + return new JacksonSerializer<>(GetPresenceBulkMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetPresenceBulkResponse value) { - JSONArray array = new JSONArray(); - for (PresenceInfo info : value.presence()) { - array.put(new JSONObject(PresenceInfo.getSerializer().serialize(info))); - } - JSONObject json = new JSONObject(); - json.put("presence", array); - return json.toString(); - } - - @Override - public GetPresenceBulkResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - JSONArray array = obj.getJSONArray("presence"); - List presence = new ArrayList<>(); - for (int i = 0; i < array.length(); i++) { - presence.add(PresenceInfo.getSerializer().deserialize(array.getJSONObject(i).toString())); - } - return new GetPresenceBulkResponse(presence); - } - - @Override - public GetPresenceBulkResponse clone(GetPresenceBulkResponse value) { - return new GetPresenceBulkResponse(new ArrayList<>(value.presence())); - } - }; + return new JacksonSerializer<>(GetPresenceBulkResponse.class); } public record GetPresenceBulkMessage(List uuids) {} - public record GetPresenceBulkResponse(List presence) {} + public record GetPresenceBulkResponse(List presence, boolean success, @Nullable String error) {} } - diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/presence/UpdatePresenceProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/presence/UpdatePresenceProtocolObject.java index 689d5cc09..2b7191cb7 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/presence/UpdatePresenceProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/presence/UpdatePresenceProtocolObject.java @@ -1,9 +1,10 @@ package net.swofty.commons.protocol.objects.presence; import net.swofty.commons.presence.PresenceInfo; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; -import org.json.JSONObject; +import org.jetbrains.annotations.Nullable; public class UpdatePresenceProtocolObject extends ProtocolObject< UpdatePresenceProtocolObject.UpdatePresenceMessage, @@ -11,50 +12,15 @@ public class UpdatePresenceProtocolObject extends ProtocolObject< @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(UpdatePresenceMessage value) { - JSONObject json = new JSONObject(); - json.put("presence", new JSONObject(PresenceInfo.getSerializer().serialize(value.presence()))); - return json.toString(); - } - - @Override - public UpdatePresenceMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - PresenceInfo presence = PresenceInfo.getSerializer().deserialize(obj.getJSONObject("presence").toString()); - return new UpdatePresenceMessage(presence); - } - - @Override - public UpdatePresenceMessage clone(UpdatePresenceMessage value) { - return new UpdatePresenceMessage(value.presence()); - } - }; + return new JacksonSerializer<>(UpdatePresenceMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(UpdatePresenceResponse value) { - return value.success ? "true" : "false"; - } - - @Override - public UpdatePresenceResponse deserialize(String json) { - return new UpdatePresenceResponse(Boolean.parseBoolean(json)); - } - - @Override - public UpdatePresenceResponse clone(UpdatePresenceResponse value) { - return new UpdatePresenceResponse(value.success); - } - }; + return new JacksonSerializer<>(UpdatePresenceResponse.class); } public record UpdatePresenceMessage(PresenceInfo presence) {} - public record UpdatePresenceResponse(boolean success) {} + public record UpdatePresenceResponse(boolean success, @Nullable String error) {} } - diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/BroadcastStaffChatProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/BroadcastStaffChatProtocol.java new file mode 100644 index 000000000..effcbfd0a --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/BroadcastStaffChatProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class BroadcastStaffChatProtocol extends ProtocolObject< + BroadcastStaffChatProtocol.Request, + BroadcastStaffChatProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String type, String formattedMessage, String uuid) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/DoesServerHaveIslandProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/DoesServerHaveIslandProtocol.java new file mode 100644 index 000000000..152e90a17 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/DoesServerHaveIslandProtocol.java @@ -0,0 +1,24 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class DoesServerHaveIslandProtocol extends ProtocolObject< + DoesServerHaveIslandProtocol.Request, + DoesServerHaveIslandProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String islandUuid) {} + public record Response(boolean serverHasIt, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/GivePlayersOriginTypeProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/GivePlayersOriginTypeProtocol.java new file mode 100644 index 000000000..59f4cce0c --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/GivePlayersOriginTypeProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class GivePlayersOriginTypeProtocol extends ProtocolObject< + GivePlayersOriginTypeProtocol.Request, + GivePlayersOriginTypeProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid, String originType) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PingServerProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PingServerProtocol.java new file mode 100644 index 000000000..13aa9b350 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PingServerProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class PingServerProtocol extends ProtocolObject< + PingServerProtocol.Request, + PingServerProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request() {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PlayerSwitchedProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PlayerSwitchedProtocol.java new file mode 100644 index 000000000..e29f00e49 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/PlayerSwitchedProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class PlayerSwitchedProtocol extends ProtocolObject< + PlayerSwitchedProtocol.Request, + PlayerSwitchedProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RefreshCoopDataProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RefreshCoopDataProtocol.java new file mode 100644 index 000000000..eb682642c --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RefreshCoopDataProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class RefreshCoopDataProtocol extends ProtocolObject< + RefreshCoopDataProtocol.Request, + RefreshCoopDataProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid, String datapoint) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RunEventProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RunEventProtocol.java new file mode 100644 index 000000000..2554f4545 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/RunEventProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class RunEventProtocol extends ProtocolObject< + RunEventProtocol.Request, + RunEventProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid, String event, String data) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/TeleportProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/TeleportProtocol.java new file mode 100644 index 000000000..df9fcbff9 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/from/TeleportProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.from; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class TeleportProtocol extends ProtocolObject< + TeleportProtocol.Request, + TeleportProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid, double x, double y, double z, float yaw, float pitch) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/FinishedWithPlayerProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/FinishedWithPlayerProtocol.java new file mode 100644 index 000000000..006291036 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/FinishedWithPlayerProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class FinishedWithPlayerProtocol extends ProtocolObject< + FinishedWithPlayerProtocol.Request, + FinishedWithPlayerProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String uuid) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerCountProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerCountProtocol.java new file mode 100644 index 000000000..faed156c8 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerCountProtocol.java @@ -0,0 +1,26 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class PlayerCountProtocol extends ProtocolObject< + PlayerCountProtocol.Request, + PlayerCountProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public enum LookupType { ALL, TYPE, UUID } + + public record Request(LookupType lookupType, String lookupValue) {} + public record Response(int playerCount, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerHandlerProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerHandlerProtocol.java new file mode 100644 index 000000000..e23cab32c --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PlayerHandlerProtocol.java @@ -0,0 +1,40 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +import java.util.Map; +import org.jetbrains.annotations.Nullable; + +public class PlayerHandlerProtocol extends ProtocolObject< + PlayerHandlerProtocol.Request, + PlayerHandlerProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public enum Action { + TRANSFER, + TELEPORT, + BANK_HASH, + VERSION, + IS_ONLINE, + EVENT, + REFRESH_COOP_DATA, + MESSAGE, + TRANSFER_WITH_UUID, + GET_SERVER, + LIMBO + } + + public record Request(String uuid, Action action, Map data) {} + public record Response(Map data, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/ProxyIsOnlineProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/ProxyIsOnlineProtocol.java new file mode 100644 index 000000000..555a5ccc4 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/ProxyIsOnlineProtocol.java @@ -0,0 +1,24 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class ProxyIsOnlineProtocol extends ProtocolObject< + ProxyIsOnlineProtocol.Request, + ProxyIsOnlineProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request() {} + public record Response(boolean online, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PunishPlayerProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PunishPlayerProtocol.java new file mode 100644 index 000000000..3025880f4 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/PunishPlayerProtocol.java @@ -0,0 +1,24 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class PunishPlayerProtocol extends ProtocolObject< + PunishPlayerProtocol.Request, + PunishPlayerProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String target, String type, String id, long expiresAt, + String reasonBan, String reasonMute, String tags) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterServerProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterServerProtocol.java new file mode 100644 index 000000000..bf26b1b80 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterServerProtocol.java @@ -0,0 +1,25 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class RegisterServerProtocol extends ProtocolObject< + RegisterServerProtocol.Request, + RegisterServerProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String type, int maxPlayers, String host, Integer port, + Boolean isTestFlow, String testFlowName, String testFlowIndex, String testFlowTotal) {} + public record Response(String host, int port, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterTestFlowProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterTestFlowProtocol.java new file mode 100644 index 000000000..6892a6cb6 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RegisterTestFlowProtocol.java @@ -0,0 +1,27 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +import java.util.List; +import java.util.Map; + +public class RegisterTestFlowProtocol extends ProtocolObject< + RegisterTestFlowProtocol.Request, + RegisterTestFlowProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String testFlowName, String handler, List players, + List> serverConfigs) {} + public record Response(boolean success, String message, String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServerNameProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServerNameProtocol.java new file mode 100644 index 000000000..13aaef2f1 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServerNameProtocol.java @@ -0,0 +1,24 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class RequestServerNameProtocol extends ProtocolObject< + RequestServerNameProtocol.Request, + RequestServerNameProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request() {} + public record Response(String serverName, String shortenedServerName, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServersProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServersProtocol.java new file mode 100644 index 000000000..2537efa32 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/RequestServersProtocol.java @@ -0,0 +1,24 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.jetbrains.annotations.Nullable; + +public class RequestServersProtocol extends ProtocolObject< + RequestServersProtocol.Request, + RequestServersProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String requestType, String type, String uuid) {} + public record Response(String serversList, boolean success, @Nullable String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/StaffChatProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/StaffChatProtocol.java new file mode 100644 index 000000000..a066c0c9a --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/StaffChatProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class StaffChatProtocol extends ProtocolObject< + StaffChatProtocol.Request, + StaffChatProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String type, String formattedMessage, String uuid) {} + public record Response() {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/TestFlowServerReadyProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/TestFlowServerReadyProtocol.java new file mode 100644 index 000000000..8d4e10242 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/proxy/to/TestFlowServerReadyProtocol.java @@ -0,0 +1,23 @@ +package net.swofty.commons.protocol.objects.proxy.to; + +import net.swofty.commons.protocol.JacksonSerializer; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; + +public class TestFlowServerReadyProtocol extends ProtocolObject< + TestFlowServerReadyProtocol.Request, + TestFlowServerReadyProtocol.Response> { + + @Override + public Serializer getSerializer() { + return new JacksonSerializer<>(Request.class); + } + + @Override + public Serializer getReturnSerializer() { + return new JacksonSerializer<>(Response.class); + } + + public record Request(String testFlowName, String serverType, int serverIndex) {} + public record Response(boolean success, String message, String error) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/GetActivePunishmentProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/GetActivePunishmentProtocolObject.java index 8dd0b5333..f380d478b 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/GetActivePunishmentProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/GetActivePunishmentProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.punishment; -import com.google.gson.Gson; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import net.swofty.commons.punishment.PunishmentReason; import net.swofty.commons.punishment.PunishmentTag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; import java.util.List; import java.util.UUID; @@ -18,74 +17,12 @@ public class GetActivePunishmentProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetActivePunishmentMessage value) { - JSONObject json = new JSONObject(); - json.put("target", value.target().toString()); - json.put("type", value.type()); - return json.toString(); - } - - @Override - public GetActivePunishmentMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new GetActivePunishmentMessage( - UUID.fromString(obj.getString("target")), - obj.getString("type") - ); - } - - @Override - public GetActivePunishmentMessage clone(GetActivePunishmentMessage value) { - return value; - } - }; + return new JacksonSerializer<>(GetActivePunishmentMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(GetActivePunishmentResponse value) { - Gson gson = new Gson(); - JSONObject json = new JSONObject(); - json.put("found", value.found()); - json.put("type", value.type()); - json.put("banId", value.banId()); - json.put("reason", value.reason() != null ? gson.toJson(value.reason()) : null); - json.put("expiresAt", value.expiresAt()); - json.put("tags", value.tags() != null ? gson.toJson(value.tags()) : null); - return json.toString(); - } - - @Override - public GetActivePunishmentResponse deserialize(String json) { - Gson gson = new Gson(); - JSONObject obj = new JSONObject(json); - boolean found = obj.getBoolean("found"); - if (!found) { - return new GetActivePunishmentResponse(false, null, null, null, 0, List.of()); - } - List tags = List.of(); - if (!obj.isNull("tags")) { - tags = List.of(gson.fromJson(obj.getString("tags"), PunishmentTag[].class)); - } - return new GetActivePunishmentResponse( - true, - obj.optString("type", null), - obj.optString("banId", null), - obj.isNull("reason") ? null : gson.fromJson(obj.getString("reason"), PunishmentReason.class), - obj.getLong("expiresAt"), - tags - ); - } - - @Override - public GetActivePunishmentResponse clone(GetActivePunishmentResponse value) { - return value; - } - }; + return new JacksonSerializer<>(GetActivePunishmentResponse.class); } public record GetActivePunishmentMessage( @@ -99,6 +36,8 @@ public record GetActivePunishmentResponse( @Nullable String banId, @Nullable PunishmentReason reason, long expiresAt, - @NotNull List tags + @NotNull List tags, + boolean success, + @Nullable String error ) {} } diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/PunishPlayerProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/PunishPlayerProtocolObject.java index 7e7ceb563..6f22625ab 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/PunishPlayerProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/PunishPlayerProtocolObject.java @@ -1,13 +1,12 @@ package net.swofty.commons.protocol.objects.punishment; -import com.google.gson.Gson; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import net.swofty.commons.punishment.PunishmentReason; import net.swofty.commons.punishment.PunishmentTag; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; import java.util.List; import java.util.UUID; @@ -18,98 +17,29 @@ public class PunishPlayerProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - - @Override - public String serialize(PunishPlayerMessage value) { - JSONObject json = new JSONObject(); - json.put("target", value.target().toString()); - json.put("type", value.type()); - json.put("reason", new Gson().toJson(value.reason())); - json.put("expiresAt", value.expiresAt()); - json.put("tags", new Gson().toJson(value.tags())); - json.put("staff", value.staff().toString()); - return json.toString(); - } - - @Override - public PunishPlayerMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - - return new PunishPlayerMessage( - UUID.fromString(obj.getString("target")), - obj.getString("type"), - new Gson().fromJson(obj.getString("reason"), PunishmentReason.class), - UUID.fromString(obj.getString("staff")), - List.of(new Gson().fromJson(obj.getString("tags"), PunishmentTag[].class)), - obj.getLong("expiresAt") - ); - } - - @Override - public PunishPlayerMessage clone(PunishPlayerMessage value) { - return value; // immutable - } - }; + return new JacksonSerializer<>(PunishPlayerMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - - @Override - public String serialize(PunishPlayerResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success()); - json.put("punishmentId", value.punishmentId()); - json.put("errorCode", value.errorCode()); - json.put("errorMessage", value.errorMessage()); - return json.toString(); - } - - @Override - public PunishPlayerResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - - return new PunishPlayerResponse( - obj.getBoolean("success"), - obj.optString("punishmentId", null), - obj.optString("errorCode", null) != null ? ErrorCode.valueOf(obj.getString("errorCode")) : null, - obj.optString("errorMessage", null) - ); - } - - @Override - public PunishPlayerResponse clone(PunishPlayerResponse value) { - return value; // immutable - } - }; + return new JacksonSerializer<>(PunishPlayerResponse.class); } public record PunishPlayerMessage( - @NotNull - UUID target, - @NotNull - String type, - @NotNull - PunishmentReason reason, - @NotNull - UUID staff, + @NotNull UUID target, + @NotNull String type, + @NotNull PunishmentReason reason, + @NotNull UUID staff, List tags, long expiresAt - ) { - } + ) {} public record PunishPlayerResponse( boolean success, - @Nullable - String punishmentId, - @Nullable - ErrorCode errorCode, - @Nullable - String errorMessage - ) { - } + @Nullable String punishmentId, + @Nullable ErrorCode errorCode, + @Nullable String errorMessage + ) {} public enum ErrorCode { INVALID_TYPE, @@ -118,4 +48,4 @@ public enum ErrorCode { ALREADY_PUNISHED, UNKNOWN_ERROR } -} \ No newline at end of file +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/UnpunishPlayerProtocolObject.java b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/UnpunishPlayerProtocolObject.java index 6a09563f3..d8007bc21 100644 --- a/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/UnpunishPlayerProtocolObject.java +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/punishment/UnpunishPlayerProtocolObject.java @@ -1,10 +1,10 @@ package net.swofty.commons.protocol.objects.punishment; +import net.swofty.commons.protocol.JacksonSerializer; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.commons.protocol.Serializer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; import java.util.UUID; @@ -14,58 +14,12 @@ public class UnpunishPlayerProtocolObject @Override public Serializer getSerializer() { - return new Serializer<>() { - @Override - public String serialize(UnpunishPlayerMessage value) { - JSONObject json = new JSONObject(); - json.put("target", value.target().toString()); - json.put("staff", value.staff().toString()); - json.put("type", value.type()); - return json.toString(); - } - - @Override - public UnpunishPlayerMessage deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new UnpunishPlayerMessage( - UUID.fromString(obj.getString("target")), - UUID.fromString(obj.getString("staff")), - obj.getString("type") - ); - } - - @Override - public UnpunishPlayerMessage clone(UnpunishPlayerMessage value) { - return value; - } - }; + return new JacksonSerializer<>(UnpunishPlayerMessage.class); } @Override public Serializer getReturnSerializer() { - return new Serializer<>() { - @Override - public String serialize(UnpunishPlayerResponse value) { - JSONObject json = new JSONObject(); - json.put("success", value.success()); - json.put("errorMessage", value.errorMessage()); - return json.toString(); - } - - @Override - public UnpunishPlayerResponse deserialize(String json) { - JSONObject obj = new JSONObject(json); - return new UnpunishPlayerResponse( - obj.getBoolean("success"), - obj.isNull("errorMessage") ? null : obj.getString("errorMessage") - ); - } - - @Override - public UnpunishPlayerResponse clone(UnpunishPlayerResponse value) { - return value; - } - }; + return new JacksonSerializer<>(UnpunishPlayerResponse.class); } public record UnpunishPlayerMessage( diff --git a/commons/src/main/java/net/swofty/commons/proxy/FromProxyChannels.java b/commons/src/main/java/net/swofty/commons/proxy/FromProxyChannels.java deleted file mode 100644 index b572b7413..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/FromProxyChannels.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.swofty.commons.proxy; - -import lombok.Getter; -import net.swofty.commons.proxy.requirements.from.BroadcastStaffChatRequirements; -import net.swofty.commons.proxy.requirements.from.DoesServerHaveIslandRequirements; -import net.swofty.commons.proxy.requirements.from.GivePlayersOriginTypeRequirements; -import net.swofty.commons.proxy.requirements.from.PingServerRequirements; -import net.swofty.commons.proxy.requirements.from.PlayerHasSwitchedFromHereRequirements; -import net.swofty.commons.proxy.requirements.from.RefreshCoopDataOnServerRequirements; -import net.swofty.commons.proxy.requirements.from.RunEventRequirements; -import net.swofty.commons.proxy.requirements.from.TeleportRequirements; -import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; - -@Getter -public enum FromProxyChannels { - TELEPORT("teleport", new TeleportRequirements()), - PLAYER_HAS_SWITCHED_FROM_HERE("player-has-switched-from-here", new PlayerHasSwitchedFromHereRequirements()), - DOES_SERVER_HAVE_ISLAND("does-server-have-island", new DoesServerHaveIslandRequirements()), - REFRESH_COOP_DATA_ON_SERVER("refresh-coop-data", new RefreshCoopDataOnServerRequirements()), - RUN_EVENT_ON_SERVER("run-event", new RunEventRequirements()), - PING_SERVER("ping-server", new PingServerRequirements()), - GIVE_PLAYERS_ORIGIN_TYPE("give-players-origin-type", new GivePlayersOriginTypeRequirements()), - BROADCAST_STAFF_CHAT("broadcast-staff-chat", new BroadcastStaffChatRequirements()) - ; - - private final String channelName; - private final ProxyChannelRequirements requirements; - - FromProxyChannels(String channelName, ProxyChannelRequirements requirements) { - this.channelName = channelName; - this.requirements = requirements; - } - - FromProxyChannels(String channelName) { - this(channelName, null); - } - - public boolean matchesRequirementsServerSide(@Nullable JSONObject message) { - if (message == null) return true; - if (requirements == null) return true; - return requirements.getRequiredKeysForServer().stream().allMatch(key -> message.has(key.key())); - } - - public boolean matchesRequirementsProxySide(@Nullable JSONObject message) { - if (message == null) return true; - if (requirements == null) return true; - return requirements.getRequiredKeysForProxy().stream().allMatch(key -> message.has(key.key())); - } - - public static FromProxyChannels getChannelName(String channel) { - for (FromProxyChannels proxyChannel : FromProxyChannels.values()) { - if (proxyChannel.channelName.equalsIgnoreCase(channel)) { - return proxyChannel; - } - } - throw new IllegalArgumentException("Unknown channelName: " + channel); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/ProxyChannelRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/ProxyChannelRequirements.java deleted file mode 100644 index 64014e109..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/ProxyChannelRequirements.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.swofty.commons.proxy; - -import java.util.List; - -public abstract class ProxyChannelRequirements { - public abstract List getRequiredKeysForProxy(); - public abstract List getRequiredKeysForServer(); - - public record RequiredKey(String key) {} -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/ToProxyChannels.java b/commons/src/main/java/net/swofty/commons/proxy/ToProxyChannels.java deleted file mode 100644 index 45e34a45a..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/ToProxyChannels.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.swofty.commons.proxy; - -import lombok.Getter; -import net.swofty.commons.proxy.requirements.to.*; -import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; - -public enum ToProxyChannels { - REQUEST_SERVERS_NAME("server-name", new ServerNameRequirements()), - PLAYER_COUNT("player-count", new PlayerCountRequirements()), - PLAYER_HANDLER("player-handler", new PlayerHandlerRequirements()), - PROXY_IS_ONLINE("proxy-online", new ProxyIsOnlineRequirements()), - REGISTER_SERVER("register-server", new RegisterServerRequirements()), - FINISHED_WITH_PLAYER("finished-with-player", new FinishedWithPlayerRequirements()), - REQUEST_SERVERS("servers", new ServersRequirement()), - REGISTER_TEST_FLOW("register-test-flow", new RegisterTestFlowRequirements()), - TEST_FLOW_SERVER_READY("test-flow-server-ready", new TestFlowServerReadyRequirements()), - STAFF_CHAT("staff-chat", new StaffChatRequirements()), - PUNISH_PLAYER("punish-player", new KickPlayerRequirements()) - ; - - @Getter - private final String channelName; - private final ProxyChannelRequirements requirements; - - ToProxyChannels(String channel, ProxyChannelRequirements requirements) { - this.channelName = channel; - this.requirements = requirements; - } - - ToProxyChannels(String channel) { - this(channel, null); - } - - public boolean matchesRequirementsServerSide(@Nullable JSONObject message) { - if (message == null) return true; - if (requirements == null) return true; - return requirements.getRequiredKeysForServer().stream().allMatch(key -> message.has(key.key())); - } - - public boolean matchesRequirementsProxySide(@Nullable JSONObject message) { - if (message == null) return true; - if (requirements == null) return true; - return requirements.getRequiredKeysForProxy().stream().allMatch(key -> message.has(key.key())); - } - - public static ToProxyChannels getChannelName(String channel) { - for (ToProxyChannels proxyChannel : ToProxyChannels.values()) { - if (proxyChannel.channelName.equalsIgnoreCase(channel)) { - return proxyChannel; - } - } - throw new IllegalArgumentException("Unknown channelName: " + channel); - } -} \ No newline at end of file diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/BroadcastStaffChatRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/BroadcastStaffChatRequirements.java deleted file mode 100644 index 2a2eb14b9..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/BroadcastStaffChatRequirements.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class BroadcastStaffChatRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("type") // "message", "join", or "leave" - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/DoesServerHaveIslandRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/DoesServerHaveIslandRequirements.java deleted file mode 100644 index cb04bce00..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/DoesServerHaveIslandRequirements.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class DoesServerHaveIslandRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("island-uuid") // The uuid of the island - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("server-has-it") // Whether the server has the island - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/GivePlayersOriginTypeRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/GivePlayersOriginTypeRequirements.java deleted file mode 100644 index c96261199..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/GivePlayersOriginTypeRequirements.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class GivePlayersOriginTypeRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid"), // The uuid of the player - new RequiredKey("origin-type") // The type of the origin server - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PingServerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PingServerRequirements.java deleted file mode 100644 index d7caad934..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PingServerRequirements.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class PingServerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of(); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PlayerHasSwitchedFromHereRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PlayerHasSwitchedFromHereRequirements.java deleted file mode 100644 index 500877fc2..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PlayerHasSwitchedFromHereRequirements.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class PlayerHasSwitchedFromHereRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid") // The uuid of the player - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PromptPlayerForAuthenticationRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PromptPlayerForAuthenticationRequirements.java deleted file mode 100644 index 92f21337e..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/PromptPlayerForAuthenticationRequirements.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class PromptPlayerForAuthenticationRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid") // The uuid of the player - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RefreshCoopDataOnServerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RefreshCoopDataOnServerRequirements.java deleted file mode 100644 index a5a940ebf..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RefreshCoopDataOnServerRequirements.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class RefreshCoopDataOnServerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid"), // The uuid of the player - new RequiredKey("datapoint") // The datapoint to refresh - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RunEventRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RunEventRequirements.java deleted file mode 100644 index a7f944e2b..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/RunEventRequirements.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class RunEventRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid"), // The uuid of the player - new RequiredKey("event"), // The event to run - new RequiredKey("data") // The data to pass to the eventq - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/TeleportRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/from/TeleportRequirements.java deleted file mode 100644 index b7b6cd6fe..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/from/TeleportRequirements.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.swofty.commons.proxy.requirements.from; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class TeleportRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("uuid"), // The uuid of the player - new RequiredKey("x"), // The x coordinate - new RequiredKey("y"), // The y coordinate - new RequiredKey("z"), // The z coordinate - new RequiredKey("yaw"), // The yaw - new RequiredKey("pitch") // The pitch - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/FinishedWithPlayerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/FinishedWithPlayerRequirements.java deleted file mode 100644 index df6144218..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/FinishedWithPlayerRequirements.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class FinishedWithPlayerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of(); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("uuid") // The UUID of the player finished with - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/KickPlayerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/KickPlayerRequirements.java deleted file mode 100644 index a86cd433a..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/KickPlayerRequirements.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class KickPlayerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of(); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("player_uuid"), - new RequiredKey("message") - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerCountRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerCountRequirements.java deleted file mode 100644 index 86c353ba8..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerCountRequirements.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class PlayerCountRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("player-count") - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("lookup-type"), // ALL, a server type, or a UUID - new RequiredKey("lookup-value") // The value to lookup, if the type is ALL then this can be empty - ); - } - - public enum LookupType { - ALL, - TYPE, - UUID - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerHandlerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerHandlerRequirements.java deleted file mode 100644 index 2cc58e45b..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/PlayerHandlerRequirements.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class PlayerHandlerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of(); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("uuid"), // The UUID of the player - new RequiredKey("action") // see {@link PlayerHandlerActions} - ); - } - - public enum PlayerHandlerActions { - TRANSFER, - TELEPORT, - BANK_HASH, - VERSION, - IS_ONLINE, - EVENT, - REFRESH_COOP_DATA, - MESSAGE, - TRANSFER_WITH_UUID, - GET_SERVER, - LIMBO, - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ProxyIsOnlineRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ProxyIsOnlineRequirements.java deleted file mode 100644 index 46a9997cc..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ProxyIsOnlineRequirements.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class ProxyIsOnlineRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("online") - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterServerRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterServerRequirements.java deleted file mode 100644 index 8b1a9942f..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterServerRequirements.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class RegisterServerRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("port") // Port for the server - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("type"), // Type of the server - new RequiredKey("max_players") // Max players for the server - // OPTIONALLY YOU CAN PASS THROUGH A PORT TO FORCE IT - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterTestFlowRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterTestFlowRequirements.java deleted file mode 100644 index 057322169..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/RegisterTestFlowRequirements.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class RegisterTestFlowRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("test_flow_name"), - new RequiredKey("handler"), - new RequiredKey("players"), - new RequiredKey("server_configs") - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("test_flow_name"), - new RequiredKey("handler"), - new RequiredKey("players"), - new RequiredKey("server_configs") - ); - } -} \ No newline at end of file diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServerNameRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServerNameRequirements.java deleted file mode 100644 index c9eb99c65..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServerNameRequirements.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class ServerNameRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("server-name"), - new RequiredKey("shortened-server-name") - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of(); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServersRequirement.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServersRequirement.java deleted file mode 100644 index bf6aeefe5..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/ServersRequirement.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class ServersRequirement extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("servers_list") // JSON of all servers from the search - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("request_type") // Request type - // -> ALL: Get all servers - // -> TYPE: Get all servers of a specific type - // -> UUID: Get all servers of a specific UUID - // -> PLAYER_UUID: Get all servers of a specific player - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/StaffChatRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/StaffChatRequirements.java deleted file mode 100644 index a0f22be1b..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/StaffChatRequirements.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class StaffChatRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of(); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("type"), // "message", "join", or "leave" - new RequiredKey("formatted_message") // Pre-formatted message (for "message" type) or empty (for join/leave) - ); - } -} diff --git a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/TestFlowServerReadyRequirements.java b/commons/src/main/java/net/swofty/commons/proxy/requirements/to/TestFlowServerReadyRequirements.java deleted file mode 100644 index eff70f9eb..000000000 --- a/commons/src/main/java/net/swofty/commons/proxy/requirements/to/TestFlowServerReadyRequirements.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.swofty.commons.proxy.requirements.to; - -import net.swofty.commons.proxy.ProxyChannelRequirements; - -import java.util.List; - -public class TestFlowServerReadyRequirements extends ProxyChannelRequirements { - @Override - public List getRequiredKeysForProxy() { - return List.of( - new RequiredKey("test_flow_name"), - new RequiredKey("server_type"), - new RequiredKey("server_index") - ); - } - - @Override - public List getRequiredKeysForServer() { - return List.of( - new RequiredKey("test_flow_name"), - new RequiredKey("server_type"), - new RequiredKey("server_index") - ); - } -} \ No newline at end of file diff --git a/commons/src/main/java/net/swofty/commons/redis/RedisEnvelope.java b/commons/src/main/java/net/swofty/commons/redis/RedisEnvelope.java new file mode 100644 index 000000000..2f1ac9695 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/redis/RedisEnvelope.java @@ -0,0 +1,22 @@ +package net.swofty.commons.redis; + +import org.json.JSONObject; + +public record RedisEnvelope(String id, String from, String payload) { + public String serialize() { + JSONObject json = new JSONObject(); + json.put("id", id); + json.put("from", from); + json.put("payload", payload); + return json.toString(); + } + + public static RedisEnvelope deserialize(String json) { + JSONObject obj = new JSONObject(json); + return new RedisEnvelope( + obj.getString("id"), + obj.getString("from"), + obj.optString("payload", "") + ); + } +} diff --git a/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java b/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java deleted file mode 100644 index 25dbf8cbf..000000000 --- a/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.swofty.commons.service; - -import lombok.Getter; - -@Getter -public enum FromServiceChannels { - GET_SKYBLOCK_DATA("get-skyblock-player-data"), - UPDATE_PLAYER_DATA("update-player-data"), - LOCK_PLAYER_DATA("lock-player-data"), - UNLOCK_PLAYER_DATA("unlock-player-data"), - KICK_FROM_GUI("kick-from-gui"), - PROPAGATE_BAZAAR_TRANSACTION("propagate-bazaar-transaction"), - SEND_MESSAGE("send-message"), - PROPAGATE_PARTY_EVENT("propagate_party_event"), - GAME_INFORMATION("game-information"), - INSTANTIATE_GAME("instantiate-game"), - DARK_AUCTION_EVENT("dark-auction-event"), - TRIGGER_DARK_AUCTION("trigger-dark-auction"), - PROPAGATE_FRIEND_EVENT("propagate_friend_event"), - ; - - private final String channelName; - - FromServiceChannels(String channelName) { - this.channelName = channelName; - } - - public static FromServiceChannels getChannelName(String channel) { - for (FromServiceChannels serviceChannel : FromServiceChannels.values()) { - if (serviceChannel.channelName.equalsIgnoreCase(channel)) { - return serviceChannel; - } - } - throw new IllegalArgumentException("Unknown channelName: " + channel); - } -} \ No newline at end of file diff --git a/commons/src/test/java/net/swofty/commons/protocol/JacksonSerializerTest.java b/commons/src/test/java/net/swofty/commons/protocol/JacksonSerializerTest.java new file mode 100644 index 000000000..0ead88163 --- /dev/null +++ b/commons/src/test/java/net/swofty/commons/protocol/JacksonSerializerTest.java @@ -0,0 +1,52 @@ +package net.swofty.commons.protocol; + +import org.junit.jupiter.api.Test; +import java.util.UUID; +import static org.junit.jupiter.api.Assertions.*; + +class JacksonSerializerTest { + + public record SimpleMessage(String name, int count) {} + public record UUIDMessage(UUID playerId, String action) {} + public record NestedMessage(String type, SimpleMessage inner) {} + + @Test + void serializesAndDeserializesSimpleRecord() { + var serializer = new JacksonSerializer<>(SimpleMessage.class); + var original = new SimpleMessage("diamond_sword", 5); + String json = serializer.serialize(original); + SimpleMessage result = serializer.deserialize(json); + assertEquals("diamond_sword", result.name()); + assertEquals(5, result.count()); + } + + @Test + void serializesAndDeserializesUUIDs() { + var serializer = new JacksonSerializer<>(UUIDMessage.class); + UUID id = UUID.randomUUID(); + var original = new UUIDMessage(id, "join"); + String json = serializer.serialize(original); + UUIDMessage result = serializer.deserialize(json); + assertEquals(id, result.playerId()); + assertEquals("join", result.action()); + } + + @Test + void serializesNestedRecords() { + var serializer = new JacksonSerializer<>(NestedMessage.class); + var original = new NestedMessage("test", new SimpleMessage("item", 3)); + String json = serializer.serialize(original); + NestedMessage result = serializer.deserialize(json); + assertEquals("test", result.type()); + assertEquals("item", result.inner().name()); + assertEquals(3, result.inner().count()); + } + + @Test + void cloneProducesEqualButDistinctObject() { + var serializer = new JacksonSerializer<>(SimpleMessage.class); + var original = new SimpleMessage("test", 42); + SimpleMessage cloned = serializer.clone(original); + assertEquals(original, cloned); + } +} diff --git a/commons/src/test/java/net/swofty/commons/protocol/SanityTest.java b/commons/src/test/java/net/swofty/commons/protocol/SanityTest.java new file mode 100644 index 000000000..70fb0bdbb --- /dev/null +++ b/commons/src/test/java/net/swofty/commons/protocol/SanityTest.java @@ -0,0 +1,11 @@ +package net.swofty.commons.protocol; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class SanityTest { + @Test + void sanityCheck() { + assertTrue(true); + } +} diff --git a/commons/src/test/java/net/swofty/commons/protocol/ServicePushProtocolTest.java b/commons/src/test/java/net/swofty/commons/protocol/ServicePushProtocolTest.java new file mode 100644 index 000000000..a6d4e8828 --- /dev/null +++ b/commons/src/test/java/net/swofty/commons/protocol/ServicePushProtocolTest.java @@ -0,0 +1,44 @@ +package net.swofty.commons.protocol; + +import org.junit.jupiter.api.Test; +import java.util.UUID; +import static org.junit.jupiter.api.Assertions.*; + +class ServicePushProtocolTest { + + public record TestPushRequest(UUID playerId, String item, int amount) {} + public record TestPushResponse(boolean handled) {} + + static class TestPush extends ServicePushProtocol { + public TestPush() { + super(TestPushRequest.class, TestPushResponse.class); + } + } + + @Test + void channelNameDerivedFromClassName() { + var protocol = new TestPush(); + assertEquals("TestPush", protocol.channel()); + } + + @Test + void serializesRequestRoundTrip() { + var protocol = new TestPush(); + UUID id = UUID.randomUUID(); + var original = new TestPushRequest(id, "diamond", 5); + String json = protocol.translateToString(original); + TestPushRequest result = protocol.translateFromString(json); + assertEquals(id, result.playerId()); + assertEquals("diamond", result.item()); + assertEquals(5, result.amount()); + } + + @Test + void serializesResponseRoundTrip() { + var protocol = new TestPush(); + var original = new TestPushResponse(true); + String json = protocol.translateReturnToString(original); + TestPushResponse result = protocol.translateReturnFromString(json); + assertTrue(result.handled()); + } +} diff --git a/loader/src/main/java/net/swofty/loader/Hypixel.java b/loader/src/main/java/net/swofty/loader/Hypixel.java index f5ad9a139..6b852965c 100644 --- a/loader/src/main/java/net/swofty/loader/Hypixel.java +++ b/loader/src/main/java/net/swofty/loader/Hypixel.java @@ -21,12 +21,12 @@ import net.swofty.commons.TestFlow; import net.swofty.commons.config.ConfigProvider; import net.swofty.commons.protocol.ProtocolObject; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.objects.proxy.to.*; import net.swofty.proxyapi.ProxyAPI; import net.swofty.proxyapi.ProxyService; -import net.swofty.proxyapi.redis.ProxyToClient; import net.swofty.proxyapi.redis.ServerOutboundMessage; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.spark.Spark; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; @@ -37,8 +37,6 @@ import net.swofty.type.generic.i18n.I18n; import net.swofty.type.ravengardgeneric.RavengardGenericLoader; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; -import org.json.JSONArray; -import org.json.JSONObject; import org.reflections.Reflections; import org.tinylog.Logger; @@ -157,28 +155,36 @@ static void main(String[] args) { // Initialize proxy support ProxyAPI proxyAPI = new ProxyAPI(ConfigProvider.settings().getRedisUri(), serverUUID); - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.generic.redis", ProxyToClient.class) - .forEach(proxyAPI::registerFromProxyHandler); - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.generic.redis.service", ServiceToClient.class) - .forEach(proxyAPI::registerFromServiceHandler); - typeLoader.getProxyRedisListeners().forEach(proxyAPI::registerFromProxyHandler); - typeLoader.getServiceRedisListeners().forEach(proxyAPI::registerFromServiceHandler); + SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.generic.redis", TypedProxyHandler.class) + .forEach(proxyAPI::registerTypedProxyHandler); + SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.generic.redis.service", TypedServiceHandler.class) + .forEach(proxyAPI::registerTypedServiceHandler); + typeLoader.getTypedProxyHandlers().forEach(proxyAPI::registerTypedProxyHandler); + typeLoader.getTypedServiceHandlers().forEach(proxyAPI::registerTypedServiceHandler); if (typeLoader instanceof SkyBlockTypeLoader) { - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.skyblockgeneric.redis", ProxyToClient.class) - .forEach(proxyAPI::registerFromProxyHandler); - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.skyblockgeneric.redis.service", ServiceToClient.class) - .forEach(proxyAPI::registerFromServiceHandler); + SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.skyblockgeneric.redis", TypedProxyHandler.class) + .forEach(proxyAPI::registerTypedProxyHandler); + SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.skyblockgeneric.redis.service", TypedServiceHandler.class) + .forEach(proxyAPI::registerTypedServiceHandler); } else if (typeLoader instanceof RavengardTypeLoader) { - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.ravengardgeneric.redis", ProxyToClient.class) - .forEach(proxyAPI::registerFromProxyHandler); - SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.ravengardgeneric.redis.service", ServiceToClient.class) - .forEach(proxyAPI::registerFromServiceHandler); + SkyBlockGenericLoader.loopThroughPackage("net.swofty.type.ravengardgeneric.redis", TypedProxyHandler.class) + .forEach(proxyAPI::registerTypedProxyHandler); + } + ProtocolObject[] toProxyProtocols = { + new RequestServerNameProtocol(), new PlayerCountProtocol(), + new PlayerHandlerProtocol(), new ProxyIsOnlineProtocol(), + new RegisterServerProtocol(), new FinishedWithPlayerProtocol(), + new RequestServersProtocol(), new RegisterTestFlowProtocol(), + new TestFlowServerReadyProtocol(), new StaffChatProtocol(), + new PunishPlayerProtocol() + }; + for (ProtocolObject protocol : toProxyProtocols) { + ServerOutboundMessage.registerToProxyProtocol(protocol); } - Arrays.stream(ToProxyChannels.values()).forEach( - ServerOutboundMessage::registerServerToProxy - ); List protocolObjects = SkyBlockGenericLoader.loopThroughPackage( - "net.swofty.commons.protocol.objects", ProtocolObject.class).toList(); + "net.swofty.commons.protocol.objects", ProtocolObject.class) + .filter(obj -> !obj.getClass().getPackageName().startsWith("net.swofty.commons.protocol.objects.proxy")) + .toList(); protocolObjects.forEach(ServerOutboundMessage::registerFromProtocolObject); proxyAPI.start(); @@ -221,12 +227,11 @@ static void main(String[] args) { HypixelConst.setMaxPlayers(maxPlayers); HypixelConst.setServerUUID(serverUUID); - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.REQUEST_SERVERS_NAME, new JSONObject(), + ServerOutboundMessage.sendToProxy(new RequestServerNameProtocol(), + new RequestServerNameProtocol.Request(), (response) -> { if (isTestFlow) { - String serverNameRaw = ((String) response.get("shortened-server-name")) - .substring(1); + String serverNameRaw = response.shortenedServerName().substring(1); String serverName = "isolated" + serverNameRaw; String shortenedServerName = "i" + serverNameRaw; @@ -236,8 +241,8 @@ ToProxyChannels.REQUEST_SERVERS_NAME, new JSONObject(), handleTestFlowRegistration(testFlowName, testFlowHandler, testFlowPlayers, serverType, testFlowIndex, testFlowTotal, testFlowServerConfigs); } else { - HypixelConst.setServerName((String) response.get("server-name")); - HypixelConst.setShortenedServerName((String) response.get("shortened-server-name")); + HypixelConst.setServerName(response.serverName()); + HypixelConst.setShortenedServerName(response.shortenedServerName()); } Logger.info("Received server name: " + HypixelConst.getServerName()); @@ -272,23 +277,14 @@ public void onFlag(UUID uuid, FlagType flagType) { System.exit(0); }); - JSONObject registerMessage = new JSONObject() - .put("type", serverType.name()) - .put("max_players", maxPlayers) - .put("host", InetAddress.getLocalHost().getHostName()); - - // Add test flow information if this is a test flow server - if (isTestFlow) { - registerMessage.put("is_test_flow", true) - .put("test_flow_name", testFlowName) - .put("test_flow_index", testFlowIndex) - .put("test_flow_total", testFlowTotal); - } - - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.REGISTER_SERVER, - registerMessage, - (response) -> startServer.complete(Integer.parseInt(response.get("port").toString()))); + ServerOutboundMessage.sendToProxy(new RegisterServerProtocol(), + new RegisterServerProtocol.Request( + serverType.name(), maxPlayers, InetAddress.getLocalHost().getHostName(), null, + isTestFlow ? true : null, + isTestFlow ? testFlowName : null, + isTestFlow ? testFlowIndex : null, + isTestFlow ? testFlowTotal : null), + (response) -> startServer.complete(response.port())); } private static void handleTestFlowRegistration(String testFlowName, String handler, String players, @@ -306,32 +302,19 @@ private static void handleTestFlowRegistration(String testFlowName, String handl if ("0".equals(index)) { Logger.info("Registering test flow with proxy: " + testFlowName); - // Parse server configs and create JSON array - JSONArray serverConfigsArray = new JSONArray(); + List> configList = new java.util.ArrayList<>(); String[] configs = serverConfigs.split(","); - for (String config : configs) { String[] parts = config.trim().split(":"); String type = parts[0]; int count = parts.length > 1 ? Integer.parseInt(parts[1]) : 1; - - serverConfigsArray.put(new JSONObject() - .put("type", type) - .put("count", count)); + configList.add(Map.of("type", type, "count", count)); } - JSONObject testFlowMessage = new JSONObject() - .put("test_flow_name", testFlowName) - .put("handler", handler) - .put("players", new JSONArray(playerList)) - .put("server_configs", serverConfigsArray); - - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.REGISTER_TEST_FLOW, - testFlowMessage, + ServerOutboundMessage.sendToProxy(new RegisterTestFlowProtocol(), + new RegisterTestFlowProtocol.Request(testFlowName, handler, playerList, configList), (response) -> { Logger.info("Test flow registered successfully with proxy"); - // Mark this server as ready notifyTestFlowServerReady(testFlowName, serverType, index); }); } else { @@ -341,14 +324,8 @@ private static void handleTestFlowRegistration(String testFlowName, String handl } private static void notifyTestFlowServerReady(String testFlowName, ServerType serverType, String index) { - JSONObject readyMessage = new JSONObject() - .put("test_flow_name", testFlowName) - .put("server_type", serverType.name()) - .put("server_index", index); - - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.TEST_FLOW_SERVER_READY, - readyMessage, + ServerOutboundMessage.sendToProxy(new TestFlowServerReadyProtocol(), + new TestFlowServerReadyProtocol.Request(testFlowName, serverType.name(), Integer.parseInt(index)), (response) -> { Logger.info("Notified proxy that " + serverType.name() + " server " + index + " is ready for test flow: " + testFlowName); }); @@ -369,9 +346,9 @@ private static void checkProxyConnected(Scheduler scheduler) { AtomicBoolean responded = new AtomicBoolean(false); try { - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.PROXY_IS_ONLINE, new JSONObject(), (response) -> { - if (response.get("online").equals(true)) { + ServerOutboundMessage.sendToProxy(new ProxyIsOnlineProtocol(), + new ProxyIsOnlineProtocol.Request(), (response) -> { + if (response.online()) { responded.set(true); } }); diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java index 7330351dc..3e99ec7b4 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java @@ -1,11 +1,12 @@ package net.swofty.proxyapi; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.redis.RedisEnvelope; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.redisapi.api.ChannelRegistry; import net.swofty.redisapi.api.RedisAPI; -import org.json.JSONObject; -import org.tinylog.Logger; import java.util.UUID; @@ -19,67 +20,67 @@ public ProxyAPI(String URI, UUID serverUUID) { RedisAPI.getInstance().setFilterId(serverUUID.toString()); } - public void registerFromProxyHandler(ProxyToClient handler) { - RedisAPI.getInstance().registerChannel(handler.getChannel().getChannelName(), (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - UUID request = UUID.fromString(split[0].substring(split[0].indexOf(";") + 1)); - String rawMessage = split[1]; - JSONObject json = new JSONObject(rawMessage); + public void registerTypedProxyHandler(TypedProxyHandler handler) { + ProtocolObject protocol = handler.getProtocol(); - JSONObject response = handler.onMessage(json); + RedisAPI.getInstance().registerChannel(protocol.channel(), (event) -> { + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + String rawMessage = envelope.payload(); - if (!handler.getChannel().matchesRequirementsServerSide(response)) { - Logger.error("Handler " + handler.getClass().getName()); - throw new RuntimeException("Message does not match requirements for server side"); - } + T typedMessage = protocol.translateFromString(rawMessage); + R response = handler.onMessage(typedMessage); + + String serializedResponse = protocol.translateReturnToString(response); RedisAPI.getInstance().publishMessage( "proxy", - ChannelRegistry.getFromName(handler.getChannel().getChannelName()), - request + "}=-=-={" + response.toString()); + ChannelRegistry.getFromName(protocol.channel()), + new RedisEnvelope(envelope.id(), serverUUID.toString(), serializedResponse).serialize()); }); } - public void registerFromServiceHandler(ServiceToClient handler) { - RedisAPI.getInstance().registerChannel("service_" + handler.getChannel().getChannelName(), (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - String serviceId = split[0].substring(split[0].indexOf(";") + 1); - UUID requestId = UUID.fromString(split[1]); - String rawMessage = split[2]; - JSONObject json = new JSONObject(rawMessage); + public void registerTypedServiceHandler(TypedServiceHandler handler) { + ServicePushProtocol protocol = handler.getProtocol(); + String channelName = "service_" + protocol.channel(); + + RedisAPI.getInstance().registerChannel(channelName, (event) -> { + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + String serviceId = envelope.from(); + String rawMessage = envelope.payload(); Thread.startVirtualThread(() -> { - JSONObject response = handler.onMessage(json); + T typedMessage = protocol.translateFromString(rawMessage); + R response = handler.onMessage(typedMessage); + + String serializedResponse = protocol.translateReturnToString(response); - // Send response back to service RedisAPI.getInstance().publishMessage( serviceId, ChannelRegistry.getFromName("service_response"), - requestId + "}=-=-={" + response.toString()); + new RedisEnvelope(envelope.id(), serverUUID.toString(), serializedResponse).serialize()); }); }); - RedisAPI.getInstance().registerChannel("service_broadcast_" + handler.getChannel().getChannelName(), (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - String serviceId = split[0].substring(split[0].indexOf(";") + 1); - UUID requestId = UUID.fromString(split[1]); - String rawMessage = split[2]; - JSONObject json = new JSONObject(rawMessage); + RedisAPI.getInstance().registerChannel("service_broadcast_" + protocol.channel(), (event) -> { + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + String serviceId = envelope.from(); + String rawMessage = envelope.payload(); Thread.startVirtualThread(() -> { - // Handle message - JSONObject response = handler.onMessage(json); + T typedMessage = protocol.translateFromString(rawMessage); + R response = handler.onMessage(typedMessage); + + if (response == null) return; - if (response == null) { - // Don't send a response if null - return; - } + String serializedResponse = protocol.translateReturnToString(response); - // Send response back to service with this server's UUID RedisAPI.getInstance().publishMessage( serviceId, ChannelRegistry.getFromName("service_broadcast_response"), - requestId + "}=-=-={" + serverUUID.toString() + "}=-=-={" + response); + new RedisEnvelope(envelope.id(), serverUUID.toString(), serializedResponse).serialize()); }); }); } diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyInformation.java b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyInformation.java index b498c3b4d..6d50a5196 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyInformation.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyInformation.java @@ -2,7 +2,7 @@ import net.swofty.commons.ServerType; import net.swofty.commons.UnderstandableProxyServer; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.objects.proxy.to.RequestServersProtocol; import net.swofty.proxyapi.redis.ServerOutboundMessage; import org.json.JSONObject; @@ -11,46 +11,37 @@ import java.util.concurrent.CompletableFuture; public class ProxyInformation { + private static final RequestServersProtocol PROTOCOL = new RequestServersProtocol(); + public CompletableFuture getServerInformation(UUID uuid) { - JSONObject message = new JSONObject() - .put("request_type", "UUID") - .put("uuid", uuid.toString()); CompletableFuture future = new CompletableFuture<>(); - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.REQUEST_SERVERS, message, (response) -> { - future.complete(UnderstandableProxyServer.fromJSON(response.getJSONObject("servers_list")).getFirst()); - }); + ServerOutboundMessage.sendToProxy(PROTOCOL, + new RequestServersProtocol.Request("UUID", null, uuid.toString()), + response -> future.complete(UnderstandableProxyServer.fromJSON(new JSONObject(response.serversList())).getFirst())); return future; } public CompletableFuture> getServerInformation(ServerType type) { - JSONObject message = new JSONObject() - .put("request_type", "TYPE") - .put("type", type.name()); CompletableFuture> future = new CompletableFuture<>(); - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.REQUEST_SERVERS, message, (response) -> { - future.complete(UnderstandableProxyServer.fromJSON(response.getJSONObject("servers_list"))); - }); + ServerOutboundMessage.sendToProxy(PROTOCOL, + new RequestServersProtocol.Request("TYPE", type.name(), null), + response -> future.complete(UnderstandableProxyServer.fromJSON(new JSONObject(response.serversList())))); return future; } public CompletableFuture> getAllServersInformation() { - JSONObject message = new JSONObject() - .put("request_type", "ALL"); CompletableFuture> future = new CompletableFuture<>(); - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.REQUEST_SERVERS, message, (response) -> { - future.complete(UnderstandableProxyServer.fromJSON(response.getJSONObject("servers_list"))); - }); + ServerOutboundMessage.sendToProxy(PROTOCOL, + new RequestServersProtocol.Request("ALL", null, null), + response -> future.complete(UnderstandableProxyServer.fromJSON(new JSONObject(response.serversList())))); return future; } public CompletableFuture getServerInformation(ProxyPlayer player) { - JSONObject message = new JSONObject() - .put("request_type", "PLAYER_UUID") - .put("uuid", player.getUuid().toString()); CompletableFuture future = new CompletableFuture<>(); - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.REQUEST_SERVERS, message, (response) -> { - future.complete(UnderstandableProxyServer.fromJSON(response.getJSONObject("servers_list")).getFirst()); - }); + ServerOutboundMessage.sendToProxy(PROTOCOL, + new RequestServersProtocol.Request("PLAYER_UUID", null, player.getUuid().toString()), + response -> future.complete(UnderstandableProxyServer.fromJSON(new JSONObject(response.serversList())).getFirst())); return future; } } diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyPlayer.java b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyPlayer.java index f862ae44e..ad03ebe62 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyPlayer.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyPlayer.java @@ -7,8 +7,7 @@ import net.minestom.server.entity.Player; import net.swofty.commons.ServerType; import net.swofty.commons.UnderstandableProxyServer; -import net.swofty.commons.proxy.ToProxyChannels; -import net.swofty.commons.proxy.requirements.to.PlayerHandlerRequirements; +import net.swofty.commons.protocol.objects.proxy.to.PlayerHandlerProtocol; import net.swofty.proxyapi.impl.ProxyUnderstandableEvent; import net.swofty.proxyapi.redis.ServerOutboundMessage; import org.json.JSONObject; @@ -20,6 +19,8 @@ @Getter public class ProxyPlayer { + private static final PlayerHandlerProtocol PLAYER_HANDLER = new PlayerHandlerProtocol(); + public static Map> waitingForTransferComplete = new ConcurrentHashMap<>(); private final UUID uuid; @@ -32,181 +33,107 @@ public ProxyPlayer(UUID uuid) { } public void sendMessage(Component message) { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("message", JSONComponentSerializer.json().serialize(message)); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.MESSAGE; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.MESSAGE, + Map.of("message", JSONComponentSerializer.json().serialize(message))), + response -> {}); } public void sendMessage(String message) { sendMessage(Component.text(message)); } - public void teleport(Pos pos) { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("x", pos.x()); - json.put("y", pos.y()); - json.put("z", pos.z()); - json.put("yaw", pos.yaw()); - json.put("pitch", pos.pitch()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.TELEPORT; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.TELEPORT, + Map.of("x", pos.x(), "y", pos.y(), "z", pos.z(), + "yaw", pos.yaw(), "pitch", pos.pitch())), + response -> {}); } public CompletableFuture getServer() { CompletableFuture future = new CompletableFuture<>(); - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.GET_SERVER; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> { - future.complete(UnderstandableProxyServer.singleFromJSON(s.getJSONObject("server"))); - }); - + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.GET_SERVER, Map.of()), + response -> { + @SuppressWarnings("unchecked") + Map serverMap = (Map) response.data().get("server"); + if (serverMap != null) { + future.complete(UnderstandableProxyServer.singleFromJSON(new JSONObject(serverMap))); + } else { + future.complete(null); + } + }); return future; } public CompletableFuture isOnline() { CompletableFuture future = new CompletableFuture<>(); - - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.IS_ONLINE; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> { - boolean isOnline = (boolean) s.get("isOnline"); - future.complete(isOnline); - }); - + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.IS_ONLINE, Map.of()), + response -> { + Object isOnline = response.data().get("isOnline"); + future.complete(Boolean.TRUE.equals(isOnline)); + }); return future; } public void runEvent(ProxyUnderstandableEvent event) { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("event", event.getClass().getName()); - json.put("data", event.asProxyUnderstandable()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.EVENT; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.EVENT, + Map.of("event", event.getClass().getName(), + "data", event.asProxyUnderstandable())), + response -> {}); } public CompletableFuture transferToWithIndication(UUID serverToTransferTo) { CompletableFuture future = new CompletableFuture<>(); - - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("server_uuid", serverToTransferTo.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.TRANSFER_WITH_UUID; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); - + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.TRANSFER_WITH_UUID, + Map.of("server_uuid", serverToTransferTo.toString())), + response -> {}); waitingForTransferComplete.put(uuid, future); - return future; } public void transferTo(ServerType serverType) { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("type", serverType.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.TRANSFER; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.TRANSFER, + Map.of("type", serverType.toString())), + response -> {}); } public void transferToLimbo() { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.LIMBO; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.LIMBO, Map.of()), + response -> {}); } public CompletableFuture transferToWithIndication(ServerType serverType) { CompletableFuture future = new CompletableFuture<>(); - - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("type", serverType.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.TRANSFER; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); - + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.TRANSFER, + Map.of("type", serverType.toString())), + response -> {}); waitingForTransferComplete.put(uuid, future); - return future; } public CompletableFuture getBankHash() { CompletableFuture future = new CompletableFuture<>(); - - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.BANK_HASH; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> { - future.complete(UUID.fromString((String) s.get("bankHash"))); - }); - + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.BANK_HASH, Map.of()), + response -> { + Object bankHash = response.data().get("bankHash"); + future.complete(UUID.fromString((String) bankHash)); + }); return future; } public void refreshCoopData(String datapoint) { - JSONObject json = new JSONObject(); - json.put("uuid", uuid.toString()); - json.put("datapoint", datapoint); - - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.REFRESH_COOP_DATA; - json.put("action", action.name()); - - ServerOutboundMessage.sendMessageToProxy(ToProxyChannels.PLAYER_HANDLER, - json, (s) -> {}); + ServerOutboundMessage.sendToProxy(PLAYER_HANDLER, + new PlayerHandlerProtocol.Request(uuid.toString(), PlayerHandlerProtocol.Action.REFRESH_COOP_DATA, + Map.of("datapoint", datapoint)), + response -> {}); } } diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ProxyToClient.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ProxyToClient.java deleted file mode 100644 index d7d953e0b..000000000 --- a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ProxyToClient.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.swofty.proxyapi.redis; - -import net.swofty.commons.proxy.FromProxyChannels; -import org.json.JSONObject; - -public interface ProxyToClient { - FromProxyChannels getChannel(); - JSONObject onMessage(JSONObject message); -} diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java index 65b71d361..13c61c008 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java @@ -3,10 +3,9 @@ import net.swofty.commons.ServiceType; import net.swofty.commons.impl.ServiceProxyRequest; import net.swofty.commons.protocol.ProtocolObject; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.redis.RedisEnvelope; import net.swofty.redisapi.api.ChannelRegistry; import net.swofty.redisapi.api.RedisAPI; -import org.json.JSONObject; import org.tinylog.Logger; import java.lang.reflect.ParameterizedType; @@ -20,30 +19,32 @@ public class ServerOutboundMessage { private static final Map> redisMessageListeners = new HashMap<>(); public static final Map protocolObjects = new HashMap<>(); - public static void registerServerToProxy(ToProxyChannels channel) { - RedisAPI.getInstance().registerChannel(channel.getChannelName(), (event) -> { - String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); - - String[] split = messageWithoutFilter.split("}=-=-=\\{"); - UUID uuid = UUID.fromString(split[0]); - - redisMessageListeners.get(uuid).accept(split[1]); - redisMessageListeners.remove(uuid); - }); - } - - public static void sendMessageToProxy(ToProxyChannels channel, JSONObject message, Consumer response) { + public static void sendToProxy(ProtocolObject protocol, T request, Consumer response) { UUID uuid = UUID.randomUUID(); UUID filterID = UUID.fromString(RedisAPI.getInstance().getFilterId()); Consumer consumer = (s) -> { - response.accept(new JSONObject(s)); + R typed = protocol.translateReturnFromString(s); + response.accept(typed); }; redisMessageListeners.put(uuid, consumer); + String serialized = protocol.translateToString(request); RedisAPI.getInstance().publishMessage("proxy", - ChannelRegistry.getFromName(channel.getChannelName()), - message.toString() + "}=-=-={" + uuid + "}=-=-={" + filterID); + ChannelRegistry.getFromName(protocol.channel()), + new RedisEnvelope(uuid.toString(), filterID.toString(), serialized).serialize()); + } + + public static void registerToProxyProtocol(ProtocolObject protocol) { + RedisAPI.getInstance().registerChannel(protocol.channel(), (event) -> { + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID uuid = UUID.fromString(envelope.id()); + + redisMessageListeners.get(uuid).accept(envelope.payload()); + redisMessageListeners.remove(uuid); + }); } public static void registerFromProtocolObject(ProtocolObject object) { @@ -52,13 +53,10 @@ public static void registerFromProtocolObject(ProtocolObject object) { RedisAPI.getInstance().registerChannel(object.channel(), (event) -> { String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); - String[] split = messageWithoutFilter.split("}=-=---=\\{"); - UUID uuid = UUID.fromString(split[0]); - String message; - if (split.length != 1) { - message = split[1]; - } else message = ""; + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID uuid = UUID.fromString(envelope.id()); + String message = envelope.payload(); try { redisMessageListeners.get(uuid).accept(message); @@ -87,9 +85,6 @@ public static void sendMessageToService(ServiceType service, specification.channel(), message).toJSON().toString()); } - /** - * Fire-and-forget: send to a service and do not wait for or register a response. - */ public static void sendMessageToServiceFireAndForget(ServiceType service, ProtocolObject specification, Object rawMessage) { @@ -113,9 +108,6 @@ public static void sendMessageToServiceFireAndForget(ServiceType service, ); } - /** - * Fire-and-forget broadcast to all service types. - */ public static void sendMessageToAllServicesFireAndForget(ProtocolObject specification, Object rawMessage) { for (ServiceType serviceType : ServiceType.values()) { @@ -134,7 +126,6 @@ private static String getRequestTypeName(ProtocolObject protocolObject) { if (firstTypeArg instanceof Class) { return ((Class) firstTypeArg).getSimpleName(); } else { - // Handle cases where T might be another generic type return firstTypeArg.getTypeName(); } } @@ -142,4 +133,4 @@ private static String getRequestTypeName(ProtocolObject protocolObject) { throw new IllegalArgumentException("Could not determine the type T for the given ProtocolObject"); } -} \ No newline at end of file +} diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServiceToClient.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServiceToClient.java deleted file mode 100644 index b01229858..000000000 --- a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServiceToClient.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.swofty.proxyapi.redis; - -import net.swofty.commons.service.FromServiceChannels; -import org.json.JSONObject; - -public interface ServiceToClient { - FromServiceChannels getChannel(); - JSONObject onMessage(JSONObject message); -} \ No newline at end of file diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedProxyHandler.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedProxyHandler.java new file mode 100644 index 000000000..e61dc1e5c --- /dev/null +++ b/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedProxyHandler.java @@ -0,0 +1,8 @@ +package net.swofty.proxyapi.redis; + +import net.swofty.commons.protocol.ProtocolObject; + +public interface TypedProxyHandler { + ProtocolObject getProtocol(); + R onMessage(T message); +} diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedServiceHandler.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedServiceHandler.java new file mode 100644 index 000000000..dbac08ec0 --- /dev/null +++ b/proxy.api/src/main/java/net/swofty/proxyapi/redis/TypedServiceHandler.java @@ -0,0 +1,8 @@ +package net.swofty.proxyapi.redis; + +import net.swofty.commons.protocol.ServicePushProtocol; + +public interface TypedServiceHandler { + ServicePushProtocol getProtocol(); + R onMessage(T message); +} diff --git a/service.api/src/main/java/net/swofty/service/api/endpoints/EndpointAuthenticateCode.java b/service.api/src/main/java/net/swofty/service/api/endpoints/EndpointAuthenticateCode.java index e69885507..15e1d7c30 100644 --- a/service.api/src/main/java/net/swofty/service/api/endpoints/EndpointAuthenticateCode.java +++ b/service.api/src/main/java/net/swofty/service/api/endpoints/EndpointAuthenticateCode.java @@ -20,17 +20,17 @@ public APIAuthenticateCodeProtocolObject associatedProtocolObject() { public APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse onMessage( ServiceProxyRequest message, APIAuthenticateCodeProtocolObject.AuthenticateCodeMessage messageObject) { - @Nullable APIAdminDatabaseObject document = APIAdminDatabase.getFromCode(messageObject.authCode); + @Nullable APIAdminDatabaseObject document = APIAdminDatabase.getFromCode(messageObject.authCode()); if (document == null) { - return new APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse(false); + return new APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse(false, "Authentication failed"); } - document.setAuthenticatorName(messageObject.playerName); - document.setAuthenticatorUUID(messageObject.playerUUID); + document.setAuthenticatorName(messageObject.playerName()); + document.setAuthenticatorUUID(messageObject.playerUUID()); APIAdminDatabase.replaceOrInsert(document); - return new APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse(true); + return new APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse(true, null); } } diff --git a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointAddItem.java b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointAddItem.java index e6b26b6d5..3034246f2 100644 --- a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointAddItem.java +++ b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointAddItem.java @@ -41,6 +41,6 @@ public AuctionAddItemProtocolObject.AuctionAddItemResponse onMessage(ServiceProx } }); - return new AuctionAddItemProtocolObject.AuctionAddItemResponse(UUID.fromString((String) document.get("_id"))); + return new AuctionAddItemProtocolObject.AuctionAddItemResponse(UUID.fromString((String) document.get("_id")), true, null); } } diff --git a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItem.java b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItem.java index 6fe234f81..7b69b8e81 100644 --- a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItem.java +++ b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItem.java @@ -35,6 +35,6 @@ public AuctionFetchItemProtocolObject.AuctionFetchItemResponse onMessage(Service toReturn = AuctionItem.fromDocument(inactiveItem); } - return new AuctionFetchItemProtocolObject.AuctionFetchItemResponse(toReturn); + return new AuctionFetchItemProtocolObject.AuctionFetchItemResponse(toReturn, true, null); } } diff --git a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItems.java b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItems.java index 37142394e..09c5de06c 100644 --- a/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItems.java +++ b/service.auctionhouse/src/main/java/net/swofty/service/auction/endpoints/EndpointFetchItems.java @@ -31,7 +31,7 @@ public AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse onMessage(Servi List results = AuctionService.cacheService.getAuctions(category.toString(), filter); if (results.isEmpty()) { - return new AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse(new ArrayList<>()); + return new AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse(new ArrayList<>(), true, null); } // Sort according to sorting @@ -66,6 +66,6 @@ public AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse onMessage(Servi break; } - return new AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse(results.stream().map(AuctionItem::fromDocument).toList()); + return new AuctionFetchItemsProtocolObject.AuctionFetchItemsResponse(results.stream().map(AuctionItem::fromDocument).toList(), true, null); } } diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/BazaarPropagator.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/BazaarPropagator.java index a6d39f631..5a1129861 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/BazaarPropagator.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/BazaarPropagator.java @@ -1,38 +1,36 @@ package net.swofty.service.bazaar; +import net.swofty.commons.protocol.objects.bazaar.BazaarTransactionPushProtocol; +import net.swofty.commons.protocol.objects.bazaar.BazaarTransactionPushProtocol.Response; import net.swofty.commons.skyblock.bazaar.BazaarTransaction; import net.swofty.commons.skyblock.bazaar.SuccessfulBazaarTransaction; import net.swofty.commons.skyblock.bazaar.OrderExpiredBazaarTransaction; -import net.swofty.commons.service.FromServiceChannels; import net.swofty.service.generic.redis.ServiceToServerManager; -import org.json.JSONObject; import java.util.Map; import java.util.UUID; public class BazaarPropagator { + private static final BazaarTransactionPushProtocol PROTOCOL = new BazaarTransactionPushProtocol(); + public void propagate(BazaarTransaction tx) { System.out.println("Propagating transaction " + tx.getClass().getSimpleName()); - // Send transaction to all servers - JSONObject message = new JSONObject(); - message.put("type", tx.getClass().getSimpleName()); - message.put("data", tx.toJSON()); - - // Send to all servers and collect responses with 5 second timeout - ServiceToServerManager.sendToAllServers( - FromServiceChannels.PROPAGATE_BAZAAR_TRANSACTION, - message, - 5000 // 5 second timeout - ).thenAccept(responses -> handleServerResponses(tx, responses)) + var request = new BazaarTransactionPushProtocol.Request( + tx.getClass().getSimpleName(), + tx.toJSON().toString() + ); + + ServiceToServerManager.sendToAllServers(PROTOCOL, request, 5000) + .thenAccept(responses -> handleServerResponses(tx, responses)) .exceptionally(throwable -> { System.err.println("Failed to get responses from servers for transaction: " + throwable.getMessage()); return null; }); } - private void handleServerResponses(BazaarTransaction tx, Map responses) { + private void handleServerResponses(BazaarTransaction tx, Map responses) { switch (tx) { case SuccessfulBazaarTransaction success -> handleSuccessfulTransactionResponses(success, responses); case OrderExpiredBazaarTransaction expired -> handleExpiredTransactionResponses(expired, responses); @@ -40,20 +38,18 @@ private void handleServerResponses(BazaarTransaction tx, Map r } } - private void handleSuccessfulTransactionResponses(SuccessfulBazaarTransaction tx, Map responses) { + private void handleSuccessfulTransactionResponses(SuccessfulBazaarTransaction tx, Map responses) { boolean buyerHandled = false; boolean sellerHandled = false; - // Check if any server successfully handled the buyer or seller - for (Map.Entry entry : responses.entrySet()) { - JSONObject response = entry.getValue(); - if (response != null && response.optBoolean("success", false)) { - buyerHandled |= response.optBoolean("buyerHandled", false); - sellerHandled |= response.optBoolean("sellerHandled", false); + for (Map.Entry entry : responses.entrySet()) { + Response response = entry.getValue(); + if (response != null && response.success()) { + buyerHandled |= response.buyerHandled(); + sellerHandled |= response.sellerHandled(); } } - // Store pending transactions for players not handled by any server if (!buyerHandled) { System.out.println("Buyer " + tx.buyer() + " not handled by any server - storing as pending"); PendingTransactionsDatabase.storePendingTransaction(tx.buyer(), tx.buyerProfile(), tx); @@ -67,18 +63,16 @@ private void handleSuccessfulTransactionResponses(SuccessfulBazaarTransaction tx System.out.println("Transaction handled - Buyer: " + buyerHandled + ", Seller: " + sellerHandled); } - private void handleExpiredTransactionResponses(OrderExpiredBazaarTransaction tx, Map responses) { + private void handleExpiredTransactionResponses(OrderExpiredBazaarTransaction tx, Map responses) { boolean ownerHandled = false; - // Check if any server successfully handled the owner - for (Map.Entry entry : responses.entrySet()) { - JSONObject response = entry.getValue(); - if (response != null && response.optBoolean("success", false)) { - ownerHandled |= response.optBoolean("ownerHandled", false); + for (Map.Entry entry : responses.entrySet()) { + Response response = entry.getValue(); + if (response != null && response.success()) { + ownerHandled |= response.buyerHandled(); } } - // Store pending transaction for owner if not handled by any server if (!ownerHandled) { System.out.println("Owner " + tx.owner() + " not handled by any server - storing as pending"); PendingTransactionsDatabase.storePendingTransaction(tx.owner(), tx.ownerProfile(), tx); diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarBuyOrder.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarBuyOrder.java index cc17f476a..b672e7e06 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarBuyOrder.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarBuyOrder.java @@ -21,20 +21,20 @@ public BazaarBuyProtocolObject.BazaarBuyResponse onMessage( ServiceProxyRequest message, BazaarBuyProtocolObject.BazaarBuyMessage msg) { - String itemName = msg.itemName; - UUID playerUUID = msg.playerUUID; - UUID profileUUID = msg.profileUUID; - double price = msg.price; - double amount = msg.amount; + String itemName = msg.itemName(); + UUID playerUUID = msg.playerUUID(); + UUID profileUUID = msg.profileUUID(); + double price = msg.price(); + double amount = msg.amount(); try { BazaarMarket.get().submitBuy(itemName, playerUUID, profileUUID, price, amount); System.out.println("Buy order submitted for " + itemName + " by " + playerUUID + " (profile: " + profileUUID + ") - Price: " + price + ", Amount: " + amount); - return new BazaarBuyProtocolObject.BazaarBuyResponse(true); + return new BazaarBuyProtocolObject.BazaarBuyResponse(true, null); } catch (Exception e) { System.err.println("Failed to submit buy order: " + e.getMessage()); - return new BazaarBuyProtocolObject.BazaarBuyResponse(false); + return new BazaarBuyProtocolObject.BazaarBuyResponse(false, "Buy order failed"); } } } diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarSellOrder.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarSellOrder.java index 2b720f7f7..5323923ef 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarSellOrder.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointBazaarSellOrder.java @@ -22,20 +22,20 @@ public BazaarSellProtocolObject.BazaarSellResponse onMessage( ServiceProxyRequest message, BazaarSellProtocolObject.BazaarSellMessage msg) { - String itemName = msg.itemName; - UUID playerUUID = msg.playerUUID; - UUID profileUUID = msg.profileUUID; - double price = msg.price; - double amount = msg.amount; + String itemName = msg.itemName(); + UUID playerUUID = msg.playerUUID(); + UUID profileUUID = msg.profileUUID(); + double price = msg.price(); + double amount = msg.amount(); try { BazaarMarket.get().submitSell(itemName, playerUUID, profileUUID, price, amount); System.out.println("Sell order submitted for " + itemName + " by " + playerUUID + " (profile: " + profileUUID + ") - Price: " + price + ", Amount: " + amount); - return new BazaarSellProtocolObject.BazaarSellResponse(true); + return new BazaarSellProtocolObject.BazaarSellResponse(true, null); } catch (Exception e) { System.err.println("Failed to submit sell order: " + e.getMessage()); - return new BazaarSellProtocolObject.BazaarSellResponse(false); + return new BazaarSellProtocolObject.BazaarSellResponse(false, "Sell order failed"); } } -} \ No newline at end of file +} diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointCancelBazaarOrder.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointCancelBazaarOrder.java index 720d701ed..84b9e2fde 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointCancelBazaarOrder.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointCancelBazaarOrder.java @@ -19,18 +19,17 @@ public BazaarCancelProtocolObject associatedProtocolObject() { @Override public CancelResponse onMessage(ServiceProxyRequest _msg, CancelMessage msg) { - // Remove the order if it belongs to this player and profile var result = OrderDatabase.ordersCollection.deleteOne( Filters.and( - Filters.eq("_id", msg.orderId.toString()), - Filters.eq("owner", msg.playerUuid.toString()), - Filters.eq("profileUuid", msg.profileUuid.toString()) // Also check profile + Filters.eq("_id", msg.orderId().toString()), + Filters.eq("owner", msg.playerUuid().toString()), + Filters.eq("profileUuid", msg.profileUuid().toString()) ) ); - BazaarMarket.get().submitDelete(msg.orderId, msg.playerUuid, msg.profileUuid); - System.out.println("Deleted order " + msg.orderId + " for player " + msg.playerUuid + " and profile " + msg.profileUuid); + BazaarMarket.get().submitDelete(msg.orderId(), msg.playerUuid(), msg.profileUuid()); + System.out.println("Deleted order " + msg.orderId() + " for player " + msg.playerUuid() + " and profile " + msg.profileUuid()); boolean success = result.getDeletedCount() > 0; - return new CancelResponse(success); + return new CancelResponse(success, success ? null : "Cancel failed"); } -} \ No newline at end of file +} diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetBazaarItem.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetBazaarItem.java index 915b8043a..a4b670d8e 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetBazaarItem.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetBazaarItem.java @@ -51,7 +51,9 @@ public BazaarGetItemProtocolObject.BazaarGetItemResponse onMessage( return new BazaarGetItemProtocolObject.BazaarGetItemResponse( itemName, buyOrderRecords, - sellOrderRecords + sellOrderRecords, + true, + null ); } } \ No newline at end of file diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingOrders.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingOrders.java index 519869f31..afb92d37f 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingOrders.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingOrders.java @@ -26,8 +26,8 @@ public BazaarGetPendingOrdersProtocolObject.BazaarGetPendingOrdersResponse onMes ServiceProxyRequest message, BazaarGetPendingOrdersProtocolObject.BazaarGetPendingOrdersMessage msg) { - UUID player = msg.playerUUID; - UUID profile = msg.profileUUID; + UUID player = msg.playerUUID(); + UUID profile = msg.profileUUID(); var docs = OrderDatabase.ordersCollection.find( Filters.and( @@ -48,6 +48,6 @@ public BazaarGetPendingOrdersProtocolObject.BazaarGetPendingOrdersResponse onMes )); } - return new BazaarGetPendingOrdersProtocolObject.BazaarGetPendingOrdersResponse(out); + return new BazaarGetPendingOrdersProtocolObject.BazaarGetPendingOrdersResponse(out, true, null); } -} \ No newline at end of file +} diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingTransactions.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingTransactions.java index 491bfd13f..2242beb45 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingTransactions.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointGetPendingTransactions.java @@ -25,24 +25,22 @@ public BazaarGetPendingTransactionsResponse onMessage( ServiceProxyRequest message, BazaarGetPendingTransactionsMessage msg) { - // Get pending transactions from database List pendingTransactions = - PendingTransactionsDatabase.getPendingTransactions(msg.playerUUID, msg.profileUUID); + PendingTransactionsDatabase.getPendingTransactions(msg.playerUUID(), msg.profileUUID()); - // Convert to protocol format List transactionInfos = pendingTransactions.stream() .map(pt -> new PendingTransactionInfo( pt.getId(), pt.getTransaction().getClass().getSimpleName(), - pt.getTransaction().toJSON(), + pt.getTransaction().toJSON().toMap(), pt.getCreatedAt() )) .collect(Collectors.toList()); System.out.println("Retrieved " + transactionInfos.size() + - " pending transactions for player " + msg.playerUUID + - " on profile " + msg.profileUUID); + " pending transactions for player " + msg.playerUUID() + + " on profile " + msg.profileUUID()); - return new BazaarGetPendingTransactionsResponse(transactionInfos); + return new BazaarGetPendingTransactionsResponse(transactionInfos, true, null); } -} \ No newline at end of file +} diff --git a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointProcessPendingTransactions.java b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointProcessPendingTransactions.java index 4f5cde06e..1f78b46e6 100644 --- a/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointProcessPendingTransactions.java +++ b/service.bazaar/src/main/java/net/swofty/service/bazaar/endpoints/EndpointProcessPendingTransactions.java @@ -27,12 +27,11 @@ public BazaarProcessPendingTransactionsResponse onMessage( List successfulIds = new ArrayList<>(); List failedIds = new ArrayList<>(); - System.out.println("Processing " + msg.transactionIds.size() + - " pending transactions for player " + msg.playerUUID); + System.out.println("Processing " + msg.transactionIds().size() + + " pending transactions for player " + msg.playerUUID()); - for (String transactionId : msg.transactionIds) { + for (String transactionId : msg.transactionIds()) { try { - // Mark the transaction as processed in the database PendingTransactionsDatabase.markTransactionProcessed(transactionId); successfulIds.add(transactionId); System.out.println("Successfully processed pending transaction: " + transactionId); @@ -42,7 +41,6 @@ public BazaarProcessPendingTransactionsResponse onMessage( } } - // Clean up processed transactions if (!successfulIds.isEmpty()) { try { PendingTransactionsDatabase.cleanupProcessedTransactions(); @@ -55,7 +53,9 @@ public BazaarProcessPendingTransactionsResponse onMessage( successfulIds.size(), failedIds.size(), successfulIds, - failedIds + failedIds, + true, + null ); } -} \ No newline at end of file +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java index b8802b971..d824be5c4 100644 --- a/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java @@ -2,12 +2,12 @@ import net.swofty.commons.skyblock.auctions.DarkAuctionPhase; import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventProtocol; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventPushProtocol; import net.swofty.service.generic.redis.ServiceToServerManager; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -149,40 +149,37 @@ public static void broadcastBidPlaced(DarkAuctionState auction, UUID refundPlaye private static void broadcastEvent(DarkAuctionEventProtocol.EventType type, DarkAuctionState auction, int countdown, UUID refundPlayerId, long refundAmount) { - JSONObject message = new JSONObject(); - message.put("eventType", type.name()); - message.put("auctionId", auction.getAuctionId().toString()); - message.put("phase", auction.getPhase().name()); - message.put("currentRound", auction.getCurrentRound()); - message.put("currentItemType", auction.getCurrentItem() != null ? auction.getCurrentItem().name() : null); - message.put("currentBid", auction.getCurrentBid()); - message.put("highestBidderId", auction.getHighestBidderId() != null ? auction.getHighestBidderId().toString() : null); - message.put("highestBidderName", auction.getHighestBidderName()); - message.put("countdown", countdown); - - JSONArray itemsArray = new JSONArray(); - for (String item : auction.getRoundItemNames()) { - itemsArray.put(item); - } - message.put("roundItems", itemsArray); - - // Include refund info for BID_PLACED events - if (refundPlayerId != null) { - message.put("refundPlayerId", refundPlayerId.toString()); - message.put("refundAmount", refundAmount); - } + List roundItems = new ArrayList<>(auction.getRoundItemNames()); - // Include new bidder info for coin handling + String newBidderId = null; + long newBidAmount = 0; if (type == DarkAuctionEventProtocol.EventType.BID_PLACED) { - message.put("newBidderId", auction.getHighestBidderId().toString()); - message.put("newBidAmount", auction.getCurrentBid()); + newBidderId = auction.getHighestBidderId().toString(); + newBidAmount = auction.getCurrentBid(); } + DarkAuctionEventPushProtocol.Request request = new DarkAuctionEventPushProtocol.Request( + type.name(), + auction.getAuctionId().toString(), + auction.getPhase().name(), + auction.getCurrentRound(), + auction.getCurrentItem() != null ? auction.getCurrentItem().name() : null, + auction.getCurrentBid(), + auction.getHighestBidderId() != null ? auction.getHighestBidderId().toString() : null, + auction.getHighestBidderName(), + countdown, + roundItems, + refundPlayerId != null ? refundPlayerId.toString() : null, + refundAmount, + newBidderId, + newBidAmount + ); + Logger.debug("Broadcasting {} event for auction {}", type, auction.getAuctionId()); ServiceToServerManager.sendToAllServers( - FromServiceChannels.DARK_AUCTION_EVENT, - message, + new DarkAuctionEventPushProtocol(), + request, 5000 ).thenAccept(responses -> { Logger.debug("Received {} responses for {} event", responses.size(), type); diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java index 35cc88e89..2ca9495d8 100644 --- a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java @@ -27,7 +27,7 @@ public GetAuctionStateProtocol.GetAuctionStateResponse onMessage( if (auction == null) { return new GetAuctionStateProtocol.GetAuctionStateResponse( - false, null, null, 0, null, 0, null, null, List.of() + false, null, null, 0, null, 0, null, null, List.of(), true, null ); } @@ -40,7 +40,9 @@ public GetAuctionStateProtocol.GetAuctionStateResponse onMessage( auction.getCurrentBid(), auction.getHighestBidderId(), auction.getHighestBidderName(), - auction.getRoundItemNames() + auction.getRoundItemNames(), + true, + null ); } } diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java index d9e076bfc..d853af378 100644 --- a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java @@ -31,19 +31,19 @@ public PlaceBidProtocol.PlaceBidResponse onMessage( // Check if there's an active auction if (auction == null) { Logger.warn("Bid rejected: No active auction"); - return new PlaceBidProtocol.PlaceBidResponse(false, "No active auction"); + return new PlaceBidProtocol.PlaceBidResponse(false, "No active auction", null); } // Check if auction ID matches if (!auction.getAuctionId().equals(msg.auctionId())) { Logger.warn("Bid rejected: Auction ID mismatch"); - return new PlaceBidProtocol.PlaceBidResponse(false, "Invalid auction ID"); + return new PlaceBidProtocol.PlaceBidResponse(false, "Invalid auction ID", null); } // Check if we're in bidding phase if (auction.getPhase() != DarkAuctionPhase.BIDDING) { Logger.warn("Bid rejected: Not in bidding phase (current: {})", auction.getPhase()); - return new PlaceBidProtocol.PlaceBidResponse(false, "Auction is not in bidding phase"); + return new PlaceBidProtocol.PlaceBidResponse(false, "Auction is not in bidding phase", null); } // SYNCHRONIZED to prevent race conditions @@ -53,7 +53,7 @@ public PlaceBidProtocol.PlaceBidResponse onMessage( Logger.info("Bid rejected: {} tried to bid {} but current bid is {}", msg.playerName(), msg.bidAmount(), auction.getCurrentBid()); return new PlaceBidProtocol.PlaceBidResponse(false, - "Bid too low - someone else bid first! Current bid is " + auction.getCurrentBid()); + "Bid too low - someone else bid first! Current bid is " + auction.getCurrentBid(), null); } // If there's a previous bidder, queue their refund @@ -83,7 +83,7 @@ public PlaceBidProtocol.PlaceBidResponse onMessage( // Broadcast BID_PLACED with refund info DarkAuctionScheduler.broadcastBidPlaced(auction, previousBidder, previousBid); - return new PlaceBidProtocol.PlaceBidResponse(true, "Bid accepted"); + return new PlaceBidProtocol.PlaceBidResponse(true, "Bid accepted", null); } } } diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java index 840623411..6dab429b1 100644 --- a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java @@ -31,13 +31,13 @@ public PlayerLeftAuctionProtocol.PlayerLeftResponse onMessage( // If no active auction, nothing to clean up if (auction == null) { Logger.debug("Player {} left but no active auction", msg.playerName()); - return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0); + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0, null); } // If auction ID was provided and doesn't match, ignore if (msg.auctionId() != null && !auction.getAuctionId().equals(msg.auctionId())) { Logger.debug("Player {} left but auction ID mismatch", msg.playerName()); - return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0); + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0, null); } synchronized (auction) { @@ -105,7 +105,7 @@ public PlayerLeftAuctionProtocol.PlayerLeftResponse onMessage( Logger.info("Player {} left Dark Auction, refund amount: {}", msg.playerName(), refundAmount); - return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, refundAmount); + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, refundAmount, null); } } } diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java index 815e8b7a0..c2a8e4540 100644 --- a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java @@ -27,17 +27,17 @@ public TriggerDarkAuctionProtocol.TriggerResponse onMessage( // Check if auction is already active (deduplication) if (DarkAuctionService.hasActiveAuction()) { Logger.info("Auction already active, ignoring trigger"); - return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Auction already in progress"); + return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Auction already in progress", null); } // Start the auction try { DarkAuctionScheduler.startNewAuction(); Logger.info("Dark Auction started successfully via calendar trigger"); - return new TriggerDarkAuctionProtocol.TriggerResponse(true, "Auction started"); + return new TriggerDarkAuctionProtocol.TriggerResponse(true, "Auction started", null); } catch (Exception e) { Logger.error(e, "Failed to start Dark Auction"); - return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Failed to start: " + e.getMessage()); + return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Failed to start: " + e.getMessage(), null); } } } diff --git a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/SynchronizeDataEndpoint.java b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/SynchronizeDataEndpoint.java index 57769b44d..e3f113250 100644 --- a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/SynchronizeDataEndpoint.java +++ b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/SynchronizeDataEndpoint.java @@ -3,11 +3,12 @@ import org.tinylog.Logger; import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.objects.data.GetPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.LockPlayerDataPushProtocol; import net.swofty.commons.protocol.objects.datamutex.SynchronizeDataProtocolObject; import net.swofty.service.datamutex.DataLockManager; import net.swofty.service.generic.redis.ServiceEndpoint; import net.swofty.service.generic.redis.ServiceToServerManager; -import org.json.JSONObject; import java.util.List; import java.util.Map; @@ -48,21 +49,20 @@ public SynchronizeDataProtocolObject.SynchronizeDataResponse onMessage( if (!DataLockManager.acquireLock(lockKey, requesterId)) { System.out.println("Failed to acquire service lock - already locked"); return new SynchronizeDataProtocolObject.SynchronizeDataResponse( - false, "Data is currently locked by another operation", null); + false, null, "Data is currently locked by another operation"); } System.out.println("Service lock acquired successfully"); // Step 2: Lock data on all servers System.out.println("Locking data on servers: " + serverUUIDs); - Map lockResults = ServiceToServerManager + Map lockResults = ServiceToServerManager .lockPlayerData(serverUUIDs, playerUUID, dataKey) .get(); System.out.println("Lock results: " + lockResults); - // Check if all locks were successful boolean allLocked = lockResults.values().stream() - .allMatch(result -> result.optBoolean("success", false)); + .allMatch(LockPlayerDataPushProtocol.Response::success); System.out.println("All servers locked: " + allLocked); @@ -73,33 +73,31 @@ public SynchronizeDataProtocolObject.SynchronizeDataResponse onMessage( ServiceToServerManager.unlockPlayerData(serverUUIDs, playerUUID, dataKey); return new SynchronizeDataProtocolObject.SynchronizeDataResponse( - false, "Failed to acquire locks on all servers", null); + false, null, "Failed to acquire locks on all servers"); } // Step 3: Get data from all servers System.out.println("Getting data from all servers..."); - Map> dataFutures = new java.util.HashMap<>(); + Map> dataFutures = new java.util.HashMap<>(); for (UUID serverUUID : serverUUIDs) { dataFutures.put(serverUUID, ServiceToServerManager.getPlayerData(serverUUID, playerUUID, dataKey)); } - // Wait for all data - Map allData = new java.util.HashMap<>(); - for (Map.Entry> entry : dataFutures.entrySet()) { + Map allData = new java.util.HashMap<>(); + for (Map.Entry> entry : dataFutures.entrySet()) { allData.put(entry.getKey(), entry.getValue().get()); } System.out.println("Received data from servers: " + allData); - // Step 4: Find the most recent data (conflict resolution) - JSONObject latestData = null; + GetPlayerDataPushProtocol.Response latestData = null; long latestTimestamp = 0; - for (JSONObject data : allData.values()) { + for (GetPlayerDataPushProtocol.Response data : allData.values()) { System.out.println("Processing data response: " + data); - if (data.optBoolean("success", false)) { - long timestamp = data.optLong("timestamp", 0); + if (data.success()) { + long timestamp = data.timestamp(); System.out.println("Data timestamp: " + timestamp); if (timestamp > latestTimestamp) { latestTimestamp = timestamp; @@ -114,15 +112,14 @@ public SynchronizeDataProtocolObject.SynchronizeDataResponse onMessage( ServiceToServerManager.unlockPlayerData(serverUUIDs, playerUUID, dataKey); return new SynchronizeDataProtocolObject.SynchronizeDataResponse( - false, "No valid data found on any server", null); + false, null, "No valid data found on any server"); } System.out.println("Using latest data with timestamp: " + latestTimestamp); - System.out.println("Latest data content: " + latestData.getString("data")); + System.out.println("Latest data content: " + latestData.data()); - // Step 5: Return the synchronized data return new SynchronizeDataProtocolObject.SynchronizeDataResponse( - true, "Data synchronized successfully", latestData.getString("data")); + true, latestData.data(), null); } catch (Exception e) { System.out.println("Exception in sync endpoint: " + e.getMessage()); @@ -133,7 +130,7 @@ public SynchronizeDataProtocolObject.SynchronizeDataResponse onMessage( ServiceToServerManager.unlockPlayerData(serverUUIDs, playerUUID, dataKey); return new SynchronizeDataProtocolObject.SynchronizeDataResponse( - false, "Error during synchronization: " + e.getMessage(), null); + false, null, "Error during synchronization: " + e.getMessage()); } } } \ No newline at end of file diff --git a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UnlockDataEndpoint.java b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UnlockDataEndpoint.java index 43d70352c..527623380 100644 --- a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UnlockDataEndpoint.java +++ b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UnlockDataEndpoint.java @@ -34,12 +34,10 @@ public UnlockDataProtocolObject.UnlockDataResponse onMessage( // Release service-level lock DataLockManager.releaseLock(lockKey, requesterId); - // Release locks on all servers ServiceToServerManager.unlockPlayerData(serverUUIDs, playerUUID, dataKey) .thenAccept(results -> { - // Log any unlock failures for debugging results.forEach((serverUUID, response) -> { - if (!response.optBoolean("success", false)) { + if (!response.success()) { System.err.println("Failed to unlock data on server " + serverUUID + " for player " + playerUUID + ", dataKey: " + dataKey); } @@ -51,7 +49,7 @@ public UnlockDataProtocolObject.UnlockDataResponse onMessage( }); return new UnlockDataProtocolObject.UnlockDataResponse( - true, "Data unlocked successfully"); + true, null); } catch (Exception e) { return new UnlockDataProtocolObject.UnlockDataResponse( diff --git a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UpdateSynchronizedDataEndpoint.java b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UpdateSynchronizedDataEndpoint.java index 32279acda..74b033404 100644 --- a/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UpdateSynchronizedDataEndpoint.java +++ b/service.datamutex/src/main/java/net/swofty/service/datamutex/endpoints/UpdateSynchronizedDataEndpoint.java @@ -4,12 +4,11 @@ import org.tinylog.Logger; import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.objects.data.UpdatePlayerDataPushProtocol; import net.swofty.commons.protocol.objects.datamutex.UpdateSynchronizedDataProtocolObject; -import net.swofty.commons.service.FromServiceChannels; import net.swofty.service.datamutex.DataLockManager; import net.swofty.service.generic.redis.ServiceEndpoint; import net.swofty.service.generic.redis.ServiceToServerManager; -import org.json.JSONObject; import java.util.List; import java.util.Map; @@ -57,33 +56,25 @@ public UpdateSynchronizedDataProtocolObject.UpdateDataResponse onMessage( } System.out.println("Service lock verified successfully"); - // Step 1: Update data on all servers System.out.println("Updating data on servers: " + serverUUIDs); - Map> updateFutures = new java.util.HashMap<>(); + Map> updateFutures = new java.util.HashMap<>(); for (UUID serverUUID : serverUUIDs) { - JSONObject updateMessage = new JSONObject() - .put("playerUUID", playerUUID.toString()) - .put("dataKey", dataKey) - .put("newData", newData); - - System.out.println("Sending update to server " + serverUUID + ": " + updateMessage); + System.out.println("Sending update to server " + serverUUID); updateFutures.put(serverUUID, - ServiceToServerManager.sendToServer(serverUUID, FromServiceChannels.UPDATE_PLAYER_DATA, updateMessage)); + ServiceToServerManager.updatePlayerData(serverUUID, playerUUID, dataKey, newData)); } - // Wait for all updates System.out.println("Waiting for update responses..."); - Map updateResults = new java.util.HashMap<>(); - for (Map.Entry> entry : updateFutures.entrySet()) { - JSONObject result = entry.getValue().get(); + Map updateResults = new java.util.HashMap<>(); + for (Map.Entry> entry : updateFutures.entrySet()) { + UpdatePlayerDataPushProtocol.Response result = entry.getValue().get(); updateResults.put(entry.getKey(), result); System.out.println("Update result from " + entry.getKey() + ": " + result); } - // Check if all updates were successful boolean allUpdated = updateResults.values().stream() - .allMatch(result -> result.optBoolean("success", false)); + .allMatch(UpdatePlayerDataPushProtocol.Response::success); System.out.println("All servers updated successfully: " + allUpdated); @@ -95,7 +86,7 @@ public UpdateSynchronizedDataProtocolObject.UpdateDataResponse onMessage( System.out.println("All updates successful!"); return new UpdateSynchronizedDataProtocolObject.UpdateDataResponse( - true, "Data successfully synchronized across all servers"); + true, null); } catch (Exception e) { System.out.println("Exception in update endpoint: " + e.getMessage()); diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/CastVoteEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/CastVoteEndpoint.java index afc54eab5..e1bee4dc1 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/CastVoteEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/CastVoteEndpoint.java @@ -29,26 +29,26 @@ public CastVoteProtocolObject.CastVoteResponse onMessage( try { String rawData = ElectionDatabase.loadElectionData(); if (rawData == null) { - return new CastVoteProtocolObject.CastVoteResponse(false, null); + return new CastVoteProtocolObject.CastVoteResponse(false, null, "Vote failed"); } Map data = new Gson().fromJson(rawData, Map.class); Boolean electionOpen = (Boolean) data.get("electionOpen"); if (electionOpen == null || !electionOpen) { - return new CastVoteProtocolObject.CastVoteResponse(false, null); + return new CastVoteProtocolObject.CastVoteResponse(false, null, "Vote failed"); } int electionYear = ((Number) data.get("electionYear")).intValue(); List> candidates = (List>) data.get("candidates"); if (candidates == null) { - return new CastVoteProtocolObject.CastVoteResponse(false, null); + return new CastVoteProtocolObject.CastVoteResponse(false, null, "Vote failed"); } boolean validCandidate = candidates.stream() .anyMatch(c -> messageObject.candidateName().equals(c.get("mayorName"))); if (!validCandidate) { - return new CastVoteProtocolObject.CastVoteResponse(false, null); + return new CastVoteProtocolObject.CastVoteResponse(false, null, "Vote failed"); } ElectionDatabase.castVote( @@ -58,10 +58,10 @@ public CastVoteProtocolObject.CastVoteResponse onMessage( ); Map tallies = ElectionDatabase.getTallies(electionYear); - return new CastVoteProtocolObject.CastVoteResponse(true, tallies); + return new CastVoteProtocolObject.CastVoteResponse(true, tallies, null); } catch (Exception e) { Logger.error(e, "Failed to cast vote"); - return new CastVoteProtocolObject.CastVoteResponse(false, null); + return new CastVoteProtocolObject.CastVoteResponse(false, null, "Vote failed"); } } } diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetCandidatesEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetCandidatesEndpoint.java index e3ecd303b..52b043171 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetCandidatesEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetCandidatesEndpoint.java @@ -32,20 +32,20 @@ public GetCandidatesProtocolObject.GetCandidatesResponse onMessage( try { String rawData = ElectionDatabase.loadElectionData(); if (rawData == null) { - return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of()); + return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of(), true, null); } Map data = GSON.fromJson(rawData, Map.class); Boolean electionOpen = (Boolean) data.get("electionOpen"); if (electionOpen == null || !electionOpen) { - return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of()); + return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of(), true, null); } int electionYear = ((Number) data.get("electionYear")).intValue(); List> candidates = (List>) data.get("candidates"); if (candidates == null || candidates.isEmpty()) { - return new GetCandidatesProtocolObject.GetCandidatesResponse(true, List.of()); + return new GetCandidatesProtocolObject.GetCandidatesResponse(true, List.of(), true, null); } Map tallies = ElectionDatabase.getTallies(electionYear); @@ -61,10 +61,10 @@ public GetCandidatesProtocolObject.GetCandidatesResponse onMessage( infos.add(new GetCandidatesProtocolObject.CandidateInfo(name, perks, voteCount, pct)); } - return new GetCandidatesProtocolObject.GetCandidatesResponse(true, infos); + return new GetCandidatesProtocolObject.GetCandidatesResponse(true, infos, true, null); } catch (Exception e) { Logger.error(e, "Failed to get candidates"); - return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of()); + return new GetCandidatesProtocolObject.GetCandidatesResponse(false, List.of(), true, null); } } } diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetElectionDataEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetElectionDataEndpoint.java index 54ec89c11..ff1107d1e 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetElectionDataEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetElectionDataEndpoint.java @@ -30,7 +30,7 @@ public GetElectionDataProtocolObject.GetElectionDataResponse onMessage( GetElectionDataProtocolObject.GetElectionDataMessage messageObject) { String data = ElectionDatabase.loadElectionData(); if (data == null) { - return new GetElectionDataProtocolObject.GetElectionDataResponse(false, null); + return new GetElectionDataProtocolObject.GetElectionDataResponse(false, null, true, null); } try { @@ -45,10 +45,10 @@ public GetElectionDataProtocolObject.GetElectionDataResponse onMessage( parsed.put("voteTallies", tallies); } - return new GetElectionDataProtocolObject.GetElectionDataResponse(true, GSON.toJson(parsed)); + return new GetElectionDataProtocolObject.GetElectionDataResponse(true, GSON.toJson(parsed), true, null); } catch (Exception e) { Logger.error(e, "Failed to parse election data"); - return new GetElectionDataProtocolObject.GetElectionDataResponse(false, null); + return new GetElectionDataProtocolObject.GetElectionDataResponse(false, null, true, null); } } } diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetPlayerVoteEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetPlayerVoteEndpoint.java index 95ba1d31a..31ac3814e 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/GetPlayerVoteEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/GetPlayerVoteEndpoint.java @@ -30,23 +30,23 @@ public GetPlayerVoteProtocolObject.GetPlayerVoteResponse onMessage( try { String rawData = ElectionDatabase.loadElectionData(); if (rawData == null) { - return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null); + return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null, true, null); } Map data = GSON.fromJson(rawData, Map.class); Number yearNum = (Number) data.get("electionYear"); if (yearNum == null) { - return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null); + return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null, true, null); } String vote = ElectionDatabase.getPlayerVote( messageObject.accountId().toString(), yearNum.intValue() ); - return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(vote); + return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(vote, true, null); } catch (Exception e) { Logger.error(e, "Failed to get player vote"); - return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null); + return new GetPlayerVoteProtocolObject.GetPlayerVoteResponse(null, true, null); } } } diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/ResolveElectionEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/ResolveElectionEndpoint.java index 7d394683e..863d89f68 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/ResolveElectionEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/ResolveElectionEndpoint.java @@ -36,7 +36,7 @@ public ResolveElectionProtocolObject.ResolveElectionResponse onMessage( try { String rawData = ElectionDatabase.loadElectionData(); if (rawData == null) { - return new ResolveElectionProtocolObject.ResolveElectionResponse(false, null); + return new ResolveElectionProtocolObject.ResolveElectionResponse(false, null, true, null); } Map data = GSON.fromJson(rawData, Map.class); @@ -44,7 +44,7 @@ public ResolveElectionProtocolObject.ResolveElectionResponse onMessage( if (electionOpen == null || !electionOpen) { data.remove("votes"); - return new ResolveElectionProtocolObject.ResolveElectionResponse(false, GSON.toJson(data)); + return new ResolveElectionProtocolObject.ResolveElectionResponse(false, GSON.toJson(data), true, null); } int electionYear = messageObject.year(); @@ -62,7 +62,7 @@ public ResolveElectionProtocolObject.ResolveElectionResponse onMessage( sorted.sort((a, b) -> Long.compare(b.getValue(), a.getValue())); if (sorted.isEmpty()) { - return new ResolveElectionProtocolObject.ResolveElectionResponse(false, GSON.toJson(data)); + return new ResolveElectionProtocolObject.ResolveElectionResponse(false, GSON.toJson(data), true, null); } long topVotes = sorted.getFirst().getValue(); @@ -154,10 +154,10 @@ public ResolveElectionProtocolObject.ResolveElectionResponse onMessage( ElectionDatabase.saveElectionData(GSON.toJson(data)); - return new ResolveElectionProtocolObject.ResolveElectionResponse(true, GSON.toJson(data)); + return new ResolveElectionProtocolObject.ResolveElectionResponse(true, GSON.toJson(data), true, null); } catch (Exception e) { Logger.error(e, "Failed to resolve election"); - return new ResolveElectionProtocolObject.ResolveElectionResponse(false, null); + return new ResolveElectionProtocolObject.ResolveElectionResponse(false, null, true, null); } } diff --git a/service.elections/src/main/java/net/swofty/service/election/endpoints/StartElectionEndpoint.java b/service.elections/src/main/java/net/swofty/service/election/endpoints/StartElectionEndpoint.java index ca6c5444e..dc4d3008d 100644 --- a/service.elections/src/main/java/net/swofty/service/election/endpoints/StartElectionEndpoint.java +++ b/service.elections/src/main/java/net/swofty/service/election/endpoints/StartElectionEndpoint.java @@ -42,7 +42,7 @@ public StartElectionProtocolObject.StartElectionResponse onMessage( Map tallies = ElectionDatabase.getTallies(messageObject.year()); existing.put("voteTallies", tallies); existing.remove("votes"); - return new StartElectionProtocolObject.StartElectionResponse(false, GSON.toJson(existing)); + return new StartElectionProtocolObject.StartElectionResponse(false, GSON.toJson(existing), true, null); } } @@ -62,10 +62,10 @@ public StartElectionProtocolObject.StartElectionResponse onMessage( ElectionDatabase.initTallies(messageObject.year(), candidateNames); electionData.remove("votes"); - return new StartElectionProtocolObject.StartElectionResponse(true, GSON.toJson(electionData)); + return new StartElectionProtocolObject.StartElectionResponse(true, GSON.toJson(electionData), true, null); } catch (Exception e) { Logger.error(e, "Failed to start election"); - return new StartElectionProtocolObject.StartElectionResponse(false, null); + return new StartElectionProtocolObject.StartElectionResponse(false, null, true, null); } } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/FriendCache.java b/service.friend/src/main/java/net/swofty/service/friend/FriendCache.java index 2a413b255..5cd5ee6a8 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/FriendCache.java +++ b/service.friend/src/main/java/net/swofty/service/friend/FriendCache.java @@ -5,9 +5,9 @@ import net.swofty.commons.friend.*; import net.swofty.commons.friend.events.*; import net.swofty.commons.friend.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.objects.friend.FriendEventPushProtocol; +import net.swofty.commons.protocol.objects.messaging.SendMessagePushProtocol; import net.swofty.service.generic.redis.ServiceToServerManager; -import org.json.JSONObject; import org.bson.Document; import org.tinylog.Logger; @@ -496,12 +496,15 @@ private static void persistFriendData(UUID playerUuid) { } private static void sendEvent(FriendEvent event) { - JSONObject message = new JSONObject(); - message.put("eventType", event.getClass().getSimpleName()); - message.put("eventData", event.getSerializer().serialize(event)); - message.put("participants", event.getParticipants()); - - ServiceToServerManager.sendToAllServers(FromServiceChannels.PROPAGATE_FRIEND_EVENT, message); + ServiceToServerManager.sendToAllServers( + new FriendEventPushProtocol(), + new FriendEventPushProtocol.Request( + event.getClass().getSimpleName(), + event.getSerializer().serialize(event), + event.getParticipants() + ), + 300 + ); } private static void sendErrorToPlayer(UUID playerUUID, String message) { @@ -509,10 +512,10 @@ private static void sendErrorToPlayer(UUID playerUUID, String message) { } private static void sendMessageToPlayer(UUID playerUUID, String message) { - JSONObject messageData = new JSONObject(); - messageData.put("playerUUID", playerUUID.toString()); - messageData.put("message", message); - - ServiceToServerManager.sendToAllServers(FromServiceChannels.SEND_MESSAGE, messageData); + ServiceToServerManager.sendToAllServers( + new SendMessagePushProtocol(), + new SendMessagePushProtocol.Request(playerUUID, message), + 300 + ); } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/AreFriendsEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/AreFriendsEndpoint.java index 482b21708..ed7921420 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/AreFriendsEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/AreFriendsEndpoint.java @@ -20,6 +20,6 @@ public AreFriendsProtocolObject.AreFriendsResponse onMessage( AreFriendsProtocolObject.AreFriendsMessage messageObject) { boolean areFriends = FriendCache.areFriends(messageObject.player1(), messageObject.player2()); - return new AreFriendsProtocolObject.AreFriendsResponse(areFriends); + return new AreFriendsProtocolObject.AreFriendsResponse(areFriends, true, null); } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/FriendEventToServiceEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/FriendEventToServiceEndpoint.java index d084e7732..1fb50037e 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/FriendEventToServiceEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/FriendEventToServiceEndpoint.java @@ -61,11 +61,11 @@ public SendFriendEventToServiceProtocolObject.SendFriendEventToServiceResponse o default -> Logger.warn("Unknown friend event type: " + event.getClass().getSimpleName()); } - return new SendFriendEventToServiceProtocolObject.SendFriendEventToServiceResponse(true); + return new SendFriendEventToServiceProtocolObject.SendFriendEventToServiceResponse(true, null); } catch (Exception e) { System.out.println("Failed to process friend event: " + e.getMessage()); Logger.error(e, "Failed to process friend event in service endpoint"); - return new SendFriendEventToServiceProtocolObject.SendFriendEventToServiceResponse(false); + return new SendFriendEventToServiceProtocolObject.SendFriendEventToServiceResponse(false, "Event processing failed"); } } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetFriendDataEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetFriendDataEndpoint.java index ab0c25a29..438fae9d5 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetFriendDataEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetFriendDataEndpoint.java @@ -21,6 +21,6 @@ public GetFriendDataProtocolObject.GetFriendDataResponse onMessage( GetFriendDataProtocolObject.GetFriendDataMessage messageObject) { FriendData data = FriendCache.getFriendData(messageObject.playerUuid()); - return new GetFriendDataProtocolObject.GetFriendDataResponse(data); + return new GetFriendDataProtocolObject.GetFriendDataResponse(data, true, null); } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPendingRequestsEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPendingRequestsEndpoint.java index 721ea2658..e823184c3 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPendingRequestsEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPendingRequestsEndpoint.java @@ -23,6 +23,6 @@ public GetPendingFriendRequestsProtocolObject.GetPendingRequestsResponse onMessa GetPendingFriendRequestsProtocolObject.GetPendingRequestsMessage messageObject) { List requests = FriendCache.getPendingRequestsFor(messageObject.playerUuid()); - return new GetPendingFriendRequestsProtocolObject.GetPendingRequestsResponse(requests); + return new GetPendingFriendRequestsProtocolObject.GetPendingRequestsResponse(requests, true, null); } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPresenceEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPresenceEndpoint.java index 925c5d2f4..2385ae98a 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPresenceEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/GetPresenceEndpoint.java @@ -23,7 +23,7 @@ public GetPresenceBulkProtocolObject.GetPresenceBulkResponse onMessage( GetPresenceBulkProtocolObject.GetPresenceBulkMessage messageObject) { List presence = PresenceStorage.getBulk(messageObject.uuids()); - return new GetPresenceBulkProtocolObject.GetPresenceBulkResponse(presence); + return new GetPresenceBulkProtocolObject.GetPresenceBulkResponse(presence, true, null); } } diff --git a/service.friend/src/main/java/net/swofty/service/friend/endpoints/UpdatePresenceEndpoint.java b/service.friend/src/main/java/net/swofty/service/friend/endpoints/UpdatePresenceEndpoint.java index ea355bc62..ce678d89f 100644 --- a/service.friend/src/main/java/net/swofty/service/friend/endpoints/UpdatePresenceEndpoint.java +++ b/service.friend/src/main/java/net/swofty/service/friend/endpoints/UpdatePresenceEndpoint.java @@ -35,7 +35,7 @@ public UpdatePresenceProtocolObject.UpdatePresenceResponse onMessage( } } - return new UpdatePresenceProtocolObject.UpdatePresenceResponse(true); + return new UpdatePresenceProtocolObject.UpdatePresenceResponse(true, null); } } diff --git a/service.generic/src/main/java/net/swofty/service/generic/ServiceInitializer.java b/service.generic/src/main/java/net/swofty/service/generic/ServiceInitializer.java index b82709ea0..78d3840c6 100644 --- a/service.generic/src/main/java/net/swofty/service/generic/ServiceInitializer.java +++ b/service.generic/src/main/java/net/swofty/service/generic/ServiceInitializer.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import net.swofty.commons.config.ConfigProvider; import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.redis.RedisEnvelope; import net.swofty.commons.skyblock.item.attribute.ItemAttribute; import net.swofty.commons.protocol.ProtocolObject; import net.swofty.redisapi.api.ChannelRegistry; @@ -52,7 +53,7 @@ public void init() { RedisAPI.getInstance().publishMessage(request.getRequestServer(), ChannelRegistry.getFromName(request.getEndpoint()), - request.getRequestId() + "}=-=---={" + response).join(); + new RedisEnvelope(request.getRequestId().toString(), service.getType().name(), response).serialize()).join(); }); }); }); diff --git a/service.generic/src/main/java/net/swofty/service/generic/redis/ServiceToServerManager.java b/service.generic/src/main/java/net/swofty/service/generic/redis/ServiceToServerManager.java index b66086cb4..1c690599d 100644 --- a/service.generic/src/main/java/net/swofty/service/generic/redis/ServiceToServerManager.java +++ b/service.generic/src/main/java/net/swofty/service/generic/redis/ServiceToServerManager.java @@ -1,7 +1,14 @@ package net.swofty.service.generic.redis; import net.swofty.commons.ServiceType; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.redis.RedisEnvelope; +import net.swofty.commons.protocol.objects.data.GetPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.LockPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.UnlockPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.UpdatePlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.game.GameInformationPushProtocol; +import net.swofty.commons.protocol.objects.gui.KickFromGUIPushProtocol; import net.swofty.redisapi.api.ChannelRegistry; import net.swofty.redisapi.api.RedisAPI; import org.json.JSONObject; @@ -10,6 +17,7 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.*; +import java.util.concurrent.TimeoutException; public class ServiceToServerManager { private static final Map> pendingRequests = new ConcurrentHashMap<>(); @@ -29,186 +37,171 @@ public static void initialize(ServiceType serviceType) { // Register response handler for server responses RedisAPI.getInstance().registerChannel("service_response", (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - UUID requestId = UUID.fromString(split[0].substring(split[0].indexOf(";") + 1)); - String response = split[1]; + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID requestId = UUID.fromString(envelope.id()); CompletableFuture future = pendingRequests.remove(requestId); if (future != null) { - future.complete(new JSONObject(response)); + future.complete(new JSONObject(envelope.payload())); } }); RedisAPI.getInstance().registerChannel("service_broadcast_response", (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - UUID requestId = UUID.fromString(split[0].substring(split[0].indexOf(";") + 1)); - UUID serverUUID = UUID.fromString(split[1]); - String response = split[2]; + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID requestId = UUID.fromString(envelope.id()); + UUID serverUUID = UUID.fromString(envelope.from()); BroadcastRequest broadcastRequest = pendingBroadcastRequests.get(requestId); if (broadcastRequest != null) { - broadcastRequest.addResponse(serverUUID, new JSONObject(response)); + broadcastRequest.addResponse(serverUUID, new JSONObject(envelope.payload())); } }); } - /** - * Send a message to a specific server - */ - public static CompletableFuture sendToServer(UUID serverUUID, FromServiceChannels channel, JSONObject message) { + public static CompletableFuture sendToServer( + UUID serverUUID, + ServicePushProtocol protocol, + T message + ) { UUID requestId = UUID.randomUUID(); - CompletableFuture future = new CompletableFuture<>(); + CompletableFuture future = new CompletableFuture<>(); + CompletableFuture rawFuture = new CompletableFuture<>(); - pendingRequests.put(requestId, future); + pendingRequests.put(requestId, rawFuture); - // Set timeout - future.orTimeout(10, TimeUnit.SECONDS).exceptionally(throwable -> { + rawFuture.orTimeout(10, TimeUnit.SECONDS).exceptionally(throwable -> { pendingRequests.remove(requestId); - return new JSONObject().put("error", "timeout"); + return null; + }); + + rawFuture.thenAccept(json -> { + if (json == null) { + future.completeExceptionally(new TimeoutException("Service push timed out")); + return; + } + try { + R response = protocol.translateReturnFromString(json.toString()); + future.complete(response); + } catch (Exception e) { + future.completeExceptionally(e); + } }); - String channelName = "service_" + channel.getChannelName(); - String messageContent = currentServiceType.name() + "}=-=-={" + requestId + "}=-=-={" + message.toString(); + String serialized = protocol.translateToString(message); + String channelName = "service_" + protocol.channel(); RedisAPI.getInstance().publishMessage( serverUUID.toString(), ChannelRegistry.getFromName(channelName), - messageContent + new RedisEnvelope(requestId.toString(), currentServiceType.name(), serialized).serialize() ); return future; } - /** - * Send a message to multiple servers and collect all responses - */ - public static CompletableFuture> sendToServers(List serverUUIDs, FromServiceChannels channel, JSONObject message) { - Map> futures = new ConcurrentHashMap<>(); - - for (UUID serverUUID : serverUUIDs) { - futures.put(serverUUID, sendToServer(serverUUID, channel, message)); - } - - return CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0])) - .thenApply(v -> { - Map results = new ConcurrentHashMap<>(); - futures.forEach((uuid, future) -> { - try { - results.put(uuid, future.get()); - } catch (Exception e) { - results.put(uuid, new JSONObject().put("error", e.getMessage())); - } - }); - return results; - }); - } - - /** - * Send a message to ALL servers and collect responses - */ - public static CompletableFuture> sendToAllServers(FromServiceChannels channel, JSONObject message) { - return sendToAllServers(channel, message, 300); // Default 300ms timeout - } - - /** - * Send a message to all servers and collect responses for up to `timeoutMs` milliseconds. - * When the timeout elapses, completes the future with whatever has been collected so far. - */ - public static CompletableFuture> sendToAllServers( - FromServiceChannels channel, - JSONObject message, + public static CompletableFuture> sendToAllServers( + ServicePushProtocol protocol, + T message, int timeoutMs ) { UUID requestId = UUID.randomUUID(); - CompletableFuture> future = new CompletableFuture<>(); + CompletableFuture> rawFuture = new CompletableFuture<>(); + CompletableFuture> typedFuture = new CompletableFuture<>(); - // Track this request - BroadcastRequest broadcastRequest = new BroadcastRequest(future); + BroadcastRequest broadcastRequest = new BroadcastRequest(rawFuture); pendingBroadcastRequests.put(requestId, broadcastRequest); - // Build and publish the Redis message - String channelName = "service_broadcast_" + channel.getChannelName(); - String messageContent = currentServiceType.name() - + "}=-=-={" + requestId - + "}=-=-={" + message.toString(); - RedisAPI.getInstance() - .publishMessage("all", - ChannelRegistry.getFromName(channelName), - messageContent); - - // Schedule the timeout task + String serialized = protocol.translateToString(message); + String channelName = "service_broadcast_" + protocol.channel(); + + RedisAPI.getInstance().publishMessage("all", + ChannelRegistry.getFromName(channelName), + new RedisEnvelope(requestId.toString(), currentServiceType.name(), serialized).serialize()); + scheduler.schedule(() -> { - // Remove from pending and complete with collected responses BroadcastRequest req = pendingBroadcastRequests.remove(requestId); if (req != null) { req.getFuture().complete(req.getResponses()); } }, timeoutMs, TimeUnit.MILLISECONDS); - return future; + rawFuture.thenAccept(rawMap -> { + Map typedMap = new ConcurrentHashMap<>(); + rawMap.forEach((uuid, json) -> { + try { + typedMap.put(uuid, protocol.translateReturnFromString(json.toString())); + } catch (Exception e) { + System.err.println("Failed to deserialize push response from " + uuid + ": " + e.getMessage()); + } + }); + typedFuture.complete(typedMap); + }); + + return typedFuture; } - /** - * Get player data from a specific server - */ - public static CompletableFuture getPlayerData(UUID serverUUID, UUID playerUUID, String dataKey) { - JSONObject message = new JSONObject() - .put("playerUUID", playerUUID.toString()) - .put("dataKey", dataKey); + public static CompletableFuture> sendToServers( + List serverUUIDs, + ServicePushProtocol protocol, + T message + ) { + Map> futures = new ConcurrentHashMap<>(); + + for (UUID serverUUID : serverUUIDs) { + futures.put(serverUUID, sendToServer(serverUUID, protocol, message)); + } - return sendToServer(serverUUID, FromServiceChannels.GET_SKYBLOCK_DATA, message); + return CompletableFuture.allOf(futures.values().toArray(new CompletableFuture[0])) + .thenApply(v -> { + Map results = new ConcurrentHashMap<>(); + futures.forEach((uuid, future) -> { + try { + results.put(uuid, future.get()); + } catch (Exception e) { + // skip failed entries + } + }); + return results; + }); } - /** - * Update player data on a specific server - */ - public static CompletableFuture updatePlayerData(UUID serverUUID, UUID playerUUID, String dataKey, JSONObject newData) { - JSONObject message = new JSONObject() - .put("playerUUID", playerUUID.toString()) - .put("dataKey", dataKey) - .put("newData", newData); + private static final GetPlayerDataPushProtocol GET_PLAYER_DATA_PROTOCOL = new GetPlayerDataPushProtocol(); + private static final UpdatePlayerDataPushProtocol UPDATE_PLAYER_DATA_PROTOCOL = new UpdatePlayerDataPushProtocol(); + private static final LockPlayerDataPushProtocol LOCK_PLAYER_DATA_PROTOCOL = new LockPlayerDataPushProtocol(); + private static final UnlockPlayerDataPushProtocol UNLOCK_PLAYER_DATA_PROTOCOL = new UnlockPlayerDataPushProtocol(); - return sendToServer(serverUUID, FromServiceChannels.UPDATE_PLAYER_DATA, message); + public static CompletableFuture getPlayerData(UUID serverUUID, UUID playerUUID, String dataKey) { + return sendToServer(serverUUID, GET_PLAYER_DATA_PROTOCOL, + new GetPlayerDataPushProtocol.Request(playerUUID, dataKey)); } - /** - * Lock player data across multiple servers (for mutex operations) - */ - public static CompletableFuture> lockPlayerData(List serverUUIDs, UUID playerUUID, String dataKey) { - JSONObject message = new JSONObject() - .put("playerUUID", playerUUID.toString()) - .put("dataKey", dataKey); - - return sendToServers(serverUUIDs, FromServiceChannels.LOCK_PLAYER_DATA, message); + public static CompletableFuture updatePlayerData(UUID serverUUID, UUID playerUUID, String dataKey, String newData) { + return sendToServer(serverUUID, UPDATE_PLAYER_DATA_PROTOCOL, + new UpdatePlayerDataPushProtocol.Request(playerUUID, dataKey, newData)); } - /** - * Unlock player data across multiple servers - */ - public static CompletableFuture> unlockPlayerData(List serverUUIDs, UUID playerUUID, String dataKey) { - JSONObject message = new JSONObject() - .put("playerUUID", playerUUID.toString()) - .put("dataKey", dataKey); + public static CompletableFuture> lockPlayerData(List serverUUIDs, UUID playerUUID, String dataKey) { + return sendToServers(serverUUIDs, LOCK_PLAYER_DATA_PROTOCOL, + new LockPlayerDataPushProtocol.Request(playerUUID, dataKey)); + } - return sendToServers(serverUUIDs, FromServiceChannels.UNLOCK_PLAYER_DATA, message); + public static CompletableFuture> unlockPlayerData(List serverUUIDs, UUID playerUUID, String dataKey) { + return sendToServers(serverUUIDs, UNLOCK_PLAYER_DATA_PROTOCOL, + new UnlockPlayerDataPushProtocol.Request(playerUUID, dataKey)); } - /** - * Kick players from specific GUIs (like bank interface) - */ - public static CompletableFuture> kickFromGUI(List serverUUIDs, List playerUUIDs, String guiType) { - JSONObject message = new JSONObject() - .put("playerUUIDs", playerUUIDs) - .put("guiType", guiType); + private static final KickFromGUIPushProtocol KICK_FROM_GUI_PROTOCOL = new KickFromGUIPushProtocol(); + private static final GameInformationPushProtocol GAME_INFORMATION_PROTOCOL = new GameInformationPushProtocol(); - return sendToServers(serverUUIDs, FromServiceChannels.KICK_FROM_GUI, message); + public static CompletableFuture> kickFromGUI(List serverUUIDs, List playerUUIDs, String guiType) { + return sendToServers(serverUUIDs, KICK_FROM_GUI_PROTOCOL, + new KickFromGUIPushProtocol.Request(playerUUIDs, guiType)); } - public static CompletableFuture> gameInformation(UUID serverUUID, UUID playerUUID, String gameId) { - JSONObject message = new JSONObject() - .put("uuid", playerUUID) - .put("game-id", gameId); - - return sendToServers(List.of(serverUUID), FromServiceChannels.GAME_INFORMATION, message); + public static CompletableFuture> gameInformation(UUID serverUUID, UUID playerUUID, String gameId) { + return sendToServers(List.of(serverUUID), GAME_INFORMATION_PROTOCOL, + new GameInformationPushProtocol.Request(playerUUID, gameId)); } } \ No newline at end of file diff --git a/service.itemtracker/src/main/java/net/swofty/service/itemtracker/endpoints/EndpointGetTrackedItem.java b/service.itemtracker/src/main/java/net/swofty/service/itemtracker/endpoints/EndpointGetTrackedItem.java index 44890be51..9cc671a73 100644 --- a/service.itemtracker/src/main/java/net/swofty/service/itemtracker/endpoints/EndpointGetTrackedItem.java +++ b/service.itemtracker/src/main/java/net/swofty/service/itemtracker/endpoints/EndpointGetTrackedItem.java @@ -26,6 +26,6 @@ public TrackedItemRetrieveProtocolObject.TrackedItemResponse onMessage(ServicePr } TrackedItem item = new TrackedItemsDatabase(itemUUID).get(); - return new TrackedItemRetrieveProtocolObject.TrackedItemResponse(item); + return new TrackedItemRetrieveProtocolObject.TrackedItemResponse(item, true, null); } } \ No newline at end of file diff --git a/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/GameChooseEndpoint.java b/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/GameChooseEndpoint.java index ada718565..b301bc696 100644 --- a/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/GameChooseEndpoint.java +++ b/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/GameChooseEndpoint.java @@ -19,7 +19,7 @@ public ProtocolObject handleBedwars(body); case MURDER_MYSTERY_GAME -> handleMurderMystery(body); case SKYWARS_GAME -> handleSkywars(body); - default -> new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + default -> new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); }; } @@ -42,7 +41,7 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleBedwars( try { BedwarsGameType gameType = parseBedwarsGameType(body.mode()); if (gameType == null) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } int neededSlots = body.neededSlots() > 0 ? body.neededSlots() : 1; @@ -61,29 +60,23 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleBedwars( hostingServer.maxPlayers(), hostingServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString()); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString(), true, null); } } // If no existing game found, find a server that can instantiate a new one OrchestratorCache.GameServerState availableServer = OrchestratorCache.instantiateServer(gameType, body.map()); if (availableServer != null) { - // Send service message to create the game - JSONObject instantiateMessage = new JSONObject(); - instantiateMessage.put("gameType", gameType.toString()); - instantiateMessage.put("map", body.map()); - try { - CompletableFuture responseFuture = ServiceToServerManager.sendToServer( + CompletableFuture responseFuture = ServiceToServerManager.sendToServer( availableServer.uuid(), - FromServiceChannels.INSTANTIATE_GAME, - instantiateMessage + new InstantiateGamePushProtocol(), + new InstantiateGamePushProtocol.Request(gameType.toString(), body.map()) ); - JSONObject response = responseFuture.get(); + InstantiateGamePushProtocol.Response response = responseFuture.get(); - if (response != null && response.optBoolean("success", false)) { - // Game created successfully, return the server + if (response != null && response.success()) { UnderstandableProxyServer proxy = new UnderstandableProxyServer( availableServer.shortName(), availableServer.uuid(), @@ -93,16 +86,16 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleBedwars( availableServer.maxPlayers(), availableServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.getString("gameId")); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.gameId(), true, null); } } catch (Exception e) { System.err.println("Failed to instantiate Bedwars game: " + e.getMessage()); } } - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } catch (Exception e) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } } @@ -111,7 +104,7 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleMurderMyster try { MurderMysteryGameType gameType = parseMurderMysteryGameType(body.mode()); if (gameType == null) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } int neededSlots = body.neededSlots() > 0 ? body.neededSlots() : 1; @@ -131,7 +124,7 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleMurderMyster hostingServer.maxPlayers(), hostingServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString()); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString(), true, null); } } @@ -139,22 +132,16 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleMurderMyster OrchestratorCache.GameServerState availableServer = OrchestratorCache.instantiateServer( ServerType.MURDER_MYSTERY_GAME, gameType.getMaxPlayers()); if (availableServer != null) { - // Send service message to create the game - JSONObject instantiateMessage = new JSONObject(); - instantiateMessage.put("gameType", gameType.name()); - instantiateMessage.put("map", body.map()); - try { - CompletableFuture responseFuture = ServiceToServerManager.sendToServer( + CompletableFuture responseFuture = ServiceToServerManager.sendToServer( availableServer.uuid(), - FromServiceChannels.INSTANTIATE_GAME, - instantiateMessage + new InstantiateGamePushProtocol(), + new InstantiateGamePushProtocol.Request(gameType.name(), body.map()) ); - JSONObject response = responseFuture.get(); + InstantiateGamePushProtocol.Response response = responseFuture.get(); - if (response != null && response.optBoolean("success", false)) { - // Game created successfully, return the server + if (response != null && response.success()) { UnderstandableProxyServer proxy = new UnderstandableProxyServer( availableServer.shortName(), availableServer.uuid(), @@ -164,16 +151,16 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleMurderMyster availableServer.maxPlayers(), availableServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.getString("gameId")); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.gameId(), true, null); } } catch (Exception e) { System.err.println("Failed to instantiate Murder Mystery game: " + e.getMessage()); } } - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } catch (Exception e) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } } @@ -219,7 +206,7 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleSkywars( try { SkywarsGameType gameType = parseSkywarsGameType(body.mode()); if (gameType == null) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } int neededSlots = body.neededSlots() > 0 ? body.neededSlots() : 1; @@ -239,7 +226,7 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleSkywars( hostingServer.maxPlayers(), hostingServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString()); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, existingGameWithServer.game().getGameId().toString(), true, null); } } @@ -247,22 +234,16 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleSkywars( OrchestratorCache.GameServerState availableServer = OrchestratorCache.instantiateServer( ServerType.SKYWARS_GAME, gameType.getMaxPlayers()); if (availableServer != null) { - // Send service message to create the game - JSONObject instantiateMessage = new JSONObject(); - instantiateMessage.put("gameType", gameType.name()); - instantiateMessage.put("map", body.map()); - try { - CompletableFuture responseFuture = ServiceToServerManager.sendToServer( + CompletableFuture responseFuture = ServiceToServerManager.sendToServer( availableServer.uuid(), - FromServiceChannels.INSTANTIATE_GAME, - instantiateMessage + new InstantiateGamePushProtocol(), + new InstantiateGamePushProtocol.Request(gameType.name(), body.map()) ); - JSONObject response = responseFuture.get(); + InstantiateGamePushProtocol.Response response = responseFuture.get(); - if (response != null && response.optBoolean("success", false)) { - // Game created successfully, return the server + if (response != null && response.success()) { UnderstandableProxyServer proxy = new UnderstandableProxyServer( availableServer.shortName(), availableServer.uuid(), @@ -272,16 +253,16 @@ private GetServerForMapProtocolObject.GetServerForMapResponse handleSkywars( availableServer.maxPlayers(), availableServer.shortName() ); - return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.getString("gameId")); + return new GetServerForMapProtocolObject.GetServerForMapResponse(proxy, response.gameId(), true, null); } } catch (Exception e) { System.err.println("Failed to instantiate Skywars game: " + e.getMessage()); } } - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } catch (Exception e) { - return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null); + return new GetServerForMapProtocolObject.GetServerForMapResponse(null, null, true, null); } } diff --git a/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/RejoinGameEndpoint.java b/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/RejoinGameEndpoint.java index 2b27ed92e..a2c987a5e 100644 --- a/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/RejoinGameEndpoint.java +++ b/service.orchestrator/src/main/java/net/swofty/service/orchestrator/endpoints/RejoinGameEndpoint.java @@ -27,17 +27,17 @@ public RejoinGameProtocolObject.RejoinGameResponse onMessage(ServiceProxyRequest OrchestratorCache.GameWithServer gameWithServer = OrchestratorCache.findPlayerGame(body.playerUuid()); if (gameWithServer == null) { - return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false); + return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false, true, null); } OrchestratorCache.GameServerState hostingServer = OrchestratorCache.getServerByUuid(gameWithServer.serverUuid()); if (hostingServer == null) { - return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false); + return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false, true, null); } // Skywars does not support rejoining if (hostingServer.type() == ServerType.SKYWARS_GAME) { - return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false); + return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false, true, null); } // Check if this player is in the disconnected list (meaning they should rejoin) @@ -47,7 +47,7 @@ public RejoinGameProtocolObject.RejoinGameResponse onMessage(ServiceProxyRequest if (!isDisconnected) { // Player is already in an active game, not a rejoin scenario - return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false); + return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false, true, null); } UnderstandableProxyServer proxy = new UnderstandableProxyServer( @@ -65,12 +65,14 @@ public RejoinGameProtocolObject.RejoinGameResponse onMessage(ServiceProxyRequest proxy, gameWithServer.game().getGameId().toString(), gameWithServer.game().getMap(), - null, // Team name not available from commons Game, will be determined on game server - false // Whether spectator determined on game server based on current bed status + null, + false, + true, + null ); } catch (Exception e) { System.err.println("Failed to check rejoin: " + e.getMessage()); - return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false); + return new RejoinGameProtocolObject.RejoinGameResponse(false, null, null, null, null, false, true, null); } } } diff --git a/service.party/src/main/java/net/swofty/service/party/PartyCache.java b/service.party/src/main/java/net/swofty/service/party/PartyCache.java index 4f8e3f16c..c32e79b5d 100644 --- a/service.party/src/main/java/net/swofty/service/party/PartyCache.java +++ b/service.party/src/main/java/net/swofty/service/party/PartyCache.java @@ -5,7 +5,8 @@ import net.swofty.commons.party.PendingParty; import net.swofty.commons.party.events.*; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.objects.messaging.SendMessagePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; import net.swofty.service.generic.redis.ServiceToServerManager; import org.json.JSONObject; @@ -277,24 +278,23 @@ public static void handleWarpRequest(PartyWarpRequestEvent event) { .execute(() -> partyWarpCooldown.remove(warperUUID)); PartyWarpResponseEvent responseEvent = new PartyWarpResponseEvent(party, warperUUID); - JSONObject message = new JSONObject(); - message.put("eventType", responseEvent.getClass().getSimpleName()); - message.put("eventData", responseEvent.getSerializer().serialize(responseEvent)); - message.put("participants", responseEvent.getParticipants()); + + PartyEventPushProtocol.Request request = new PartyEventPushProtocol.Request( + responseEvent.getClass().getSimpleName(), + responseEvent.getSerializer().serialize(responseEvent), + responseEvent.getParticipants() + ); List intendedToWarp = party.getParticipants().stream().filter(uuid -> !uuid.equals(warperUUID)).toList(); - Map responses = ServiceToServerManager.sendToAllServers(FromServiceChannels.PROPAGATE_PARTY_EVENT, message, 3000).join(); + Map responses = ServiceToServerManager.sendToAllServers( + new PartyEventPushProtocol(), request, 3000).join(); List actualWarped = new ArrayList<>(); Map failureReasons = new HashMap<>(); - for (JSONObject response : responses.values()) { - boolean success = response.getBoolean("success"); - - // Check if the warp was blocked (e.g., game already started) - if (!success) { - if (response.optBoolean("blocked", false)) { - String blockReason = response.optString("blockReason", "Unable to warp"); - // Apply block reason to all intended warp targets + for (PartyEventPushProtocol.Response response : responses.values()) { + if (!response.success()) { + if (response.blocked()) { + String blockReason = response.blockReason() != null ? response.blockReason() : "Unable to warp"; for (UUID uuid : intendedToWarp) { failureReasons.put(uuid, blockReason); } @@ -302,31 +302,14 @@ public static void handleWarpRequest(PartyWarpRequestEvent event) { continue; } - List playersHandledUuids = response.getJSONArray("playersHandledUUIDs") - .toList().stream().map(object -> { - try { - return UUID.fromString(object.toString()); - } catch (Exception e) { - return null; - } - }).toList(); - - for (UUID uuid : playersHandledUuids) { + for (UUID uuid : response.playersHandledUUIDs()) { if (intendedToWarp.contains(uuid)) { actualWarped.add(uuid); } } - // Collect rejection reasons from server response - if (response.has("rejectedPlayers")) { - JSONObject rejectedPlayers = response.getJSONObject("rejectedPlayers"); - for (String key : rejectedPlayers.keySet()) { - try { - UUID rejectedUuid = UUID.fromString(key); - String reason = rejectedPlayers.getString(key); - failureReasons.put(rejectedUuid, reason); - } catch (Exception ignored) {} - } + if (response.rejectedPlayers() != null) { + failureReasons.putAll(response.rejectedPlayers()); } } @@ -492,12 +475,15 @@ private static void disbandParty(FullParty party, UUID disbander) { } private static void sendEvent(PartyEvent event) { - JSONObject message = new JSONObject(); - message.put("eventType", event.getClass().getSimpleName()); - message.put("eventData", event.getSerializer().serialize(event)); - message.put("participants", event.getParticipants()); - - ServiceToServerManager.sendToAllServers(FromServiceChannels.PROPAGATE_PARTY_EVENT, message); + ServiceToServerManager.sendToAllServers( + new PartyEventPushProtocol(), + new PartyEventPushProtocol.Request( + event.getClass().getSimpleName(), + event.getSerializer().serialize(event), + event.getParticipants() + ), + 300 + ); } private static void sendErrorToPlayer(UUID playerUUID, String message) { @@ -505,11 +491,11 @@ private static void sendErrorToPlayer(UUID playerUUID, String message) { } private static void sendMessageToPlayer(UUID playerUUID, String message) { - JSONObject messageData = new JSONObject(); - messageData.put("playerUUID", playerUUID.toString()); - messageData.put("message", message); - - ServiceToServerManager.sendToAllServers(FromServiceChannels.SEND_MESSAGE, messageData); + ServiceToServerManager.sendToAllServers( + new SendMessagePushProtocol(), + new SendMessagePushProtocol.Request(playerUUID, message), + 300 + ); } private static FullParty getPlayerParty(UUID playerUUID) { diff --git a/service.party/src/main/java/net/swofty/service/party/endpoints/GetPartyEndpoint.java b/service.party/src/main/java/net/swofty/service/party/endpoints/GetPartyEndpoint.java index 955cd1c86..59f588dcf 100644 --- a/service.party/src/main/java/net/swofty/service/party/endpoints/GetPartyEndpoint.java +++ b/service.party/src/main/java/net/swofty/service/party/endpoints/GetPartyEndpoint.java @@ -22,6 +22,6 @@ public GetPartyProtocolObject.GetPartyResponse onMessage(ServiceProxyRequest mes UUID memberUUID = messageObject.memberUuid(); FullParty party = PartyCache.getPartyFromPlayer(memberUUID); if (party == null) throw new RuntimeException("Player is not in a party"); - return new GetPartyProtocolObject.GetPartyResponse(party); + return new GetPartyProtocolObject.GetPartyResponse(party, true, null); } } diff --git a/service.party/src/main/java/net/swofty/service/party/endpoints/IsPlayerInPartyEndpoint.java b/service.party/src/main/java/net/swofty/service/party/endpoints/IsPlayerInPartyEndpoint.java index e3530e475..0abb8a6e2 100644 --- a/service.party/src/main/java/net/swofty/service/party/endpoints/IsPlayerInPartyEndpoint.java +++ b/service.party/src/main/java/net/swofty/service/party/endpoints/IsPlayerInPartyEndpoint.java @@ -22,6 +22,6 @@ public IsPlayerInPartyProtocolObject.IsPlayerInPartyResponse onMessage(ServicePr boolean isInParty = PartyCache.isInParty(playerUUID); - return new IsPlayerInPartyProtocolObject.IsPlayerInPartyResponse(isInParty); + return new IsPlayerInPartyProtocolObject.IsPlayerInPartyResponse(isInParty, true, null); } } \ No newline at end of file diff --git a/service.party/src/main/java/net/swofty/service/party/endpoints/PartyEventToServiceEndpoint.java b/service.party/src/main/java/net/swofty/service/party/endpoints/PartyEventToServiceEndpoint.java index e58461e5c..01ff222a8 100644 --- a/service.party/src/main/java/net/swofty/service/party/endpoints/PartyEventToServiceEndpoint.java +++ b/service.party/src/main/java/net/swofty/service/party/endpoints/PartyEventToServiceEndpoint.java @@ -44,11 +44,11 @@ public SendPartyEventToServiceProtocolObject.SendPartyEventToServiceResponse onM default -> Logger.warn("Unknown party event type: " + event.getClass().getSimpleName()); } - return new SendPartyEventToServiceProtocolObject.SendPartyEventToServiceResponse(true); + return new SendPartyEventToServiceProtocolObject.SendPartyEventToServiceResponse(true, null); } catch (Exception e) { System.out.println("Failed to process party event: " + e.getMessage()); Logger.error(e, "Failed to process party event in service endpoint"); - return new SendPartyEventToServiceProtocolObject.SendPartyEventToServiceResponse(false); + return new SendPartyEventToServiceProtocolObject.SendPartyEventToServiceResponse(false, "Event processing failed"); } } } \ No newline at end of file diff --git a/service.punishment/src/main/java/net/swofty/service/punishment/ProxyRedis.java b/service.punishment/src/main/java/net/swofty/service/punishment/ProxyRedis.java index d068ab929..f6eb9d655 100644 --- a/service.punishment/src/main/java/net/swofty/service/punishment/ProxyRedis.java +++ b/service.punishment/src/main/java/net/swofty/service/punishment/ProxyRedis.java @@ -4,8 +4,8 @@ import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; -import net.swofty.commons.proxy.ToProxyChannels; -import org.json.JSONObject; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.redis.RedisEnvelope; import java.net.URI; import java.time.Duration; @@ -63,13 +63,14 @@ public static CompletableFuture publishMessage(String filterId, String cha }); } - public static void publishToProxy(ToProxyChannels channel, JSONObject message) { + public static void publishToProxy(ProtocolObject protocol, T message) { UUID uuid = UUID.randomUUID(); - publishMessage("proxy", channel.getChannelName(), - message.toString() + "}=-=-={" + uuid + "}=-=-={" + uuid); + String serialized = protocol.translateToString(message); + publishMessage("proxy", protocol.channel(), + new RedisEnvelope(uuid.toString(), uuid.toString(), serialized).serialize()); } public static boolean isInitialized() { return initialized && jedisPool != null && !jedisPool.isClosed(); } -} \ No newline at end of file +} diff --git a/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/GetActivePunishmentEndpoint.java b/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/GetActivePunishmentEndpoint.java index 225887560..0dab4f1f9 100644 --- a/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/GetActivePunishmentEndpoint.java +++ b/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/GetActivePunishmentEndpoint.java @@ -23,7 +23,7 @@ public ProtocolObject existing = PunishmentRedis.getActive(messageObject.target(), messageObject.type()); if (existing.isEmpty()) { - return new GetActivePunishmentProtocolObject.GetActivePunishmentResponse(false, null, null, null, 0, List.of()); + return new GetActivePunishmentProtocolObject.GetActivePunishmentResponse(false, null, null, null, 0, List.of(), true, null); } ActivePunishment punishment = existing.get(); @@ -33,7 +33,9 @@ public GetActivePunishmentProtocolObject.GetActivePunishmentResponse onMessage(S punishment.banId(), punishment.reason(), punishment.expiresAt(), - punishment.tags() + punishment.tags(), + true, + null ); } } diff --git a/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/PunishPlayerEndpoint.java b/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/PunishPlayerEndpoint.java index 8d7ea68f2..970b7b0cd 100644 --- a/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/PunishPlayerEndpoint.java +++ b/service.punishment/src/main/java/net/swofty/service/punishment/endpoints/PunishPlayerEndpoint.java @@ -3,12 +3,11 @@ import com.google.gson.Gson; import net.swofty.commons.impl.ServiceProxyRequest; import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.PunishPlayerProtocol; import net.swofty.commons.protocol.objects.punishment.PunishPlayerProtocolObject; -import net.swofty.commons.proxy.ToProxyChannels; import net.swofty.commons.punishment.*; import net.swofty.service.generic.redis.ServiceEndpoint; import net.swofty.service.punishment.ProxyRedis; -import org.json.JSONObject; import org.tinylog.Logger; import java.time.Instant; @@ -65,17 +64,16 @@ public PunishPlayerProtocolObject.PunishPlayerResponse onMessage(ServiceProxyReq } Gson gson = new Gson(); - ProxyRedis.publishToProxy(ToProxyChannels.PUNISH_PLAYER, new JSONObject() - .put("target", messageObject.target()) - .put("type", messageObject.type()) - .put("id", id.id()) - .put("reason_ban", reason.getBanType() != null ? reason.getBanType().name() : null) - .put("reason_mute", reason.getMuteType() != null ? reason.getMuteType().name() : null) - .put("staff", messageObject.staff()) - .put("issuedAt", now.toEpochMilli()) - .put("expiresAt", messageObject.expiresAt()) - .put("tags", messageObject.tags() != null ? gson.toJson(messageObject.tags()) : null) - ); + ProxyRedis.publishToProxy(new PunishPlayerProtocol(), + new PunishPlayerProtocol.Request( + messageObject.target().toString(), + messageObject.type(), + id.id().toString(), + messageObject.expiresAt(), + reason.getBanType() != null ? reason.getBanType().name() : null, + reason.getMuteType() != null ? reason.getMuteType().name() : null, + messageObject.tags() != null ? gson.toJson(messageObject.tags()) : null + )); Logger.info("Issued {} punishment to {} for reason '{}' (expires at: {})", messageObject.type(), messageObject.target(), diff --git a/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java index d4905f1ff..26bc2a91f 100644 --- a/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java +++ b/type.backwaterbayou/src/main/java/net/swofty/type/backwaterbayou/TypeBackwaterBayouLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.backwaterbayou.tab.BackwaterBayouServerModule; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -84,13 +83,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.bedwarsconfigurator/src/main/java/net/swofty/type/bedwarsconfigurator/TypeBedWarsConfiguratorLoader.java b/type.bedwarsconfigurator/src/main/java/net/swofty/type/bedwarsconfigurator/TypeBedWarsConfiguratorLoader.java index 56e26895e..dbc62a348 100644 --- a/type.bedwarsconfigurator/src/main/java/net/swofty/type/bedwarsconfigurator/TypeBedWarsConfiguratorLoader.java +++ b/type.bedwarsconfigurator/src/main/java/net/swofty/type/bedwarsconfigurator/TypeBedWarsConfiguratorLoader.java @@ -9,8 +9,7 @@ import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; import net.swofty.commons.bedwars.map.BedWarsMapsConfig; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.HypixelTypeLoader; import net.swofty.type.generic.command.HypixelCommand; @@ -134,16 +133,9 @@ public List getNPCs() { ).toList(); } - @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( - "net.swofty.type.bedwarsconfigurator.redis.service", - ServiceToClient.class - ).toList(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java index d4207abc5..683844e13 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/TypeBedWarsGameLoader.java @@ -23,8 +23,8 @@ import net.swofty.commons.ServiceType; import net.swofty.commons.protocol.objects.orchestrator.GameHeartbeatProtocolObject; import net.swofty.proxyapi.ProxyService; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.pvp.MinestomPvP; import net.swofty.pvp.feature.CombatFeatureSet; import net.swofty.pvp.feature.CombatFeatures; @@ -319,19 +319,22 @@ public List getNPCs() { ).toList(); } - @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( - "net.swofty.type.bedwarsgame.redis.service", - ServiceToClient.class - ).toList(); - } + + @Override + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( + "net.swofty.type.bedwarsgame.redis.service", + TypedServiceHandler.class + ).toList(); + } @Override - public List getProxyRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedProxyHandlers() { + return (List>) (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.bedwarsgame.redis", - ProxyToClient.class + TypedProxyHandler.class ).toList(); } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerJoin.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerJoin.java index bc0b536b7..e878f3ff7 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerJoin.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerJoin.java @@ -11,7 +11,7 @@ import net.swofty.type.generic.event.EventNodes; import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; -import net.swofty.type.generic.redis.service.RedisGameMessage; +import net.swofty.type.generic.redis.service.TypedGameInformationHandler; import net.swofty.type.generic.utility.MathUtility; import org.tinylog.Logger; @@ -31,7 +31,7 @@ public void run(AsyncPlayerConfigurationEvent event) { private void tryJoinGame(BedWarsPlayer player, boolean isRetry) { if (!player.isOnline()) return; - String preferredGameId = RedisGameMessage.game.remove(player.getUuid()); + String preferredGameId = TypedGameInformationHandler.game.remove(player.getUuid()); if (preferredGameId == null) { if (!isRetry) { Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second..."); diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisInstantiateGame.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisInstantiateGame.java deleted file mode 100644 index 9fcc7b645..000000000 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisInstantiateGame.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.swofty.type.bedwarsgame.redis.service; - -import net.swofty.commons.bedwars.BedwarsGameType; -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; -import net.swofty.type.bedwarsgame.game.Game; -import net.swofty.commons.bedwars.map.BedWarsMapsConfig; -import org.json.JSONObject; - -public class RedisInstantiateGame implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.INSTANTIATE_GAME; - } - - @Override - public JSONObject onMessage(JSONObject message) { - try { - String gameTypeStr = message.getString("gameType"); - String mapName = message.getString("map"); - - BedwarsGameType gameType = BedwarsGameType.valueOf(gameTypeStr.toUpperCase()); - - // Find the map entry - BedWarsMapsConfig.MapEntry mapEntry = null; - if (TypeBedWarsGameLoader.getMapsConfig() != null) { - for (BedWarsMapsConfig.MapEntry entry : TypeBedWarsGameLoader.getMapsConfig().getMaps()) { - if (entry.getId().equals(mapName) || entry.getName().equals(mapName)) { - // Check if this map supports the requested game type - if (entry.getConfiguration() != null && - entry.getConfiguration().getTypes() != null && - !entry.getConfiguration().getTypes().contains(gameType)) { - return new JSONObject() - .put("success", false) - .put("error", "Map does not support game type: " + gameType); - } - mapEntry = entry; - break; - } - } - } - - if (mapEntry == null) { - return new JSONObject() - .put("success", false) - .put("error", "Map not found: " + mapName); - } - - // Create the game - Game game = TypeBedWarsGameLoader.createGame(mapEntry); - if (game == null) { - return new JSONObject() - .put("success", false) - .put("error", "Server at capacity, cannot create new game"); - } - - return new JSONObject() - .put("success", true) - .put("gameId", game.getGameId()) - .put("map", mapEntry.getName()) - .put("gameType", gameType.toString()); - - } catch (Exception e) { - return new JSONObject() - .put("success", false) - .put("error", "Failed to instantiate game: " + e.getMessage()); - } - } -} \ No newline at end of file diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedBedWarsGamePartyEventHandler.java similarity index 78% rename from type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java rename to type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedBedWarsGamePartyEventHandler.java index 08b907184..e6a5acffd 100644 --- a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/RedisBedWarsGamePropagatePartyEvent.java +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedBedWarsGamePartyEventHandler.java @@ -10,16 +10,17 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.bedwarsgame.game.Game; import net.swofty.type.bedwarsgame.user.BedWarsPlayer; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -29,72 +30,58 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisBedWarsGamePropagatePartyEvent implements ServiceToClient { +public class TypedBedWarsGamePartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - // Special handling for warp events on game servers if (event instanceof PartyWarpResponseEvent warpEvent) { - return handleWarpEventWithGameValidation(warpEvent, participants); + return handleWarpEventWithGameValidation(warpEvent, message.participants()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } - private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { + private Response handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { UUID warperUUID = warpEvent.getWarper(); - // Find the warper on this server BedWarsPlayer warper = findPlayerByUuid(warperUUID); if (warper == null) { - // Warper is not on this server, handle normally for other participants List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } - // Warper IS on this game server - check if they're in a game Game warperGame = warper.getGame(); if (warperGame == null) { - // Warper is on this server but not in a game - handle normally List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } - // Warper is in a game - check if the game can accept new players String blockReason = warperGame.canAcceptPartyWarp(); if (blockReason != null) { - // Game is IN_PROGRESS or ENDING - block the entire warp warper.sendMessage(Component.text(blockReason, NamedTextColor.RED)); - return createBlockedResponse(blockReason); + return Response.blocked(blockReason); } - // Game is in WAITING state - check capacity List membersToWarp = participants.stream() .filter(uuid -> !uuid.equals(warperUUID)) .toList(); @@ -111,25 +98,20 @@ private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warp } } - // Notify the warper warper.sendMessage(Component.text("Warping party...", NamedTextColor.GRAY)); - // Transfer accepted players for (UUID uuid : accepted) { - // Check if player is on a different server ProxyPlayer memberProxy = new ProxyPlayer(uuid); if (memberProxy.isOnline().join()) { UnderstandableProxyServer memberServer = memberProxy.getServer().join(); if (memberServer != null && !memberServer.uuid().equals(HypixelConst.getServerUUID())) { - // Player is on different server - transfer them memberProxy.sendMessage("§eParty Leader summoned you to their game!"); memberProxy.transferToWithIndication(HypixelConst.getServerUUID()); } } } - // Create response with rejection reasons - return createGameWarpResponse(accepted, rejected); + return Response.gameWarp(accepted, rejected); } private PartyEvent parseEvent(String eventType, String eventData) { @@ -195,11 +177,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -257,8 +236,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -297,9 +275,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -308,11 +284,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -335,12 +308,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -411,53 +380,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } - - private JSONObject createBlockedResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("blocked", true); - response.put("blockReason", reason); - return response; - } - - private JSONObject createGameWarpResponse(List accepted, Map rejected) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", accepted.size()); - - JSONArray acceptedArray = new JSONArray(); - for (UUID uuid : accepted) { - acceptedArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", acceptedArray); - - if (!rejected.isEmpty()) { - JSONObject rejectedObj = new JSONObject(); - for (Map.Entry entry : rejected.entrySet()) { - rejectedObj.put(entry.getKey().toString(), entry.getValue()); - } - response.put("rejectedPlayers", rejectedObj); - } - - return response; - } } diff --git a/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedInstantiateGameHandler.java b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedInstantiateGameHandler.java new file mode 100644 index 000000000..6310515b7 --- /dev/null +++ b/type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/redis/service/TypedInstantiateGameHandler.java @@ -0,0 +1,56 @@ +package net.swofty.type.bedwarsgame.redis.service; + +import net.swofty.commons.bedwars.BedwarsGameType; +import net.swofty.commons.bedwars.map.BedWarsMapsConfig; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Request; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader; +import net.swofty.type.bedwarsgame.game.Game; + +public class TypedInstantiateGameHandler implements TypedServiceHandler { + + private static final InstantiateGamePushProtocol PROTOCOL = new InstantiateGamePushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request request) { + try { + BedwarsGameType gameType = BedwarsGameType.valueOf(request.gameType().toUpperCase()); + + BedWarsMapsConfig.MapEntry mapEntry = null; + if (TypeBedWarsGameLoader.getMapsConfig() != null) { + for (BedWarsMapsConfig.MapEntry entry : TypeBedWarsGameLoader.getMapsConfig().getMaps()) { + if (entry.getId().equals(request.map()) || entry.getName().equals(request.map())) { + if (entry.getConfiguration() != null && + entry.getConfiguration().getTypes() != null && + !entry.getConfiguration().getTypes().contains(gameType)) { + return Response.failure("Map does not support game type: " + gameType); + } + mapEntry = entry; + break; + } + } + } + + if (mapEntry == null) { + return Response.failure("Map not found: " + request.map()); + } + + Game game = TypeBedWarsGameLoader.createGame(mapEntry); + if (game == null) { + return Response.failure("Server at capacity, cannot create new game"); + } + + return Response.success(game.getGameId(), mapEntry.getName(), gameType.toString()); + } catch (Exception e) { + return Response.failure("Failed to instantiate game: " + e.getMessage()); + } + } +} diff --git a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java index d9f0895df..b11bef5af 100644 --- a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java +++ b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/TypeBedWarsLobbyLoader.java @@ -7,8 +7,8 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.bedwarslobby.hologram.LeaderboardHologramManager; import net.swofty.type.bedwarslobby.item.impl.BedWarsMenu; import net.swofty.type.bedwarslobby.item.impl.Collectibles; @@ -187,16 +187,18 @@ public List getNPCs() { ).toList(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.bedwarslobby.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/RedisBedWarsLobbyPropagatePartyEvent.java b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/TypedBedWarsLobbyPartyEventHandler.java similarity index 84% rename from type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/RedisBedWarsLobbyPropagatePartyEvent.java rename to type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/TypedBedWarsLobbyPartyEventHandler.java index ea2bc050e..8d432e954 100644 --- a/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/RedisBedWarsLobbyPropagatePartyEvent.java +++ b/type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/TypedBedWarsLobbyPartyEventHandler.java @@ -9,14 +9,15 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -24,36 +25,29 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisBedWarsLobbyPropagatePartyEvent implements ServiceToClient { +public class TypedBedWarsLobbyPartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - // Logger.info("Handled party event: " + event.getClass().getSimpleName() + " for " + participants.size() + " players"); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -62,7 +56,7 @@ private PartyEvent parseEvent(String eventType, String eventData) { PartyEvent templateEvent = PartyEvent.findFromType(eventType); return (PartyEvent) templateEvent.getSerializer().deserialize(eventData); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e, "Failed to parse party event of type: {}", eventType); return null; } } @@ -111,11 +105,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -177,8 +168,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -219,9 +209,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -230,11 +218,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -257,12 +242,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -295,7 +276,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event) if (player.isOnline()) { throw new RuntimeException(throwable); } - return null; // Return value for the CompletableFuture + return null; }).join(); } else { player.sendMessage("§7Warping party..."); @@ -333,23 +314,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } -} \ No newline at end of file +} diff --git a/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java index 272e68144..e8e3dc589 100644 --- a/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java +++ b/type.crimsonisle/src/main/java/net/swofty/type/crimsonisle/TypeCrimsonIsleLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.crimsonisle.tab.CrimsonIsleServerModule; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -84,13 +83,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java index e5afc31b0..ef8c2cf61 100644 --- a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.deepcaverns.tab.DeepCavernsServerModule; import net.swofty.type.generic.SkyBlockTypeLoader; @@ -86,13 +85,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.dungeonhub/src/main/java/net/swofty/type/dungeonhub/TypeDungeonHubLoader.java b/type.dungeonhub/src/main/java/net/swofty/type/dungeonhub/TypeDungeonHubLoader.java index 83ac13f65..7d9425623 100644 --- a/type.dungeonhub/src/main/java/net/swofty/type/dungeonhub/TypeDungeonHubLoader.java +++ b/type.dungeonhub/src/main/java/net/swofty/type/dungeonhub/TypeDungeonHubLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.dungeonhub.tab.DungeonServerModule; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -86,13 +85,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java index 721709c4d..8445cda5d 100644 --- a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java @@ -12,8 +12,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.dwarvenmines.gui.GUIGemstoneGrinder; import net.swofty.type.dwarvenmines.tab.DwarvenMinesServerModule; import net.swofty.type.generic.HypixelConst; @@ -103,13 +102,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java b/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java index 42d746ef5..16abe65c1 100644 --- a/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java +++ b/type.galatea/src/main/java/net/swofty/type/galatea/TypeGalateaLoader.java @@ -6,8 +6,7 @@ import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; import net.swofty.commons.Songs; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.galatea.tab.GalateaServerModule; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -90,13 +89,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.generic/src/main/java/net/swofty/type/generic/HypixelTypeLoader.java b/type.generic/src/main/java/net/swofty/type/generic/HypixelTypeLoader.java index 6ffb9bc15..4ef484fe6 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/HypixelTypeLoader.java +++ b/type.generic/src/main/java/net/swofty/type/generic/HypixelTypeLoader.java @@ -7,8 +7,8 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.data.GameDataHandler; import net.swofty.type.generic.entity.npc.HypixelNPC; import net.swofty.type.generic.event.HypixelEventClass; @@ -37,9 +37,7 @@ public interface HypixelTypeLoader { List getNPCs(); - List getServiceRedisListeners(); - - List getProxyRedisListeners(); + List> getTypedProxyHandlers(); record LoaderValues(Function spawnPosition, boolean announceDeathMessages) {} @@ -50,6 +48,10 @@ record LoaderValues(Function spawnPosition, boolean announceDea * These handlers will be automatically loaded/saved on player join/quit. * @return List of GameDataHandler classes to load */ + default List> getTypedServiceHandlers() { + return List.of(); + } + default List> getAdditionalDataHandlers() { return List.of(); } diff --git a/type.generic/src/main/java/net/swofty/type/generic/chat/StaffChat.java b/type.generic/src/main/java/net/swofty/type/generic/chat/StaffChat.java index b3bb226aa..da9f39fea 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/chat/StaffChat.java +++ b/type.generic/src/main/java/net/swofty/type/generic/chat/StaffChat.java @@ -1,48 +1,27 @@ package net.swofty.type.generic.chat; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.objects.proxy.to.StaffChatProtocol; import net.swofty.proxyapi.redis.ServerOutboundMessage; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONObject; public final class StaffChat { private StaffChat() {} - /** - * Sends a staff chat message from a player. - * The message is routed through the proxy to all servers. - * - * @param sender The player sending the message - * @param message The message content - */ + private static final StaffChatProtocol PROTOCOL = new StaffChatProtocol(); + public static void sendMessage(HypixelPlayer sender, String message) { String formatted = "§b[STAFF] " + sender.getRank().getPrefix() + sender.getUsername() + "§f: " + message; broadcastViaProxy(formatted); } - /** - * Sends a staff notification (system message). - * The message is routed through the proxy to all servers. - * - * @param message The notification message - */ public static void sendNotification(String message) { String formatted = "§b[STAFF] §7" + message; broadcastViaProxy(formatted); } private static void broadcastViaProxy(String formattedMessage) { - JSONObject message = new JSONObject() - .put("type", "message") - .put("formatted_message", formattedMessage); - - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.STAFF_CHAT, - message, - response -> { - // Fire-and-forget, no response handling needed - } - ); + ServerOutboundMessage.sendToProxy(PROTOCOL, + new StaffChatProtocol.Request("message", formattedMessage, null), + response -> {}); } } - diff --git a/type.generic/src/main/java/net/swofty/type/generic/event/actions/ActionPlayerMute.java b/type.generic/src/main/java/net/swofty/type/generic/event/actions/ActionPlayerMute.java index a52bbb093..b23220cb7 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/event/actions/ActionPlayerMute.java +++ b/type.generic/src/main/java/net/swofty/type/generic/event/actions/ActionPlayerMute.java @@ -31,7 +31,7 @@ public void onPlayerChat(PlayerChatEvent event) { if (response instanceof GetActivePunishmentProtocolObject.GetActivePunishmentResponse( boolean found, String type, String banId, PunishmentReason reason, - long expiresAt, List tags + long expiresAt, List tags, boolean success, String error ) && found) { event.setCancelled(true); ActivePunishment punishment = new ActivePunishment(type, banId, reason, expiresAt, tags); diff --git a/type.generic/src/main/java/net/swofty/type/generic/event/actions/data/ActionPlayerDataSave.java b/type.generic/src/main/java/net/swofty/type/generic/event/actions/data/ActionPlayerDataSave.java index 47a195738..d67a5f71f 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/event/actions/data/ActionPlayerDataSave.java +++ b/type.generic/src/main/java/net/swofty/type/generic/event/actions/data/ActionPlayerDataSave.java @@ -2,7 +2,7 @@ import lombok.SneakyThrows; import net.minestom.server.event.player.PlayerDisconnectEvent; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.objects.proxy.to.FinishedWithPlayerProtocol; import net.swofty.proxyapi.redis.ServerOutboundMessage; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.data.DataHandler; @@ -20,7 +20,6 @@ import net.swofty.type.generic.resourcepack.ResourcePackManager; import net.swofty.type.generic.user.HypixelPlayer; import net.swofty.type.generic.utility.MathUtility; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.List; @@ -78,12 +77,9 @@ public void run(PlayerDisconnectEvent event) { gameHandler.removeFromCache(uuid); } - // Notify proxy that we're done with this player - ServerOutboundMessage.sendMessageToProxy( - ToProxyChannels.FINISHED_WITH_PLAYER, - new JSONObject().put("uuid", uuid.toString()), - (response) -> {} - ); + ServerOutboundMessage.sendToProxy(new FinishedWithPlayerProtocol(), + new FinishedWithPlayerProtocol.Request(uuid.toString()), + response -> {}); // Clean up tablist entries MathUtility.delay(() -> { diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisOriginServer.java b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisOriginServer.java index 32e00d189..621b116ab 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisOriginServer.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisOriginServer.java @@ -1,28 +1,27 @@ package net.swofty.type.generic.redis; import net.swofty.commons.ServerType; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; -import org.json.JSONObject; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.GivePlayersOriginTypeProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class RedisOriginServer implements ProxyToClient { +public class RedisOriginServer implements TypedProxyHandler { public static Map origin = new HashMap<>(); @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE; + public ProtocolObject getProtocol() { + return new GivePlayersOriginTypeProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); - ServerType originType = ServerType.valueOf(message.getString("origin-type")); - + public GivePlayersOriginTypeProtocol.Response onMessage(GivePlayersOriginTypeProtocol.Request message) { + UUID uuid = UUID.fromString(message.uuid()); + ServerType originType = ServerType.valueOf(message.originType()); origin.put(uuid, originType); - return new JSONObject(); + return new GivePlayersOriginTypeProtocol.Response(); } } diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisPing.java b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisPing.java index 1c42b42ea..17319c1b1 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisPing.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisPing.java @@ -1,17 +1,17 @@ package net.swofty.type.generic.redis; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; -import org.json.JSONObject; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.PingServerProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; -public class RedisPing implements ProxyToClient { +public class RedisPing implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.PING_SERVER; + public ProtocolObject getProtocol() { + return new PingServerProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - return new JSONObject(); + public PingServerProtocol.Response onMessage(PingServerProtocol.Request message) { + return new PingServerProtocol.Response(); } } diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisStaffChatBroadcast.java b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisStaffChatBroadcast.java index c4d05f92c..ac4469fb2 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisStaffChatBroadcast.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisStaffChatBroadcast.java @@ -1,53 +1,50 @@ package net.swofty.type.generic.redis; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.BroadcastStaffChatProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.command.commands.ChatCommand; import net.swofty.type.generic.data.HypixelDataHandler; import net.swofty.type.generic.data.datapoints.DatapointRank; import net.swofty.type.generic.data.datapoints.DatapointString; import net.swofty.type.generic.user.categories.Rank; -import org.json.JSONObject; import java.util.UUID; -public class RedisStaffChatBroadcast implements ProxyToClient { +public class RedisStaffChatBroadcast implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.BROADCAST_STAFF_CHAT; + public ProtocolObject getProtocol() { + return new BroadcastStaffChatProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - String type = message.getString("type"); + public BroadcastStaffChatProtocol.Response onMessage(BroadcastStaffChatProtocol.Request message) { + String type = message.type(); switch (type) { case "message" -> { - // Staff chat message - already formatted, just send to local staff - String formattedMessage = message.getString("formatted_message"); + String formattedMessage = message.formattedMessage(); sendToLocalStaff(formattedMessage, null); } case "join" -> { - UUID playerUuid = UUID.fromString(message.getString("uuid")); + UUID playerUuid = UUID.fromString(message.uuid()); handleJoinLeave(playerUuid, true); } case "leave" -> { - UUID playerUuid = UUID.fromString(message.getString("uuid")); + UUID playerUuid = UUID.fromString(message.uuid()); handleJoinLeave(playerUuid, false); } } - return new JSONObject(); + return new BroadcastStaffChatProtocol.Response(); } private void handleJoinLeave(UUID playerUuid, boolean isJoin) { try { - // Get player data (will check cache first, then query DB) HypixelDataHandler handler = HypixelDataHandler.getOfOfflinePlayer(playerUuid); Rank rank = handler.get(HypixelDataHandler.Data.RANK, DatapointRank.class).getValue(); - // Only send notification if the player is staff if (!rank.isStaff()) { return; } @@ -59,7 +56,6 @@ private void handleJoinLeave(UUID playerUuid, boolean isJoin) { sendToLocalStaff(formattedMessage, playerUuid); } catch (Exception e) { - // Player may not have data yet (first join), silently ignore } } diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTeleport.java b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTeleport.java index e260a9cdf..3e849a452 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTeleport.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTeleport.java @@ -1,33 +1,26 @@ package net.swofty.type.generic.redis; import net.minestom.server.coordinate.Pos; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.TeleportProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONObject; import java.util.UUID; -public class RedisTeleport implements ProxyToClient { +public class RedisTeleport implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.TELEPORT; + public ProtocolObject getProtocol() { + return new TeleportProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); - double x = message.getDouble("x"); - double y = message.getDouble("y"); - double z = message.getDouble("z"); - float yaw = message.getFloat("yaw"); - float pitch = message.getFloat("pitch"); - + public TeleportProtocol.Response onMessage(TeleportProtocol.Request message) { + UUID uuid = UUID.fromString(message.uuid()); HypixelPlayer player = HypixelGenericLoader.getFromUUID(uuid); - if (player == null) return new JSONObject(); - player.teleport(new Pos(x, y, z, yaw, pitch)); - - return new JSONObject(); + if (player == null) return new TeleportProtocol.Response(); + player.teleport(new Pos(message.x(), message.y(), message.z(), message.yaw(), message.pitch())); + return new TeleportProtocol.Response(); } -} \ No newline at end of file +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTransferredFromThisServer.java b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTransferredFromThisServer.java index a57227cdc..abb45804e 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTransferredFromThisServer.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/RedisTransferredFromThisServer.java @@ -1,25 +1,25 @@ package net.swofty.type.generic.redis; -import net.swofty.commons.proxy.FromProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.PlayerSwitchedProtocol; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ProxyToClient; -import org.json.JSONObject; +import net.swofty.proxyapi.redis.TypedProxyHandler; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -public class RedisTransferredFromThisServer implements ProxyToClient { +public class RedisTransferredFromThisServer implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.PLAYER_HAS_SWITCHED_FROM_HERE; + public ProtocolObject getProtocol() { + return new PlayerSwitchedProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); + public PlayerSwitchedProtocol.Response onMessage(PlayerSwitchedProtocol.Request message) { + UUID uuid = UUID.fromString(message.uuid()); if (!ProxyPlayer.waitingForTransferComplete.containsKey(uuid)) { - return new JSONObject(); + return new PlayerSwitchedProtocol.Response(); } CompletableFuture.delayedExecutor(500, TimeUnit.MILLISECONDS) @@ -31,6 +31,6 @@ public JSONObject onMessage(JSONObject message) { ProxyPlayer.waitingForTransferComplete.remove(uuid); }); - return new JSONObject(); + return new PlayerSwitchedProtocol.Response(); } -} \ No newline at end of file +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisGameMessage.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisGameMessage.java deleted file mode 100644 index ef8f69911..000000000 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisGameMessage.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.swofty.type.generic.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class RedisGameMessage implements ServiceToClient { - public static Map game = new HashMap<>(); - - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.GAME_INFORMATION; - } - - @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); - String gameId = message.getString("game-id"); - - game.put(uuid, gameId); - return new JSONObject(); - } -} diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisKickFromGUI.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisKickFromGUI.java deleted file mode 100644 index fdc63402a..000000000 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisKickFromGUI.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.swofty.type.generic.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.generic.HypixelGenericLoader; -import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; -import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class RedisKickFromGUI implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.KICK_FROM_GUI; - } - - @Override - public JSONObject onMessage(JSONObject message) { - JSONArray playerUUIDs = message.getJSONArray("playerUUIDs"); - String guiType = message.getString("guiType"); - - List kickedPlayers = new ArrayList<>(); - - for (int i = 0; i < playerUUIDs.length(); i++) { - UUID playerUUID = UUID.fromString(playerUUIDs.getString(i)); - HypixelPlayer player = HypixelGenericLoader.getFromUUID(playerUUID); - - if (player != null && HypixelInventoryGUI.GUI_MAP.containsKey(playerUUID)) { - HypixelInventoryGUI gui = net.swofty.type.generic.gui.inventory.HypixelInventoryGUI.GUI_MAP.get(playerUUID); - - // Check if GUI matches the type we want to kick from - if (gui.getClass().getSimpleName().toLowerCase().contains(guiType.toLowerCase())) { - player.closeInventory(); - player.sendMessage("§cYou have been kicked from the " + guiType + " GUI due to a data synchronization operation."); - kickedPlayers.add(playerUUID); - } - } - } - - return new JSONObject() - .put("success", true) - .put("kickedPlayers", kickedPlayers) - .put("totalKicked", kickedPlayers.size()); - } -} \ No newline at end of file diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisSendMessage.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisSendMessage.java deleted file mode 100644 index 27b60d720..000000000 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisSendMessage.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.swofty.type.generic.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.generic.HypixelGenericLoader; -import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONObject; - -import java.util.UUID; - -public class RedisSendMessage implements ServiceToClient { - - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.SEND_MESSAGE; - } - - @Override - public JSONObject onMessage(JSONObject message) { - try { - UUID playerUUID = UUID.fromString(message.getString("playerUUID")); - String messageText = message.getString("message"); - - HypixelPlayer player = HypixelGenericLoader.getLoadedPlayers().stream() - .filter(p -> p.getUuid().equals(playerUUID)) - .findFirst() - .orElse(null); - - if (player != null) { - player.sendMessage(messageText); - return new JSONObject().put("success", true); - } - - return new JSONObject().put("success", false); - } catch (Exception e) { - return new JSONObject().put("success", false); - } - } -} \ No newline at end of file diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisPropagateFriendEvent.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedFriendEventHandler.java similarity index 87% rename from type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisPropagateFriendEvent.java rename to type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedFriendEventHandler.java index 69eb36f57..749cfc514 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/redis/service/RedisPropagateFriendEvent.java +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedFriendEventHandler.java @@ -8,47 +8,42 @@ import net.swofty.commons.friend.FriendEvent; import net.swofty.commons.friend.FriendSettingType; import net.swofty.commons.friend.events.response.*; -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.friend.FriendEventPushProtocol; +import net.swofty.commons.protocol.objects.friend.FriendEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.friend.FriendEventPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; import java.util.List; import java.util.UUID; -public class RedisPropagateFriendEvent implements ServiceToClient { +public class TypedFriendEventHandler implements TypedServiceHandler { + + private static final FriendEventPushProtocol PROTOCOL = new FriendEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_FRIEND_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - FriendEvent event = parseEvent(eventType, eventData); + FriendEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse friend event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse friend event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle friend event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -191,11 +186,9 @@ private void handleLeaveNotification(HypixelPlayer player, FriendLeaveNotificati private void handleRequestExpired(HypixelPlayer player, FriendRequestExpiredResponseEvent event) { if (player.getUuid().equals(event.getSender())) { - // Message to sender String targetDisplay = HypixelPlayer.getDisplayName(event.getTarget()); sendMessage(player, "§eYour friend request to " + targetDisplay + " §ehas expired."); } else { - // Message to recipient String senderDisplay = HypixelPlayer.getDisplayName(event.getSender()); sendMessage(player, "§eThe friend request from " + senderDisplay + " §ehas expired."); } @@ -213,19 +206,16 @@ private void handleFriendList(HypixelPlayer player, FriendListResponseEvent even for (FriendListResponseEvent.FriendListEntry friend : event.getFriends()) { StringBuilder sb = new StringBuilder(); - // Online status indicator if (friend.isOnline()) { sb.append("§a● "); } else { sb.append("§c● "); } - // Best friend marker if (friend.isBest()) { sb.append("§6✦ "); } - // Name (rank-colored, matches tablist). Fallback to plain name if unavailable or failure. String displayName; try { displayName = HypixelPlayer.getDisplayName(friend.getUuid()); @@ -236,14 +226,12 @@ private void handleFriendList(HypixelPlayer player, FriendListResponseEvent even displayName = "§e" + friend.getName(); } - // Append nickname if set if (friend.getNickname() != null && !friend.getNickname().isEmpty()) { sb.append(displayName).append(" §7(").append(friend.getNickname()).append(")"); } else { sb.append(displayName); } - // Server info (when online) if (friend.isOnline() && friend.getServer() != null && !friend.getServer().isEmpty()) { sb.append(" §7- §e").append(StringUtility.toNormalCase(friend.getServer())); } @@ -333,23 +321,4 @@ private String formatDuration(long seconds) { } return seconds + "s"; } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } } diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedGameInformationHandler.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedGameInformationHandler.java new file mode 100644 index 000000000..4892f8d9f --- /dev/null +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedGameInformationHandler.java @@ -0,0 +1,29 @@ +package net.swofty.type.generic.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.game.GameInformationPushProtocol; +import net.swofty.commons.protocol.objects.game.GameInformationPushProtocol.Request; +import net.swofty.commons.protocol.objects.game.GameInformationPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class TypedGameInformationHandler implements TypedServiceHandler { + + public static Map game = new HashMap<>(); + + private static final GameInformationPushProtocol PROTOCOL = new GameInformationPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + game.put(message.uuid(), message.gameId()); + return new Response(); + } +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedKickFromGUIHandler.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedKickFromGUIHandler.java new file mode 100644 index 000000000..f8c316e20 --- /dev/null +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedKickFromGUIHandler.java @@ -0,0 +1,45 @@ +package net.swofty.type.generic.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.gui.KickFromGUIPushProtocol; +import net.swofty.commons.protocol.objects.gui.KickFromGUIPushProtocol.Request; +import net.swofty.commons.protocol.objects.gui.KickFromGUIPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.generic.HypixelGenericLoader; +import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TypedKickFromGUIHandler implements TypedServiceHandler { + + private static final KickFromGUIPushProtocol PROTOCOL = new KickFromGUIPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + List kickedPlayers = new ArrayList<>(); + + for (UUID playerUUID : message.playerUUIDs()) { + HypixelPlayer player = HypixelGenericLoader.getFromUUID(playerUUID); + + if (player != null && HypixelInventoryGUI.GUI_MAP.containsKey(playerUUID)) { + HypixelInventoryGUI gui = HypixelInventoryGUI.GUI_MAP.get(playerUUID); + + if (gui.getClass().getSimpleName().toLowerCase().contains(message.guiType().toLowerCase())) { + player.closeInventory(); + player.sendMessage("§cYou have been kicked from the " + message.guiType() + " GUI due to a data synchronization operation."); + kickedPlayers.add(playerUUID); + } + } + } + + return new Response(true, kickedPlayers, kickedPlayers.size(), null); + } +} diff --git a/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedSendMessageHandler.java b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedSendMessageHandler.java new file mode 100644 index 000000000..6ca48f328 --- /dev/null +++ b/type.generic/src/main/java/net/swofty/type/generic/redis/service/TypedSendMessageHandler.java @@ -0,0 +1,38 @@ +package net.swofty.type.generic.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.messaging.SendMessagePushProtocol; +import net.swofty.commons.protocol.objects.messaging.SendMessagePushProtocol.Request; +import net.swofty.commons.protocol.objects.messaging.SendMessagePushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.generic.HypixelGenericLoader; +import net.swofty.type.generic.user.HypixelPlayer; + +public class TypedSendMessageHandler implements TypedServiceHandler { + + private static final SendMessagePushProtocol PROTOCOL = new SendMessagePushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + try { + HypixelPlayer player = HypixelGenericLoader.getLoadedPlayers().stream() + .filter(p -> p.getUuid().equals(message.playerUUID())) + .findFirst() + .orElse(null); + + if (player != null) { + player.sendMessage(message.message()); + return new Response(true, null); + } + + return new Response(false, "Player not found or error"); + } catch (Exception e) { + return new Response(false, "Player not found or error"); + } + } +} diff --git a/type.goldmine/src/main/java/net/swofty/type/goldmine/TypeGoldMineLoader.java b/type.goldmine/src/main/java/net/swofty/type/goldmine/TypeGoldMineLoader.java index c4afefd5a..d3f9d7f8c 100644 --- a/type.goldmine/src/main/java/net/swofty/type/goldmine/TypeGoldMineLoader.java +++ b/type.goldmine/src/main/java/net/swofty/type/goldmine/TypeGoldMineLoader.java @@ -8,8 +8,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.SkyBlockTypeLoader; @@ -105,13 +104,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.hub/src/main/java/net/swofty/type/hub/TypeHubLoader.java b/type.hub/src/main/java/net/swofty/type/hub/TypeHubLoader.java index 1ee56652e..ed6a5433c 100644 --- a/type.hub/src/main/java/net/swofty/type/hub/TypeHubLoader.java +++ b/type.hub/src/main/java/net/swofty/type/hub/TypeHubLoader.java @@ -20,8 +20,7 @@ import net.swofty.commons.StringUtility; import net.swofty.commons.skyblock.item.ItemType; import net.swofty.proxyapi.ProxyService; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.InteractionEntity; @@ -253,13 +252,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIDarkAuction.java b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIDarkAuction.java index d2963d0c4..270ddc7a1 100644 --- a/type.hub/src/main/java/net/swofty/type/hub/gui/GUIDarkAuction.java +++ b/type.hub/src/main/java/net/swofty/type/hub/gui/GUIDarkAuction.java @@ -267,7 +267,7 @@ public void run(InventoryPreClickEvent e, HypixelPlayer p) { darkAuctionService.handleRequest(bidMessage) .thenAccept(response -> { - if (response instanceof PlaceBidProtocol.PlaceBidResponse(boolean success, String message)) { + if (response instanceof PlaceBidProtocol.PlaceBidResponse(boolean success, String message, String error)) { if (!success) { sp.sendMessage("§c" + message); } diff --git a/type.island/src/main/java/net/swofty/type/island/TypeIslandLoader.java b/type.island/src/main/java/net/swofty/type/island/TypeIslandLoader.java index dd5039bd6..99cb82e1b 100644 --- a/type.island/src/main/java/net/swofty/type/island/TypeIslandLoader.java +++ b/type.island/src/main/java/net/swofty/type/island/TypeIslandLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelTypeLoader; import net.swofty.type.generic.SkyBlockTypeLoader; @@ -95,13 +94,9 @@ public List getNPCs() { return new ArrayList<>(); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.jerrysworkshop/src/main/java/net/swofty/type/jerrysworkshop/TypeJerrysWorkshopLoader.java b/type.jerrysworkshop/src/main/java/net/swofty/type/jerrysworkshop/TypeJerrysWorkshopLoader.java index a5ea5e0d8..2903ef275 100644 --- a/type.jerrysworkshop/src/main/java/net/swofty/type/jerrysworkshop/TypeJerrysWorkshopLoader.java +++ b/type.jerrysworkshop/src/main/java/net/swofty/type/jerrysworkshop/TypeJerrysWorkshopLoader.java @@ -8,8 +8,7 @@ import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; import net.swofty.commons.skyblock.item.ItemType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -95,13 +94,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.lobby/src/main/java/net/swofty/type/lobby/LobbyOrchestratorConnector.java b/type.lobby/src/main/java/net/swofty/type/lobby/LobbyOrchestratorConnector.java index d9d474458..9c8ea85ee 100644 --- a/type.lobby/src/main/java/net/swofty/type/lobby/LobbyOrchestratorConnector.java +++ b/type.lobby/src/main/java/net/swofty/type/lobby/LobbyOrchestratorConnector.java @@ -49,7 +49,7 @@ public CompletableFuture> findGameServer PLAYERS_SEARCHING.remove(player.getUuid()); if (response instanceof GetServerForMapProtocolObject.GetServerForMapResponse( - UnderstandableProxyServer server, String gameId + UnderstandableProxyServer server, String gameId, boolean success, String error )) { return new Pair<>(server, gameId); } diff --git a/type.murdermysteryconfigurator/src/main/java/net/swofty/type/murdermysteryconfigurator/TypeMurderMysteryConfiguratorLoader.java b/type.murdermysteryconfigurator/src/main/java/net/swofty/type/murdermysteryconfigurator/TypeMurderMysteryConfiguratorLoader.java index 1361004a0..e480e755a 100644 --- a/type.murdermysteryconfigurator/src/main/java/net/swofty/type/murdermysteryconfigurator/TypeMurderMysteryConfiguratorLoader.java +++ b/type.murdermysteryconfigurator/src/main/java/net/swofty/type/murdermysteryconfigurator/TypeMurderMysteryConfiguratorLoader.java @@ -9,8 +9,7 @@ import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; import net.swofty.commons.murdermystery.map.MurderMysteryMapsConfig; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.HypixelTypeLoader; import net.swofty.type.generic.command.HypixelCommand; @@ -146,16 +145,9 @@ public List getNPCs() { ).toList(); } - @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( - "net.swofty.type.murdermysteryconfigurator.redis.service", - ServiceToClient.class - ).toList(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/TypeMurderMysteryGameLoader.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/TypeMurderMysteryGameLoader.java index 1e9dce4a1..f97c2bd84 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/TypeMurderMysteryGameLoader.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/TypeMurderMysteryGameLoader.java @@ -24,8 +24,8 @@ import net.swofty.commons.murdermystery.map.MurderMysteryMapsConfig; import net.swofty.commons.protocol.objects.orchestrator.GameHeartbeatProtocolObject; import net.swofty.proxyapi.ProxyService; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.pvp.MinestomPvP; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; @@ -278,19 +278,22 @@ public List getNPCs() { ).toList(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.murdermysterygame.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedProxyHandlers() { + return (List>) (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.murdermysterygame.redis", - ProxyToClient.class + TypedProxyHandler.class ).toList(); } diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerJoin.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerJoin.java index 6d082f652..d8d13d2ac 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerJoin.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerJoin.java @@ -11,7 +11,7 @@ import net.swofty.type.generic.event.EventNodes; import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; -import net.swofty.type.generic.redis.service.RedisGameMessage; +import net.swofty.type.generic.redis.service.TypedGameInformationHandler; import net.swofty.type.generic.utility.MathUtility; import org.tinylog.Logger; @@ -31,7 +31,7 @@ public void run(AsyncPlayerConfigurationEvent event) { private void tryJoinGame(MurderMysteryPlayer player, boolean isRetry) { if (!player.isOnline()) return; - String preferredGameId = RedisGameMessage.game.remove(player.getUuid()); + String preferredGameId = TypedGameInformationHandler.game.remove(player.getUuid()); if (preferredGameId == null) { if (!isRetry) { Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second..."); diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisInstantiateGame.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisInstantiateGame.java deleted file mode 100644 index 33d8fbf2b..000000000 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisInstantiateGame.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.swofty.type.murdermysterygame.redis.service; - -import net.swofty.commons.murdermystery.MurderMysteryGameType; -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; -import net.swofty.type.murdermysterygame.game.Game; -import net.swofty.commons.murdermystery.map.MurderMysteryMapsConfig; -import org.json.JSONObject; - -public class RedisInstantiateGame implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.INSTANTIATE_GAME; - } - - @Override - public JSONObject onMessage(JSONObject message) { - try { - String gameTypeStr = message.getString("gameType"); - String mapName = message.getString("map"); - - MurderMysteryGameType gameType = MurderMysteryGameType.valueOf(gameTypeStr.toUpperCase()); - - // Find the map entry - MurderMysteryMapsConfig.MapEntry mapEntry = null; - if (TypeMurderMysteryGameLoader.getMapsConfig() != null) { - for (MurderMysteryMapsConfig.MapEntry entry : TypeMurderMysteryGameLoader.getMapsConfig().getMaps()) { - if (entry.getId().equals(mapName) || entry.getName().equals(mapName)) { - // Check if this map supports the requested game type - if (entry.getConfiguration() != null && - entry.getConfiguration().getTypes() != null && - !entry.getConfiguration().getTypes().contains(gameType)) { - return new JSONObject() - .put("success", false) - .put("error", "Map does not support game type: " + gameType); - } - mapEntry = entry; - break; - } - } - } - - if (mapEntry == null) { - return new JSONObject() - .put("success", false) - .put("error", "Map not found: " + mapName); - } - - // Create the game - Game game = TypeMurderMysteryGameLoader.createGame(mapEntry, gameType); - if (game == null) { - return new JSONObject() - .put("success", false) - .put("error", "Server at capacity, cannot create new game"); - } - - return new JSONObject() - .put("success", true) - .put("gameId", game.getGameId()) - .put("map", mapEntry.getName()) - .put("gameType", gameType.toString()); - - } catch (Exception e) { - return new JSONObject() - .put("success", false) - .put("error", "Failed to instantiate game: " + e.getMessage()); - } - } -} diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedInstantiateGameHandler.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedInstantiateGameHandler.java new file mode 100644 index 000000000..dbe7ceac4 --- /dev/null +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedInstantiateGameHandler.java @@ -0,0 +1,56 @@ +package net.swofty.type.murdermysterygame.redis.service; + +import net.swofty.commons.murdermystery.MurderMysteryGameType; +import net.swofty.commons.murdermystery.map.MurderMysteryMapsConfig; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Request; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; +import net.swofty.type.murdermysterygame.game.Game; + +public class TypedInstantiateGameHandler implements TypedServiceHandler { + + private static final InstantiateGamePushProtocol PROTOCOL = new InstantiateGamePushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request request) { + try { + MurderMysteryGameType gameType = MurderMysteryGameType.valueOf(request.gameType().toUpperCase()); + + MurderMysteryMapsConfig.MapEntry mapEntry = null; + if (TypeMurderMysteryGameLoader.getMapsConfig() != null) { + for (MurderMysteryMapsConfig.MapEntry entry : TypeMurderMysteryGameLoader.getMapsConfig().getMaps()) { + if (entry.getId().equals(request.map()) || entry.getName().equals(request.map())) { + if (entry.getConfiguration() != null && + entry.getConfiguration().getTypes() != null && + !entry.getConfiguration().getTypes().contains(gameType)) { + return Response.failure("Map does not support game type: " + gameType); + } + mapEntry = entry; + break; + } + } + } + + if (mapEntry == null) { + return Response.failure("Map not found: " + request.map()); + } + + Game game = TypeMurderMysteryGameLoader.createGame(mapEntry, gameType); + if (game == null) { + return Response.failure("Server at capacity, cannot create new game"); + } + + return Response.success(game.getGameId(), mapEntry.getName(), gameType.toString()); + } catch (Exception e) { + return Response.failure("Failed to instantiate game: " + e.getMessage()); + } + } +} diff --git a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisMurderMysteryGamePropagatePartyEvent.java b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedMurderMysteryGamePartyEventHandler.java similarity index 78% rename from type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisMurderMysteryGamePropagatePartyEvent.java rename to type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedMurderMysteryGamePartyEventHandler.java index f3a4d1c88..8cc9769e3 100644 --- a/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/RedisMurderMysteryGamePropagatePartyEvent.java +++ b/type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/redis/service/TypedMurderMysteryGamePartyEventHandler.java @@ -10,88 +10,75 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader; import net.swofty.type.murdermysterygame.game.Game; import net.swofty.type.murdermysterygame.user.MurderMysteryPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.*; import java.util.concurrent.TimeUnit; -public class RedisMurderMysteryGamePropagatePartyEvent implements ServiceToClient { +public class TypedMurderMysteryGamePartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - // Special handling for warp events on game servers if (event instanceof PartyWarpResponseEvent warpEvent) { - return handleWarpEventWithGameValidation(warpEvent, participants); + return handleWarpEventWithGameValidation(warpEvent, message.participants()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } - private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { + private Response handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { UUID warperUUID = warpEvent.getWarper(); - // Find the warper on this server MurderMysteryPlayer warper = findPlayerByUuid(warperUUID); if (warper == null) { - // Warper is not on this server, handle normally for other participants List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } - // Warper IS on this game server - check if they're in a game Game warperGame = TypeMurderMysteryGameLoader.getPlayerGame(warper); if (warperGame == null) { - // Warper is on this server but not in a game - handle normally List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } - // Warper is in a game - check if the game can accept new players String blockReason = warperGame.canAcceptPartyWarp(); if (blockReason != null) { - // Game is IN_PROGRESS or ENDING - block the entire warp warper.sendMessage(Component.text(blockReason, NamedTextColor.RED)); - return createBlockedResponse(blockReason); + return Response.blocked(blockReason); } - // Game is in WAITING state - check capacity List membersToWarp = participants.stream() .filter(uuid -> !uuid.equals(warperUUID)) .toList(); @@ -108,25 +95,20 @@ private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warp } } - // Notify the warper warper.sendMessage(Component.text("Warping party...", NamedTextColor.GRAY)); - // Transfer accepted players for (UUID uuid : accepted) { - // Check if player is on a different server ProxyPlayer memberProxy = new ProxyPlayer(uuid); if (memberProxy.isOnline().join()) { UnderstandableProxyServer memberServer = memberProxy.getServer().join(); if (memberServer != null && !memberServer.uuid().equals(HypixelConst.getServerUUID())) { - // Player is on different server - transfer them memberProxy.sendMessage("§eParty Leader summoned you to their game!"); memberProxy.transferToWithIndication(HypixelConst.getServerUUID()); } } } - // Create response with rejection reasons - return createGameWarpResponse(accepted, rejected); + return Response.gameWarp(accepted, rejected); } private PartyEvent parseEvent(String eventType, String eventData) { @@ -192,11 +174,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -254,8 +233,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -294,9 +272,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -305,11 +281,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -332,12 +305,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -408,53 +377,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } - - private JSONObject createBlockedResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("blocked", true); - response.put("blockReason", reason); - return response; - } - - private JSONObject createGameWarpResponse(List accepted, Map rejected) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", accepted.size()); - - JSONArray acceptedArray = new JSONArray(); - for (UUID uuid : accepted) { - acceptedArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", acceptedArray); - - if (!rejected.isEmpty()) { - JSONObject rejectedObj = new JSONObject(); - for (Map.Entry entry : rejected.entrySet()) { - rejectedObj.put(entry.getKey().toString(), entry.getValue()); - } - response.put("rejectedPlayers", rejectedObj); - } - - return response; - } } diff --git a/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/TypeMurderMysteryLobbyLoader.java b/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/TypeMurderMysteryLobbyLoader.java index 78684de34..c30928981 100644 --- a/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/TypeMurderMysteryLobbyLoader.java +++ b/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/TypeMurderMysteryLobbyLoader.java @@ -7,8 +7,8 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.command.HypixelCommand; @@ -170,16 +170,18 @@ public List getNPCs() { ).toList(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.murdermysterylobby.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/RedisMurderMysteryLobbyPropagatePartyEvent.java b/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/TypedMurderMysteryLobbyPartyEventHandler.java similarity index 85% rename from type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/RedisMurderMysteryLobbyPropagatePartyEvent.java rename to type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/TypedMurderMysteryLobbyPartyEventHandler.java index 6eba6d68c..a3df0956d 100644 --- a/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/RedisMurderMysteryLobbyPropagatePartyEvent.java +++ b/type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/TypedMurderMysteryLobbyPartyEventHandler.java @@ -9,14 +9,15 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -24,35 +25,29 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisMurderMysteryLobbyPropagatePartyEvent implements ServiceToClient { +public class TypedMurderMysteryLobbyPartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -61,7 +56,7 @@ private PartyEvent parseEvent(String eventType, String eventData) { PartyEvent templateEvent = PartyEvent.findFromType(eventType); return (PartyEvent) templateEvent.getSerializer().deserialize(eventData); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e, "Failed to parse party event of type: {}", eventType); return null; } } @@ -110,11 +105,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -176,8 +168,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -218,9 +209,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -229,11 +218,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -256,12 +242,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -332,23 +314,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } } diff --git a/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/TypePrototypeLobbyLoader.java b/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/TypePrototypeLobbyLoader.java index 514511d18..056cd6285 100644 --- a/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/TypePrototypeLobbyLoader.java +++ b/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/TypePrototypeLobbyLoader.java @@ -5,8 +5,8 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.data.GameDataHandler; @@ -157,16 +157,18 @@ public List getNPCs() { ).toList(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.prototypelobby.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/RedisPrototypeLobbyPropagatePartyEvent.java b/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/TypedPrototypeLobbyPartyEventHandler.java similarity index 84% rename from type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/RedisPrototypeLobbyPropagatePartyEvent.java rename to type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/TypedPrototypeLobbyPartyEventHandler.java index 6f2dd1ecf..18b1603db 100644 --- a/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/RedisPrototypeLobbyPropagatePartyEvent.java +++ b/type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/TypedPrototypeLobbyPartyEventHandler.java @@ -9,14 +9,15 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -24,36 +25,29 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisPrototypeLobbyPropagatePartyEvent implements ServiceToClient { +public class TypedPrototypeLobbyPartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - // Logger.info("Handled party event: " + event.getClass().getSimpleName() + " for " + participants.size() + " players"); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -111,11 +105,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -177,8 +168,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -219,9 +209,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -230,11 +218,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -257,12 +242,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -295,7 +276,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event) if (player.isOnline()) { throw new RuntimeException(throwable); } - return null; // Return value for the CompletableFuture + return null; }).join(); } else { player.sendMessage("§7Warping party..."); @@ -333,23 +314,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } -} \ No newline at end of file +} diff --git a/type.ravengardlobby/src/main/java/net/swofty/type/ravengardlobby/TypeRavengardLobbyLoader.java b/type.ravengardlobby/src/main/java/net/swofty/type/ravengardlobby/TypeRavengardLobbyLoader.java index 1869feb06..a17d2c5de 100644 --- a/type.ravengardlobby/src/main/java/net/swofty/type/ravengardlobby/TypeRavengardLobbyLoader.java +++ b/type.ravengardlobby/src/main/java/net/swofty/type/ravengardlobby/TypeRavengardLobbyLoader.java @@ -10,8 +10,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.RavengardTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -113,13 +112,9 @@ public List getNPCs() { return new ArrayList<>(); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/bazaar/BazaarConnector.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/bazaar/BazaarConnector.java index 58500d297..a784a15f3 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/bazaar/BazaarConnector.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/bazaar/BazaarConnector.java @@ -35,7 +35,7 @@ public CompletableFuture> getPendingOrders() { return bazaarService.handleRequest(message) - .thenApply(response -> response.orders.stream() + .thenApply(response -> response.orders().stream() .map(order -> new BazaarOrder( order.orderId(), order.itemName(), @@ -56,7 +56,7 @@ public CompletableFuture cancelOrder(UUID orderId) { return bazaarService.handleRequest(message) - .thenApply(response -> response.successful); + .thenApply(response -> response.success()); } public CompletableFuture getItemData(ItemType itemType) { @@ -115,8 +115,8 @@ public CompletableFuture createBuyOrder(ItemType itemType, double return bazaarService.handleRequest(message) .thenApply(response -> new BazaarResult( - response.successful, - response.successful ? "Buy order created!" : "Failed to create buy order" + response.success(), + response.success() ? "Buy order created!" : "Failed to create buy order" )); } @@ -132,8 +132,8 @@ public CompletableFuture createSellOrder(ItemType itemType, double return bazaarService.handleRequest(message) .thenApply(response -> new BazaarResult( - response.successful, - response.successful ? "Sell order created!" : "Failed to create sell order" + response.success(), + response.success() ? "Sell order created!" : "Failed to create sell order" )); } @@ -213,12 +213,12 @@ public CompletableFuture> getPendingTransactions() { return bazaarService.handleRequest(message) - .thenApply(response -> response.transactions.stream() + .thenApply(response -> response.transactions().stream() .map(txInfo -> new PendingTransaction( - txInfo.id, - txInfo.transactionType, - txInfo.transactionData, - txInfo.createdAt + txInfo.id(), + txInfo.transactionType(), + new org.json.JSONObject(txInfo.transactionData()), + txInfo.createdAt() )) .collect(Collectors.toList())); } @@ -233,10 +233,10 @@ public CompletableFuture processPendingTransactions(Li return bazaarService.handleRequest(message) .thenApply(response -> new TransactionProcessResult( - response.processedCount, - response.failedCount, - response.successfulTransactionIds, - response.failedTransactionIds + response.processedCount(), + response.failedCount(), + response.successfulTransactionIds(), + response.failedTransactionIds() )); } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/commands/VerifyApiCommand.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/commands/VerifyApiCommand.java index 81e07f76c..0e0d99175 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/commands/VerifyApiCommand.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/commands/VerifyApiCommand.java @@ -41,7 +41,7 @@ public void registerUsage(MinestomCommand command) { player.getUuid() )).thenAccept(nonCastedResponse -> { APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse response = (APIAuthenticateCodeProtocolObject.AuthenticateCodeResponse) nonCastedResponse; - if (response.successful) { + if (response.success()) { sender.sendMessage("§aCode '" + codeString + "' has successfully been verified! Check your web browser."); } else { sender.sendMessage("§cInvalid code!"); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/DataMutexService.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/DataMutexService.java index 8da3654aa..eb309067b 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/DataMutexService.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/data/DataMutexService.java @@ -96,11 +96,11 @@ public void withSynchronizedData(String lockKey, List coopMembers, service.handleRequest(updateRequest); updateFuture.thenAccept(updateResponse -> { - Logger.info("Update response: success=" + updateResponse.success() + ", message=" + updateResponse.message()); + Logger.info("Update response: success=" + updateResponse.success() + ", error=" + updateResponse.error()); if (!updateResponse.success()) { // If update fails, unlock the data - Logger.error("Failed to update data: " + updateResponse.message()); + Logger.error("Failed to update data: " + updateResponse.error()); unlockData(onlineServers, playerUUID, dataType.getKey()); onFailure.run(); } else { @@ -180,11 +180,11 @@ private void unlockData(List serverUUIDs, UUID playerUUID, String dataKey) serverUUIDs, playerUUID, dataKey )).thenAccept(response -> { UnlockDataProtocolObject.UnlockDataResponse responseObject = (UnlockDataProtocolObject.UnlockDataResponse) response; - Logger.info("Unlock response: success=" + responseObject.success() + ", message=" + responseObject.message()); + Logger.info("Unlock response: success=" + responseObject.success() + ", error=" + responseObject.error()); if (!responseObject.success()) { Logger.error("Failed to unlock data for player " + playerUUID + - ", dataKey: " + dataKey + " - " + responseObject.message()); + ", dataKey: " + dataKey + " - " + responseObject.error()); } }).exceptionally(throwable -> { Logger.error("Error unlocking data: " + throwable.getMessage(), throwable); diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisHasIslandLoaded.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisHasIslandLoaded.java index a4d05b3f4..d3ceae626 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisHasIslandLoaded.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisHasIslandLoaded.java @@ -1,22 +1,21 @@ package net.swofty.type.skyblockgeneric.redis; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.DoesServerHaveIslandProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.skyblockgeneric.user.SkyBlockIsland; -import org.json.JSONObject; import java.util.UUID; -public class RedisHasIslandLoaded implements ProxyToClient { - +public class RedisHasIslandLoaded implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.DOES_SERVER_HAVE_ISLAND; + public ProtocolObject getProtocol() { + return new DoesServerHaveIslandProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID islandUUID = UUID.fromString(message.getString("island-uuid")); - return new JSONObject().put("server-has-it", SkyBlockIsland.hasIsland(islandUUID)); + public DoesServerHaveIslandProtocol.Response onMessage(DoesServerHaveIslandProtocol.Request message) { + UUID islandUUID = UUID.fromString(message.islandUuid()); + return new DoesServerHaveIslandProtocol.Response(SkyBlockIsland.hasIsland(islandUUID), true, null); } } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRefreshCoopData.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRefreshCoopData.java index 775551ec0..98787f01f 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRefreshCoopData.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRefreshCoopData.java @@ -1,30 +1,30 @@ package net.swofty.type.skyblockgeneric.redis; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.RefreshCoopDataProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; import net.swofty.type.generic.data.mongodb.ProfilesDatabase; import net.swofty.type.skyblockgeneric.data.SkyBlockDataHandler; import net.swofty.type.skyblockgeneric.data.SkyBlockDatapoint; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; import org.bson.Document; -import org.json.JSONObject; import java.util.UUID; -public class RedisRefreshCoopData implements ProxyToClient { +public class RedisRefreshCoopData implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.REFRESH_COOP_DATA_ON_SERVER; + public ProtocolObject getProtocol() { + return new RefreshCoopDataProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); - String datapoint = message.getString("datapoint"); + public RefreshCoopDataProtocol.Response onMessage(RefreshCoopDataProtocol.Request message) { + UUID uuid = UUID.fromString(message.uuid()); + String datapoint = message.datapoint(); SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(uuid); - if (player == null) return new JSONObject(); + if (player == null) return new RefreshCoopDataProtocol.Response(); SkyBlockDataHandler dataHandler = SkyBlockDataHandler.createFromProfileOnly( new ProfilesDatabase(player.getProfiles().getCurrentlySelected().toString()).getDocument() @@ -33,11 +33,11 @@ public JSONObject onMessage(JSONObject message) { @SuppressWarnings("unchecked") SkyBlockDatapoint targetDatapoint = (SkyBlockDatapoint) player.getSkyblockDataHandler().getSkyBlockDatapoint(datapoint); Object value = dataHandler.getSkyBlockDatapoint(datapoint).getValue(); - targetDatapoint.setValueBypassCoop(value); // starting to remind me of Python - ArikSquad + targetDatapoint.setValueBypassCoop(value); Document toReplace = player.getSkyblockDataHandler().toProfileDocument(); ProfilesDatabase.replaceDocument(player.getProfiles().getCurrentlySelected().toString(), toReplace); - return new JSONObject(); + return new RefreshCoopDataProtocol.Response(); } } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRunEvent.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRunEvent.java index 5d76e94c5..d00fe36fb 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRunEvent.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/RedisRunEvent.java @@ -1,35 +1,31 @@ package net.swofty.type.skyblockgeneric.redis; import net.minestom.server.event.Event; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.RunEventProtocol; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; import net.swofty.type.generic.event.HypixelEventHandler; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; -import org.json.JSONObject; import org.tinylog.Logger; import java.lang.reflect.InvocationTargetException; import java.util.UUID; -public class RedisRunEvent implements ProxyToClient { +public class RedisRunEvent implements TypedProxyHandler { @Override - public FromProxyChannels getChannel() { - return FromProxyChannels.RUN_EVENT_ON_SERVER; + public ProtocolObject getProtocol() { + return new RunEventProtocol(); } @Override - public JSONObject onMessage(JSONObject message) { - UUID uuid = UUID.fromString(message.getString("uuid")); - String eventClassName = message.getString("event"); - String eventArgs = message.getString("data"); + public RunEventProtocol.Response onMessage(RunEventProtocol.Request message) { + UUID uuid = UUID.fromString(message.uuid()); + String eventClassName = message.event(); + String eventArgs = message.data(); SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(uuid); - if (player == null) return new JSONObject(); - - // Access static method - // public static CollectionUpdateEvent fromProxyUnderstandable(SkyBlockPlayer player, String string) { - // with the arguments player and eventArgsWithoutPlayerName + if (player == null) return new RunEventProtocol.Response(); Class eventClass = null; try { @@ -48,6 +44,6 @@ public JSONObject onMessage(JSONObject message) { HypixelEventHandler.callCustomEvent(event); - return new JSONObject(); + return new RunEventProtocol.Response(); } } diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisDarkAuctionEvent.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisDarkAuctionEvent.java deleted file mode 100644 index 39928cdf1..000000000 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisDarkAuctionEvent.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.swofty.type.skyblockgeneric.redis.service; - -import net.swofty.commons.ServerType; -import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventProtocol; -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.generic.HypixelConst; -import net.swofty.type.skyblockgeneric.darkauction.DarkAuctionHandler; -import org.json.JSONObject; -import org.tinylog.Logger; - -/** - * Redis handler for Dark Auction events. - * Only responsible for receiving and routing messages to DarkAuctionHandler. - */ -public class RedisDarkAuctionEvent implements ServiceToClient { - - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.DARK_AUCTION_EVENT; - } - - @Override - public JSONObject onMessage(JSONObject message) { - if (HypixelConst.getTypeLoader().getType() != ServerType.SKYBLOCK_HUB) { - return null; - } - - try { - String eventTypeStr = message.getString("eventType"); - DarkAuctionEventProtocol.EventType eventType = DarkAuctionEventProtocol.EventType.valueOf(eventTypeStr); - - Logger.info("Received Dark Auction event: {}", eventType); - - switch (eventType) { - case AUCTION_START -> DarkAuctionHandler.handleAuctionStart(message); - case AUCTION_BEGIN -> DarkAuctionHandler.handleAuctionBegin(message); - case ROUND_START -> DarkAuctionHandler.handleRoundStart(message); - case BID_PLACED -> DarkAuctionHandler.handleBidPlaced(message); - case ROUND_END -> DarkAuctionHandler.handleRoundEnd(message); - case AUCTION_END -> DarkAuctionHandler.handleAuctionEnd(message); - } - - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersInAuction", DarkAuctionHandler.getPlayersInAuctionCount()); - return response; - - } catch (Exception e) { - Logger.error(e, "Error handling Dark Auction event"); - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", e.getMessage()); - return response; - } - } -} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisGetPlayerData.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisGetPlayerData.java deleted file mode 100644 index cbb89b953..000000000 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisGetPlayerData.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.swofty.type.skyblockgeneric.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; -import net.swofty.type.skyblockgeneric.data.SkyBlockDataHandler; -import net.swofty.type.skyblockgeneric.data.SkyBlockDatapoint; -import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; -import org.json.JSONObject; - -import java.util.UUID; - -public class RedisGetPlayerData implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.GET_SKYBLOCK_DATA; - } - - @Override - public JSONObject onMessage(JSONObject message) { - UUID playerUUID = UUID.fromString(message.getString("playerUUID")); - String dataKey = message.getString("dataKey"); - - SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(playerUUID); - if (player == null) { - return new JSONObject() - .put("success", false) - .put("error", "Player not found on this server"); - } - - try { - SkyBlockDataHandler.Data dataType = SkyBlockDataHandler.Data.fromKey(dataKey); - if (dataType == null) { - return new JSONObject() - .put("success", false) - .put("error", "Invalid data key: " + dataKey); - } - - Object data = player.getSkyblockDataHandler().get(dataType, dataType.getType()).getValue(); - String serializedData = ((SkyBlockDatapoint) dataType.getDefaultDatapoint()).getSerializer().serialize(data); - - return new JSONObject() - .put("success", true) - .put("data", serializedData) - .put("timestamp", System.currentTimeMillis()); - - } catch (Exception e) { - return new JSONObject() - .put("success", false) - .put("error", "Failed to get data: " + e.getMessage()); - } - } -} \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisLockPlayerData.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisLockPlayerData.java deleted file mode 100644 index 13d0f3a96..000000000 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisLockPlayerData.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.swofty.type.skyblockgeneric.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; -import net.swofty.type.skyblockgeneric.redis.service.manager.ServerLockManager; -import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; -import org.json.JSONObject; - -import java.util.UUID; - -public class RedisLockPlayerData implements ServiceToClient { - - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.LOCK_PLAYER_DATA; - } - - @Override - public JSONObject onMessage(JSONObject message) { - UUID playerUUID = UUID.fromString(message.getString("playerUUID")); - String dataKey = message.getString("dataKey"); - - SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(playerUUID); - if (player == null) { - return new JSONObject() - .put("success", false) - .put("error", "Player not found on this server"); - } - - String lockKey = playerUUID + ":" + dataKey; - - if (ServerLockManager.acquireLock(lockKey)) { - return new JSONObject() - .put("success", true) - .put("lockTime", System.currentTimeMillis()); - } else { - return new JSONObject() - .put("success", false) - .put("error", "Data is already locked"); - } - } -} \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUnlockPlayerData.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUnlockPlayerData.java deleted file mode 100644 index 9a5e7181e..000000000 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUnlockPlayerData.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.swofty.type.skyblockgeneric.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.skyblockgeneric.redis.service.manager.ServerLockManager; -import org.json.JSONObject; - -import java.util.UUID; - -public class RedisUnlockPlayerData implements ServiceToClient { - - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.UNLOCK_PLAYER_DATA; - } - - @Override - public JSONObject onMessage(JSONObject message) { - UUID playerUUID = UUID.fromString(message.getString("playerUUID")); - String dataKey = message.getString("dataKey"); - - String lockKey = playerUUID + ":" + dataKey; - - ServerLockManager.releaseLock(lockKey); - - return new JSONObject() - .put("success", true) - .put("unlockTime", System.currentTimeMillis()); - } -} \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUpdatePlayerData.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUpdatePlayerData.java deleted file mode 100644 index 886aabd99..000000000 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisUpdatePlayerData.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.swofty.type.skyblockgeneric.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.generic.data.Datapoint; -import net.swofty.type.generic.data.HypixelDataHandler; -import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; -import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; -import org.json.JSONObject; - -import java.util.UUID; - -public class RedisUpdatePlayerData implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.UPDATE_PLAYER_DATA; - } - - @Override - public JSONObject onMessage(JSONObject message) { - UUID playerUUID = UUID.fromString(message.getString("playerUUID")); - String dataKey = message.getString("dataKey"); - String newDataSerialized = message.getString("newData"); - - SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(playerUUID); - if (player == null) { - return new JSONObject() - .put("success", false) - .put("error", "Player not found on this server"); - } - - try { - HypixelDataHandler.Data dataType = HypixelDataHandler.Data.fromKey(dataKey); - if (dataType == null) { - return new JSONObject() - .put("success", false) - .put("error", "Invalid data key: " + dataKey); - } - - // Deserialize and set the new data - Datapoint datapoint = dataType.getDefaultDatapoint().getClass().getDeclaredConstructor(String.class).newInstance(dataKey); - datapoint.deserializeValue(newDataSerialized); - datapoint.setUser(player.getSkyblockDataHandler()).setData(dataType); - - player.getSkyblockDataHandler().getDatapoints().put(dataKey, datapoint); - - return new JSONObject() - .put("success", true) - .put("timestamp", System.currentTimeMillis()); - - } catch (Exception e) { - return new JSONObject() - .put("success", false) - .put("error", "Failed to update data: " + e.getMessage()); - } - } -} \ No newline at end of file diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisPropogateBazaarTransaction.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedBazaarTransactionHandler.java similarity index 70% rename from type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisPropogateBazaarTransaction.java rename to type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedBazaarTransactionHandler.java index 41914a980..75d9a35d2 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisPropogateBazaarTransaction.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedBazaarTransactionHandler.java @@ -1,10 +1,13 @@ package net.swofty.type.skyblockgeneric.redis.service; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.bazaar.BazaarTransactionPushProtocol; +import net.swofty.commons.protocol.objects.bazaar.BazaarTransactionPushProtocol.Request; +import net.swofty.commons.protocol.objects.bazaar.BazaarTransactionPushProtocol.Response; import net.swofty.commons.skyblock.bazaar.BazaarTransaction; import net.swofty.commons.skyblock.bazaar.OrderExpiredBazaarTransaction; import net.swofty.commons.skyblock.bazaar.SuccessfulBazaarTransaction; -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; import net.swofty.type.skyblockgeneric.bazaar.BazaarAwarder; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; @@ -13,42 +16,41 @@ import java.util.UUID; -public class RedisPropogateBazaarTransaction implements ServiceToClient { +public class TypedBazaarTransactionHandler implements TypedServiceHandler { + + private static final BazaarTransactionPushProtocol PROTOCOL = new BazaarTransactionPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_BAZAAR_TRANSACTION; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String transactionType = message.getString("type"); - JSONObject data = message.getJSONObject("data"); + String transactionType = message.transactionType(); + JSONObject data = new JSONObject(message.transactionJson()); Logger.info("Received bazaar transaction: " + transactionType); - // Parse the transaction based on type BazaarTransaction transaction = parseTransaction(transactionType, data); if (transaction == null) { Logger.error("Failed to parse bazaar transaction of type: " + transactionType); - return createFailureResponse("Failed to parse transaction"); + return Response.failure("Failed to parse transaction"); } - // Handle the transaction using BazaarAwarder - return switch (transaction) { case SuccessfulBazaarTransaction success -> handleSuccessfulTransaction(success); case OrderExpiredBazaarTransaction expired -> handleExpiredTransaction(expired); default -> { Logger.error("Unknown transaction type: " + transaction.getClass().getSimpleName()); - yield createFailureResponse("Unknown transaction type"); + yield Response.failure("Unknown transaction type"); } }; } catch (Exception e) { Logger.error(e, "Failed to propagate bazaar transaction"); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -72,7 +74,7 @@ private BazaarTransaction parseTransaction(String type, JSONObject data) { } } - private JSONObject handleSuccessfulTransaction(SuccessfulBazaarTransaction transaction) { + private Response handleSuccessfulTransaction(SuccessfulBazaarTransaction transaction) { Logger.info("Handling successful transaction for item: " + transaction.itemName() + " between buyer: " + transaction.buyer() + " and seller: " + transaction.seller()); @@ -95,17 +97,10 @@ private JSONObject handleSuccessfulTransaction(SuccessfulBazaarTransaction trans Logger.info("Seller " + transaction.seller() + " is offline or on different profile"); } - // Return status to bazaar service - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("buyerHandled", buyerHandled); - response.put("sellerHandled", sellerHandled); - response.put("transactionId", transaction.timestamp().toString()); - - return response; + return new Response(true, buyerHandled, sellerHandled, transaction.timestamp().toString(), null); } - private JSONObject handleExpiredTransaction(OrderExpiredBazaarTransaction transaction) { + private Response handleExpiredTransaction(OrderExpiredBazaarTransaction transaction) { Logger.info("Handling expired order for: " + transaction.itemName() + " owner: " + transaction.owner()); @@ -119,18 +114,6 @@ private JSONObject handleExpiredTransaction(OrderExpiredBazaarTransaction transa Logger.info("Owner " + transaction.owner() + " is offline or on different profile"); } - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("ownerHandled", ownerHandled); - response.put("orderId", transaction.orderId().toString()); - - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("reason", reason); - return response; + return new Response(true, ownerHandled, false, transaction.orderId().toString(), null); } -} \ No newline at end of file +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedDarkAuctionEventHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedDarkAuctionEventHandler.java new file mode 100644 index 000000000..649745efb --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedDarkAuctionEventHandler.java @@ -0,0 +1,86 @@ +package net.swofty.type.skyblockgeneric.redis.service; + +import net.swofty.commons.ServerType; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventPushProtocol; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventPushProtocol.Response; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventProtocol; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.skyblockgeneric.darkauction.DarkAuctionHandler; +import org.json.JSONArray; +import org.json.JSONObject; +import org.tinylog.Logger; + +public class TypedDarkAuctionEventHandler implements TypedServiceHandler { + + private static final DarkAuctionEventPushProtocol PROTOCOL = new DarkAuctionEventPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request request) { + if (HypixelConst.getTypeLoader().getType() != ServerType.SKYBLOCK_HUB) { + return null; + } + + try { + DarkAuctionEventProtocol.EventType eventType = DarkAuctionEventProtocol.EventType.valueOf(request.eventType()); + + Logger.info("Received Dark Auction event: {}", eventType); + + JSONObject message = toJson(request); + + switch (eventType) { + case AUCTION_START -> DarkAuctionHandler.handleAuctionStart(message); + case AUCTION_BEGIN -> DarkAuctionHandler.handleAuctionBegin(message); + case ROUND_START -> DarkAuctionHandler.handleRoundStart(message); + case BID_PLACED -> DarkAuctionHandler.handleBidPlaced(message); + case ROUND_END -> DarkAuctionHandler.handleRoundEnd(message); + case AUCTION_END -> DarkAuctionHandler.handleAuctionEnd(message); + } + + return Response.success(DarkAuctionHandler.getPlayersInAuctionCount()); + } catch (Exception e) { + Logger.error(e, "Error handling Dark Auction event"); + return Response.failure(e.getMessage()); + } + } + + private JSONObject toJson(Request request) { + JSONObject json = new JSONObject(); + json.put("eventType", request.eventType()); + json.put("auctionId", request.auctionId()); + json.put("phase", request.phase()); + json.put("currentRound", request.currentRound()); + json.put("currentItemType", request.currentItemType()); + json.put("currentBid", request.currentBid()); + json.put("highestBidderId", request.highestBidderId()); + json.put("highestBidderName", request.highestBidderName()); + json.put("countdown", request.countdown()); + + JSONArray itemsArray = new JSONArray(); + if (request.roundItems() != null) { + for (String item : request.roundItems()) { + itemsArray.put(item); + } + } + json.put("roundItems", itemsArray); + + if (request.refundPlayerId() != null) { + json.put("refundPlayerId", request.refundPlayerId()); + json.put("refundAmount", request.refundAmount()); + } + + if (request.newBidderId() != null) { + json.put("newBidderId", request.newBidderId()); + json.put("newBidAmount", request.newBidAmount()); + } + + return json; + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedGetPlayerDataHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedGetPlayerDataHandler.java new file mode 100644 index 000000000..bf28c31af --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedGetPlayerDataHandler.java @@ -0,0 +1,43 @@ +package net.swofty.type.skyblockgeneric.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.data.GetPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.GetPlayerDataPushProtocol.Request; +import net.swofty.commons.protocol.objects.data.GetPlayerDataPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.data.SkyBlockDataHandler; +import net.swofty.type.skyblockgeneric.data.SkyBlockDatapoint; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class TypedGetPlayerDataHandler implements TypedServiceHandler { + + private static final GetPlayerDataPushProtocol PROTOCOL = new GetPlayerDataPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(message.playerUUID()); + if (player == null) { + return Response.failure("Player not found on this server"); + } + + try { + SkyBlockDataHandler.Data dataType = SkyBlockDataHandler.Data.fromKey(message.dataKey()); + if (dataType == null) { + return Response.failure("Invalid data key: " + message.dataKey()); + } + + Object data = player.getSkyblockDataHandler().get(dataType, dataType.getType()).getValue(); + String serializedData = ((SkyBlockDatapoint) dataType.getDefaultDatapoint()).getSerializer().serialize(data); + + return Response.success(serializedData, System.currentTimeMillis()); + } catch (Exception e) { + return Response.failure("Failed to get data: " + e.getMessage()); + } + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedLockPlayerDataHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedLockPlayerDataHandler.java new file mode 100644 index 000000000..50b266928 --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedLockPlayerDataHandler.java @@ -0,0 +1,36 @@ +package net.swofty.type.skyblockgeneric.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.data.LockPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.LockPlayerDataPushProtocol.Request; +import net.swofty.commons.protocol.objects.data.LockPlayerDataPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.redis.service.manager.ServerLockManager; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class TypedLockPlayerDataHandler implements TypedServiceHandler { + + private static final LockPlayerDataPushProtocol PROTOCOL = new LockPlayerDataPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(message.playerUUID()); + if (player == null) { + return Response.failure("Player not found on this server"); + } + + String lockKey = message.playerUUID() + ":" + message.dataKey(); + + if (ServerLockManager.acquireLock(lockKey)) { + return Response.success(System.currentTimeMillis()); + } else { + return Response.failure("Data is already locked"); + } + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisSkyBlockPropagatePartyEvent.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedSkyBlockPartyEventHandler.java similarity index 85% rename from type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisSkyBlockPropagatePartyEvent.java rename to type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedSkyBlockPartyEventHandler.java index 1420c822e..ab746aaeb 100644 --- a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisSkyBlockPropagatePartyEvent.java +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedSkyBlockPartyEventHandler.java @@ -8,14 +8,15 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -23,36 +24,29 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisSkyBlockPropagatePartyEvent implements ServiceToClient { +public class TypedSkyBlockPartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - // Logger.info("Handled party event: " + event.getClass().getSimpleName() + " for " + participants.size() + " players"); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -81,7 +75,6 @@ private List handleEventForPlayers(PartyEvent event, List participan playersHandled.add(participantUUID); } catch (Exception e) { Logger.error("Failed to handle party event for player " + participantUUID + ": " + e.getMessage()); - e.printStackTrace(); } } } @@ -111,11 +104,8 @@ private void handleEventForPlayer(SkyBlockPlayer player, PartyEvent event) { } private void handleChatMessageEvent(SkyBlockPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = SkyBlockPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = SkyBlockPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(SkyBlockPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -177,8 +167,7 @@ private void handleInviteExpiredEvent(SkyBlockPlayer player, PartyInviteExpiredR private void handleInviteEvent(SkyBlockPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = SkyBlockPlayer.getRawName(inviter); + String inviterName = SkyBlockPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(SkyBlockPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -219,9 +208,7 @@ private void handleTransferEvent(SkyBlockPlayer player, PartyLeaderTransferRespo if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = SkyBlockPlayer.getDisplayName(newLeader); - + String newLeaderName = SkyBlockPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -230,11 +217,8 @@ private void handleKickEvent(SkyBlockPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = SkyBlockPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = SkyBlockPlayer.getDisplayName(kicker); - + String kickedName = SkyBlockPlayer.getDisplayName(event.getKicked()); + String kickerName = SkyBlockPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -257,12 +241,8 @@ private void handlePromotionEvent(SkyBlockPlayer player, PartyPromotionResponseE } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = SkyBlockPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = SkyBlockPlayer.getDisplayName(promoter); - + String promotedName = SkyBlockPlayer.getDisplayName(event.getPromoted()); + String promoterName = SkyBlockPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -295,7 +275,7 @@ private void handleWarpEvent(SkyBlockPlayer player, PartyWarpResponseEvent event if (player.isOnline()) { throw new RuntimeException(throwable); } - return null; // Return value for the CompletableFuture + return null; }).join(); } else { player.sendMessage("§7Warping party..."); @@ -333,23 +313,4 @@ private void sendMessage(SkyBlockPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } -} \ No newline at end of file +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUnlockPlayerDataHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUnlockPlayerDataHandler.java new file mode 100644 index 000000000..b60fc632c --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUnlockPlayerDataHandler.java @@ -0,0 +1,25 @@ +package net.swofty.type.skyblockgeneric.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.data.UnlockPlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.UnlockPlayerDataPushProtocol.Request; +import net.swofty.commons.protocol.objects.data.UnlockPlayerDataPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.skyblockgeneric.redis.service.manager.ServerLockManager; + +public class TypedUnlockPlayerDataHandler implements TypedServiceHandler { + + private static final UnlockPlayerDataPushProtocol PROTOCOL = new UnlockPlayerDataPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + String lockKey = message.playerUUID() + ":" + message.dataKey(); + ServerLockManager.releaseLock(lockKey); + return Response.success(System.currentTimeMillis()); + } +} diff --git a/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUpdatePlayerDataHandler.java b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUpdatePlayerDataHandler.java new file mode 100644 index 000000000..f9da00e09 --- /dev/null +++ b/type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/TypedUpdatePlayerDataHandler.java @@ -0,0 +1,47 @@ +package net.swofty.type.skyblockgeneric.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.data.UpdatePlayerDataPushProtocol; +import net.swofty.commons.protocol.objects.data.UpdatePlayerDataPushProtocol.Request; +import net.swofty.commons.protocol.objects.data.UpdatePlayerDataPushProtocol.Response; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.generic.data.Datapoint; +import net.swofty.type.generic.data.HypixelDataHandler; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class TypedUpdatePlayerDataHandler implements TypedServiceHandler { + + private static final UpdatePlayerDataPushProtocol PROTOCOL = new UpdatePlayerDataPushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request message) { + SkyBlockPlayer player = SkyBlockGenericLoader.getFromUUID(message.playerUUID()); + if (player == null) { + return Response.failure("Player not found on this server"); + } + + try { + HypixelDataHandler.Data dataType = HypixelDataHandler.Data.fromKey(message.dataKey()); + if (dataType == null) { + return Response.failure("Invalid data key: " + message.dataKey()); + } + + Datapoint datapoint = dataType.getDefaultDatapoint().getClass() + .getDeclaredConstructor(String.class).newInstance(message.dataKey()); + datapoint.deserializeValue(message.newData()); + datapoint.setUser(player.getSkyblockDataHandler()).setData(dataType); + + player.getSkyblockDataHandler().getDatapoints().put(message.dataKey(), datapoint); + + return Response.success(System.currentTimeMillis()); + } catch (Exception e) { + return Response.failure("Failed to update data: " + e.getMessage()); + } + } +} diff --git a/type.skywarsconfigurator/src/main/java/net/swofty/type/skywarsconfigurator/TypeSkyWarsConfiguratorLoader.java b/type.skywarsconfigurator/src/main/java/net/swofty/type/skywarsconfigurator/TypeSkyWarsConfiguratorLoader.java index 3edf21a80..eecd23562 100644 --- a/type.skywarsconfigurator/src/main/java/net/swofty/type/skywarsconfigurator/TypeSkyWarsConfiguratorLoader.java +++ b/type.skywarsconfigurator/src/main/java/net/swofty/type/skywarsconfigurator/TypeSkyWarsConfiguratorLoader.java @@ -10,8 +10,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.HypixelTypeLoader; import net.swofty.type.generic.command.HypixelCommand; @@ -115,13 +114,9 @@ public List getNPCs() { return List.of(); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/TypeSkywarsGameLoader.java b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/TypeSkywarsGameLoader.java index b22dd5b66..43d3a6950 100644 --- a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/TypeSkywarsGameLoader.java +++ b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/TypeSkywarsGameLoader.java @@ -24,8 +24,8 @@ import net.swofty.commons.skywars.SkywarsGameType; import net.swofty.commons.skywars.map.SkywarsMapsConfig; import net.swofty.proxyapi.ProxyService; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.pvp.MinestomPvP; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; @@ -291,16 +291,18 @@ public List getNPCs() { return List.of(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.skywarsgame.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/events/ActionPlayerJoin.java b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/events/ActionPlayerJoin.java index fa6cb1fd8..b2e72c737 100644 --- a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/events/ActionPlayerJoin.java +++ b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/events/ActionPlayerJoin.java @@ -7,7 +7,7 @@ import net.swofty.type.generic.event.EventNodes; import net.swofty.type.generic.event.HypixelEvent; import net.swofty.type.generic.event.HypixelEventClass; -import net.swofty.type.generic.redis.service.RedisGameMessage; +import net.swofty.type.generic.redis.service.TypedGameInformationHandler; import net.swofty.type.generic.utility.MathUtility; import net.swofty.type.skywarsgame.TypeSkywarsGameLoader; import net.swofty.type.skywarsgame.game.SkywarsGame; @@ -30,7 +30,7 @@ public void onJoin(AsyncPlayerConfigurationEvent event) { private void tryJoinGame(SkywarsPlayer player, boolean isRetry) { if (!player.isOnline()) return; - String assignedGameId = RedisGameMessage.game.remove(player.getUuid()); + String assignedGameId = TypedGameInformationHandler.game.remove(player.getUuid()); if (assignedGameId == null) { if (!isRetry) { Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second..."); diff --git a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisInstantiateGame.java b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisInstantiateGame.java deleted file mode 100644 index a63ca43c1..000000000 --- a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisInstantiateGame.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.swofty.type.skywarsgame.redis.service; - -import net.swofty.commons.service.FromServiceChannels; -import net.swofty.commons.skywars.SkywarsGameType; -import net.swofty.commons.skywars.map.SkywarsMapsConfig; -import net.swofty.proxyapi.redis.ServiceToClient; -import net.swofty.type.skywarsgame.TypeSkywarsGameLoader; -import net.swofty.type.skywarsgame.game.SkywarsGame; -import org.json.JSONObject; - -import java.util.List; - -public class RedisInstantiateGame implements ServiceToClient { - @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.INSTANTIATE_GAME; - } - - @Override - public JSONObject onMessage(JSONObject message) { - try { - String gameTypeStr = message.getString("gameType"); - String mapName = message.optString("map", null); - - SkywarsGameType gameType = SkywarsGameType.from(gameTypeStr.toUpperCase()); - if (gameType == null) { - return new JSONObject() - .put("success", false) - .put("error", "Invalid game type: " + gameTypeStr); - } - - SkywarsMapsConfig.MapEntry mapEntry = null; - if (TypeSkywarsGameLoader.getMapsConfig() != null) { - List availableMaps = TypeSkywarsGameLoader.getMapsConfig().getMaps(); - - if (mapName != null && !mapName.isEmpty()) { - for (SkywarsMapsConfig.MapEntry entry : availableMaps) { - if (entry.getId().equals(mapName) || entry.getName().equals(mapName)) { - mapEntry = entry; - break; - } - } - } else { - List compatibleMaps = availableMaps.stream() - .filter(entry -> entry.getConfiguration() != null - && entry.getConfiguration().getTypes() != null - && entry.getConfiguration().getTypes().contains(gameType)) - .toList(); - - if (!compatibleMaps.isEmpty()) { - mapEntry = compatibleMaps.get(java.util.concurrent.ThreadLocalRandom.current().nextInt(compatibleMaps.size())); - } - } - } - - if (mapEntry == null) { - return new JSONObject() - .put("success", false) - .put("error", mapName != null ? "Map not found: " + mapName : "No compatible maps available for " + gameType); - } - - SkywarsGame game = TypeSkywarsGameLoader.createGame(mapEntry, gameType); - if (game == null) { - return new JSONObject() - .put("success", false) - .put("error", "Server at capacity, cannot create new game"); - } - - return new JSONObject() - .put("success", true) - .put("gameId", game.getGameId()) - .put("map", mapEntry.getName()) - .put("gameType", gameType.toString()); - - } catch (Exception e) { - return new JSONObject() - .put("success", false) - .put("error", "Failed to instantiate game: " + e.getMessage()); - } - } -} diff --git a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedInstantiateGameHandler.java b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedInstantiateGameHandler.java new file mode 100644 index 000000000..159c7d4a7 --- /dev/null +++ b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedInstantiateGameHandler.java @@ -0,0 +1,71 @@ +package net.swofty.type.skywarsgame.redis.service; + +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Request; +import net.swofty.commons.protocol.objects.game.InstantiateGamePushProtocol.Response; +import net.swofty.commons.skywars.SkywarsGameType; +import net.swofty.commons.skywars.map.SkywarsMapsConfig; +import net.swofty.proxyapi.redis.TypedServiceHandler; +import net.swofty.type.skywarsgame.TypeSkywarsGameLoader; +import net.swofty.type.skywarsgame.game.SkywarsGame; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class TypedInstantiateGameHandler implements TypedServiceHandler { + + private static final InstantiateGamePushProtocol PROTOCOL = new InstantiateGamePushProtocol(); + + @Override + public ServicePushProtocol getProtocol() { + return PROTOCOL; + } + + @Override + public Response onMessage(Request request) { + try { + SkywarsGameType gameType = SkywarsGameType.from(request.gameType().toUpperCase()); + if (gameType == null) { + return Response.failure("Invalid game type: " + request.gameType()); + } + + SkywarsMapsConfig.MapEntry mapEntry = null; + if (TypeSkywarsGameLoader.getMapsConfig() != null) { + List availableMaps = TypeSkywarsGameLoader.getMapsConfig().getMaps(); + + if (request.map() != null && !request.map().isEmpty()) { + for (SkywarsMapsConfig.MapEntry entry : availableMaps) { + if (entry.getId().equals(request.map()) || entry.getName().equals(request.map())) { + mapEntry = entry; + break; + } + } + } else { + List compatibleMaps = availableMaps.stream() + .filter(entry -> entry.getConfiguration() != null + && entry.getConfiguration().getTypes() != null + && entry.getConfiguration().getTypes().contains(gameType)) + .toList(); + + if (!compatibleMaps.isEmpty()) { + mapEntry = compatibleMaps.get(ThreadLocalRandom.current().nextInt(compatibleMaps.size())); + } + } + } + + if (mapEntry == null) { + return Response.failure(request.map() != null ? "Map not found: " + request.map() : "No compatible maps available for " + gameType); + } + + SkywarsGame game = TypeSkywarsGameLoader.createGame(mapEntry, gameType); + if (game == null) { + return Response.failure("Server at capacity, cannot create new game"); + } + + return Response.success(game.getGameId(), mapEntry.getName(), gameType.toString()); + } catch (Exception e) { + return Response.failure("Failed to instantiate game: " + e.getMessage()); + } + } +} diff --git a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisSkywarsGamePropagatePartyEvent.java b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedSkywarsGamePartyEventHandler.java similarity index 80% rename from type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisSkywarsGamePropagatePartyEvent.java rename to type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedSkywarsGamePartyEventHandler.java index dcec34ca3..4d9f49059 100644 --- a/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/RedisSkywarsGamePropagatePartyEvent.java +++ b/type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/redis/service/TypedSkywarsGamePartyEventHandler.java @@ -10,18 +10,19 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; -import net.swofty.type.generic.redis.service.RedisGameMessage; +import net.swofty.type.generic.redis.service.TypedGameInformationHandler; import net.swofty.type.generic.user.HypixelPlayer; import net.swofty.type.skywarsgame.TypeSkywarsGameLoader; import net.swofty.type.skywarsgame.game.SkywarsGame; import net.swofty.type.skywarsgame.user.SkywarsPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -31,62 +32,56 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisSkywarsGamePropagatePartyEvent implements ServiceToClient { +public class TypedSkywarsGamePartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } if (event instanceof PartyWarpResponseEvent warpEvent) { - return handleWarpEventWithGameValidation(warpEvent, participants); + return handleWarpEventWithGameValidation(warpEvent, message.participants()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } - private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { + private Response handleWarpEventWithGameValidation(PartyWarpResponseEvent warpEvent, List participants) { UUID warperUUID = warpEvent.getWarper(); SkywarsPlayer warper = findPlayerByUuid(warperUUID); if (warper == null) { List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } SkywarsGame warperGame = TypeSkywarsGameLoader.getPlayerGame(warper); if (warperGame == null) { List playersHandled = handleEventForPlayers(warpEvent, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + return Response.success(playersHandled.size(), playersHandled); } String blockReason = warperGame.canAcceptPartyWarp(); if (blockReason != null) { warper.sendMessage(Component.text(blockReason, NamedTextColor.RED)); - return createBlockedResponse(blockReason); + return Response.blocked(blockReason); } List membersToWarp = participants.stream() @@ -108,7 +103,7 @@ private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warp warper.sendMessage(Component.text("Warping party...", NamedTextColor.GRAY)); for (UUID uuid : accepted) { - RedisGameMessage.game.put(uuid, warperGame.getGameId()); + TypedGameInformationHandler.game.put(uuid, warperGame.getGameId()); ProxyPlayer memberProxy = new ProxyPlayer(uuid); if (memberProxy.isOnline().join()) { UnderstandableProxyServer memberServer = memberProxy.getServer().join(); @@ -119,7 +114,7 @@ private JSONObject handleWarpEventWithGameValidation(PartyWarpResponseEvent warp } } - return createGameWarpResponse(accepted, rejected); + return Response.gameWarp(accepted, rejected); } private PartyEvent parseEvent(String eventType, String eventData) { @@ -185,11 +180,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -247,8 +239,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -287,9 +278,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -298,11 +287,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -325,12 +311,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -401,53 +383,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } - - private JSONObject createBlockedResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("blocked", true); - response.put("blockReason", reason); - return response; - } - - private JSONObject createGameWarpResponse(List accepted, Map rejected) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", accepted.size()); - - JSONArray acceptedArray = new JSONArray(); - for (UUID uuid : accepted) { - acceptedArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", acceptedArray); - - if (!rejected.isEmpty()) { - JSONObject rejectedObj = new JSONObject(); - for (Map.Entry entry : rejected.entrySet()) { - rejectedObj.put(entry.getKey().toString(), entry.getValue()); - } - response.put("rejectedPlayers", rejectedObj); - } - - return response; - } } diff --git a/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/TypeSkyWarsLobbyLoader.java b/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/TypeSkyWarsLobbyLoader.java index b69d024f0..24141d03f 100644 --- a/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/TypeSkyWarsLobbyLoader.java +++ b/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/TypeSkyWarsLobbyLoader.java @@ -7,8 +7,8 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.command.HypixelCommand; @@ -196,16 +196,18 @@ public List getNPCs() { ).toList(); } + @Override - public List getServiceRedisListeners() { - return HypixelGenericLoader.loopThroughPackage( + @SuppressWarnings("unchecked") + public List> getTypedServiceHandlers() { + return (List) HypixelGenericLoader.loopThroughPackage( "net.swofty.type.skywarslobby.redis.service", - ServiceToClient.class + TypedServiceHandler.class ).toList(); } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/RedisSkywarsLobbyPropagatePartyEvent.java b/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/TypedSkywarsLobbyPartyEventHandler.java similarity index 84% rename from type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/RedisSkywarsLobbyPropagatePartyEvent.java rename to type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/TypedSkywarsLobbyPartyEventHandler.java index 11cc01ed5..e79ea664b 100644 --- a/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/RedisSkywarsLobbyPropagatePartyEvent.java +++ b/type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/TypedSkywarsLobbyPartyEventHandler.java @@ -9,14 +9,15 @@ import net.swofty.commons.party.FullParty; import net.swofty.commons.party.PartyEvent; import net.swofty.commons.party.events.response.*; -import net.swofty.commons.service.FromServiceChannels; +import net.swofty.commons.protocol.ServicePushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Request; +import net.swofty.commons.protocol.objects.party.PartyEventPushProtocol.Response; import net.swofty.proxyapi.ProxyPlayer; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedServiceHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.HypixelGenericLoader; import net.swofty.type.generic.user.HypixelPlayer; -import org.json.JSONArray; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.ArrayList; @@ -24,35 +25,29 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; -public class RedisSkywarsLobbyPropagatePartyEvent implements ServiceToClient { +public class TypedSkywarsLobbyPartyEventHandler implements TypedServiceHandler { + + private static final PartyEventPushProtocol PROTOCOL = new PartyEventPushProtocol(); @Override - public FromServiceChannels getChannel() { - return FromServiceChannels.PROPAGATE_PARTY_EVENT; + public ServicePushProtocol getProtocol() { + return PROTOCOL; } @Override - public JSONObject onMessage(JSONObject message) { + public Response onMessage(Request message) { try { - String eventType = message.getString("eventType"); - String eventData = message.getString("eventData"); - JSONArray participantsArray = message.getJSONArray("participants"); - - List participants = participantsArray.toList().stream() - .map(obj -> UUID.fromString(obj.toString())) - .toList(); - - PartyEvent event = parseEvent(eventType, eventData); + PartyEvent event = parseEvent(message.eventType(), message.eventData()); if (event == null) { - Logger.error("Failed to parse event of type: " + eventType); - return createFailureResponse("Failed to parse event of type: " + eventType); + Logger.error("Failed to parse event of type: " + message.eventType()); + return Response.failure("Failed to parse event of type: " + message.eventType()); } - List playersHandled = handleEventForPlayers(event, participants); - return createSuccessResponse(playersHandled.size(), playersHandled); + List playersHandled = handleEventForPlayers(event, message.participants()); + return Response.success(playersHandled.size(), playersHandled); } catch (Exception e) { Logger.error("Failed to handle party event: " + e.getMessage()); - return createFailureResponse("Exception occurred: " + e.getMessage()); + return Response.failure("Exception occurred: " + e.getMessage()); } } @@ -61,7 +56,7 @@ private PartyEvent parseEvent(String eventType, String eventData) { PartyEvent templateEvent = PartyEvent.findFromType(eventType); return (PartyEvent) templateEvent.getSerializer().deserialize(eventData); } catch (Exception e) { - e.printStackTrace(); + Logger.error(e, "Failed to parse party event of type: {}", eventType); return null; } } @@ -110,11 +105,8 @@ private void handleEventForPlayer(HypixelPlayer player, PartyEvent event) { } private void handleChatMessageEvent(HypixelPlayer player, PartyChatMessageResponseEvent event) { - UUID messenger = event.getPlayer(); - String message = event.getMessage(); - - String messengerName = HypixelPlayer.getDisplayName(messenger); - player.sendMessage("§9Party §8> " + messengerName + "§f: " + message); + String messengerName = HypixelPlayer.getDisplayName(event.getPlayer()); + player.sendMessage("§9Party §8> " + messengerName + "§f: " + event.getMessage()); } private void handlePlayerSwitchedServerEvent(HypixelPlayer player, PartyPlayerSwitchedServerResponseEvent event) { @@ -151,12 +143,12 @@ private void handleWarpOverviewEvent(HypixelPlayer player, PartyWarpOverviewResp boolean isPlural = amountToWarp > 1; player.sendMessage("§eParty Warp §7(" + amountToWarp + (isPlural ? " players" : " player") + ")"); for (UUID uuid : event.getSuccessfullyWarped()) { - player.sendMessage("§a§l+ " + HypixelPlayer.getDisplayName(uuid) + " §awarped to your server"); + player.sendMessage("§a§l✔ " + HypixelPlayer.getDisplayName(uuid) + " §awarped to your server"); } for (UUID uuid : event.getFailedToWarp()) { String reason = event.getFailureReasons() != null ? event.getFailureReasons().getOrDefault(uuid, "Unable to warp") : "Unable to warp"; - player.sendMessage("§c§l- " + HypixelPlayer.getDisplayName(uuid) + " §c- " + reason); + player.sendMessage("§c§l✖ " + HypixelPlayer.getDisplayName(uuid) + " §c- " + reason); } player.sendMessage("§9§m-----------------------------------------------------"); } @@ -176,8 +168,7 @@ private void handleInviteExpiredEvent(HypixelPlayer player, PartyInviteExpiredRe private void handleInviteEvent(HypixelPlayer player, PartyInviteResponseEvent event) { if (event.getInvitee().equals(player.getUuid())) { - UUID inviter = event.getInviter(); - String inviterName = HypixelPlayer.getRawName(inviter); + String inviterName = HypixelPlayer.getRawName(event.getInviter()); player.sendMessage("§9§m-----------------------------------------------------"); player.sendMessage(HypixelPlayer.getDisplayName(event.getInviter()) + " §ehas invited you to join their party!"); @@ -218,9 +209,7 @@ private void handleTransferEvent(HypixelPlayer player, PartyLeaderTransferRespon if (event.getNewLeader().equals(player.getUuid())) { sendMessage(player, "§eYou are now the party leader!"); } else { - UUID newLeader = event.getNewLeader(); - String newLeaderName = HypixelPlayer.getDisplayName(newLeader); - + String newLeaderName = HypixelPlayer.getDisplayName(event.getNewLeader()); sendMessage(player, "§eThe party was transferred to " + newLeaderName); } } @@ -229,11 +218,8 @@ private void handleKickEvent(HypixelPlayer player, PartyMemberKickResponseEvent if (event.getKicked().equals(player.getUuid())) { sendMessage(player, "§cYou have been kicked from the party!"); } else { - UUID kicked = event.getKicked(); - String kickedName = HypixelPlayer.getDisplayName(kicked); - UUID kicker = event.getKicker(); - String kickerName = HypixelPlayer.getDisplayName(kicker); - + String kickedName = HypixelPlayer.getDisplayName(event.getKicked()); + String kickerName = HypixelPlayer.getDisplayName(event.getKicker()); sendMessage(player, kickerName + " §ehas kicked " + kickedName + " §efrom the party!"); } } @@ -256,12 +242,8 @@ private void handlePromotionEvent(HypixelPlayer player, PartyPromotionResponseEv } else { String action = event.getNewRole() == FullParty.Role.MEMBER ? "demoted" : "promoted"; String role = event.getNewRole().name().toLowerCase(); - - UUID promoted = event.getPromoted(); - String promotedName = HypixelPlayer.getDisplayName(promoted); - UUID promoter = event.getPromoter(); - String promoterName = HypixelPlayer.getDisplayName(promoter); - + String promotedName = HypixelPlayer.getDisplayName(event.getPromoted()); + String promoterName = HypixelPlayer.getDisplayName(event.getPromoter()); sendMessage(player, promoterName + " §e" + action + " " + promotedName + " §eto " + role + "!"); } } @@ -332,23 +314,4 @@ private void sendMessage(HypixelPlayer player, String message) { player.sendMessage(message); player.sendMessage("§9§m-----------------------------------------------------"); } - - private JSONObject createSuccessResponse(int playersHandled, List playersHandledUuids) { - JSONObject response = new JSONObject(); - response.put("success", true); - response.put("playersHandled", playersHandled); - JSONArray participantsArray = new JSONArray(); - for (UUID uuid : playersHandledUuids) { - participantsArray.put(uuid.toString()); - } - response.put("playersHandledUUIDs", participantsArray); - return response; - } - - private JSONObject createFailureResponse(String reason) { - JSONObject response = new JSONObject(); - response.put("success", false); - response.put("error", reason); - return response; - } } diff --git a/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java b/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java index 6da9e59f9..a44b9e80a 100644 --- a/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java +++ b/type.spidersden/src/main/java/net/swofty/type/spidersden/TypeSpidersDenLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; import net.swofty.type.generic.event.HypixelEventClass; @@ -86,13 +85,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.theend/src/main/java/net/swofty/type/theend/TypeTheEndLoader.java b/type.theend/src/main/java/net/swofty/type/theend/TypeTheEndLoader.java index 9916ed930..a90a16ca2 100644 --- a/type.theend/src/main/java/net/swofty/type/theend/TypeTheEndLoader.java +++ b/type.theend/src/main/java/net/swofty/type/theend/TypeTheEndLoader.java @@ -8,8 +8,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; import net.swofty.type.generic.event.HypixelEventClass; @@ -97,13 +96,9 @@ public List getNPCs() { .build()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/TypeTheFarmingIslandsLoader.java b/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/TypeTheFarmingIslandsLoader.java index e97cf1b83..0b5d81507 100644 --- a/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/TypeTheFarmingIslandsLoader.java +++ b/type.thefarmingislands/src/main/java/net/swofty/type/thefarmingislands/TypeTheFarmingIslandsLoader.java @@ -5,8 +5,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.npc.HypixelNPC; @@ -86,13 +85,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java index 74c0391ef..4806ed56f 100644 --- a/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java +++ b/type.thepark/src/main/java/net/swofty/type/thepark/TypeTheParkLoader.java @@ -16,8 +16,7 @@ import net.swofty.commons.CustomWorlds; import net.swofty.commons.ServerType; import net.swofty.commons.ServiceType; -import net.swofty.proxyapi.redis.ProxyToClient; -import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.proxyapi.redis.TypedProxyHandler; import net.swofty.type.generic.HypixelConst; import net.swofty.type.generic.SkyBlockTypeLoader; import net.swofty.type.generic.entity.BlockDisplayEntity; @@ -272,13 +271,9 @@ public List getNPCs() { ).toList()); } - @Override - public List getServiceRedisListeners() { - return List.of(); - } @Override - public List getProxyRedisListeners() { + public List> getTypedProxyHandlers() { return List.of(); } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/SkyBlockVelocity.java b/velocity.extension/src/main/java/net/swofty/velocity/SkyBlockVelocity.java index ef279e003..1c321ed7f 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/SkyBlockVelocity.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/SkyBlockVelocity.java @@ -40,8 +40,8 @@ import net.swofty.commons.config.ConfigProvider; import net.swofty.commons.config.Settings; import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.*; import net.swofty.commons.protocol.objects.punishment.GetActivePunishmentProtocolObject; -import net.swofty.commons.proxy.FromProxyChannels; import net.swofty.commons.punishment.ActivePunishment; import net.swofty.commons.punishment.PunishmentMessages; import net.swofty.commons.punishment.PunishmentReason; @@ -228,13 +228,19 @@ public void onProxyInitialization(ProxyInitializeEvent event) { loopThroughPackage("net.swofty.velocity.redis.listeners", RedisListener.class) .forEach(listener -> { RedisAPI.getInstance().registerChannel( - listener.getClass().getAnnotation(ChannelListener.class).channel().getChannelName(), + listener.getChannelName(), (event2) -> { listener.onMessage(event2.channel, event2.message); }); }); - for (FromProxyChannels channel : FromProxyChannels.values()) { - RedisMessage.registerProxyToServer(channel); + ProtocolObject[] fromProxyProtocols = { + new TeleportProtocol(), new PlayerSwitchedProtocol(), + new DoesServerHaveIslandProtocol(), new RefreshCoopDataProtocol(), + new RunEventProtocol(), new PingServerProtocol(), + new GivePlayersOriginTypeProtocol(), new BroadcastStaffChatProtocol() + }; + for (ProtocolObject protocol : fromProxyProtocols) { + RedisMessage.registerProxyToServer(protocol); } loopThroughPackage("net.swofty.commons.protocol.objects", ProtocolObject.class) .forEach(ServerOutboundMessage::registerFromProtocolObject); @@ -258,7 +264,7 @@ private boolean checkPunished(Player player) { Object banResult = banFuture.join(); if (banResult instanceof GetActivePunishmentProtocolObject.GetActivePunishmentResponse( boolean found1, String type1, String id, PunishmentReason reason1, - long at, List tags1 + long at, List tags1, boolean success1, String error1 ) && found1) { ActivePunishment punishment = new ActivePunishment( type1, id, reason1, at, tags1); @@ -269,7 +275,7 @@ private boolean checkPunished(Player player) { Object muteResult = muteFuture.join(); if (muteResult instanceof GetActivePunishmentProtocolObject.GetActivePunishmentResponse( boolean found, String type, String banId, PunishmentReason reason, - long expiresAt, List tags + long expiresAt, List tags, boolean success, String error ) && found) { ActivePunishment punishment = new ActivePunishment( type, banId, reason, expiresAt, tags); diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java index fdc209f91..3a2b571e7 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/GameManager.java @@ -6,12 +6,11 @@ import lombok.Getter; import net.swofty.commons.ServerType; import net.swofty.commons.config.ConfigProvider; -import net.swofty.commons.proxy.FromProxyChannels; +import net.swofty.commons.protocol.objects.proxy.from.PingServerProtocol; import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.redis.RedisMessage; import net.swofty.velocity.testflow.TestFlowManager; import org.jetbrains.annotations.Nullable; -import org.json.JSONObject; import java.net.InetSocketAddress; import java.time.Duration; @@ -106,7 +105,7 @@ public static void loopServers(ProxyServer server) { long startTime = System.currentTimeMillis(); RedisMessage.sendMessageToServer(registeredServer.internalID(), - FromProxyChannels.PING_SERVER, new JSONObject() + new PingServerProtocol(), new PingServerProtocol.Request() ).thenRun(() -> { pingSuccess.set(true); }); diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/TransferHandler.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/TransferHandler.java index a65046391..8592726a7 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/TransferHandler.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/TransferHandler.java @@ -4,10 +4,10 @@ import com.velocitypowered.api.proxy.server.RegisteredServer; import net.kyori.adventure.text.Component; import net.swofty.commons.ServerType; -import net.swofty.commons.proxy.FromProxyChannels; +import net.swofty.commons.protocol.objects.proxy.from.GivePlayersOriginTypeProtocol; +import net.swofty.commons.protocol.objects.proxy.from.PlayerSwitchedProtocol; import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.redis.RedisMessage; -import org.json.JSONObject; import java.util.Map; import java.util.Set; @@ -67,10 +67,9 @@ public void previousServerIsFinished(RegisteredServer manualPick) { UUID originServerUUID = UUID.fromString(originServer.getServerInfo().getName()); RedisMessage.sendMessageToServer(serverUUID, - FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE, - new JSONObject().put("uuid", player.getUniqueId().toString()) - .put("origin-type", originServerType.name()) - ); + new GivePlayersOriginTypeProtocol(), + new GivePlayersOriginTypeProtocol.Request( + player.getUniqueId().toString(), originServerType.name())); playersGoalServerType.remove(player); playersOriginServer.remove(player); @@ -80,8 +79,8 @@ public void previousServerIsFinished(RegisteredServer manualPick) { player.createConnectionRequest(manualPick).connectWithIndication(); RedisMessage.sendMessageToServer(originServerUUID, - FromProxyChannels.PLAYER_HAS_SWITCHED_FROM_HERE, - new JSONObject().put("uuid", player.getUniqueId().toString())); + new PlayerSwitchedProtocol(), + new PlayerSwitchedProtocol.Request(player.getUniqueId().toString())); }).start(); } @@ -114,10 +113,9 @@ public void previousServerIsFinished() { ServerType originServerType = GameManager.getTypeFromRegisteredServer(originServer); RedisMessage.sendMessageToServer(sendingToServerUUID, - FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE, - new JSONObject().put("uuid", player.getUniqueId().toString()) - .put("origin-type", originServerType.name()) - ); + new GivePlayersOriginTypeProtocol(), + new GivePlayersOriginTypeProtocol.Request( + player.getUniqueId().toString(), originServerType.name())); playersOriginServer.remove(player); playersGoalServerType.remove(player); @@ -126,8 +124,8 @@ public void previousServerIsFinished() { player.createConnectionRequest(server.registeredServer()).connectWithIndication(); RedisMessage.sendMessageToServer(originServerUUID, - FromProxyChannels.PLAYER_HAS_SWITCHED_FROM_HERE, - new JSONObject().put("uuid", player.getUniqueId().toString())); + new PlayerSwitchedProtocol(), + new PlayerSwitchedProtocol.Request(player.getUniqueId().toString())); }).start(); } @@ -169,10 +167,9 @@ public CompletableFuture transferTo(RegisteredServer toTransferTo) { if (originServer != null && originServerType != null) { RedisMessage.sendMessageToServer(serverUUID, - FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE, - new JSONObject().put("uuid", player.getUniqueId().toString()) - .put("origin-type", originServerType.name()) - ); + new GivePlayersOriginTypeProtocol(), + new GivePlayersOriginTypeProtocol.Request( + player.getUniqueId().toString(), originServerType.name())); } player.createConnectionRequest(toTransferTo).connectWithIndication(); diff --git a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/impl/IslandCheck.java b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/impl/IslandCheck.java index d3a67d5c0..cd6960154 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/impl/IslandCheck.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/gamemanager/impl/IslandCheck.java @@ -2,7 +2,7 @@ import com.velocitypowered.api.proxy.Player; import net.swofty.commons.ServerType; -import net.swofty.commons.proxy.FromProxyChannels; +import net.swofty.commons.protocol.objects.proxy.from.DoesServerHaveIslandProtocol; import net.swofty.velocity.data.ProfilesDatabase; import net.swofty.velocity.data.UserDatabase; import net.swofty.velocity.gamemanager.BalanceConfiguration; @@ -10,7 +10,6 @@ import net.swofty.velocity.redis.RedisMessage; import org.bson.Document; import org.jetbrains.annotations.NotNull; -import org.json.JSONObject; import java.util.ArrayList; import java.util.List; @@ -50,14 +49,12 @@ private static AtomicReference getGameServerAtomicRefere ArrayList gameServers = entry.getValue(); gameServers.forEach(gameServer -> { - JSONObject jsonResponse = RedisMessage.sendMessageToServer( + DoesServerHaveIslandProtocol.Response response = RedisMessage.sendMessageToServer( gameServer.internalID(), - FromProxyChannels.DOES_SERVER_HAVE_ISLAND, - new JSONObject().put("island-uuid", islandUUID.toString())).join(); + new DoesServerHaveIslandProtocol(), + new DoesServerHaveIslandProtocol.Request(islandUUID.toString())).join(); - boolean hasIsland = jsonResponse.getBoolean("server-has-it"); - - if (hasIsland) { + if (response.serverHasIt()) { toSendTo.set(gameServer); } }); diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/ChannelListener.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/ChannelListener.java index 2ed76fd98..c58fa472d 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/ChannelListener.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/ChannelListener.java @@ -1,11 +1,8 @@ package net.swofty.velocity.redis; -import net.swofty.commons.proxy.ToProxyChannels; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface ChannelListener { - ToProxyChannels channel(); } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisListener.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisListener.java index 98391b531..a382d498c 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisListener.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisListener.java @@ -1,46 +1,51 @@ package net.swofty.velocity.redis; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.redis.RedisEnvelope; import net.swofty.redisapi.api.ChannelRegistry; import net.swofty.redisapi.api.RedisAPI; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.UUID; -public abstract class RedisListener { +public abstract class RedisListener { + private final ProtocolObject protocol; public RedisListener() { - ChannelListener annotation = this.getClass().getAnnotation(ChannelListener.class); - if (annotation == null) { - throw new RuntimeException("Class " + this.getClass().getName() + " does not have a @ChannelListener annotation!"); - } + this.protocol = getProtocol(); + } + + public abstract ProtocolObject getProtocol(); + public abstract R receivedMessage(T message, UUID serverUUID); + + public String getChannelName() { + return protocol.channel(); } public void onMessage(String channel, String message) { - String[] split = message.split("}=-=-=\\{"); - String rawMessage = split[0]; - UUID uuid = UUID.fromString(split[1]); - UUID filterID = UUID.fromString(split[2]); + String messageWithoutFilter = message.substring(message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID uuid = UUID.fromString(envelope.id()); + UUID filterID = UUID.fromString(envelope.from()); - String messageWithoutFilter = rawMessage.substring(rawMessage.indexOf(";") + 1); - JSONObject json = new JSONObject(messageWithoutFilter); + T typedMessage = protocol.translateFromString(envelope.payload()); Thread.startVirtualThread(() -> { - JSONObject response; + R response; try { - response = receivedMessage(json, filterID); + response = receivedMessage(typedMessage, filterID); } catch (Exception e) { - System.out.println("Error on channel " + channel + " with message " + messageWithoutFilter); + System.out.println("Error on channel " + channel + " with message " + envelope.payload()); Logger.error(e, "Error in Redis listener"); return; } + String serializedResponse = protocol.translateReturnToString(response); + RedisAPI.getInstance().publishMessage( filterID.toString(), ChannelRegistry.getFromName(channel), - uuid + "}=-=-={" + response.toString()); + new RedisEnvelope(envelope.id(), "proxy", serializedResponse).serialize()); }); } - - public abstract JSONObject receivedMessage(JSONObject message, UUID serverUUID); } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisMessage.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisMessage.java index 593b0344d..fd8089765 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisMessage.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/RedisMessage.java @@ -1,9 +1,9 @@ package net.swofty.velocity.redis; -import net.swofty.commons.proxy.FromProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.redis.RedisEnvelope; import net.swofty.redisapi.api.ChannelRegistry; import net.swofty.redisapi.api.RedisAPI; -import org.json.JSONObject; import java.util.HashMap; import java.util.Map; @@ -11,32 +11,34 @@ import java.util.concurrent.CompletableFuture; public class RedisMessage { - private static final Map> callbacks = new HashMap<>(); + private static final Map> callbacks = new HashMap<>(); - public static CompletableFuture sendMessageToServer(UUID server, - FromProxyChannels channel, - JSONObject message) { + public static CompletableFuture sendMessageToServer(UUID server, + ProtocolObject protocol, + T message) { UUID requestID = UUID.randomUUID(); - CompletableFuture future = new CompletableFuture<>(); + CompletableFuture rawFuture = new CompletableFuture<>(); - callbacks.put(requestID, future); + callbacks.put(requestID, rawFuture); + String serialized = protocol.translateToString(message); RedisAPI.getInstance().publishMessage( server.toString(), - ChannelRegistry.getFromName(channel.getChannelName()), - requestID + "}=-=-={" + message.toString()); + ChannelRegistry.getFromName(protocol.channel()), + new RedisEnvelope(requestID.toString(), "proxy", serialized).serialize()); - return future; + return rawFuture.thenApply(protocol::translateReturnFromString); } - public static void registerProxyToServer(FromProxyChannels channel) { - RedisAPI.getInstance().registerChannel(channel.getChannelName(), (event) -> { - String[] split = event.message.split("}=-=-=\\{"); - UUID request = UUID.fromString(split[0].substring(split[0].indexOf(";") + 1)); - String rawMessage = split[1]; + public static void registerProxyToServer(ProtocolObject protocol) { + RedisAPI.getInstance().registerChannel(protocol.channel(), (event) -> { + String messageWithoutFilter = event.message.substring(event.message.indexOf(";") + 1); + RedisEnvelope envelope = RedisEnvelope.deserialize(messageWithoutFilter); + UUID request = UUID.fromString(envelope.id()); + String rawMessage = envelope.payload(); try { - callbacks.get(request).complete(new JSONObject(rawMessage)); + callbacks.get(request).complete(rawMessage); callbacks.remove(request); } catch (Exception e) { System.out.println("RedisMessage: Error while processing message"); diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerCount.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerCount.java index dfcc139da..71dcdc996 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerCount.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerCount.java @@ -1,44 +1,50 @@ package net.swofty.velocity.redis.listeners; import net.swofty.commons.ServerType; -import net.swofty.commons.proxy.ToProxyChannels; -import net.swofty.commons.proxy.requirements.to.PlayerCountRequirements; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.PlayerCountProtocol; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import java.util.List; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.PLAYER_COUNT) -public class ListenerPlayerCount extends RedisListener { +@ChannelListener +public class ListenerPlayerCount extends RedisListener< + PlayerCountProtocol.Request, + PlayerCountProtocol.Response> { + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - PlayerCountRequirements.LookupType lookupType = - PlayerCountRequirements.LookupType.valueOf(message.getString("lookup-type")); - String lookupValue = message.getString("lookup-value"); + public ProtocolObject getProtocol() { + return new PlayerCountProtocol(); + } - switch (lookupType) { + @Override + public PlayerCountProtocol.Response receivedMessage(PlayerCountProtocol.Request message, UUID serverUUID) { + switch (message.lookupType()) { case ALL -> { - return new JSONObject().put("player-count", GameManager.getServers().values().stream() + int count = GameManager.getServers().values().stream() .flatMap(List::stream) .mapToInt(server -> server.registeredServer().getPlayersConnected().size()) - .sum()); + .sum(); + return new PlayerCountProtocol.Response(count, true, null); } case TYPE -> { - ServerType serverType = ServerType.valueOf(lookupValue); - return new JSONObject().put("player-count", GameManager.getServers().entrySet().stream() + ServerType serverType = ServerType.valueOf(message.lookupValue()); + int count = GameManager.getServers().entrySet().stream() .filter(entry -> entry.getKey() == serverType) .flatMap(entry -> entry.getValue().stream()) .mapToInt(server -> server.registeredServer().getPlayersConnected().size()) - .sum()); + .sum(); + return new PlayerCountProtocol.Response(count, true, null); } case UUID -> { - UUID uuid = UUID.fromString(lookupValue); - return new JSONObject().put("player-count", GameManager.getFromUUID(uuid).registeredServer().getPlayersConnected().size()); + UUID uuid = UUID.fromString(message.lookupValue()); + int count = GameManager.getFromUUID(uuid).registeredServer().getPlayersConnected().size(); + return new PlayerCountProtocol.Response(count, true, null); } } - throw new RuntimeException("Unknown lookup type: " + lookupType); + throw new RuntimeException("Unknown lookup type: " + message.lookupType()); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerHandler.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerHandler.java index d8e1c54b9..4d9c5fcaf 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerHandler.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerHandler.java @@ -7,9 +7,12 @@ import net.swofty.commons.ServerType; import net.swofty.commons.StringUtility; import net.swofty.commons.UnderstandableProxyServer; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.commons.proxy.ToProxyChannels; -import net.swofty.commons.proxy.requirements.to.PlayerHandlerRequirements; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.GivePlayersOriginTypeProtocol; +import net.swofty.commons.protocol.objects.proxy.from.RefreshCoopDataProtocol; +import net.swofty.commons.protocol.objects.proxy.from.RunEventProtocol; +import net.swofty.commons.protocol.objects.proxy.from.TeleportProtocol; +import net.swofty.commons.protocol.objects.proxy.to.PlayerHandlerProtocol; import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.gamemanager.TransferHandler; @@ -17,32 +20,40 @@ import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; import net.swofty.velocity.redis.RedisMessage; -import org.json.JSONObject; +import java.util.Map; import java.util.Optional; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.PLAYER_HANDLER) -public class ListenerPlayerHandler extends RedisListener { +@ChannelListener +public class ListenerPlayerHandler extends RedisListener< + PlayerHandlerProtocol.Request, + PlayerHandlerProtocol.Response> { + + private static final PlayerHandlerProtocol.Response EMPTY = new PlayerHandlerProtocol.Response(Map.of(), true, null); + + @Override + public ProtocolObject getProtocol() { + return new PlayerHandlerProtocol(); + } @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - UUID uuid = UUID.fromString(message.getString("uuid")); - PlayerHandlerRequirements.PlayerHandlerActions action = - PlayerHandlerRequirements.PlayerHandlerActions.valueOf( - message.getString("action")); + public PlayerHandlerProtocol.Response receivedMessage(PlayerHandlerProtocol.Request message, UUID serverUUID) { + UUID uuid = UUID.fromString(message.uuid()); + PlayerHandlerProtocol.Action action = message.action(); + Map data = message.data() != null ? message.data() : Map.of(); Optional potentialPlayer = SkyBlockVelocity.getServer().getPlayer(uuid); if (potentialPlayer.isEmpty()) { - if (action == PlayerHandlerRequirements.PlayerHandlerActions.IS_ONLINE) { - return new JSONObject().put("isOnline", false); + if (action == PlayerHandlerProtocol.Action.IS_ONLINE) { + return new PlayerHandlerProtocol.Response(Map.of("isOnline", false), true, null); } - return new JSONObject(); + return EMPTY; } - if (action == PlayerHandlerRequirements.PlayerHandlerActions.IS_ONLINE) { + if (action == PlayerHandlerProtocol.Action.IS_ONLINE) { Player player = potentialPlayer.get(); publishPresence(player, true); - return new JSONObject().put("isOnline", true); + return new PlayerHandlerProtocol.Response(Map.of("isOnline", true), true, null); } Player player = potentialPlayer.get(); Optional potentialServer = player.getCurrentServer(); @@ -52,11 +63,11 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { UUID playersServer = UUID.fromString(potentialServer.get().getServer().getServerInfo().getName()); GameManager.GameServer serverInfo = GameManager.getFromUUID(playersServer); if (serverInfo == null) { - return new JSONObject(); + return EMPTY; } publishPresence(player, true); - return new JSONObject().put("server", new UnderstandableProxyServer( + UnderstandableProxyServer ups = new UnderstandableProxyServer( serverInfo.displayName(), serverInfo.internalID(), GameManager.getTypeFromRegisteredServer(serverInfo.registeredServer()), @@ -64,11 +75,11 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { serverInfo.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), serverInfo.maxPlayers(), serverInfo.shortDisplayName() - ).toJSON()); + ); + return new PlayerHandlerProtocol.Response(Map.of("server", ups.toJSON().toMap()), true, null); } case TRANSFER_WITH_UUID -> { - UUID server = UUID.fromString(message.getString("server_uuid")); - System.out.println("Transfer with UUID: " + server); + UUID server = UUID.fromString((String) data.get("server_uuid")); GameManager.GameServer serverInfo = GameManager.getFromUUID(server); TransferHandler transferHandler = new TransferHandler(player); @@ -76,7 +87,7 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { player.sendMessage(Component.text( "§cWe encountered an issue while attempting to locate the server on the network. Please try again later." )); - return new JSONObject(); + return EMPTY; } player.sendMessage(Component.text("§7Sending to server " + serverInfo.displayName() + "...")); @@ -85,62 +96,69 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { player.sendMessage(Component.text( "§cAttempted to connect to " + serverInfo.displayName() + ", but there are no empty slots available. Please try again later." )); - return new JSONObject(); + return EMPTY; } transferHandler.addToDisregard(); transferHandler.transferTo(serverInfo.registeredServer()) .thenRun(transferHandler::removeFromDisregard); - } case TRANSFER -> { - ServerType type = ServerType.valueOf(message.getString("type")); + ServerType type = ServerType.valueOf((String) data.get("type")); if (!GameManager.hasType(type) || new TransferHandler(player).isInLimbo() || !GameManager.isAnyEmpty(type)) { player.sendMessage(Component.text( "§cAttempted to transfer to a " + StringUtility.toNormalCase(type.name()) + " server, but there are no empty slots available. Please try again later." )); - return new JSONObject(); + return EMPTY; } new TransferHandler(player).transferTo(type); } case LIMBO -> new TransferHandler(player).sendToLimbo().join(); case TELEPORT -> { if (potentialServer.isEmpty()) { - return new JSONObject(); + return EMPTY; } UUID server = UUID.fromString(potentialServer.get().getServer().getServerInfo().getName()); - return RedisMessage.sendMessageToServer(server, - FromProxyChannels.TELEPORT, - message).join(); + Number x = (Number) data.get("x"); + Number y = (Number) data.get("y"); + Number z = (Number) data.get("z"); + Number yaw = (Number) data.get("yaw"); + Number pitch = (Number) data.get("pitch"); + RedisMessage.sendMessageToServer(server, + new TeleportProtocol(), + new TeleportProtocol.Request(uuid.toString(), + x.doubleValue(), y.doubleValue(), z.doubleValue(), + yaw.floatValue(), pitch.floatValue())).join(); } case EVENT -> { if (potentialServer.isEmpty()) { - return new JSONObject(); + return EMPTY; } UUID server = UUID.fromString(potentialServer.get().getServer().getServerInfo().getName()); RedisMessage.sendMessageToServer(server, - FromProxyChannels.RUN_EVENT_ON_SERVER, - message - ).join(); + new RunEventProtocol(), + new RunEventProtocol.Request(uuid.toString(), + (String) data.get("event"), + (String) data.get("data"))).join(); } case REFRESH_COOP_DATA -> { if (potentialServer.isEmpty()) { - return new JSONObject(); + return EMPTY; } UUID server = UUID.fromString(potentialServer.get().getServer().getServerInfo().getName()); RedisMessage.sendMessageToServer(server, - FromProxyChannels.REFRESH_COOP_DATA_ON_SERVER, - message - ).join(); + new RefreshCoopDataProtocol(), + new RefreshCoopDataProtocol.Request(uuid.toString(), + (String) data.get("datapoint"))).join(); } case MESSAGE -> { - String messageToSend = message.getString("message"); + String messageToSend = (String) data.get("message"); player.sendMessage(JSONComponentSerializer.json().deserialize(messageToSend)); } } - return new JSONObject(); + return EMPTY; } private void publishPresence(Player player, boolean online) { diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerPunished.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerPunished.java index 9a686fbb8..7a6dad533 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerPunished.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerPunished.java @@ -3,7 +3,8 @@ import com.google.gson.Gson; import io.sentry.Sentry; import net.kyori.adventure.text.Component; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.PunishPlayerProtocol; import net.swofty.commons.punishment.PunishmentReason; import net.swofty.commons.punishment.PunishmentTag; import net.swofty.commons.punishment.ActivePunishment; @@ -14,44 +15,50 @@ import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import org.tinylog.Logger; import java.util.List; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.PUNISH_PLAYER) -public class ListenerPlayerPunished extends RedisListener { +@ChannelListener +public class ListenerPlayerPunished extends RedisListener< + PunishPlayerProtocol.Request, + PunishPlayerProtocol.Response> { @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - UUID target = UUID.fromString(message.getString("target")); - String type = message.getString("type"); - String id = message.getString("id"); - long expiresAt = message.getLong("expiresAt"); + public ProtocolObject getProtocol() { + return new PunishPlayerProtocol(); + } + + @Override + public PunishPlayerProtocol.Response receivedMessage(PunishPlayerProtocol.Request message, UUID serverUUID) { + UUID target = UUID.fromString(message.target()); + String type = message.type(); + String id = message.id(); + long expiresAt = message.expiresAt(); PunishmentReason reason; try { - String banString = message.optString("reason_ban", null); - String muteString = message.optString("reason_mute", null); + String banString = message.reasonBan(); + String muteString = message.reasonMute(); if (banString != null) { reason = new PunishmentReason(BanType.valueOf(banString)); } else if (muteString != null) { reason = new PunishmentReason(MuteType.valueOf(muteString)); } else { - throw new org.json.JSONException("Missing reason ban or reason_mute"); + throw new IllegalArgumentException("Missing reason ban or reason_mute"); } - } catch (IllegalArgumentException | org.json.JSONException e) { + } catch (IllegalArgumentException e) { Logger.error("Failed to parse punishment reason from message: " + message, e); Sentry.captureException(e); - return null; + return new PunishPlayerProtocol.Response(); } List tags = List.of(); - if (!message.isNull("tags")) { + if (message.tags() != null) { try { - tags = List.of(new Gson().fromJson(message.getString("tags"), PunishmentTag[].class)); + tags = List.of(new Gson().fromJson(message.tags(), PunishmentTag[].class)); } catch (Exception ignored) { } } @@ -70,6 +77,6 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { } }); - return null; + return new PunishPlayerProtocol.Response(); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerProxyOnline.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerProxyOnline.java index 744d3f5d4..319f20892 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerProxyOnline.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerProxyOnline.java @@ -1,20 +1,28 @@ package net.swofty.velocity.redis.listeners; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.ProxyIsOnlineProtocol; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.PROXY_IS_ONLINE) -public class ListenerProxyOnline extends RedisListener { +@ChannelListener +public class ListenerProxyOnline extends RedisListener< + ProxyIsOnlineProtocol.Request, + ProxyIsOnlineProtocol.Response> { + + @Override + public ProtocolObject getProtocol() { + return new ProxyIsOnlineProtocol(); + } + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { + public ProxyIsOnlineProtocol.Response receivedMessage(ProxyIsOnlineProtocol.Request message, UUID serverUUID) { if (GameManager.getFromUUID(serverUUID) == null) { - return new JSONObject().put("online", false); + return new ProxyIsOnlineProtocol.Response(false, true, null); } - return new JSONObject().put("online", true); + return new ProxyIsOnlineProtocol.Response(true, true, null); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerRegisterTestFlow.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerRegisterTestFlow.java index 4aaa1fb8e..b41dbde2a 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerRegisterTestFlow.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerRegisterTestFlow.java @@ -1,53 +1,49 @@ package net.swofty.velocity.redis.listeners; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.RegisterTestFlowProtocol; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; import net.swofty.velocity.testflow.TestFlowManager; -import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.REGISTER_TEST_FLOW) -public class ListenerRegisterTestFlow extends RedisListener { +@ChannelListener +public class ListenerRegisterTestFlow extends RedisListener< + RegisterTestFlowProtocol.Request, + RegisterTestFlowProtocol.Response> { + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { + public ProtocolObject getProtocol() { + return new RegisterTestFlowProtocol(); + } + + @Override + public RegisterTestFlowProtocol.Response receivedMessage(RegisterTestFlowProtocol.Request message, UUID serverUUID) { try { - String testFlowName = message.getString("test_flow_name"); - String handler = message.getString("handler"); - - // Parse players array - JSONArray playersArray = message.getJSONArray("players"); - List players = new ArrayList<>(); - for (int i = 0; i < playersArray.length(); i++) { - players.add(playersArray.getString(i)); - } + String testFlowName = message.testFlowName(); + String handler = message.handler(); + List players = message.players(); - // Parse server configs array - JSONArray serverConfigsArray = message.getJSONArray("server_configs"); List serverConfigs = new ArrayList<>(); - for (int i = 0; i < serverConfigsArray.length(); i++) { - JSONObject configJson = serverConfigsArray.getJSONObject(i); + for (Map configMap : message.serverConfigs()) { + JSONObject configJson = new JSONObject(configMap); serverConfigs.add(TestFlowManager.ServerConfig.fromJson(configJson)); } - // Register the test flow TestFlowManager.registerTestFlow(testFlowName, handler, players, serverConfigs); System.out.println("Registered test flow '" + testFlowName + "' from server " + serverUUID); - return new JSONObject() - .put("success", true) - .put("message", "Test flow registered successfully"); + return new RegisterTestFlowProtocol.Response(true, "Test flow registered successfully", null); } catch (Exception e) { System.out.println("Failed to register test flow from server " + serverUUID); - return new JSONObject() - .put("success", false) - .put("error", e.getMessage()); + return new RegisterTestFlowProtocol.Response(false, null, e.getMessage()); } } -} \ No newline at end of file +} diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerFinishedWithPlayer.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerFinishedWithPlayer.java index 48020e615..fbd03e942 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerFinishedWithPlayer.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerFinishedWithPlayer.java @@ -1,34 +1,42 @@ package net.swofty.velocity.redis.listeners; import com.velocitypowered.api.proxy.Player; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.FinishedWithPlayerProtocol; import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.gamemanager.TransferHandler; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import java.util.Optional; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.FINISHED_WITH_PLAYER) -public class ListenerServerFinishedWithPlayer extends RedisListener { +@ChannelListener +public class ListenerServerFinishedWithPlayer extends RedisListener< + FinishedWithPlayerProtocol.Request, + FinishedWithPlayerProtocol.Response> { + + @Override + public ProtocolObject getProtocol() { + return new FinishedWithPlayerProtocol(); + } + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - UUID playerUUID = UUID.fromString(message.getString("uuid")); + public FinishedWithPlayerProtocol.Response receivedMessage(FinishedWithPlayerProtocol.Request message, UUID serverUUID) { + UUID playerUUID = UUID.fromString(message.uuid()); Optional potentialPlayer = SkyBlockVelocity.getServer().getPlayer(playerUUID); if (potentialPlayer.isEmpty()) { - return new JSONObject(); + return new FinishedWithPlayerProtocol.Response(); } Player player = potentialPlayer.get(); TransferHandler handler = new TransferHandler(player); if (!handler.isInLimbo()) { - return new JSONObject(); + return new FinishedWithPlayerProtocol.Response(); } handler.previousServerIsFinished(); - return new JSONObject(); + return new FinishedWithPlayerProtocol.Response(); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerInitialized.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerInitialized.java index d6b3f7ddb..12950bce2 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerInitialized.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerInitialized.java @@ -2,33 +2,40 @@ import net.swofty.commons.ServerType; import net.swofty.commons.config.ConfigProvider; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.RegisterServerProtocol; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.REGISTER_SERVER) -public class ListenerServerInitialized extends RedisListener { +@ChannelListener +public class ListenerServerInitialized extends RedisListener< + RegisterServerProtocol.Request, + RegisterServerProtocol.Response> { + + @Override + public ProtocolObject getProtocol() { + return new RegisterServerProtocol(); + } + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - ServerType type = ServerType.valueOf(message.getString("type")); - int port = -1; - if (message.has("port")) { - port = message.getInt("port"); - } + public RegisterServerProtocol.Response receivedMessage(RegisterServerProtocol.Request message, UUID serverUUID) { + ServerType type = ServerType.valueOf(message.type()); + int port = message.port() != null ? message.port() : -1; - String host = message.has("host") - ? message.getString("host") - : ConfigProvider.settings().getHostName(); // fallback to config if not present + String host = message.host() != null + ? message.host() + : ConfigProvider.settings().getHostName(); - int maxPlayers = message.getInt("max_players"); + int maxPlayers = message.maxPlayers(); GameManager.GameServer server = GameManager.addServer(type, serverUUID, host, port, maxPlayers); - return new JSONObject() - .put("host", server.registeredServer().getServerInfo().getAddress().getHostString()) - .put("port", server.registeredServer().getServerInfo().getAddress().getPort()); + return new RegisterServerProtocol.Response( + server.registeredServer().getServerInfo().getAddress().getHostString(), + server.registeredServer().getServerInfo().getAddress().getPort(), + true, + null); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerName.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerName.java index 826ea86a3..1a9afbdbf 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerName.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServerName.java @@ -1,21 +1,26 @@ package net.swofty.velocity.redis.listeners; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.RequestServerNameProtocol; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; -import org.json.JSONObject; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.REQUEST_SERVERS_NAME) -public class ListenerServerName extends RedisListener { +@ChannelListener +public class ListenerServerName extends RedisListener< + RequestServerNameProtocol.Request, + RequestServerNameProtocol.Response> { + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - GameManager.GameServer server = GameManager.getFromUUID(serverUUID); + public ProtocolObject getProtocol() { + return new RequestServerNameProtocol(); + } - return new JSONObject() - .put("server-name", server.displayName()) - .put("shortened-server-name", server.shortDisplayName()); + @Override + public RequestServerNameProtocol.Response receivedMessage(RequestServerNameProtocol.Request message, UUID serverUUID) { + GameManager.GameServer server = GameManager.getFromUUID(serverUUID); + return new RequestServerNameProtocol.Response(server.displayName(), server.shortDisplayName(), true, null); } -} \ No newline at end of file +} diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServersInformation.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServersInformation.java index 02c216b68..ffd3323bb 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServersInformation.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerServersInformation.java @@ -3,173 +3,87 @@ import com.velocitypowered.api.proxy.Player; import net.swofty.commons.ServerType; import net.swofty.commons.UnderstandableProxyServer; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.RequestServersProtocol; import net.swofty.velocity.SkyBlockVelocity; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; import net.swofty.velocity.testflow.TestFlowManager; -import org.json.JSONObject; import java.util.*; -@ChannelListener(channel = ToProxyChannels.REQUEST_SERVERS) -public class ListenerServersInformation extends RedisListener { +@ChannelListener +public class ListenerServersInformation extends RedisListener< + RequestServersProtocol.Request, + RequestServersProtocol.Response> { + + @Override + public ProtocolObject getProtocol() { + return new RequestServersProtocol(); + } + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - String requestType = message.getString("request_type"); + public RequestServersProtocol.Response receivedMessage(RequestServersProtocol.Request message, UUID serverUUID) { + String requestType = message.requestType(); boolean isInTestFlow = TestFlowManager.isServerInTestFlow(serverUUID); switch (requestType) { case "ALL" -> { List servers = new ArrayList<>(GameManager.getServers().values().stream().flatMap(List::stream).toList()); - - if (isInTestFlow) { - // Remove all servers that are not in the current test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return !testFlowInstance.hasServer(server.internalID()); - }); - } else { - // Remove all servers that are in a test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return testFlowInstance != null; - }); - } - - List understandableProxyServers = servers.stream().map(server -> new UnderstandableProxyServer( - server.displayName(), - server.internalID(), - GameManager.getTypeFromRegisteredServer(server.registeredServer()), - server.registeredServer().getServerInfo().getAddress().getPort(), - server.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), - server.maxPlayers(), - server.shortDisplayName() - )).toList(); - return new JSONObject().put("servers_list", UnderstandableProxyServer.toJSON(understandableProxyServers)); + filterByTestFlow(servers, isInTestFlow); + return new RequestServersProtocol.Response(UnderstandableProxyServer.toJSON(toUnderstandable(servers)).toString(), true, null); } case "TYPE" -> { - String type = message.getString("type"); - List servers = GameManager.getFromType(ServerType.valueOf(type)); + List servers = GameManager.getFromType(ServerType.valueOf(message.type())); if (servers == null) servers = new ArrayList<>(); - - if (isInTestFlow) { - // Remove all servers that are not in the current test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return testFlowInstance == null || !testFlowInstance.hasServer(server.internalID()); - }); - } else { - // Remove all servers that are in a test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return testFlowInstance != null; - }); - } - - List understandableProxyServers = servers.stream().map(server -> new UnderstandableProxyServer( - server.displayName(), - server.internalID(), - GameManager.getTypeFromRegisteredServer(server.registeredServer()), - server.registeredServer().getServerInfo().getAddress().getPort(), - server.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), - server.maxPlayers(), - server.shortDisplayName() - )).toList(); - return new JSONObject().put("servers_list", UnderstandableProxyServer.toJSON(understandableProxyServers)); + filterByTestFlow(servers, isInTestFlow); + return new RequestServersProtocol.Response(UnderstandableProxyServer.toJSON(toUnderstandable(servers)).toString(), true, null); } case "UUID" -> { - String uuid = message.getString("uuid"); - UUID uuidObject = UUID.fromString(uuid); - List servers = new ArrayList<>(List.of(GameManager.getFromUUID(uuidObject))); - - if (isInTestFlow) { - // Remove all servers that are not in the current test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return !testFlowInstance.hasServer(server.internalID()); - }); - } else { - // Remove all servers that are in a test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return testFlowInstance != null; - }); - } - - List understandableProxyServers = servers.stream().map(server -> new UnderstandableProxyServer( - server.displayName(), - server.internalID(), - GameManager.getTypeFromRegisteredServer(server.registeredServer()), - server.registeredServer().getServerInfo().getAddress().getPort(), - server.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), - server.maxPlayers(), - server.shortDisplayName() - )).toList(); - return new JSONObject().put("servers_list", UnderstandableProxyServer.toJSON(understandableProxyServers)); + List servers = new ArrayList<>(List.of(GameManager.getFromUUID(UUID.fromString(message.uuid())))); + filterByTestFlow(servers, isInTestFlow); + return new RequestServersProtocol.Response(UnderstandableProxyServer.toJSON(toUnderstandable(servers)).toString(), true, null); } case "PLAYER_UUID" -> { - String uuid = message.getString("uuid"); - UUID uuidObject = UUID.fromString(uuid); + UUID uuidObject = UUID.fromString(message.uuid()); Optional potentialPlayer = SkyBlockVelocity.getServer().getPlayer(uuidObject); if (potentialPlayer.isEmpty()) { - return new JSONObject(); + return new RequestServersProtocol.Response(UnderstandableProxyServer.toJSON(List.of()).toString(), true, null); } Player player = potentialPlayer.get(); List servers = new ArrayList<>(Collections.singletonList(GameManager.getFromRegisteredServer(player.getCurrentServer().get().getServer()))); - - if (isInTestFlow) { - // Remove all servers that are not in the current test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return !testFlowInstance.hasServer(server.internalID()); - }); - } else { - // Remove all servers that are in a test flow - servers.removeIf(server -> { - TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID( - server.internalID() - ); - - return testFlowInstance != null; - }); - } - - List understandableProxyServers = servers.stream().map(server -> new UnderstandableProxyServer( - server.displayName(), - server.internalID(), - GameManager.getTypeFromRegisteredServer(server.registeredServer()), - server.registeredServer().getServerInfo().getAddress().getPort(), - server.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), - server.maxPlayers(), - server.shortDisplayName() - )).toList(); - return new JSONObject().put("servers_list", UnderstandableProxyServer.toJSON(understandableProxyServers)); + filterByTestFlow(servers, isInTestFlow); + return new RequestServersProtocol.Response(UnderstandableProxyServer.toJSON(toUnderstandable(servers)).toString(), true, null); } } throw new RuntimeException("Unknown request type: " + requestType); } + + private void filterByTestFlow(List servers, boolean isInTestFlow) { + if (isInTestFlow) { + servers.removeIf(server -> { + TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID(server.internalID()); + return testFlowInstance == null || !testFlowInstance.hasServer(server.internalID()); + }); + } else { + servers.removeIf(server -> { + TestFlowManager.ProxyTestFlowInstance testFlowInstance = TestFlowManager.getFromServerUUID(server.internalID()); + return testFlowInstance != null; + }); + } + } + + private List toUnderstandable(List servers) { + return servers.stream().map(server -> new UnderstandableProxyServer( + server.displayName(), + server.internalID(), + GameManager.getTypeFromRegisteredServer(server.registeredServer()), + server.registeredServer().getServerInfo().getAddress().getPort(), + server.registeredServer().getPlayersConnected().stream().map(Player::getUniqueId).toList(), + server.maxPlayers(), + server.shortDisplayName() + )).toList(); + } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerStaffChat.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerStaffChat.java index 2da4fc3bc..4f66465e5 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerStaffChat.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerStaffChat.java @@ -1,64 +1,51 @@ package net.swofty.velocity.redis.listeners; -import net.swofty.commons.proxy.FromProxyChannels; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.from.BroadcastStaffChatProtocol; +import net.swofty.commons.protocol.objects.proxy.to.StaffChatProtocol; import net.swofty.velocity.gamemanager.GameManager; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; import net.swofty.velocity.redis.RedisMessage; -import org.json.JSONObject; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.STAFF_CHAT) -public class ListenerStaffChat extends RedisListener { +@ChannelListener +public class ListenerStaffChat extends RedisListener< + StaffChatProtocol.Request, + StaffChatProtocol.Response> { @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { - // Broadcast the staff chat message to all servers - broadcastToAllServers(message); - return new JSONObject(); + public ProtocolObject getProtocol() { + return new StaffChatProtocol(); } - /** - * Broadcasts a staff chat message to all registered game servers. - * Used for both chat messages (from servers) and join/leave notifications (from proxy). - * - * @param message JSON containing "type" ("message", "join", or "leave") and relevant data - */ - public static void broadcastToAllServers(JSONObject message) { + @Override + public StaffChatProtocol.Response receivedMessage(StaffChatProtocol.Request message, UUID serverUUID) { + broadcastToAllServers(new BroadcastStaffChatProtocol.Request( + message.type(), message.formattedMessage(), message.uuid())); + return new StaffChatProtocol.Response(); + } + + public static void broadcastToAllServers(BroadcastStaffChatProtocol.Request message) { GameManager.getServers().forEach((serverType, serverList) -> { serverList.forEach(gameServer -> { RedisMessage.sendMessageToServer( gameServer.internalID(), - FromProxyChannels.BROADCAST_STAFF_CHAT, + new BroadcastStaffChatProtocol(), message ); }); }); } - /** - * Convenience method to broadcast a player join notification. - * - * @param playerUuid The UUID of the player who joined - */ public static void broadcastStaffJoin(UUID playerUuid) { - JSONObject message = new JSONObject() - .put("type", "join") - .put("uuid", playerUuid.toString()); - broadcastToAllServers(message); + broadcastToAllServers(new BroadcastStaffChatProtocol.Request( + "join", null, playerUuid.toString())); } - /** - * Convenience method to broadcast a player leave notification. - * - * @param playerUuid The UUID of the player who left - */ public static void broadcastStaffLeave(UUID playerUuid) { - JSONObject message = new JSONObject() - .put("type", "leave") - .put("uuid", playerUuid.toString()); - broadcastToAllServers(message); + broadcastToAllServers(new BroadcastStaffChatProtocol.Request( + "leave", null, playerUuid.toString())); } } diff --git a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerTestFlowServerReady.java b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerTestFlowServerReady.java index 8a3645e23..495f31186 100644 --- a/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerTestFlowServerReady.java +++ b/velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerTestFlowServerReady.java @@ -1,38 +1,41 @@ package net.swofty.velocity.redis.listeners; import net.swofty.commons.ServerType; -import net.swofty.commons.proxy.ToProxyChannels; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.proxy.to.TestFlowServerReadyProtocol; import net.swofty.velocity.redis.ChannelListener; import net.swofty.velocity.redis.RedisListener; import net.swofty.velocity.testflow.TestFlowManager; -import org.json.JSONObject; import java.util.UUID; -@ChannelListener(channel = ToProxyChannels.TEST_FLOW_SERVER_READY) -public class ListenerTestFlowServerReady extends RedisListener { +@ChannelListener +public class ListenerTestFlowServerReady extends RedisListener< + TestFlowServerReadyProtocol.Request, + TestFlowServerReadyProtocol.Response> { + + @Override + public ProtocolObject getProtocol() { + return new TestFlowServerReadyProtocol(); + } + @Override - public JSONObject receivedMessage(JSONObject message, UUID serverUUID) { + public TestFlowServerReadyProtocol.Response receivedMessage(TestFlowServerReadyProtocol.Request message, UUID serverUUID) { try { - String testFlowName = message.getString("test_flow_name"); - ServerType serverType = ServerType.valueOf(message.getString("server_type")); - int serverIndex = message.getInt("server_index"); + String testFlowName = message.testFlowName(); + ServerType serverType = ServerType.valueOf(message.serverType()); + int serverIndex = message.serverIndex(); - // Mark the server as ready TestFlowManager.markServerReady(testFlowName, serverType, serverIndex, serverUUID); System.out.println("Server " + serverType.name() + " #" + serverIndex + " is ready for test flow '" + testFlowName + "' (UUID: " + serverUUID + ")"); - return new JSONObject() - .put("success", true) - .put("message", "Server ready status recorded"); + return new TestFlowServerReadyProtocol.Response(true, "Server ready status recorded", null); } catch (Exception e) { System.out.println("Failed to process test flow server ready from server " + serverUUID); - return new JSONObject() - .put("success", false) - .put("error", e.getMessage()); + return new TestFlowServerReadyProtocol.Response(false, null, e.getMessage()); } } -} \ No newline at end of file +}