From c4182fb7253b282516dd213efb9722becc0f93a5 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 25 Oct 2025 04:18:18 +0800 Subject: [PATCH] [O] CM Java > kt --- .../sega/cardmaker/CardMakerController.kt | 111 ++++++++++++++++++ .../cardmaker/CardMakerControllerAdvice.kt | 31 +++++ .../controller/CardMakerController.java | 56 --------- .../controller/CardMakerControllerAdvice.java | 39 ------ .../impl/GetClientBookkeepingHandler.java | 45 ------- .../handler/impl/GetGameConnectHandler.java | 80 ------------- .../handler/impl/GetGameSettingHandler.java | 67 ----------- .../cardmaker/model/response/CodeResp.java | 16 --- .../model/response/GetGameSettingResp.java | 21 ---- .../model/response/data/GameConnect.java | 14 --- .../model/response/data/GameSetting.java | 31 ----- 11 files changed, 142 insertions(+), 369 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerController.kt create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerControllerAdvice.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerController.kt b/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerController.kt new file mode 100644 index 00000000..d2f9bb91 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerController.kt @@ -0,0 +1,111 @@ +package icu.samnyan.aqua.sega.cardmaker + +import ext.API +import ext.logger +import ext.long +import ext.parsing +import icu.samnyan.aqua.sega.allnet.TokenChecker +import icu.samnyan.aqua.sega.util.jackson.BasicMapper +import org.springframework.beans.factory.annotation.Value +import org.springframework.web.bind.annotation.ModelAttribute +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.net.InetAddress +import java.net.UnknownHostException +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@RestController +@RequestMapping("/g/card") +class CardMakerController( + val mapper: BasicMapper, + @param:Value("\${allnet.server.host:}") val ALLNET_HOST: String, + @param:Value("\${allnet.server.port:}") val ALLNET_PORT: String, + @param:Value("\${server.port:}") val SERVER_PORT: String +) { + val logger = logger() + + @API("GetGameSettingApi") + fun getGameSetting(@ModelAttribute request: MutableMap): Any? { + val formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss") + val rebootStartTime = LocalDateTime.now().minusHours(3) + val rebootEndTime = LocalDateTime.now().minusHours(2) + + val gameSetting = mapOf( + "dataVersion" to "1.35.0", + "ongekiCmVersion" to "1.32.0", + "chuniCmVersion" to "1.30.0", + "maimaiCmVersion" to "1.45.0", + "isMaintenance" to false, + "requestInterval" to 10, + "rebootStartTime" to rebootStartTime.format(formatter), + "rebootEndTime" to rebootEndTime.format(formatter), + "isBackgroundDistribute" to false, + "maxCountCharacter" to 100, + "maxCountItem" to 100, + "maxCountCard" to 100, + "watermark" to false + ) + + val json = mapper.write(mapOf( + "gameSetting" to gameSetting, + "isDumpUpload" to false, + "isAou" to false + )) + + logger.info("Response: {}", json) + return json + } + + fun gameConnect(modelKind: Int, modelVersion: Int, url: String) = mapOf( + "modelKind" to modelKind, + "modelVersion" to modelVersion, + "url" to url + ) + + @API("GetGameConnectApi") + fun getGameConnect(@ModelAttribute request: MutableMap): Any? { + val version = parsing { request["version"]!!.long } // Rom version + val session = TokenChecker.Companion.getCurrentSession() + + val addr = ALLNET_HOST.ifBlank { null } ?: + try { InetAddress.getLocalHost().hostAddress } + catch (_: UnknownHostException) { "localhost" } + val port = ALLNET_PORT.ifBlank { null } ?: SERVER_PORT + + val base = if (session == null) "/g" else "/gs/" + session.token + val json = mapper.write(mapOf( + "length" to 3, + "gameConnectList" to listOf( + gameConnect(0, 1, "http://$addr:$port$base/chu3/$version/"), + gameConnect(1, 1, "http://$addr:$port$base/mai2/"), + gameConnect(2, 1, "http://$addr:$port$base/ongeki/") + ) + )) + + logger.info("Response: $json") + return json + } + + @API("GetClientBookkeepingApi") + fun getClientBookkeeping(@ModelAttribute request: MutableMap): Any? { + val placeId = parsing { request["placeId"]!!.long } + val json = mapper.write(mapOf( + "placeId" to placeId, + "length" to 0, + "clientBookkeepingList" to mutableListOf() + )) + + logger.info("Response: $json") + return json + } + + @API("UpsertClientBookkeepingApi") + fun upsertClientBookkeeping() = "{\"returnCode\":1,\"apiName\":\"UpsertClientBookkeepingApi\"}" + + @API("UpsertClientSettingApi") + fun upsertClientSetting() = "{\"returnCode\":1,\"apiName\":\"UpsertClientSettingApi\"}" +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerControllerAdvice.kt b/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerControllerAdvice.kt new file mode 100644 index 00000000..99b82abb --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/CardMakerControllerAdvice.kt @@ -0,0 +1,31 @@ +package icu.samnyan.aqua.sega.cardmaker + +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper +import ext.logger +import jakarta.servlet.http.HttpServletRequest +import org.springframework.web.bind.annotation.ModelAttribute +import org.springframework.web.bind.annotation.RestControllerAdvice +import java.nio.charset.StandardCharsets + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@RestControllerAdvice(basePackages = ["icu.samnyan.aqua.sega.cardmaker"]) +class CardMakerControllerAdvice { + val logger = logger() + + /** + * Get the map object from json string + * + * @param request HttpServletRequest + */ + @ModelAttribute + fun preHandle(request: HttpServletRequest): MutableMap { + val src = request.inputStream.readAllBytes() + val outputString = String(src, StandardCharsets.UTF_8).trim { it <= ' ' } + logger.info("Request ${request.requestURI}: $outputString") + val mapper = ObjectMapper() + return mapper.readValue(outputString, object : TypeReference>() {}) + } +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java deleted file mode 100644 index c2c3d165..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java +++ /dev/null @@ -1,56 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.controller; - - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.cardmaker.handler.impl.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@RestController -@RequestMapping("/g/card") -public class CardMakerController { - private final GetGameSettingHandler getGameSettingHandler; - private final GetClientBookkeepingHandler getClientBookkeepingHandler; - private final GetGameConnectHandler getGameConnectHandler; - - @Autowired - public CardMakerController(GetGameSettingHandler getGameSettingHandler, GetClientBookkeepingHandler getClientBookkeepingHandler, GetGameConnectHandler getGameConnectHandler) { - this.getGameSettingHandler = getGameSettingHandler; - this.getClientBookkeepingHandler = getClientBookkeepingHandler; - this.getGameConnectHandler = getGameConnectHandler; - } - - @PostMapping("GetGameSettingApi") - public String getGameSetting(@ModelAttribute Map request) throws JsonProcessingException { - return getGameSettingHandler.handle(request); - } - - @PostMapping("GetGameConnectApi") - public String getGameConnect(@ModelAttribute Map request) throws JsonProcessingException { - return getGameConnectHandler.handle(request); - } - - @PostMapping("GetClientBookkeepingApi") - public String getClientBookkeeping(@ModelAttribute Map request) throws JsonProcessingException { - return getClientBookkeepingHandler.handle(request); - } - - @PostMapping("UpsertClientBookkeepingApi") - public String upsertClientBookkeeping(@ModelAttribute Map request) { - return "{\"returnCode\":1,\"apiName\":\"UpsertClientBookkeepingApi\"}"; - } - - @PostMapping("UpsertClientSettingApi") - public String upsertClientSetting(@ModelAttribute Map request) { - return "{\"returnCode\":1,\"apiName\":\"UpsertClientSettingApi\"}"; - } - -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java deleted file mode 100644 index 1015cebd..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java +++ /dev/null @@ -1,39 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.controller; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import jakarta.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@RestControllerAdvice(basePackages = "icu.samnyan.aqua.sega.cardmaker") -public class CardMakerControllerAdvice { - - private static final Logger logger = LoggerFactory.getLogger(CardMakerControllerAdvice.class); - - - /** - * Get the map object from json string - * - * @param request HttpServletRequest - */ - @ModelAttribute - public Map preHandle(HttpServletRequest request) throws IOException { - byte[] src = request.getInputStream().readAllBytes(); - String outputString = new String(src, StandardCharsets.UTF_8).trim(); - logger.info("Request " + request.getRequestURI() + ": " + outputString); - ObjectMapper mapper = new ObjectMapper(); - - return mapper.readValue(outputString, new TypeReference<>() { - }); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java deleted file mode 100644 index 66835415..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.handler.impl; - -import com.fasterxml.jackson.core.JsonProcessingException; - -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -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("CardMakerGetClientBookkeepingHandler") -public class GetClientBookkeepingHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(GetClientBookkeepingHandler.class); - - private final BasicMapper mapper; - - @Autowired - public GetClientBookkeepingHandler(BasicMapper mapper) { - this.mapper = mapper; - } - - @Override - public String handle(Map request) throws JsonProcessingException { - long placeId = ((Number) request.get("placeId")).longValue(); - - Map resultMap = new LinkedHashMap<>(); - resultMap.put("placeId", placeId); - resultMap.put("length", 0); - resultMap.put("clientBookkeepingList", List.of()); - - String json = mapper.write(resultMap); - - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java deleted file mode 100644 index 46b139ba..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java +++ /dev/null @@ -1,80 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.handler.impl; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.allnet.KeychipSession; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.cardmaker.model.response.data.GameConnect; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -import icu.samnyan.aqua.sega.allnet.TokenChecker; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component("CardMakerGetGameConnectHandler") -public class GetGameConnectHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(GetGameConnectHandler.class); - - private final BasicMapper mapper; - private final String ALLNET_HOST; - private final String ALLNET_PORT; - private final String SERVER_PORT; - - @Autowired - public GetGameConnectHandler(BasicMapper mapper, @Value("${allnet.server.host:}") String ALLNET_HOST, - @Value("${allnet.server.port:}") String ALLNET_PORT, @Value("${server.port:}") String SERVER_PORT) { - this.mapper = mapper; - this.ALLNET_HOST = ALLNET_HOST; - this.ALLNET_PORT = ALLNET_PORT; - this.SERVER_PORT = SERVER_PORT; - } - - @Override - public String handle(Map request) throws JsonProcessingException { - int type = ((Number) request.get("type")).intValue(); // Allnet enabled or not - long version = ((Number) request.get("version")).longValue(); // Rom version - KeychipSession session = TokenChecker.Companion.getCurrentSession(); - - // Unless ip and port is explicitly overridden, use the guessed ip and port as same as AllNet Controller does. - String localAddr; - try { - localAddr = InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - // If above didn't work then how did this run? I really don't know. - localAddr = "localhost"; - } - - String addr = ALLNET_HOST.equals("") ? localAddr : ALLNET_HOST; - String port = ALLNET_PORT.equals("") ? SERVER_PORT : ALLNET_PORT; - - String base = session == null ? "/g" : "/gs/" + session.getToken(); - List gameConnectList = new ArrayList<>(); - GameConnect chuni = new GameConnect(0, 1, "http://" + addr + ":" + port + base + "/chu3/" + version + "/"); - GameConnect mai = new GameConnect(1, 1, "http://" + addr + ":" + port + base + "/mai2/"); - GameConnect ongeki = new GameConnect(2, 1, "http://" + addr + ":" + port + base + "/ongeki/"); - gameConnectList.add(chuni); - gameConnectList.add(mai); - gameConnectList.add(ongeki); - - Map resultMap = new LinkedHashMap<>(); - resultMap.put("length", gameConnectList.size()); - resultMap.put("gameConnectList", gameConnectList); - - String json = mapper.write(resultMap); - - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java deleted file mode 100644 index fcd0b6e4..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.handler.impl; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.cardmaker.model.response.GetGameSettingResp; -import icu.samnyan.aqua.sega.cardmaker.model.response.data.GameSetting; -import icu.samnyan.aqua.sega.util.jackson.BasicMapper; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component("CardMakerGetGameSettingHandler") -public class GetGameSettingHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(GetGameSettingHandler.class); - - private final BasicMapper mapper; - - @Autowired - public GetGameSettingHandler(BasicMapper mapper) { - this.mapper = mapper; - } - - - @Override - public String handle(@NotNull Map request) throws JsonProcessingException { - - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); - LocalDateTime rebootStartTime = LocalDateTime.now().minusHours(3); - LocalDateTime rebootEndTime = LocalDateTime.now().minusHours(2); - - GameSetting gameSetting = new GameSetting( - "1.35.0", - "1.32.0", - "1.30.0", - "1.45.0", - false, - 10, - rebootStartTime.format(formatter), - rebootEndTime.format(formatter), - false, - 100, - 100, - 100, - false); - - GetGameSettingResp resp = new GetGameSettingResp( - gameSetting, - false, - false - ); - - String json = mapper.write(resp); - - logger.info("Response: {}", json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java deleted file mode 100644 index 46a8fac3..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java +++ /dev/null @@ -1,16 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.model.response; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class CodeResp { - private int returnCode; - private String apiName; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java deleted file mode 100644 index a5ec2264..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java +++ /dev/null @@ -1,21 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.model.response; - -import com.fasterxml.jackson.annotation.JsonProperty; -import icu.samnyan.aqua.sega.cardmaker.model.response.data.GameSetting; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GetGameSettingResp { - private GameSetting gameSetting; - @JsonProperty("isDumpUpload") - private boolean isDumpUpload; - @JsonProperty("isAou") - private boolean isAou; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java deleted file mode 100644 index 2cb1afbd..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java +++ /dev/null @@ -1,14 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.model.response.data; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class GameConnect { - private int modelKind; // 0: chunithm, 1: maimai, 2: ongeki - private int type; // 0: LAN, 1: WAN - private String titleUri; -} diff --git a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java deleted file mode 100644 index 97f4d0a3..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java +++ /dev/null @@ -1,31 +0,0 @@ -package icu.samnyan.aqua.sega.cardmaker.model.response.data; - -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 GameSetting { - private String dataVersion; - private String ongekiCmVersion; - private String chuniCmVersion; - private String maimaiCmVersion; - @JsonProperty("isMaintenance") - private boolean isMaintenance; - private int requestInterval; - private String rebootStartTime; - private String rebootEndTime; - @JsonProperty("isBackgroundDistribute") - private boolean isBackgroundDistribute; - private int maxCountCharacter; - private int maxCountItem; - private int maxCountCard; - private boolean watermark; -}