diff --git a/docs/dev/chusan_dev_notes.md b/docs/dev/chusan_dev_notes.md index 4ead6795..7fdfd978 100644 --- a/docs/dev/chusan_dev_notes.md +++ b/docs/dev/chusan_dev_notes.md @@ -30,5 +30,13 @@ - Can be disabled dynamically on GetGameSettingHandler - NAT hole punching, direct connection between cab to cab? - Session management required -- Fallback to CPU competitors if conditions met -- ReflectorUri, Related? \ No newline at end of file +- Fill player slots with CPU competitors if at least two player exist in a room +- ReflectorUri, Related? + +## User favorite kind types +| Kind | Name | Notes | +|------|-------------|----------------------------| +| 1 | Music | | +| 2 | Rival | Query ID to Rival Handlers | +| 3 | Character | | +| 4 | Unknown | | \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserFavoriteItemHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserFavoriteItemHandler.java index b77150b9..cd667239 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserFavoriteItemHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/impl/GetUserFavoriteItemHandler.java @@ -2,44 +2,86 @@ 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.UserFavorite; +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData; +import icu.samnyan.aqua.sega.chusan.service.UserGeneralDataService; import icu.samnyan.aqua.sega.util.jackson.StringMapper; + +import org.apache.commons.lang3.StringUtils; 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.LinkedList; import java.util.List; import java.util.Map; - -/** - * Handle GetUserFavoriteItem request - * @author yueou (yueou.xu@gmail.com) - */ +import java.util.Optional; @Component("ChusanGetUserFavoriteItemHandler") -public class GetUserFavoriteItemHandler implements BaseHandler { +public class GetUserFavoriteItemHandler implements BaseHandler { private static final Logger logger = LoggerFactory.getLogger(GetUserFavoriteItemHandler.class); private final StringMapper mapper; + private final UserGeneralDataService userGeneralDataService; + @Autowired - public GetUserFavoriteItemHandler(StringMapper mapper) { + public GetUserFavoriteItemHandler(StringMapper mapper, UserGeneralDataService userGeneralDataService) { this.mapper = mapper; + this.userGeneralDataService = userGeneralDataService; } @Override public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - String kind = (String) request.get("kind"); + int kind = Integer.parseInt((String) request.get("kind")); + Long nextIndexVal = Long.parseLong((String) request.get("nextIndex")); + int maxCount = Integer.parseInt((String) request.get("maxCount")); // Fixed to 50? + List userFavorites = new LinkedList<>(); + Optional favOptional; + + switch (kind) { + case 1: // Music + favOptional = userGeneralDataService.getByUserIdAndKey(userId, "favorite_music"); + break; + + case 3: // Chara + favOptional = userGeneralDataService.getByUserIdAndKey(userId, "favorite_chara"); + break; + + default: + favOptional = Optional.empty(); + break; + } + + // Let's assume data is in following format: + // 1111,2222,3333,4444 ... + if(favOptional.isPresent()) { + String val = favOptional.get().getPropertyValue(); + if(StringUtils.isNotBlank(val) && val.contains(",")) { + String[] records = val.split(","); + for (String record : records) { + userFavorites.add(new UserFavorite(Integer.parseInt(record))); + } + } + } + + // While client seems capable to handle more than 50 items, let's limit it to 50 + // Reasons: 1. VARCHAR is limited to 255 chars (theoretically <= 51 entries), 2. Multiple pagination is troublesome + if (userFavorites.size() > 50) { + userFavorites = userFavorites.subList(0, 50); + } + Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - resultMap.put("length", 0); resultMap.put("kind", kind); + resultMap.put("length", userFavorites.size()); resultMap.put("nextIndex", -1); - resultMap.put("userFavoriteItemList", List.of()); + resultMap.put("userFavoriteItemList", userFavorites); String json = mapper.write(resultMap); logger.info("Response: " + json); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserFavorite.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserFavorite.java new file mode 100644 index 00000000..596286d7 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/response/data/UserFavorite.java @@ -0,0 +1,17 @@ +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 UserFavorite { + + private int id; + +}