diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.java deleted file mode 100644 index 9c87e2e4..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package icu.samnyan.aqua.sega.maimai2.handler.impl; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.maimai2.model.Mai2UserItemRepo; -import icu.samnyan.aqua.sega.maimai2.handler.BaseHandler; -import icu.samnyan.aqua.sega.maimai2.model.userdata.UserItem; -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.data.domain.PageRequest; -import org.springframework.stereotype.Component; - -import java.util.LinkedHashMap; -import java.util.Map; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@Component("Maimai2GetUserItemHandler") -public class GetUserItemHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(GetUserItemHandler.class); - - private final BasicMapper mapper; - - private final Mai2UserItemRepo userItemRepository; - - public GetUserItemHandler(BasicMapper mapper, Mai2UserItemRepo userItemRepository) { - this.mapper = mapper; - this.userItemRepository = userItemRepository; - } - - @Override - public String handle(Map request) throws JsonProcessingException { - long userId = ((Number) request.get("userId")).longValue(); - 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 dbPage = userItemRepository.findByUser_Card_ExtIdAndItemKind(userId, kind, PageRequest.of(pageNum, maxCount)); - - long currentIndex = kind * mul + maxCount * pageNum + dbPage.getNumberOfElements(); - Map resultMap = new LinkedHashMap<>(); - resultMap.put("userId", userId); - resultMap.put("nextIndex", dbPage.getNumberOfElements() < maxCount ? 0 : currentIndex); - resultMap.put("itemKind", kind); - resultMap.put("userItemList", dbPage.getContent()); - - String json = mapper.write(resultMap); - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.kt new file mode 100644 index 00000000..a0d18993 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/GetUserItemHandler.kt @@ -0,0 +1,69 @@ +package icu.samnyan.aqua.sega.maimai2.handler.impl + +import ext.JSON +import icu.samnyan.aqua.net.games.Maimai2 +import icu.samnyan.aqua.sega.maimai2.handler.BaseHandler +import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos +import icu.samnyan.aqua.sega.maimai2.model.userdata.UserItem +import kotlinx.serialization.encodeToString +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import org.springframework.data.domain.PageRequest +import org.springframework.stereotype.Component + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@Component("Maimai2GetUserItemHandler") +class GetUserItemHandler( + val repos: Mai2Repos, + val maimai2: Maimai2 +) : BaseHandler { + val musicUnlock = (5..8).associateWith { kind -> + JSON.encodeToString(maimai2.musicMapping.mapKeys { UserItem().apply { + itemKind = kind + itemId = it.key + stock = 1 + } }) } + + override fun handle(request: Map): Any { + val userId = request["userId"] as Long + val nextIndexVal = request["nextIndex"] as Long + val maxCount = request["maxCount"] as Int + + val kind = (nextIndexVal / MULT).toInt() + val nextIndex = (nextIndexVal % MULT).toInt() + val pageNum = nextIndex / maxCount + + // All Music unlock TODO: Check user settings + if (kind in 5..8) { + logger.info("Response: ${maimai2.musicMapping.size} items - Music unlock") + return mapOf( + "userId" to userId, + "nextIndex" to 0, + "itemKind" to kind, + "userItemList" to musicUnlock.getValue(kind) + ) + } + + // + + val dbPage = repos.userItem.findByUser_Card_ExtIdAndItemKind(userId, kind, PageRequest.of(pageNum, maxCount)) + + val currentIndex = kind * MULT + maxCount * pageNum + dbPage.numberOfElements + val result = mapOf( + "userId" to userId, + "nextIndex" to if (dbPage.numberOfElements < maxCount) 0 else currentIndex, + "itemKind" to kind, + "userItemList" to dbPage.content + ) + + logger.info("Response: ${dbPage.numberOfElements} items") + return result + } + + companion object { + val logger: Logger = LoggerFactory.getLogger(GetUserItemHandler::class.java) + const val MULT = 10000000000L + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserItem.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserItem.java index 68966b96..d2fcd9d0 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserItem.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserItem.java @@ -39,4 +39,16 @@ public class UserItem implements Serializable { public UserItem(UserDetail user) { this.user = user; } + + public static final int KIND_NAMEPLATE = 1; + public static final int KIND_TITLE = 2; + public static final int KIND_ICON = 3; + public static final int KIND_MUSIC_UNLOCK = 5; + public static final int KIND_MUSIC_MASTER_UNLOCK = 6; + public static final int KIND_MUSIC_REMASTER_UNLOCK = 7; + public static final int KIND_MUSIC_STRONG_UNLOCK = 8; + public static final int KIND_CHARACTER = 9; + public static final int KIND_PARTNER = 10; + public static final int KIND_FRAME = 11; + public static final int KIND_TICKETS = 12; }