From a034ba2c88424584ced7e83d81822056030bfb6e Mon Sep 17 00:00:00 2001 From: Dom Eori <4j6dq2zi8@relay.firefox.com> Date: Wed, 27 Jul 2022 22:41:22 +0900 Subject: [PATCH] [cardmaker] Add experimental chusan gacha support --- .../aqua/sega/allnet/AllNetController.java | 2 + .../controller/CardMakerController.java | 56 ++++++ .../controller/CardMakerControllerAdvice.java | 39 ++++ .../sega/cardmaker/handler/BaseHandler.java | 13 ++ .../impl/GetClientBookkeepingHandler.java | 45 +++++ .../handler/impl/GetGameConnectHandler.java | 76 +++++++ .../handler/impl/GetGameSettingHandler.java | 66 +++++++ .../cardmaker/model/response/CodeResp.java | 16 ++ .../model/response/GetGameSettingResp.java | 21 ++ .../model/response/data/GameConnect.java | 14 ++ .../model/response/data/GameSetting.java | 31 +++ .../controller/ChuniServletController.java | 5 + .../controller/ChusanServletController.java | 138 ++++++++++++- .../dao/gamedata/GameGachaCardRepository.java | 18 ++ .../dao/gamedata/GameGachaRepository.java | 13 ++ .../UserCardPrintStateRepository.java | 21 ++ .../dao/userdata/UserGachaRepository.java | 20 ++ .../impl/CMGetUserCharacterHandler.java | 68 +++++++ .../handler/impl/CMGetUserDataHandler.java | 59 ++++++ .../handler/impl/CMGetUserItemHandler.java | 66 +++++++ .../handler/impl/CMGetUserPreviewHandler.java | 60 ++++++ .../impl/CMUpsertUserGachaHandler.java | 117 +++++++++++ .../impl/CMUpsertUserPrintCancelHandler.java | 58 ++++++ .../CMUpsertUserPrintSubtractHandler.java | 92 +++++++++ .../impl/GetGameGachaCardByIdHandler.java | 53 +++++ .../handler/impl/GetGameGachaHandler.java | 47 +++++ .../impl/GetUserCardPrintErrorHandler.java | 49 +++++ .../handler/impl/GetUserGachaHandler.java | 50 +++++ .../impl/GetUserPrintedCardHandler.java | 43 ++++ .../chusan/handler/impl/RollGachaHandler.java | 50 +++++ .../sega/chusan/model/gamedata/GameGacha.java | 47 +++++ .../chusan/model/gamedata/GameGachaCard.java | 39 ++++ .../chusan/model/request/UpsertUserGacha.java | 49 +++++ .../model/response/data/UserEmoney.java | 22 +++ .../model/userdata/UserCardPrintState.java | 45 +++++ .../sega/chusan/model/userdata/UserData.java | 12 +- .../sega/chusan/model/userdata/UserGacha.java | 52 +++++ .../chusan/service/GameGachaCardService.java | 46 +++++ .../sega/chusan/service/UserGachaService.java | 40 ++++ .../general/filter/CompressionFilter.java | 1 + .../controller/Maimai2ServletController.java | 5 + .../ongeki/controller/OngekiController.java | 5 + .../V111__add_cardmaker_chusan_table.sql | 50 +++++ .../mysql/V112__add_cardmaker_chusan_data.sql | 185 ++++++++++++++++++ .../V111__add_cardmaker_chusan_table.sql | 58 ++++++ .../V112__add_cardmaker_chusan_data.sql | 185 ++++++++++++++++++ 46 files changed, 2244 insertions(+), 3 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/BaseHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaCardRepository.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaRepository.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserCardPrintStateRepository.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserGachaRepository.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserCharacterHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserDataHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserItemHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserPreviewHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserGachaHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintCancelHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintSubtractHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaCardByIdHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserCardPrintErrorHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserGachaHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserPrintedCardHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RollGachaHandler.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserEmoney.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/service/GameGachaCardService.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java create mode 100644 src/main/resources/db/migration/mysql/V111__add_cardmaker_chusan_table.sql create mode 100644 src/main/resources/db/migration/mysql/V112__add_cardmaker_chusan_data.sql create mode 100644 src/main/resources/db/migration/sqlite/V111__add_cardmaker_chusan_table.sql create mode 100644 src/main/resources/db/migration/sqlite/V112__add_cardmaker_chusan_data.sql diff --git a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetController.java b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetController.java index e7a3fcb3..a22ee5cf 100644 --- a/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetController.java +++ b/src/main/java/icu/samnyan/aqua/sega/allnet/AllNetController.java @@ -163,6 +163,8 @@ public class AllNetController { } case "SDHD": return "http://" + addr + ":" + port + "/ChusanServlet/"; + case "SDED": + return "http://" + addr + ":" + port + "/CardMakerServlet/"; default: return "http://" + addr + ":" + port + "/"; } 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 new file mode 100644 index 00000000..32df5a43 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerController.java @@ -0,0 +1,56 @@ +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("CardMakerServlet") +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\":\"upsertClientBookkeeping\""; + } + + @PostMapping("UpsertClientSettingApi") + public String upsertClientSetting(@ModelAttribute Map request) { + return "{\"returnCode\":1,\"apiName\":\"upsertClientSetting\"}"; + } + +} 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 new file mode 100644 index 00000000..255d6494 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/controller/CardMakerControllerAdvice.java @@ -0,0 +1,39 @@ +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 javax.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/BaseHandler.java b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/BaseHandler.java new file mode 100644 index 00000000..8fbea1a0 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/BaseHandler.java @@ -0,0 +1,13 @@ +package icu.samnyan.aqua.sega.cardmaker.handler; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import java.util.Map; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +public interface BaseHandler { + + String handle(Map request) throws JsonProcessingException; +} 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 new file mode 100644 index 00000000..41ddcdd8 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetClientBookkeepingHandler.java @@ -0,0 +1,45 @@ +package icu.samnyan.aqua.sega.cardmaker.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import icu.samnyan.aqua.sega.cardmaker.handler.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 new file mode 100644 index 00000000..2823a8d7 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameConnectHandler.java @@ -0,0 +1,76 @@ +package icu.samnyan.aqua.sega.cardmaker.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.cardmaker.handler.BaseHandler; +import icu.samnyan.aqua.sega.cardmaker.model.response.data.GameConnect; +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.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 + + // 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; + + List gameConnectList = new ArrayList<>(); + GameConnect chuni = new GameConnect(0, 1, "http://" + addr + ":" + port + "/ChusanServlet/"); + GameConnect mai = new GameConnect(1, 1, "http://" + addr + ":" + port + "/Maimai2Servlet/"); + GameConnect ongeki = new GameConnect(2, 1, "http://" + addr + ":" + port + "/OngekiServlet/"); + 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 new file mode 100644 index 00000000..8b2e7103 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/handler/impl/GetGameSettingHandler.java @@ -0,0 +1,66 @@ +package icu.samnyan.aqua.sega.cardmaker.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.cardmaker.handler.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.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(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.0.0", + "1.32.0", + "1.30.0", + "1.32.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 new file mode 100644 index 00000000..46a8fac3 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/CodeResp.java @@ -0,0 +1,16 @@ +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 new file mode 100644 index 00000000..a5ec2264 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/GetGameSettingResp.java @@ -0,0 +1,21 @@ +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 new file mode 100644 index 00000000..2cb1afbd --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameConnect.java @@ -0,0 +1,14 @@ +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 new file mode 100644 index 00000000..97f4d0a3 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/cardmaker/model/response/data/GameSetting.java @@ -0,0 +1,31 @@ +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; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chunithm/controller/ChuniServletController.java b/src/main/java/icu/samnyan/aqua/sega/chunithm/controller/ChuniServletController.java index 0231157f..41b492c3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chunithm/controller/ChuniServletController.java +++ b/src/main/java/icu/samnyan/aqua/sega/chunithm/controller/ChuniServletController.java @@ -305,4 +305,9 @@ public class ChuniServletController { return upsertUserChargelogHandler.handle(request); } + @PostMapping("Ping") + String ping(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\"}"; + } + } 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 4f8ab19f..d54e0c2f 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 @@ -46,9 +46,43 @@ public class ChusanServletController { private final GetUserTeamHandler getUserTeamHandler; private final UpsertUserAllHandler upsertUserAllHandler; private final UpsertUserChargelogHandler upsertUserChargelogHandler; + private final GetGameGachaHandler getGameGachaHandler; + private final GetGameGachaCardByIdHandler getGameGachaCardByIdHandler; + private final GetUserCardPrintErrorHandler getUserCardPrintErrorHandler; + private final CMGetUserPreviewHandler cmGetUserPreviewHandler; + private final CMGetUserDataHandler cmGetUserDataHandler; + private final CMGetUserCharacterHandler cmGetUserCharacterHandler; + private final GetUserGachaHandler getUserGachaHandler; + private final GetUserPrintedCardHandler getUserPrintedCardHandler; + private final CMGetUserItemHandler cmGetUserItemHandler; + private final RollGachaHandler rollGachaHandler; + private final CMUpsertUserGachaHandler cmUpsertUserGachaHandler; + private final CMUpsertUserPrintSubtractHandler cmUpsertUserPrintSubtractHandler; + private final CMUpsertUserPrintCancelHandler cmUpsertUserPrintCancelHandler; @Autowired - public ChusanServletController(GameLoginHandler gameLoginHandler, GameLogoutHandler gameLogoutHandler, GetGameChargeHandler getGameChargeHandler, GetGameEventHandler getGameEventHandler, GetGameIdlistHandler getGameIdlistHandler, GetGameRankingHandler getGameRankingHandler, GetGameSettingHandler getGameSettingHandler, GetTeamCourseRuleHandler getTeamCourseRuleHandler, GetTeamCourseSettingHandler getTeamCourseSettingHandler, GetUserActivityHandler getUserActivityHandler, GetUserCharacterHandler getUserCharacterHandler, GetUserChargeHandler getUserChargeHandler, GetUserCourseHandler getUserCourseHandler, GetUserDataHandler getUserDataHandler, GetUserDuelHandler getUserDuelHandler, GetUserFavoriteItemHandler getUserFavoriteItemHandler, GetUserItemHandler getUserItemHandler, GetUserLoginBonusHandler getUserLoginBonusHandler, GetUserMapAreaHandler getUserMapAreaHandler, GetUserMusicHandler getUserMusicHandler, GetUserOptionHandler getUserOptionHandler, GetUserPreviewHandler getUserPreviewHandler, GetUserRecentRatingHandler getUserRecentRatingHandler, GetUserRegionHandler getUserRegionHandler, GetUserRivalDataHandler getUserRivalDataHandler, GetUserRivalMusicHandler getUserRivalMusicHandler, GetUserTeamHandler getUserTeamHandler, UpsertUserAllHandler upsertUserAllHandler, UpsertUserChargelogHandler upsertUserChargelogHandler, GetUserSymbolChatSettingHandler getUserSymbolChatSettingHandler, GetUserNetBattleDataHandler getUserNetBattleDataHandler) { + public ChusanServletController(GameLoginHandler gameLoginHandler, GameLogoutHandler gameLogoutHandler, + GetGameChargeHandler getGameChargeHandler, GetGameEventHandler getGameEventHandler, + GetGameIdlistHandler getGameIdlistHandler, GetGameRankingHandler getGameRankingHandler, + GetGameSettingHandler getGameSettingHandler, GetTeamCourseRuleHandler getTeamCourseRuleHandler, + GetTeamCourseSettingHandler getTeamCourseSettingHandler, GetUserActivityHandler getUserActivityHandler, + GetUserCharacterHandler getUserCharacterHandler, GetUserChargeHandler getUserChargeHandler, + GetUserCourseHandler getUserCourseHandler, GetUserDataHandler getUserDataHandler, + GetUserDuelHandler getUserDuelHandler, GetUserFavoriteItemHandler getUserFavoriteItemHandler, + GetUserItemHandler getUserItemHandler, GetUserLoginBonusHandler getUserLoginBonusHandler, + GetUserMapAreaHandler getUserMapAreaHandler, GetUserMusicHandler getUserMusicHandler, + GetUserOptionHandler getUserOptionHandler, GetUserPreviewHandler getUserPreviewHandler, + GetUserRecentRatingHandler getUserRecentRatingHandler, GetUserRegionHandler getUserRegionHandler, + GetUserRivalDataHandler getUserRivalDataHandler, GetUserRivalMusicHandler getUserRivalMusicHandler, + GetUserTeamHandler getUserTeamHandler, UpsertUserAllHandler upsertUserAllHandler, + UpsertUserChargelogHandler upsertUserChargelogHandler, GetUserSymbolChatSettingHandler getUserSymbolChatSettingHandler, + GetUserNetBattleDataHandler getUserNetBattleDataHandler, GetGameGachaHandler getGameGachaHandler, + GetGameGachaCardByIdHandler getGameGachaCardByIdHandler, GetUserCardPrintErrorHandler getUserCardPrintErrorHandler, + CMGetUserPreviewHandler cmGetUserPreviewHandler, CMGetUserDataHandler cmGetUserDataHandler, + CMGetUserCharacterHandler cmGetUserCharacterHandler, GetUserGachaHandler getUserGachaHandler, + GetUserPrintedCardHandler getUserPrintedCardHandler, CMGetUserItemHandler cmGetUserItemHandler, + RollGachaHandler rollGachaHandler, CMUpsertUserGachaHandler cmUpsertUserGachaHandler, + CMUpsertUserPrintSubtractHandler cmUpsertUserPrintSubtractHandler, CMUpsertUserPrintCancelHandler cmUpsertUserPrintCancelHandler) { this.gameLoginHandler = gameLoginHandler; this.gameLogoutHandler = gameLogoutHandler; this.getGameChargeHandler = getGameChargeHandler; @@ -80,6 +114,19 @@ public class ChusanServletController { this.upsertUserChargelogHandler = upsertUserChargelogHandler; this.getUserSymbolChatSettingHandler = getUserSymbolChatSettingHandler; this.getUserNetBattleDataHandler = getUserNetBattleDataHandler; + this.getGameGachaHandler = getGameGachaHandler; + this.getGameGachaCardByIdHandler = getGameGachaCardByIdHandler; + this.getUserCardPrintErrorHandler = getUserCardPrintErrorHandler; + this.cmGetUserPreviewHandler = cmGetUserPreviewHandler; + this.cmGetUserDataHandler = cmGetUserDataHandler; + this.cmGetUserCharacterHandler = cmGetUserCharacterHandler; + this.getUserGachaHandler = getUserGachaHandler; + this.getUserPrintedCardHandler = getUserPrintedCardHandler; + this.cmGetUserItemHandler = cmGetUserItemHandler; + this.rollGachaHandler = rollGachaHandler; + this.cmUpsertUserGachaHandler = cmUpsertUserGachaHandler; + this.cmUpsertUserPrintSubtractHandler = cmUpsertUserPrintSubtractHandler; + this.cmUpsertUserPrintCancelHandler = cmUpsertUserPrintCancelHandler; } @PostMapping("GameLoginApi") @@ -277,7 +324,7 @@ public class ChusanServletController { return "{\"returnCode\":\"1\"}"; } - @PostMapping("MatchingServer/Ping") + @PostMapping({"MatchingServer/Ping", "Ping"}) String ping(@ModelAttribute Map request) { return "{\"returnCode\":\"1\"}"; } @@ -296,4 +343,91 @@ public class ChusanServletController { */ + // Cardmaker endpoints + + @PostMapping("GetGameGachaApi") + String getGameGacha(@ModelAttribute Map request) throws JsonProcessingException { + return getGameGachaHandler.handle(request); + } + + @PostMapping("GetGameGachaCardByIdApi") + String getGameGachaCardById(@ModelAttribute Map request) throws JsonProcessingException { + return getGameGachaCardByIdHandler.handle(request); + } + + @PostMapping("GetUserCardPrintErrorApi") + String getUserCardPrintError(@ModelAttribute Map request) throws JsonProcessingException { + return getUserCardPrintErrorHandler.handle(request); + } + + @PostMapping("CMGetUserCharacterApi") + String cmGetUserCharacter(@ModelAttribute Map request) throws JsonProcessingException { + return cmGetUserCharacterHandler.handle(request); + } + + @PostMapping("CMGetUserDataApi") + String cmGetUserData(@ModelAttribute Map request) throws JsonProcessingException { + return cmGetUserDataHandler.handle(request); + } + + @PostMapping("GetUserGachaApi") + String GetUserGacha(@ModelAttribute Map request) throws JsonProcessingException { + return getUserGachaHandler.handle(request); + } + + @PostMapping("CMGetUserItemApi") + String cmGetUserItem(@ModelAttribute Map request) throws JsonProcessingException { + return cmGetUserItemHandler.handle(request); + } + + @PostMapping("CMGetUserPreviewApi") + String cmGetUserPreview(@ModelAttribute Map request) throws JsonProcessingException { + return cmGetUserPreviewHandler.handle(request); + } + + @PostMapping("GetUserPrintedCardApi") + String getUserPrintedCard(@ModelAttribute Map request) throws JsonProcessingException { + return getUserPrintedCardHandler.handle(request); + } + + @PostMapping("PrinterLoginApi") + String printerLogin(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\"}"; + } + + @PostMapping("PrinterLogoutApi") + String printerLogout(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\"}"; + } + + @PostMapping("RollGachaApi") + String rollGacha(@ModelAttribute Map request) throws JsonProcessingException { + return rollGachaHandler.handle(request); + } + + @PostMapping("CMUpsertUserGachaApi") + String cmUpsertUserGacha(@ModelAttribute Map request) throws JsonProcessingException { + return cmUpsertUserGachaHandler.handle(request); + } + + @PostMapping("CMUpsertUserPrintApi") + String cmUpsertUserPrint(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\", \"orderId\":\"0\", \"serialId\":\"FAKECARDIMAG12345678\", \"apiName\":\"CMUpsertUserPrintApi\"}"; + } + + @PostMapping("CMUpsertUserPrintCancelApi") + String cmUpsertUserPrintCancel(@ModelAttribute Map request) throws JsonProcessingException { + return cmUpsertUserPrintCancelHandler.handle(request); + } + + @PostMapping("CMUpsertUserPrintlogApi") + String cmUpsertUserPrintlog(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\", \"orderId\":\"0\", \"serialId\":\"FAKECARDIMAG12345678\", \"apiName\":\"CMUpsertUserPrintlogApi\"}"; + } + + @PostMapping("CMUpsertUserPrintSubtractApi") + String cmUpsertUserPrintSubtract(@ModelAttribute Map request) throws JsonProcessingException { + return cmUpsertUserPrintSubtractHandler.handle(request); + } + } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaCardRepository.java b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaCardRepository.java new file mode 100644 index 00000000..49e7b321 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaCardRepository.java @@ -0,0 +1,18 @@ +package icu.samnyan.aqua.sega.chusan.dao.gamedata; + +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("ChusanGameGachaCardRepository") +public interface GameGachaCardRepository extends JpaRepository { + + List findAllByGachaId(int gacha_id); + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaRepository.java b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaRepository.java new file mode 100644 index 00000000..dd1f065e --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/gamedata/GameGachaRepository.java @@ -0,0 +1,13 @@ +package icu.samnyan.aqua.sega.chusan.dao.gamedata; + +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGacha; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("ChusanGameGachaRepository") +public interface GameGachaRepository extends JpaRepository { +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserCardPrintStateRepository.java b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserCardPrintStateRepository.java new file mode 100644 index 00000000..72e7b8b2 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserCardPrintStateRepository.java @@ -0,0 +1,21 @@ +package icu.samnyan.aqua.sega.chusan.dao.userdata; + +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("ChusanUserCardPrintStateRepository") +public interface UserCardPrintStateRepository extends JpaRepository { + List findByUser_Card_ExtId(Long extId); + + List findByUser_Card_ExtIdAndHasCompleted(Long extId, boolean hasCompleted); + + List findByUserAndGachaIdAndHasCompleted(UserData userData, int gachaId, boolean hasCompleted); +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserGachaRepository.java b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserGachaRepository.java new file mode 100644 index 00000000..19319386 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/dao/userdata/UserGachaRepository.java @@ -0,0 +1,20 @@ +package icu.samnyan.aqua.sega.chusan.dao.userdata; + +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Repository("ChusanUserGachaRepository") +public interface UserGachaRepository extends JpaRepository { + List findByUser_Card_ExtId(Long extId); + + Optional findByUserAndGachaId(UserData extId, int gachaId); +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserCharacterHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserCharacterHandler.java new file mode 100644 index 00000000..d756f8f0 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserCharacterHandler.java @@ -0,0 +1,68 @@ +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.userdata.UserCharacter; +import icu.samnyan.aqua.sega.chusan.service.UserCharacterService; +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.data.domain.Page; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Handle getUserCharacter request + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMGetUserCharacterHandler") +public class CMGetUserCharacterHandler implements BaseHandler { + + + private static final Logger logger = LoggerFactory.getLogger(CMGetUserCharacterHandler.class); + + private final BasicMapper mapper; + + private final UserCharacterService userCharacterService; + + + @Autowired + public CMGetUserCharacterHandler(BasicMapper mapper, UserCharacterService userCharacterService) { + this.mapper = mapper; + this.userCharacterService = userCharacterService; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + int nextIndex = ((Number) request.get("nextIndex")).intValue(); + int maxCount = ((Number) request.get("maxCount")).intValue(); + + int pageNum = nextIndex / maxCount; + + Page dbPage = userCharacterService.getByUserId(userId, pageNum, maxCount); + + long currentIndex = maxCount * pageNum + dbPage.getNumberOfElements(); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + resultMap.put("length", dbPage.getNumberOfElements()); + resultMap.put("nextIndex", dbPage.getNumberOfElements() < maxCount ? -1 : currentIndex); + List userCharacterIdList = new ArrayList<>(); + + dbPage.getContent().forEach(userCharacter -> { + userCharacterIdList.add(userCharacter.getCharacterId()); + }); + + resultMap.put("userCharacterList", userCharacterIdList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserDataHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserDataHandler.java new file mode 100644 index 00000000..413d56a0 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserDataHandler.java @@ -0,0 +1,59 @@ +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.UserEmoney; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.service.UserDataService; +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.Map; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMGetUserDataHandler") +public class CMGetUserDataHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMGetUserDataHandler.class); + + private final BasicMapper mapper; + + private final UserDataService userDataService; + + @Autowired + public CMGetUserDataHandler(BasicMapper mapper, UserDataService userDataService) { + this.mapper = mapper; + this.userDataService = userDataService; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + Optional userDataOptional = userDataService.getUserByExtId(userId); + + if (userDataOptional.isPresent()) { + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + UserData user = userDataOptional.get(); + UserEmoney userEmoney = new UserEmoney(); + user.setUserEmoney(userEmoney); + + resultMap.put("userData", user); + resultMap.put("userEmoney", userEmoney); + + String json = mapper.write(resultMap); + + logger.info("Response: " + json); + return json; + } + + return null; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserItemHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserItemHandler.java new file mode 100644 index 00000000..f0a0ba0f --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserItemHandler.java @@ -0,0 +1,66 @@ +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.userdata.UserItem; +import icu.samnyan.aqua.sega.chusan.service.UserItemService; +import icu.samnyan.aqua.sega.util.jackson.BasicMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Handler for getting user item. + * This get call before profile create. + * + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMGetUserItemHandler") +public class CMGetUserItemHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMGetUserItemHandler.class); + + private final BasicMapper mapper; + + private final UserItemService userItemService; + + public CMGetUserItemHandler(BasicMapper mapper, UserItemService userItemService) { + this.mapper = mapper; + this.userItemService = userItemService; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + Long nextIndexVal = ((Number) request.get("nextIndex")).longValue(); + int maxCount = ((Number) request.get("maxCount")).intValue(); + + Long mul = 10000000000L; + + int kind = (int) (nextIndexVal / mul); + int nextIndex = (int) (nextIndexVal % mul); + int pageNum = nextIndex / maxCount; + + Page userItemPage = userItemService.getByUserAndItemKind(userId, kind, pageNum, maxCount); + + List userItemList = userItemPage.getContent(); + + long currentIndex = kind * mul + maxCount * pageNum + userItemPage.getNumberOfElements(); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + resultMap.put("length", userItemPage.getNumberOfElements()); + resultMap.put("nextIndex", userItemPage.getNumberOfElements() < maxCount ? -1 : currentIndex); + resultMap.put("itemKind", kind); + resultMap.put("userItemList", userItemList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserPreviewHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserPreviewHandler.java new file mode 100644 index 00000000..40d71304 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMGetUserPreviewHandler.java @@ -0,0 +1,60 @@ +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.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.service.UserDataService; +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.Map; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMGetUserPreviewHandler") +public class CMGetUserPreviewHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMGetUserPreviewHandler.class); + + private final BasicMapper mapper; + + private final UserDataService userDataService; + + @Autowired + public CMGetUserPreviewHandler(BasicMapper mapper, UserDataService userDataService) { + this.mapper = mapper; + this.userDataService = userDataService; + } + + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + String segaIdAuthKey = String.valueOf(request.get("segaIdAuthKey")); + + Optional userDataOptional = userDataService.getUserByExtId(userId); + + if (userDataOptional.isPresent()) { + Map resultMap = new LinkedHashMap<>(); + UserData user = userDataOptional.get(); + + resultMap.put("userName", user.getUserName()); + resultMap.put("level", user.getLevel()); + resultMap.put("medal", user.getMedal()); + resultMap.put("lastDataVersion", "2.00.00"); //Hardcode due to outdated + resultMap.put("isLogin", false); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } + + return null; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserGachaHandler.java new file mode 100644 index 00000000..28262541 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserGachaHandler.java @@ -0,0 +1,117 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCardPrintStateRepository; +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserGachaRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; +import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; +import icu.samnyan.aqua.sega.chusan.service.UserDataService; +import icu.samnyan.aqua.sega.chusan.service.UserItemService; +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.time.LocalDateTime; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMUpsertUserGachaHandler") +public class CMUpsertUserGachaHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserGachaHandler.class); + private final UserCardPrintStateRepository userCardPrintStateRepository; + private final UserGachaRepository userGachaRepository; + private final UserDataService userDataService; + private final UserItemService userItemService; + private final BasicMapper mapper; + + @Autowired + public CMUpsertUserGachaHandler(UserItemService userItemService, UserDataService userDataService, + UserCardPrintStateRepository userCardPrintStateRepository, BasicMapper mapper, + UserGachaRepository userGachaRepository) { + this.userCardPrintStateRepository = userCardPrintStateRepository; + this.userGachaRepository = userGachaRepository; + this.userDataService = userDataService; + this.userItemService = userItemService; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + int gachaId = ((Number) request.get("gachaId")).intValue(); + int placeId = ((Number) request.get("placeId")).intValue(); + + UpsertUserGacha upsertUserGacha = mapper.convert(request.get("cmUpsertUserGacha"), UpsertUserGacha.class); + List userCardPrintStateList = new ArrayList<>(); + UserData userData; + + Optional userOptional = userDataService.getUserByExtId(userId); + if (userOptional.isPresent()) { + userData = userOptional.get(); + } else { + logger.error("User not found. userId: {}", userId); + return null; + } + + if (upsertUserGacha.getGameGachaCardList() != null) { + for (GameGachaCard gameGachaCard : upsertUserGacha.getGameGachaCardList()) { + UserCardPrintState userCardPrintState = new UserCardPrintState(); + userCardPrintState.setHasCompleted(false); + userCardPrintState.setLimitDate(LocalDateTime.of(2029, 01, 01, 0, 0)); + userCardPrintState.setPlaceId(placeId); + userCardPrintState.setCardId(gameGachaCard.getCardId()); + userCardPrintState.setGachaId(gachaId); + userCardPrintState.setUser(userData); + userCardPrintStateRepository.save(userCardPrintState); + } + } + + List userItemListToSave = new ArrayList<>(); + List userItemList = upsertUserGacha.getUserItemList(); + + userItemList.forEach(newUserItem -> { + int itemId = newUserItem.getItemId(); + int itemKind = newUserItem.getItemKind(); + + Optional userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind); + UserItem userItem = userItemOptional.orElseGet(() -> new UserItem(userData)); + + newUserItem.setId(userItem.getId()); + newUserItem.setUser(userItem.getUser()); + + userItemListToSave.add(newUserItem); + }); + userItemService.saveAll(userItemListToSave); + + if (upsertUserGacha.getUserGacha() != null) { + UserGacha newUserGacha = upsertUserGacha.getUserGacha(); + newUserGacha.setUser(userData); + userGachaRepository.save(newUserGacha); + } + + userCardPrintStateList = userCardPrintStateRepository.findByUserAndGachaIdAndHasCompleted(userData, gachaId, false); + Map resultMap = new LinkedHashMap<>(); + resultMap.put("returnCode", 1); + resultMap.put("apiName", "CMUpsertUserGachaApi"); + resultMap.put("userCardPrintStateList", userCardPrintStateList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintCancelHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintCancelHandler.java new file mode 100644 index 00000000..2f933455 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintCancelHandler.java @@ -0,0 +1,58 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; + +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCardPrintStateRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; +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; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMUpsertUserPrintCancelHandler") +public class CMUpsertUserPrintCancelHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserPrintCancelHandler.class); + private final UserCardPrintStateRepository userCardPrintStateRepository; + private final BasicMapper mapper; + + @Autowired + public CMUpsertUserPrintCancelHandler(UserCardPrintStateRepository userCardPrintStateRepository, BasicMapper mapper) { + this.userCardPrintStateRepository = userCardPrintStateRepository; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + List orderIdList = mapper.convert(request.get("orderIdList"), new TypeReference>() {}); + + for (Integer orderId : orderIdList) { + Optional userCardPrintStateOptional = userCardPrintStateRepository.findById(orderId.longValue()); + if (userCardPrintStateOptional.isPresent()) { + UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get(); + newUserCardPrintState.setHasCompleted(true); + userCardPrintStateRepository.save(newUserCardPrintState); + } + } + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("returnCode", 1); + resultMap.put("apiName", "CMUpsertUserPrintCancelApi"); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintSubtractHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintSubtractHandler.java new file mode 100644 index 00000000..5574626d --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/CMUpsertUserPrintSubtractHandler.java @@ -0,0 +1,92 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; + +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCardPrintStateRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; +import icu.samnyan.aqua.sega.chusan.service.UserDataService; +import icu.samnyan.aqua.sega.chusan.service.UserItemService; +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.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("ChusanCMUpsertUserPrintSubtractHandler") +public class CMUpsertUserPrintSubtractHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserPrintSubtractHandler.class); + private final UserCardPrintStateRepository userCardPrintStateRepository; + private final UserItemService userItemService; + private final UserDataService userDataService; + private final BasicMapper mapper; + + @Autowired + public CMUpsertUserPrintSubtractHandler(UserItemService userItemService, UserDataService userDataService, UserCardPrintStateRepository userCardPrintStateRepository, BasicMapper mapper) { + this.userCardPrintStateRepository = userCardPrintStateRepository; + this.userItemService = userItemService; + this.userDataService = userDataService; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + UserCardPrintState userCardPrintState = mapper.convert(request.get("userCardPrintState"), UserCardPrintState.class); + List userItemList = mapper.convert(request.get("userItemList"), new TypeReference>() {}); + + UserData userData; + + Optional userOptional = userDataService.getUserByExtId(userId); + if (userOptional.isPresent()) { + userData = userOptional.get(); + } else { + logger.error("User not found. userId: {}", userId); + return null; + } + + List userItemListToSave = new ArrayList<>(); + + userItemList.forEach(newUserItem -> { + int itemId = newUserItem.getItemId(); + int itemKind = newUserItem.getItemKind(); + + Optional userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind); + UserItem userItem = userItemOptional.orElseGet(() -> new UserItem(userData)); + + newUserItem.setId(userItem.getId()); + newUserItem.setUser(userItem.getUser()); + + userItemListToSave.add(newUserItem); + }); + userItemService.saveAll(userItemListToSave); + + Optional userCardPrintStateOptional = userCardPrintStateRepository.findById(userCardPrintState.getId()); + if (userCardPrintStateOptional.isPresent()) { + UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get(); + newUserCardPrintState.setHasCompleted(true); + userCardPrintStateRepository.save(newUserCardPrintState); + } + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("returnCode", 1); + resultMap.put("apiName", "CMUpsertUserPrintSubtractApi"); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaCardByIdHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaCardByIdHandler.java new file mode 100644 index 00000000..3c318640 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaCardByIdHandler.java @@ -0,0 +1,53 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import icu.samnyan.aqua.sega.chusan.dao.gamedata.GameGachaCardRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; +import icu.samnyan.aqua.sega.chusan.service.GameGachaCardService; +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("ChusanGetGameGachaCardByIdHandler") +public class GetGameGachaCardByIdHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetGameGachaCardByIdHandler.class); + private final GameGachaCardService gameGachaCardService; + private final BasicMapper mapper; + + @Autowired + public GetGameGachaCardByIdHandler(GameGachaCardService gameGachaCardService, BasicMapper mapper) { + this.gameGachaCardService = gameGachaCardService; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + int gachaId = ((Number) request.get("gachaId")).intValue(); + + List gameGachaCardList = gameGachaCardService.getByGachaId(gachaId); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("gachaId", gachaId); + resultMap.put("length", gameGachaCardList.size()); + resultMap.put("isPickup", false); + resultMap.put("gameGachaCardList", gameGachaCardList); + resultMap.put("emissionList", List.of()); + resultMap.put("afterCalcList", List.of()); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaHandler.java new file mode 100644 index 00000000..b90ee44c --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetGameGachaHandler.java @@ -0,0 +1,47 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import icu.samnyan.aqua.sega.chusan.dao.gamedata.GameGachaRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGacha; +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("ChusanGetGameGachaHandler") +public class GetGameGachaHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetGameGachaHandler.class); + private final GameGachaRepository gameGachaRepository; + private final BasicMapper mapper; + + @Autowired + public GetGameGachaHandler(GameGachaRepository gameGachaRepository, BasicMapper mapper) { + this.gameGachaRepository = gameGachaRepository; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + + List gameGachaList = gameGachaRepository.findAll(); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("length", gameGachaList.size()); + resultMap.put("gameGachaList", gameGachaList); + resultMap.put("registIdList", List.of()); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserCardPrintErrorHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserCardPrintErrorHandler.java new file mode 100644 index 00000000..158eb3af --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserCardPrintErrorHandler.java @@ -0,0 +1,49 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCardPrintStateRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; +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("ChusanGetUserCardPrintErrorHandler") +public class GetUserCardPrintErrorHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetUserCardPrintErrorHandler.class); + private final UserCardPrintStateRepository userCardPrintStateRepository; + private final BasicMapper mapper; + + @Autowired + public GetUserCardPrintErrorHandler(UserCardPrintStateRepository userCardPrintStateRepository, BasicMapper mapper) { + this.mapper = mapper; + this.userCardPrintStateRepository = userCardPrintStateRepository; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + Long userId = ((Number) request.get("userId")).longValue(); + + List userCardPrintStateList = userCardPrintStateRepository.findByUser_Card_ExtIdAndHasCompleted(userId, false); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + resultMap.put("length", userCardPrintStateList.size()); + resultMap.put("userCardPrintStateList", userCardPrintStateList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserGachaHandler.java new file mode 100644 index 00000000..2c37d0b7 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserGachaHandler.java @@ -0,0 +1,50 @@ +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.userdata.UserGacha; +import icu.samnyan.aqua.sega.chusan.service.UserGachaService; +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("ChusanGetUserGachaHandler") +public class GetUserGachaHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetUserGachaHandler.class); + + private final BasicMapper mapper; + + private final UserGachaService userGachaService; + + @Autowired + public GetUserGachaHandler(BasicMapper mapper, UserGachaService userGachaService) { + this.mapper = mapper; + this.userGachaService = userGachaService; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + + List userGachaList = userGachaService.getByUserId(userId); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + resultMap.put("length", userGachaList.size()); + resultMap.put("userGachaList", userGachaList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserPrintedCardHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserPrintedCardHandler.java new file mode 100644 index 00000000..d026efe2 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserPrintedCardHandler.java @@ -0,0 +1,43 @@ +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.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("ChusanGetUserPrintedCardHandler") +public class GetUserPrintedCardHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(GetUserPrintedCardHandler.class); + private final BasicMapper mapper; + + @Autowired + public GetUserPrintedCardHandler(BasicMapper mapper) { + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + String userId = String.valueOf(request.get("userId")); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("userId", userId); + resultMap.put("length", 0); + resultMap.put("nextIndex", -1); + resultMap.put("userPrintedCardList", List.of()); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RollGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RollGachaHandler.java new file mode 100644 index 00000000..694d7df9 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/RollGachaHandler.java @@ -0,0 +1,50 @@ +package icu.samnyan.aqua.sega.chusan.handler.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; + +import icu.samnyan.aqua.sega.chusan.dao.gamedata.GameGachaCardRepository; +import icu.samnyan.aqua.sega.chusan.handler.BaseHandler; +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; +import icu.samnyan.aqua.sega.chusan.service.GameGachaCardService; +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("ChusanRollGachaHandler") +public class RollGachaHandler implements BaseHandler { + + private static final Logger logger = LoggerFactory.getLogger(RollGachaHandler.class); + private final GameGachaCardService gameGachaCardService; + private final BasicMapper mapper; + + @Autowired + public RollGachaHandler(GameGachaCardService gameGachaCardService, BasicMapper mapper) { + this.gameGachaCardService = gameGachaCardService; + this.mapper = mapper; + } + + @Override + public String handle(Map request) throws JsonProcessingException { + int gachaId = ((Number) request.get("gachaId")).intValue(); + int times = ((Number) request.get("times")).intValue(); + + List gameGachaCardList = gameGachaCardService.getRandomCards(gachaId, times); + + Map resultMap = new LinkedHashMap<>(); + resultMap.put("length", gameGachaCardList.size()); + resultMap.put("gameGachaCardList", gameGachaCardList); + + String json = mapper.write(resultMap); + logger.info("Response: " + json); + return json; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java new file mode 100644 index 00000000..0c2ea496 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGacha.java @@ -0,0 +1,47 @@ +package icu.samnyan.aqua.sega.chusan.model.gamedata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "ChusanGameGacha") +@Table(name = "chusan_game_gacha") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GameGacha implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private int id; + private int gachaId; + private String gachaName; + private int type; + private int kind; // 0 + @JsonProperty("isCeiling") + private boolean isCeiling; + private int ceilingCnt; + private int changeRateCnt1; + private int changeRateCnt2; + private LocalDateTime startDate; + private LocalDateTime endDate; + private LocalDateTime noticeStartDate; + private LocalDateTime noticeEndDate; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java new file mode 100644 index 00000000..10a58add --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/gamedata/GameGachaCard.java @@ -0,0 +1,39 @@ +package icu.samnyan.aqua.sega.chusan.model.gamedata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.io.Serializable; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "ChusanGameGachaCard") +@Table(name = "chusan_game_gacha_card") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GameGachaCard implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private int id; + private int gachaId; + private int cardId; + private int rarity; + private int weight; + @JsonProperty("isPickup") + private boolean isPickup; +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java new file mode 100644 index 00000000..015b9cdd --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java @@ -0,0 +1,49 @@ +package icu.samnyan.aqua.sega.chusan.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; +import icu.samnyan.aqua.sega.chusan.model.userdata.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.lang.Nullable; + +import java.io.Serializable; +import java.util.List; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class UpsertUserGacha implements Serializable { + + @Nullable + private UserData userData; + + @Nullable + private UserGacha userGacha; + + @Nullable + private List userCharacterList; + + @Nullable + private List userCardList; + + @Nullable + private List gameGachaCardList; + + @Nullable + private List userItemList; + + @Nullable + @JsonProperty("isNewCharacterList") + private String isNewCharacterList; + + @Nullable + @JsonProperty("isNewCardList") + private String isNewCardList; + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserEmoney.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserEmoney.java new file mode 100644 index 00000000..9517e9b4 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserEmoney.java @@ -0,0 +1,22 @@ +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 UserEmoney { + + private int type = 0; + private int emoneyCredit = 69; + private int emoneyBrand = 2; + private int ext1 = 0; + private int ext2 = 0; + private int ext3 = 0; + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java new file mode 100644 index 00000000..4d8ff6a0 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java @@ -0,0 +1,45 @@ +package icu.samnyan.aqua.sega.chusan.model.userdata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "ChusanUserCardPrintState") +@Table(name = "chusan_user_print_state") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserCardPrintState implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonProperty("orderId") + private long id; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "user_id") + private UserData user; + + private boolean hasCompleted; + private LocalDateTime limitDate; + private int placeId; + private int cardId; + private int gachaId; + + public UserCardPrintState(UserData user) { + this.user = user; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java index 30dca413..452d6279 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java @@ -1,9 +1,12 @@ package icu.samnyan.aqua.sega.chusan.model.userdata; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import icu.samnyan.aqua.sega.chusan.model.response.data.UserEmoney; import icu.samnyan.aqua.sega.general.model.Card; import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer; import lombok.AllArgsConstructor; @@ -13,6 +16,7 @@ import lombok.NoArgsConstructor; import javax.persistence.*; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; /** * @author samnyan (privateamusement@protonmail.com) @@ -328,11 +332,17 @@ public class UserData implements Serializable { private long extLong2; - private String rankUpChallengeResults; + @JsonInclude + @Transient + private List rankUpChallengeResults; @JsonProperty("isNetBattleHost") private boolean isNetBattleHost; private int netBattleEndState; + @JsonInclude(JsonInclude.Include.NON_NULL) + @Transient + private UserEmoney userEmoney; + } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java new file mode 100644 index 00000000..f4866600 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java @@ -0,0 +1,52 @@ +package icu.samnyan.aqua.sega.chusan.model.userdata; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Entity(name = "ChusanUserGacha") +@Table(name = "chusan_user_gacha", uniqueConstraints = {@UniqueConstraint(columnNames = {"user_id", "gacha_id"})}) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserGacha implements Serializable { + + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private long id; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "user_id") + private UserData user; + + @Column(name = "gacha_id") + private int gachaId; + + private int totalGachaCnt; + + private int ceilingGachaCnt; + + private int dailyGachaCnt; + + private int fiveGachaCnt; + + private int elevenGachaCnt; + + private LocalDateTime dailyGachaDate; + + public UserGacha(UserData user) { + this.user = user; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/GameGachaCardService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/GameGachaCardService.java new file mode 100644 index 00000000..6bb10273 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/GameGachaCardService.java @@ -0,0 +1,46 @@ +package icu.samnyan.aqua.sega.chusan.service; + +import icu.samnyan.aqua.sega.chusan.dao.gamedata.GameGachaCardRepository; +import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Service("ChusanGameGachaCardService") +public class GameGachaCardService { + + private final GameGachaCardRepository gameGachaCardRepository; + + @Autowired + public GameGachaCardService(GameGachaCardRepository gameGachaCardRepository) { + this.gameGachaCardRepository = gameGachaCardRepository; + } + + @Cacheable("gachaCard") + public List getAll() { + return gameGachaCardRepository.findAll(); + } + + public List getByGachaId(int gachaId) { + return gameGachaCardRepository.findAllByGachaId(gachaId); + } + + public List getRandomCards(int gachaId, int times) { + List gachaCards = gameGachaCardRepository.findAllByGachaId(gachaId); + List randomCards = new ArrayList<>(); + + Random rand = new Random(); + for (int i = 0; i < Math.min(times, gachaCards.size()); i++) { + randomCards.add(gachaCards.remove(rand.nextInt(gachaCards.size()))); + } + + return randomCards; + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java new file mode 100644 index 00000000..a4f998aa --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java @@ -0,0 +1,40 @@ +package icu.samnyan.aqua.sega.chusan.service; + +import icu.samnyan.aqua.sega.chusan.dao.userdata.UserGachaRepository; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; + +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Service("ChusanUserGachaService") +public class UserGachaService { + + private final UserGachaRepository userGachaRepository; + + public UserGachaService(UserGachaRepository userGachaRepository) { + this.userGachaRepository = userGachaRepository; + } + + public UserGacha save(UserGacha userGacha) { + return userGachaRepository.save(userGacha); + } + + public List saveAll(List newUserGachaList) { + return userGachaRepository.saveAll(newUserGachaList); + } + + public List getByUserId(String userId) { + return userGachaRepository.findByUser_Card_ExtId(Long.parseLong(userId)); + } + + public Optional getByUserAndGachaId(UserData user, int gachaId) { + return userGachaRepository.findByUserAndGachaId(user, gachaId); + } + +} diff --git a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.java b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.java index 1a555200..533530a3 100644 --- a/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.java +++ b/src/main/java/icu/samnyan/aqua/sega/general/filter/CompressionFilter.java @@ -30,6 +30,7 @@ public class CompressionFilter extends OncePerRequestFilter { filterList.add("/MaimaiServlet"); filterList.add("/Maimai2Servlet"); filterList.add("/ChusanServlet"); + filterList.add("/CardMakerServlet"); } @Override diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/controller/Maimai2ServletController.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/controller/Maimai2ServletController.java index 0c613138..97ea786b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/controller/Maimai2ServletController.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/controller/Maimai2ServletController.java @@ -288,5 +288,10 @@ public class Maimai2ServletController { public String getUserFriendSeasonRankingHandler(@ModelAttribute Map request) throws JsonProcessingException { return getUserFriendSeasonRankingHandler.handle(request); } + + @PostMapping("Ping") + String ping(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\"}"; + } } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/controller/OngekiController.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/controller/OngekiController.java index a027336b..5d5d0d55 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/controller/OngekiController.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/controller/OngekiController.java @@ -395,4 +395,9 @@ public class OngekiController { return upsertUserAllHandler.handle(request); } + @PostMapping("Ping") + String ping(@ModelAttribute Map request) { + return "{\"returnCode\":\"1\"}"; + } + } diff --git a/src/main/resources/db/migration/mysql/V111__add_cardmaker_chusan_table.sql b/src/main/resources/db/migration/mysql/V111__add_cardmaker_chusan_table.sql new file mode 100644 index 00000000..d3be4187 --- /dev/null +++ b/src/main/resources/db/migration/mysql/V111__add_cardmaker_chusan_table.sql @@ -0,0 +1,50 @@ +CREATE TABLE chusan_game_gacha ( + id BIGINT auto_increment PRIMARY KEY, + gacha_id INTEGER NOT NULL, + gacha_name VARCHAR(255), + `type` INTEGER, + kind INTEGER, + is_ceiling BOOLEAN, + ceiling_cnt INTEGER, + change_rate_cnt1 INTEGER, + change_rate_cnt2 INTEGER, + start_date DATETIME, + end_date DATETIME, + notice_start_date DATETIME, + notice_end_date DATETIME +); + +CREATE TABLE chusan_game_gacha_card ( + id BIGINT auto_increment PRIMARY KEY, + gacha_id INTEGER NOT NULL, + card_id INTEGER NOT NULL, + rarity INTEGER, + weight INTEGER, + is_pickup BOOLEAN +); + +CREATE TABLE chusan_user_gacha ( + id BIGINT auto_increment PRIMARY KEY, + gacha_id INTEGER, + total_gacha_cnt INTEGER, + ceiling_gacha_cnt INTEGER, + daily_gacha_cnt INTEGER, + five_gacha_cnt INTEGER, + eleven_gacha_cnt INTEGER, + daily_gacha_date DATETIME, + user_id BIGINT, + constraint FKKgEwDqNazYzQYXQ6aM + foreign key (user_id) references chusan_user_data (id) +); + +CREATE TABLE chusan_user_print_state ( + id BIGINT auto_increment PRIMARY KEY, + has_completed BOOLEAN, + limit_date DATETIME, + place_id INTEGER, + card_id INTEGER, + gacha_id INTEGER, + user_id BIGINT, + constraint FKYWeiCGeXh6fYTym8KY + foreign key (user_id) references chusan_user_data (id) +); diff --git a/src/main/resources/db/migration/mysql/V112__add_cardmaker_chusan_data.sql b/src/main/resources/db/migration/mysql/V112__add_cardmaker_chusan_data.sql new file mode 100644 index 00000000..04938fc8 --- /dev/null +++ b/src/main/resources/db/migration/mysql/V112__add_cardmaker_chusan_data.sql @@ -0,0 +1,185 @@ +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (370, 'お風呂上がりの一発でわからせる!', 0, 0, b'0', 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (380, '優しいキャロルが流れる頃には', 0, 0, b'0', 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (390, '音闘気鍛練の行', 0, 0, b'0', 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (400, '最後の物語。約束はあなたと共に', 0, 0, b'0', 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (410, '可愛さ指数は3000倍!?', 0, 0, b'0', 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1323002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 905002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 894002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 646002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 40002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 25002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 6002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 11002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 231002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 237002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 239002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 325002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 336002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 442002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 449002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 338002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 635002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 637002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 642002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 761002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 763002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 768002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 774002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 868002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 885002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1011002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1015002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1024002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1030002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 874002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 657002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 995002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 996002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 777002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 538002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1324002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1160002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 895002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 647002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 45002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 24002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 36002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 39002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 20002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 189002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 198002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 232002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 237002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 316002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 327002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 434002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 441002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 445002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 621002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 628002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 630002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 639002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 643002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 766002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 634002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 867002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 870002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 884002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 886002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1010002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1017002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1030002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 873002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 992002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 658002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 994002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1325002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1161002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 896002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 648002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 18002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 44002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 10002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 31002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 192002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 196002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 201002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 237002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 317002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 319002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 322002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 334002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 437002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 443002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 447002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 622002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 638002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 760002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 762002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 765002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 452002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 871002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 888002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1013002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1016002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1030002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1026002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 875002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 656002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 991002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 993002, 2, 2, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 539002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 1336002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 897002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 649002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 662002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 28002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 2002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 41002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 43002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 29002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 199002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 203002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 230002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 237002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 318002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 333002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 433002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 435002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 444002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 623002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 625002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 627002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 629002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 640002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 767002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 769002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 773002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 775002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 631002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 1030002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 50002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 244002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 343002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 207002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 661002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 655002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 863002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1337002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1162002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 898002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 650002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 35002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 4002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 37002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 7002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 47002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 12002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 187002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 197002, 2, 4, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 202002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 227002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 237002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 328002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 329002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 436002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 438002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 624002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 626002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 636002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 641002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 644002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 764002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 770002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 772002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 632002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 633002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1030002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 341002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 660002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 659002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 345002, 2, 3, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 777002, 2, 1, b'0'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 862002, 2, 1, b'0'); diff --git a/src/main/resources/db/migration/sqlite/V111__add_cardmaker_chusan_table.sql b/src/main/resources/db/migration/sqlite/V111__add_cardmaker_chusan_table.sql new file mode 100644 index 00000000..855f53a0 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V111__add_cardmaker_chusan_table.sql @@ -0,0 +1,58 @@ +CREATE TABLE chusan_game_gacha ( + id INTEGER NOT NULL, + gacha_id INTEGER NOT NULL, + gacha_name VARCHAR, + type INTEGER, + kind INTEGER, + is_ceiling BOOLEAN, + ceiling_cnt INTEGER, + change_rate_cnt1 INTEGER, + change_rate_cnt2 INTEGER, + start_date DATETIME, + end_date DATETIME, + notice_start_date DATETIME, + notice_end_date DATETIME, + PRIMARY KEY ( + id + ) +); + +CREATE TABLE chusan_game_gacha_card ( + id INTEGER, + gacha_id INTEGER NOT NULL, + card_id INTEGER NOT NULL, + rarity INTEGER, + weight INTEGER, + is_pickup BOOLEAN, + PRIMARY KEY ( + id + ) +); + +CREATE TABLE chusan_user_gacha ( + id INTEGER, + gacha_id INTEGER, + total_gacha_cnt INTEGER, + ceiling_gacha_cnt INTEGER, + daily_gacha_cnt INTEGER, + five_gacha_cnt INTEGER, + eleven_gacha_cnt INTEGER, + daily_gacha_date DATETIME, + user_id BIGINT REFERENCES chusan_user_data (id), + PRIMARY KEY ( + id + ) +); + +CREATE TABLE chusan_user_print_state ( + id INTEGER, + has_completed BOOLEAN, + limit_date DATETIME, + place_id INTEGER, + card_id INTEGER, + gacha_id INTEGER, + user_id BIGINT REFERENCES chusan_user_data (id), + PRIMARY KEY ( + id + ) +); diff --git a/src/main/resources/db/migration/sqlite/V112__add_cardmaker_chusan_data.sql b/src/main/resources/db/migration/sqlite/V112__add_cardmaker_chusan_data.sql new file mode 100644 index 00000000..92474639 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V112__add_cardmaker_chusan_data.sql @@ -0,0 +1,185 @@ +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (370, 'お風呂上がりの一発でわからせる!', 0, 0, false, 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (380, '優しいキャロルが流れる頃には', 0, 0, false, 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (390, '音闘気鍛練の行', 0, 0, false, 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (400, '最後の物語。約束はあなたと共に', 0, 0, false, 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha` (`gacha_id`, `gacha_name`, `type`, `kind`, `is_ceiling`, `ceiling_cnt`, `change_rate_cnt1`, `change_rate_cnt2`, `start_date`, `end_date`, `notice_start_date`, `notice_end_date`) VALUES (410, '可愛さ指数は3000倍!?', 0, 0, false, 10, 0, 0, '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000', '2019-01-01 00:00:00.000000', '2029-01-01 00:00:00.000000'); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1323002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 905002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 894002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 646002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 40002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 25002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 6002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 11002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 231002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 237002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 239002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 325002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 336002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 442002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 449002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 338002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 635002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 637002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 642002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 761002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 763002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 768002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 774002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 868002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 885002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1011002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1015002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1024002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 1030002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 874002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 657002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 995002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 996002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 777002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (370, 538002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1324002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1160002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 895002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 647002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 45002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 24002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 36002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 39002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 20002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 189002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 198002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 232002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 237002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 316002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 327002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 434002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 441002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 445002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 621002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 628002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 630002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 639002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 643002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 766002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 634002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 867002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 870002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 884002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 886002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1010002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1017002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 1030002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 873002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 992002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 658002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (380, 994002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1325002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1161002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 896002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 648002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 18002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 44002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 10002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 31002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 192002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 196002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 201002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 237002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 317002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 319002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 322002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 334002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 437002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 443002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 447002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 622002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 638002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 760002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 762002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 765002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 452002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 871002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 888002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1013002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1016002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1030002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 1026002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 875002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 656002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 991002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 993002, 2, 2, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (390, 539002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 1336002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 897002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 649002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 662002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 28002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 2002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 41002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 43002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 29002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 199002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 203002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 230002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 237002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 318002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 333002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 433002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 435002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 444002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 623002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 625002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 627002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 629002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 640002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 767002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 769002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 773002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 775002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 631002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 1030002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 50002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 244002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 343002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 207002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 661002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 655002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (400, 863002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1337002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1162002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 898002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 650002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 35002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 4002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 37002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 7002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 47002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 12002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 187002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 197002, 2, 4, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 202002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 227002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 237002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 328002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 329002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 436002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 438002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 624002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 626002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 636002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 641002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 644002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 764002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 770002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 772002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 632002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 633002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 1030002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 341002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 660002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 659002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 345002, 2, 3, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 777002, 2, 1, False); +INSERT INTO `chusan_game_gacha_card` (`gacha_id`, `card_id`, `rarity`, `weight`, `is_pickup`) VALUES (410, 862002, 2, 1, False);