From 8549763f58302067754429c3d538e95f3fb17db3 Mon Sep 17 00:00:00 2001 From: Dom Eori <4j6dq2zi8@relay.firefox.com> Date: Fri, 17 Mar 2023 15:35:03 +0900 Subject: [PATCH] [chusan] Add global matching lobby stub --- .../controller/ChusanServletController.java | 37 +++++++++---- .../handler/impl/BeginMatchingHandler.java | 48 +++++++++++++++++ .../handler/impl/EndMatchingHandler.java | 48 +++++++++++++++++ .../handler/impl/GetGameSettingHandler.java | 10 ++-- .../handler/impl/GetMatchingStateHandler.java | 48 +++++++++++++++++ .../impl/GetUserNetBattleDataHandler.java | 1 + .../impl/GetUserSymbolChatSettingHandler.java | 3 +- .../impl/RemoveMatchingMemberHandler.java | 40 ++++++++++++++ .../chusan/model/request/UpsertUserAll.java | 3 ++ .../model/response/data/AvatarEquip.java | 23 ++++++++ .../model/response/data/GenreGraph.java | 18 +++++++ .../response/data/MatchingMemberInfo.java | 53 +++++++++++++++++++ .../response/data/MatchingWaitState.java | 26 +++++++++ .../model/response/data/SymbolChatInfo.java | 19 +++++++ 14 files changed, 364 insertions(+), 13 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/BeginMatchingHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/EndMatchingHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetMatchingStateHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RemoveMatchingMemberHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/AvatarEquip.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/GenreGraph.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingMemberInfo.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingWaitState.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/SymbolChatInfo.java diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/controller/ChusanServletController.java b/src/main/java/icu/samnyan/aqua/sega/chusan/controller/ChusanServletController.java index d54e0c2f..79c3915c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/controller/ChusanServletController.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/controller/ChusanServletController.java @@ -59,6 +59,10 @@ public class ChusanServletController { private final CMUpsertUserGachaHandler cmUpsertUserGachaHandler; private final CMUpsertUserPrintSubtractHandler cmUpsertUserPrintSubtractHandler; private final CMUpsertUserPrintCancelHandler cmUpsertUserPrintCancelHandler; + private final BeginMatchingHandler beginMatchingHandler; + private final EndMatchingHandler endMatchingHandler; + private final GetMatchingStateHandler getMatchingStateHandler; + private final RemoveMatchingMemberHandler removeMatchingMemberHandler; @Autowired public ChusanServletController(GameLoginHandler gameLoginHandler, GameLogoutHandler gameLogoutHandler, @@ -82,7 +86,9 @@ public class ChusanServletController { CMGetUserCharacterHandler cmGetUserCharacterHandler, GetUserGachaHandler getUserGachaHandler, GetUserPrintedCardHandler getUserPrintedCardHandler, CMGetUserItemHandler cmGetUserItemHandler, RollGachaHandler rollGachaHandler, CMUpsertUserGachaHandler cmUpsertUserGachaHandler, - CMUpsertUserPrintSubtractHandler cmUpsertUserPrintSubtractHandler, CMUpsertUserPrintCancelHandler cmUpsertUserPrintCancelHandler) { + CMUpsertUserPrintSubtractHandler cmUpsertUserPrintSubtractHandler, CMUpsertUserPrintCancelHandler cmUpsertUserPrintCancelHandler, + BeginMatchingHandler beginMatchingHandler, EndMatchingHandler endMatchingHandler, + GetMatchingStateHandler getMatchingStateHandler, RemoveMatchingMemberHandler removeMatchingMemberHandler) { this.gameLoginHandler = gameLoginHandler; this.gameLogoutHandler = gameLogoutHandler; this.getGameChargeHandler = getGameChargeHandler; @@ -127,6 +133,10 @@ public class ChusanServletController { this.cmUpsertUserGachaHandler = cmUpsertUserGachaHandler; this.cmUpsertUserPrintSubtractHandler = cmUpsertUserPrintSubtractHandler; this.cmUpsertUserPrintCancelHandler = cmUpsertUserPrintCancelHandler; + this.beginMatchingHandler = beginMatchingHandler; + this.endMatchingHandler = endMatchingHandler; + this.getMatchingStateHandler = getMatchingStateHandler; + this.removeMatchingMemberHandler = removeMatchingMemberHandler; } @PostMapping("GameLoginApi") @@ -254,6 +264,7 @@ public class ChusanServletController { String getUserRivalData(@ModelAttribute Map request) throws JsonProcessingException { return getUserRivalDataHandler.handle(request); } + @PostMapping("GetUserRivalMusicApi") String getUserRivalMusic(@ModelAttribute Map request) throws JsonProcessingException { return getUserRivalMusicHandler.handle(request); @@ -324,24 +335,32 @@ public class ChusanServletController { return "{\"returnCode\":\"1\"}"; } - @PostMapping({"MatchingServer/Ping", "Ping"}) + // Matching endpoints + + @PostMapping("MatchingServer/Ping") String ping(@ModelAttribute Map request) { return "{\"returnCode\":\"1\"}"; } - /* TBD matching endpoints - @PostMapping("MatchingServer/BeginMatchingApi") + String beginMatching(@ModelAttribute Map request) throws JsonProcessingException { + return beginMatchingHandler.handle(request); + } @PostMapping("MatchingServer/EndMatchingApi") - - @PostMapping("MatchingServer/BeginMatchingApi") + String endMatching(@ModelAttribute Map request) throws JsonProcessingException { + return endMatchingHandler.handle(request); + } @PostMapping("MatchingServer/RemoveMatchingMemberApi") + String removeMatchingMember(@ModelAttribute Map request) throws JsonProcessingException { + return removeMatchingMemberHandler.handle(request); + } - @PostMapping("GetMatchingStateApi") - - */ + @PostMapping("MatchingServer/GetMatchingStateApi") + String getMatchingState(@ModelAttribute Map request) throws JsonProcessingException { + return getMatchingStateHandler.handle(request); + } // Cardmaker endpoints diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/BeginMatchingHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/BeginMatchingHandler.java new file mode 100644 index 00000000..f9e96f11 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/BeginMatchingHandler.java @@ -0,0 +1,48 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.response.data.MatchingMemberInfo; +import icu.samnyan.aqua.sega.chusan.model.response.data.MatchingWaitState; +import icu.samnyan.aqua.sega.util.jackson.StringMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanBeginMatchingHandler") +public class BeginMatchingHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(BeginMatchingHandler.class); + + private final StringMapper mapper; + + @Autowired + public BeginMatchingHandler(StringMapper mapper) { + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + MatchingMemberInfo matchingMemberInfo = mapper.convert(request.get("matchingMemberInfo"), MatchingMemberInfo.class); + + MatchingWaitState matchingWaitState = new MatchingWaitState(); + + matchingWaitState.getMatchingMemberInfoList().add(matchingMemberInfo); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("roomId", 1); + resultMap.put("matchingWaitState", matchingWaitState); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/EndMatchingHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/EndMatchingHandler.java new file mode 100644 index 00000000..1370be0e --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/EndMatchingHandler.java @@ -0,0 +1,48 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.util.jackson.StringMapper; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanEndMatchingHandler") +public class EndMatchingHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(EndMatchingHandler.class); + + private final StringMapper mapper; + + @Autowired + public EndMatchingHandler(StringMapper mapper) { + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + //roomId, userId + + Map matchingResult = new LinkedHashMap<>(); + matchingResult.put("matchingMemberInfoList", List.of()); // MatchingMemberInfo + matchingResult.put("matchingMemberRoleList", List.of()); // Role? + matchingResult.put("reflectorUri", ""); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("matchingResult", matchingResult); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameSettingHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameSettingHandler.java index 2e4c674e..66225222 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameSettingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameSettingHandler.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; import java.net.InetAddress; import java.net.UnknownHostException; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Map; @@ -55,6 +56,9 @@ public class GetGameSettingHandler implements BaseHandler { LocalDateTime rebootStartTime = LocalDateTime.now().minusHours(3); LocalDateTime rebootEndTime = LocalDateTime.now().minusHours(2); + LocalDateTime matchingStartTime = LocalDateTime.now().minusHours(1); + LocalDateTime matchingEndTime = LocalDateTime.now().plusHours(1); + // Unless ip and port is explicitly overridden, use the guessed ip and port as same as AllNet Controller does. String localAddr; try { @@ -78,10 +82,10 @@ public class GetGameSettingHandler implements BaseHandler { 300, 300, 300, - rebootStartTime.format(formatter), - rebootEndTime.format(formatter), + matchingStartTime.format(formatter), + matchingEndTime.format(formatter), + 10, 10, - 1, "http://" + addr + ":" + port + "/ChusanServlet/", "http://" + addr + ":" + port + "/ChusanServlet/", "http://" + addr + ":" + port + "/ChusanServlet/" diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetMatchingStateHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetMatchingStateHandler.java new file mode 100644 index 00000000..35a6e843 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetMatchingStateHandler.java @@ -0,0 +1,48 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.response.data.MatchingMemberInfo; +import icu.samnyan.aqua.sega.chusan.model.response.data.MatchingWaitState; +import icu.samnyan.aqua.sega.util.jackson.StringMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanGetMatchingStateHandler") +public class GetMatchingStateHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetMatchingStateHandler.class); + + private final StringMapper mapper; + + @Autowired + public GetMatchingStateHandler(StringMapper mapper) { + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String roomId = (String) request.get("roomId"); + MatchingMemberInfo matchingMemberInfo = mapper.convert(request.get("matchingMemberInfo"), MatchingMemberInfo.class); + + Map resultMap = new LinkedHashMap<>(); + + MatchingWaitState matchingWaitState = new MatchingWaitState(); + matchingWaitState.setFinish(true); + + resultMap.put("matchingWaitState", matchingWaitState); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserNetBattleDataHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserNetBattleDataHandler.java index 6976e3e1..9ae5129b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserNetBattleDataHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserNetBattleDataHandler.java @@ -33,6 +33,7 @@ public class GetUserNetBattleDataHandler implements BaseHandler { Map userNetBattleData = new LinkedHashMap<>(); userNetBattleData.put("recentNBSelectMusicList", List.of()); + userNetBattleData.put("recentNBMusicList", List.of()); resultMap.put("userNetBattleData", userNetBattleData); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserSymbolChatSettingHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserSymbolChatSettingHandler.java index 8d84e1c3..b36dcccd 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserSymbolChatSettingHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserSymbolChatSettingHandler.java @@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.chusan.handler.impl; import com.fasterxml.jackson.core.JsonProcessingException; import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.response.data.SymbolChatInfo; import icu.samnyan.aqua.sega.util.jackson.StringMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,7 +33,7 @@ public class GetUserSymbolChatSettingHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - List symbolChatInfoList = new ArrayList<>(); + List symbolChatInfoList = new ArrayList<>(); Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RemoveMatchingMemberHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RemoveMatchingMemberHandler.java new file mode 100644 index 00000000..f73fb1a9 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RemoveMatchingMemberHandler.java @@ -0,0 +1,40 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.util.jackson.StringMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanRemoveMatchingMemberHandler") +public class RemoveMatchingMemberHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(RemoveMatchingMemberHandler.class); + + private final StringMapper mapper; + + @Autowired + public RemoveMatchingMemberHandler(StringMapper mapper) { + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("returnCode", 1); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java index f0c78516..d8e21a94 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java @@ -80,6 +80,9 @@ public class UpsertUserAll implements Serializable { @Nullable private List> userEmoneyList; + @Nullable + private List> userNetBattleData; + @Nullable @JsonProperty("isNewCharacterList") private String isNewCharacterList; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/AvatarEquip.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/AvatarEquip.java new file mode 100644 index 00000000..ce1ba8f7 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/AvatarEquip.java @@ -0,0 +1,23 @@ +package icu.samnyan.aqua.sega.chusan.model.response.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AvatarEquip { + + private int wearID; + private int headID; + private int faceID; + private int skinID; + private int itemID; + private int frontID; + private int backID; + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/GenreGraph.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/GenreGraph.java new file mode 100644 index 00000000..fa80500f --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/GenreGraph.java @@ -0,0 +1,18 @@ +package icu.samnyan.aqua.sega.chusan.model.response.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GenreGraph { + + private int genreId; + private int musicCount; + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingMemberInfo.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingMemberInfo.java new file mode 100644 index 00000000..4db1a7a2 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingMemberInfo.java @@ -0,0 +1,53 @@ +package icu.samnyan.aqua.sega.chusan.model.response.data; + +import java.time.LocalDateTime; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MatchingMemberInfo { + + private int userId; + private int regionId; + private int placeId; + private String userName; + private int playerRating; + private int battleRankId; + private int battleCorrection; + private int battleRatingAvg; + private int optRatingId; + private int ratingEffectColorId; + private int trophyId; + private int nameplateId; + private int emblemMedal; + private int emblemBase; + private int characterId; + private int characterRank; + private int skillId; + private int skillLv; + private int skillIdForChara; + @JsonProperty("isJoinTeam") + private boolean isJoinTeam; + private String teamName; + private int teamRank; + private AvatarEquip avatarEquip; + private int messageId; + private String clientId; + private String romVersion; + private String dataVersion; + private int errCnt; + private int hostErrCnt; + private int joinTime; + private List genreGraphList; + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingWaitState.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingWaitState.java new file mode 100644 index 00000000..aec36d25 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/MatchingWaitState.java @@ -0,0 +1,26 @@ +package icu.samnyan.aqua.sega.chusan.model.response.data; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MatchingWaitState { + + @JsonProperty("isFinish") + private boolean isFinish = false; + private int restMSec = 30000; + private int pollingInterval = 10; + private List matchingMemberInfoList = new ArrayList<>(); + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/SymbolChatInfo.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/SymbolChatInfo.java new file mode 100644 index 00000000..fd4c9b21 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/SymbolChatInfo.java @@ -0,0 +1,19 @@ +package icu.samnyan.aqua.sega.chusan.model.response.data; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SymbolChatInfo { + + private int sceneId; + private int symbolChatId; + private int orderId; + +}