From 8d48ab0d3f8e2b2b969468eb80ef305a905434aa Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 25 Oct 2025 07:29:09 +0800 Subject: [PATCH] [O] DIVA utils > kt --- src/main/java/ext/Ext.kt | 2 + .../aqua/sega/diva/handler/BaseHandler.kt | 5 +- .../diva/handler/card/ChangeNameHandler.kt | 4 +- .../diva/handler/card/ChangePasswdHandler.kt | 4 +- .../diva/handler/ingame/BuyCstmzItmHandler.kt | 4 +- .../diva/handler/ingame/BuyModuleHandler.kt | 4 +- .../diva/handler/ingame/ShopExitHandler.kt | 16 ++--- .../diva/handler/ingame/StageResultHandler.kt | 4 +- .../diva/handler/ingame/StageStartHandler.kt | 4 +- .../diva/handler/ingame/StoreSsHandler.kt | 8 +-- .../aqua/sega/diva/handler/user/EndHandler.kt | 4 +- .../sega/diva/handler/user/PdUnlockHandler.kt | 4 +- .../diva/handler/user/SpendCreditHandler.kt | 2 +- .../sega/diva/handler/user/StartHandler.kt | 3 + .../aqua/sega/diva/util/DivaCalculator.java | 37 ------------ .../diva/util/DivaDateTimeSerializer.java | 27 --------- .../aqua/sega/diva/util/DivaDateTimeUtil.java | 18 ------ .../aqua/sega/diva/util/DivaMapper.java | 59 ------------------- .../samnyan/aqua/sega/diva/util/DivaMapper.kt | 38 ++++++++++++ .../aqua/sega/diva/util/DivaStringUtils.java | 24 -------- .../samnyan/aqua/sega/diva/util/DivaUtils.kt | 55 +++++++++++++++++ .../aqua/sega/diva/{ => util}/Exceptions.kt | 2 +- .../samnyan/aqua/sega/diva/util/URIEncoder.kt | 12 ---- 23 files changed, 131 insertions(+), 209 deletions(-) delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaCalculator.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeSerializer.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeUtil.java delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaStringUtils.java create mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/DivaUtils.kt rename src/main/java/icu/samnyan/aqua/sega/diva/{ => util}/Exceptions.kt (81%) delete mode 100644 src/main/java/icu/samnyan/aqua/sega/diva/util/URIEncoder.kt diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index bdd29ba6..12a1ff73 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -212,6 +212,8 @@ val Map.mut get() = toMutableMap() val Set.mut get() = toMutableSet() fun List.unique(fn: (T) -> Any) = distinctBy(fn).ifEmpty { null } +val Collection.csv get() = joinToString(",") +val IntArray.csv get() = joinToString(",") // Optionals operator fun Optional.invoke(): T? = orElse(null) diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/BaseHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/BaseHandler.kt index 35cd3ecb..0ff9cbab 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/BaseHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/BaseHandler.kt @@ -1,9 +1,10 @@ package icu.samnyan.aqua.sega.diva.handler +import ext.JDict import icu.samnyan.aqua.sega.diva.util.DivaMapper import org.springframework.stereotype.Component -fun buildResultMap(map: MutableMap) = +fun buildResultMap(map: JDict) = map.filterValues { it != null && !(it is String && it == "") } .map { (k, v) -> "$k=$v" }.joinToString("&") @@ -15,5 +16,5 @@ class BaseHandler { @JvmField final var mapper = DivaMapper() - fun build(map: MutableMap) = buildResultMap(map) + fun build(map: JDict) = buildResultMap(map) } diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangeNameHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangeNameHandler.kt index 907a9794..7a7b4d4d 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangeNameHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangeNameHandler.kt @@ -2,8 +2,8 @@ package icu.samnyan.aqua.sega.diva.handler.card import ext.invoke import icu.samnyan.aqua.sega.diva.DivaRepos -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.model.common.Result import icu.samnyan.aqua.sega.diva.model.request.card.ChangeNameRequest import icu.samnyan.aqua.sega.diva.model.response.card.ChangeNameResponse diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangePasswdHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangePasswdHandler.kt index 72d0ccc0..2db90813 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangePasswdHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/card/ChangePasswdHandler.kt @@ -1,8 +1,8 @@ package icu.samnyan.aqua.sega.diva.handler.card import icu.samnyan.aqua.sega.diva.DivaRepos -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.model.common.PassStat import icu.samnyan.aqua.sega.diva.model.common.Result import icu.samnyan.aqua.sega.diva.model.request.card.ChangePasswdRequest diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyCstmzItmHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyCstmzItmHandler.kt index 04eca8d2..bf9716df 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyCstmzItmHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyCstmzItmHandler.kt @@ -2,8 +2,8 @@ package icu.samnyan.aqua.sega.diva.handler.ingame import icu.samnyan.aqua.sega.diva.DivaCustomizeRepository import icu.samnyan.aqua.sega.diva.GameSessionRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.common.Result import icu.samnyan.aqua.sega.diva.model.request.ingame.BuyCstmzItmRequest diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyModuleHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyModuleHandler.kt index e8269404..db788088 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyModuleHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/BuyModuleHandler.kt @@ -2,8 +2,8 @@ package icu.samnyan.aqua.sega.diva.handler.ingame import icu.samnyan.aqua.sega.diva.DivaModuleRepository import icu.samnyan.aqua.sega.diva.GameSessionRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.common.Result import icu.samnyan.aqua.sega.diva.model.request.ingame.BuyModuleRequest diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/ShopExitHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/ShopExitHandler.kt index 3631707d..1332435f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/ShopExitHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/ShopExitHandler.kt @@ -1,14 +1,14 @@ package icu.samnyan.aqua.sega.diva.handler.ingame +import ext.csv import icu.samnyan.aqua.sega.diva.PlayerPvCustomizeRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.common.Result import icu.samnyan.aqua.sega.diva.model.request.ingame.ShopExitRequest import icu.samnyan.aqua.sega.diva.model.response.ingame.ShopExitResponse import icu.samnyan.aqua.sega.diva.model.userdata.PlayerPvCustomize import icu.samnyan.aqua.sega.diva.service.PlayerProfileService -import icu.samnyan.aqua.sega.diva.util.DivaStringUtils import org.springframework.stereotype.Component import java.util.function.Supplier @@ -27,18 +27,18 @@ class ShopExitHandler( .orElseGet(Supplier { PlayerPvCustomize(profile, request.ply_pv_id) }) if (request.use_pv_mdl_eqp == 1) { - customize.module = DivaStringUtils.arrToCsv(request.mdl_eqp_pv_ary) - customize.customize = DivaStringUtils.arrToCsv(request.c_itm_eqp_pv_ary) - customize.customizeFlag = DivaStringUtils.arrToCsv(request.ms_itm_flg_pv_ary) + customize.module = request.mdl_eqp_pv_ary.csv + customize.customize = request.c_itm_eqp_pv_ary.csv + customize.customizeFlag = request.ms_itm_flg_pv_ary.csv } else { customize.module = "-1,-1,-1" customize.customize = "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" customize.customizeFlag = "1,1,1,1,1,1,1,1,1,1,1,1" } - profile.commonModule = DivaStringUtils.arrToCsv(request.mdl_eqp_cmn_ary) - profile.commonCustomizeItems = DivaStringUtils.arrToCsv(request.c_itm_eqp_cmn_ary) - profile.moduleSelectItemFlag = DivaStringUtils.arrToCsv(request.ms_itm_flg_cmn_ary) + profile.commonModule = request.mdl_eqp_cmn_ary.csv + profile.commonCustomizeItems = request.c_itm_eqp_cmn_ary.csv + profile.moduleSelectItemFlag = request.ms_itm_flg_cmn_ary.csv playerProfileService.save(profile) pvCustomizeRepository.save(customize) diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageResultHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageResultHandler.kt index 5b70fef1..29253ec1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageResultHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageResultHandler.kt @@ -8,8 +8,8 @@ import icu.samnyan.aqua.sega.diva.PlayerContestRepository import icu.samnyan.aqua.sega.diva.PlayerCustomizeRepository import icu.samnyan.aqua.sega.diva.PlayerInventoryRepository import icu.samnyan.aqua.sega.diva.PlayerPvRecordRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.common.* import icu.samnyan.aqua.sega.diva.model.request.ingame.StageResultRequest diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageStartHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageStartHandler.kt index e8dc7ad0..44054c1c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageStartHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StageStartHandler.kt @@ -1,8 +1,8 @@ package icu.samnyan.aqua.sega.diva.handler.ingame import icu.samnyan.aqua.sega.diva.GameSessionRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.request.ingame.StageStartRequest import icu.samnyan.aqua.sega.diva.model.response.BaseResponse diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StoreSsHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StoreSsHandler.kt index 30ded6ac..cebbd06a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StoreSsHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/ingame/StoreSsHandler.kt @@ -1,14 +1,14 @@ package icu.samnyan.aqua.sega.diva.handler.ingame +import ext.csv import ext.logger import icu.samnyan.aqua.sega.diva.PlayerScreenShotRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.request.ingame.StoreSsRequest import icu.samnyan.aqua.sega.diva.model.response.BaseResponse import icu.samnyan.aqua.sega.diva.model.userdata.PlayerScreenShot import icu.samnyan.aqua.sega.diva.service.PlayerProfileService -import icu.samnyan.aqua.sega.diva.util.DivaStringUtils import org.springframework.stereotype.Component import org.springframework.web.multipart.MultipartFile import java.io.IOException @@ -41,8 +41,8 @@ class StoreSsHandler( profile, filename, request.pd_id, - DivaStringUtils.arrToCsv(request.ss_mdl_id), - DivaStringUtils.arrToCsv(request.ss_c_itm_id) + request.ss_mdl_id.csv, + request.ss_c_itm_id.csv ) screenShotRepository.save(ss) diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/EndHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/EndHandler.kt index 2efb9060..d3dba350 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/EndHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/EndHandler.kt @@ -3,8 +3,8 @@ package icu.samnyan.aqua.sega.diva.handler.user import icu.samnyan.aqua.sega.diva.ContestRepository import icu.samnyan.aqua.sega.diva.GameSessionRepository import icu.samnyan.aqua.sega.diva.PlayerContestRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.common.ContestBorder import icu.samnyan.aqua.sega.diva.model.common.Difficulty diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/PdUnlockHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/PdUnlockHandler.kt index 8986b00f..ed358540 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/PdUnlockHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/PdUnlockHandler.kt @@ -1,8 +1,8 @@ package icu.samnyan.aqua.sega.diva.handler.user import icu.samnyan.aqua.sega.diva.GameSessionRepository -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException -import icu.samnyan.aqua.sega.diva.SessionNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.request.user.PdUnlockRequest import icu.samnyan.aqua.sega.diva.model.response.BaseResponse diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/SpendCreditHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/SpendCreditHandler.kt index c9cc7f61..a18a8592 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/SpendCreditHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/SpendCreditHandler.kt @@ -1,6 +1,6 @@ package icu.samnyan.aqua.sega.diva.handler.user -import icu.samnyan.aqua.sega.diva.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException import icu.samnyan.aqua.sega.diva.handler.BaseHandler import icu.samnyan.aqua.sega.diva.model.request.user.SpendCreditRequest import icu.samnyan.aqua.sega.diva.model.response.user.SpendCreditResponse diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/StartHandler.kt b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/StartHandler.kt index 8c9852f4..bb552fd5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/StartHandler.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/handler/user/StartHandler.kt @@ -14,6 +14,9 @@ import icu.samnyan.aqua.sega.diva.model.userdata.PlayerPvRecord import icu.samnyan.aqua.sega.diva.service.PlayerCustomizeService import icu.samnyan.aqua.sega.diva.service.PlayerModuleService import icu.samnyan.aqua.sega.diva.service.PlayerProfileService +import icu.samnyan.aqua.sega.diva.util.ProfileNotFoundException +import icu.samnyan.aqua.sega.diva.util.PvRecordDataException +import icu.samnyan.aqua.sega.diva.util.SessionNotFoundException import org.springframework.stereotype.Component import java.time.LocalDateTime import java.util.* diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaCalculator.java b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaCalculator.java deleted file mode 100644 index 77ed2c48..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaCalculator.java +++ /dev/null @@ -1,37 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util; - -import icu.samnyan.aqua.sega.diva.PlayerPvRecordRepository; -import icu.samnyan.aqua.sega.diva.model.common.Edition; -import icu.samnyan.aqua.sega.diva.model.common.LevelInfo; -import icu.samnyan.aqua.sega.diva.model.userdata.PlayerProfile; -import icu.samnyan.aqua.sega.diva.model.userdata.PlayerPvRecord; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component -public class DivaCalculator { - - private final PlayerPvRecordRepository playerPvRecordRepository; - - public DivaCalculator(PlayerPvRecordRepository playerPvRecordRepository) { - this.playerPvRecordRepository = playerPvRecordRepository; - } - - public LevelInfo getLevelInfo(PlayerProfile profile) { - List recordList = playerPvRecordRepository.findByPdIdAndEdition(profile, Edition.ORIGINAL); - int totalAttain = 0; - for (PlayerPvRecord record : - recordList) { - totalAttain += record.getMaxAttain(); - } - - int level = totalAttain / 13979; - int exp = Math.round((totalAttain % 13979) / 13979.0f * 100.0f); - - return new LevelInfo(level + 1, exp); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeSerializer.java b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeSerializer.java deleted file mode 100644 index a27d5dcf..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import java.io.IOException; -import java.time.LocalDateTime; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -public class DivaDateTimeSerializer extends StdSerializer { - - public DivaDateTimeSerializer() { - this(null); - } - - public DivaDateTimeSerializer(Class t) { - super(t); - } - - @Override - public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException { - gen.writeString(DivaDateTimeUtil.getString(value)); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeUtil.java b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeUtil.java deleted file mode 100644 index 1107bb44..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaDateTimeUtil.java +++ /dev/null @@ -1,18 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -public class DivaDateTimeUtil { - - public static String getString(LocalDateTime time) { - return URIEncoder.encode(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0").format(time)); - } - - public static String format(LocalDateTime time) { - return DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0").format(time); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.java b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.java deleted file mode 100644 index 755f5bf5..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.java +++ /dev/null @@ -1,59 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.json.JsonWriteFeature; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import icu.samnyan.aqua.sega.util.BooleanNumberDeserializer; -import icu.samnyan.aqua.sega.util.BooleanNumberSerializer; -import icu.samnyan.aqua.sega.util.ZonedDateTimeDeserializer; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component -public class DivaMapper { - private final ObjectMapper mapper; - - public DivaMapper() { - SimpleModule module = new SimpleModule(); - module.addSerializer(LocalDateTime.class, new DivaDateTimeSerializer()); - module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0"))); - module.addDeserializer(ZonedDateTime.class, new ZonedDateTimeDeserializer()); - module.addSerializer(Boolean.class, new BooleanNumberSerializer()); - module.addSerializer(boolean.class, new BooleanNumberSerializer()); - module.addDeserializer(Boolean.class, new BooleanNumberDeserializer()); - module.addDeserializer(boolean.class, new BooleanNumberDeserializer()); - - mapper = JsonMapper.builder().enable(JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS) - .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - .build(); - - mapper.registerModule(module); - } - - public String write(Object o) throws JsonProcessingException { - return mapper.writeValueAsString(o); - - } - - public T convert(Map map, Class toClass) { - return mapper.convertValue(map, toClass); - } - - public LinkedHashMap toMap(Object object) { - return mapper.convertValue(object, new TypeReference<>() { - }); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.kt b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.kt new file mode 100644 index 00000000..f4f5bec4 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaMapper.kt @@ -0,0 +1,38 @@ +package icu.samnyan.aqua.sega.diva.util + +import com.fasterxml.jackson.core.json.JsonWriteFeature +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.json.JsonMapper +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer +import ext.JDict +import icu.samnyan.aqua.sega.util.BooleanNumberDeserializer +import icu.samnyan.aqua.sega.util.BooleanNumberSerializer +import icu.samnyan.aqua.sega.util.ZonedDateTimeDeserializer +import org.springframework.stereotype.Component +import java.time.LocalDateTime +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter + +@Component +class DivaMapper { + private val mapper: ObjectMapper = JsonMapper.builder().enable(JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .build().apply { + registerModule(SimpleModule().apply { + addSerializer(LocalDateTime::class.java, DivaDateTimeSerializer()) + addDeserializer(LocalDateTime::class.java, LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0"))) + addDeserializer(ZonedDateTime::class.java, ZonedDateTimeDeserializer()) + addSerializer(Boolean::class.java, BooleanNumberSerializer()) + addSerializer(Boolean::class.javaPrimitiveType, BooleanNumberSerializer()) + addDeserializer(Boolean::class.java, BooleanNumberDeserializer()) + addDeserializer(Boolean::class.javaPrimitiveType, BooleanNumberDeserializer()) + }) + } + + fun write(o: Any) = mapper.writeValueAsString(o) + fun convert(map: JDict, toClass: Class) = mapper.convertValue(map, toClass) + fun toMap(obj: Any) = mapper.convertValue(obj, object : TypeReference>() {}) +} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaStringUtils.java b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaStringUtils.java deleted file mode 100644 index 0df6b01d..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaStringUtils.java +++ /dev/null @@ -1,24 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -public class DivaStringUtils { - - public static String arrToCsv(int[] arr) { - StringBuilder sb = new StringBuilder(); - for (int i : - arr) { - sb.append(i).append(","); - } - sb.deleteCharAt(sb.length() - 1); - return sb.toString(); - } - - public static String getDummyString(String content, int length) { - StringBuilder sb = new StringBuilder(); - sb.append((content + ",").repeat(length)); - sb.deleteCharAt(sb.length() - 1); - return sb.toString(); - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaUtils.kt b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaUtils.kt new file mode 100644 index 00000000..2cc1e94e --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/diva/util/DivaUtils.kt @@ -0,0 +1,55 @@ +package icu.samnyan.aqua.sega.diva.util + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.ser.std.StdSerializer +import icu.samnyan.aqua.sega.diva.PlayerPvRecordRepository +import icu.samnyan.aqua.sega.diva.model.common.Edition +import icu.samnyan.aqua.sega.diva.model.common.LevelInfo +import icu.samnyan.aqua.sega.diva.model.userdata.PlayerProfile +import org.springframework.stereotype.Component +import java.net.URLEncoder +import java.nio.charset.StandardCharsets +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import kotlin.math.roundToInt + +object DivaStringUtils { + @JvmStatic + fun getDummyString(content: String, length: Int) = "$content,".repeat(length).removeSuffix(",") +} + +object DivaDateTimeUtil { + @JvmStatic + fun getString(time: LocalDateTime) = + URIEncoder.encode(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0").format(time)) + @JvmStatic + fun format(time: LocalDateTime) = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.0").format(time) +} + +class DivaDateTimeSerializer(t: Class? = null) : StdSerializer(t) { + override fun serialize(value: LocalDateTime, gen: JsonGenerator, provider: SerializerProvider) { + gen.writeString(DivaDateTimeUtil.getString(value)) + } +} + +@Component +class DivaCalculator(private val playerPvRecordRepository: PlayerPvRecordRepository) { + fun getLevelInfo(profile: PlayerProfile): LevelInfo { + val recordList = playerPvRecordRepository.findByPdIdAndEdition(profile, Edition.ORIGINAL) + var totalAttain = 0 + for (record in recordList) { + totalAttain += record.maxAttain + } + + val level = totalAttain / 13979 + val exp = ((totalAttain % 13979) / 13979.0f * 100.0f).roundToInt() + + return LevelInfo(level + 1, exp) + } +} + +object URIEncoder { + @JvmStatic + fun encode(str: String) = URLEncoder.encode(str, StandardCharsets.UTF_8).replace("\\+".toRegex(), "%20") +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/Exceptions.kt b/src/main/java/icu/samnyan/aqua/sega/diva/util/Exceptions.kt similarity index 81% rename from src/main/java/icu/samnyan/aqua/sega/diva/Exceptions.kt rename to src/main/java/icu/samnyan/aqua/sega/diva/util/Exceptions.kt index 79b66b52..d4aaced6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/diva/Exceptions.kt +++ b/src/main/java/icu/samnyan/aqua/sega/diva/util/Exceptions.kt @@ -1,4 +1,4 @@ -package icu.samnyan.aqua.sega.diva +package icu.samnyan.aqua.sega.diva.util class PvRecordDataException(message: String?) : RuntimeException(message) class SessionNotFoundException : RuntimeException() diff --git a/src/main/java/icu/samnyan/aqua/sega/diva/util/URIEncoder.kt b/src/main/java/icu/samnyan/aqua/sega/diva/util/URIEncoder.kt deleted file mode 100644 index 66ee8684..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/diva/util/URIEncoder.kt +++ /dev/null @@ -1,12 +0,0 @@ -package icu.samnyan.aqua.sega.diva.util - -import java.net.URLEncoder -import java.nio.charset.StandardCharsets - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -object URIEncoder { - @JvmStatic - fun encode(str: String) = URLEncoder.encode(str, StandardCharsets.UTF_8).replace("\\+".toRegex(), "%20") -} \ No newline at end of file