[O] Rewrite CM chusan apis

pull/99/head^2
Azalea 2025-01-04 19:49:36 -05:00
parent f290e6e576
commit 8203a70b60
10 changed files with 104 additions and 351 deletions

View File

@ -4,7 +4,9 @@ import ext.*
import icu.samnyan.aqua.net.db.AquaUserServices
import icu.samnyan.aqua.net.utils.simpleDescribe
import icu.samnyan.aqua.sega.allnet.TokenChecker
import icu.samnyan.aqua.sega.chusan.handler.*
import icu.samnyan.aqua.sega.chusan.handler.GameLoginHandler
import icu.samnyan.aqua.sega.chusan.handler.UpsertUserAllHandler
import icu.samnyan.aqua.sega.chusan.handler.chusanInit
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.general.*
import icu.samnyan.aqua.sega.util.jackson.BasicMapper
@ -25,9 +27,6 @@ import kotlin.reflect.full.declaredMemberProperties
class ChusanController(
val gameLogin: GameLoginHandler,
val upsertUserAll: UpsertUserAllHandler,
val cmUpsertUserGacha: CMUpsertUserGachaHandler,
val cmUpsertUserPrintSubtract: CMUpsertUserPrintSubtractHandler,
val cmUpsertUserPrintCancel: CMUpsertUserPrintCancelHandler,
val mapper: StringMapper,
val cmMapper: BasicMapper,
@ -42,8 +41,7 @@ class ChusanController(
val log = LoggerFactory.getLogger(ChusanController::class.java)
// Below are code related to handling the handlers
val externalHandlers = mutableListOf("GameLoginApi", "UpsertUserAllApi",
"CMUpsertUserGachaApi", "CMUpsertUserPrintCancelApi", "CMUpsertUserPrintSubtractApi")
val externalHandlers = mutableListOf("GameLoginApi", "UpsertUserAllApi")
val noopEndpoint = setOf("UpsertClientBookkeepingApi", "UpsertClientDevelopApi", "UpsertClientErrorApi",
"UpsertClientSettingApi", "UpsertClientTestmodeApi", "CreateTokenApi", "RemoveTokenApi", "UpsertClientUploadApi",

View File

@ -1,101 +0,0 @@
package icu.samnyan.aqua.sega.chusan.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserGachaRepo;
import icu.samnyan.aqua.sega.general.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.Chu3UserData;
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 lombok.AllArgsConstructor;
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.*;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@AllArgsConstructor
@Component("ChusanCMUpsertUserGachaHandler")
public class CMUpsertUserGachaHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserGachaHandler.class);
private final Chu3UserCardPrintStateRepo userCardPrintStateRepository;
private final Chu3UserGachaRepo userGachaRepository;
private final UserDataService userDataService;
private final UserItemService userItemService;
private final BasicMapper mapper;
@Override
public Object handle(Map<String, ?> 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<UserCardPrintState> userCardPrintStateList = new ArrayList<>();
Chu3UserData userData;
Optional<Chu3UserData> 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<UserItem> userItemListToSave = new ArrayList<>();
List<UserItem> userItemList = upsertUserGacha.getUserItemList();
userItemList.forEach(newUserItem -> {
int itemId = newUserItem.getItemId();
int itemKind = newUserItem.getItemKind();
Optional<UserItem> userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind);
UserItem userItem = userItemOptional.orElseGet(() -> new UserItem());
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<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("returnCode", 1);
resultMap.put("apiName", "CMUpsertUserGachaApi");
resultMap.put("userCardPrintStateList", userCardPrintStateList);
return resultMap;
}
}

View File

@ -1,57 +0,0 @@
package icu.samnyan.aqua.sega.chusan.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo;
import icu.samnyan.aqua.sega.general.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 Chu3UserCardPrintStateRepo userCardPrintStateRepository;
private final BasicMapper mapper;
@Autowired
public CMUpsertUserPrintCancelHandler(Chu3UserCardPrintStateRepo userCardPrintStateRepository, BasicMapper mapper) {
this.userCardPrintStateRepository = userCardPrintStateRepository;
this.mapper = mapper;
}
@Override
public String handle(Map<String, ?> request) throws JsonProcessingException {
String userId = String.valueOf(request.get("userId"));
List<Integer> orderIdList = mapper.convert(request.get("orderIdList"), new TypeReference<List<Integer>>() {});
for (Integer orderId : orderIdList) {
Optional<UserCardPrintState> userCardPrintStateOptional = userCardPrintStateRepository.findById(orderId.longValue());
if (userCardPrintStateOptional.isPresent()) {
UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get();
newUserCardPrintState.setHasCompleted(true);
userCardPrintStateRepository.save(newUserCardPrintState);
}
}
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("returnCode", 1);
resultMap.put("apiName", "CMUpsertUserPrintCancelApi");
String json = mapper.write(resultMap);
logger.info("Response: " + json);
return json;
}
}

View File

@ -1,81 +0,0 @@
package icu.samnyan.aqua.sega.chusan.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo;
import icu.samnyan.aqua.sega.general.BaseHandler;
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState;
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData;
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 lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@AllArgsConstructor
@Component("ChusanCMUpsertUserPrintSubtractHandler")
public class CMUpsertUserPrintSubtractHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(CMUpsertUserPrintSubtractHandler.class);
private final Chu3UserCardPrintStateRepo userCardPrintStateRepository;
private final UserItemService userItemService;
private final UserDataService userDataService;
private final BasicMapper mapper;
@Override
public String handle(Map<String, ?> request) throws JsonProcessingException {
String userId = String.valueOf(request.get("userId"));
UserCardPrintState userCardPrintState = mapper.convert(request.get("userCardPrintState"), UserCardPrintState.class);
List<UserItem> userItemList = mapper.convert(request.get("userItemList"), new TypeReference<List<UserItem>>() {});
Chu3UserData userData;
Optional<Chu3UserData> userOptional = userDataService.getUserByExtId(userId);
if (userOptional.isPresent()) {
userData = userOptional.get();
} else {
logger.error("User not found. userId: {}", userId);
return null;
}
List<UserItem> userItemListToSave = new ArrayList<>();
userItemList.forEach(newUserItem -> {
int itemId = newUserItem.getItemId();
int itemKind = newUserItem.getItemKind();
Optional<UserItem> userItemOptional = userItemService.getByUserAndItemIdAndKind(userData, itemId, itemKind);
UserItem userItem = userItemOptional.orElseGet(() -> new UserItem());
newUserItem.setId(userItem.getId());
newUserItem.setUser(userItem.getUser());
userItemListToSave.add(newUserItem);
});
userItemService.saveAll(userItemListToSave);
Optional<UserCardPrintState> userCardPrintStateOptional = userCardPrintStateRepository.findById(userCardPrintState.getId());
if (userCardPrintStateOptional.isPresent()) {
UserCardPrintState newUserCardPrintState = userCardPrintStateOptional.get();
newUserCardPrintState.setHasCompleted(true);
userCardPrintStateRepository.save(newUserCardPrintState);
}
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("returnCode", 1);
resultMap.put("apiName", "CMUpsertUserPrintSubtractApi");
String json = mapper.write(resultMap);
logger.info("Response: " + json);
return json;
}
}

View File

@ -1,7 +1,9 @@
package icu.samnyan.aqua.sega.chusan
package icu.samnyan.aqua.sega.chusan.handler
import ext.*
import icu.samnyan.aqua.sega.allnet.TokenChecker
import icu.samnyan.aqua.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.ChusanData
import icu.samnyan.aqua.sega.chusan.model.request.UserCMissionResp
import icu.samnyan.aqua.sega.chusan.model.request.UserEmoney
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge
@ -13,6 +15,7 @@ import java.time.format.DateTimeFormatter
@Suppress("UNCHECKED_CAST")
fun ChusanController.chusanInit() {
matchingApiInit()
cmApiInit()
// Stub handlers
"GetGameRanking" { """{"type":"${data["type"]}","length":"0","gameRankingList":[]}""" }

View File

@ -0,0 +1,86 @@
package icu.samnyan.aqua.sega.chusan.handler
import com.fasterxml.jackson.core.type.TypeReference
import ext.int
import ext.invoke
import ext.mapApply
import ext.parsing
import icu.samnyan.aqua.sega.chusan.ChusanController
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.UserItem
import java.time.LocalDateTime
fun ChusanController.cmApiInit() {
"CMUpsertUserGacha" api@ {
val (gachaId, placeId) = parsing { data["gachaId"]!!.int to data["placeId"]!!.int }
val u = db.userData.findByCard_ExtId(uid)() ?: return@api null
val upsertUserGacha = parsing { mapper.convert(data["cmUpsertUserGacha"], UpsertUserGacha::class.java) }
upsertUserGacha.gameGachaCardList?.let { lst ->
db.userCardPrintState.saveAll(lst.map {
UserCardPrintState(
hasCompleted = false,
limitDate = LocalDateTime.of(2029, 1, 1, 0, 0),
placeId = placeId,
cardId = it.cardId,
gachaId = gachaId
).apply { user = u }
})
}
upsertUserGacha.userItemList?.let {
db.userItem.saveAll(it.mapApply {
user = u
id = db.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0
})
}
upsertUserGacha.userGacha?.let {
it.user = u
db.userGacha.save(it)
}
mapOf(
"returnCode" to 1,
"apiName" to "CMUpsertUserGachaApi",
"userCardPrintStateList" to db.userCardPrintState.findByUserAndGachaIdAndHasCompleted(u, gachaId, false)
)
}
"CMUpsertUserPrintCancel" {
val orderIdList: List<Long> = cmMapper.convert(data["orderIdList"], object : TypeReference<List<Long>>() {})
db.userCardPrintState.saveAll(orderIdList.mapNotNull {
// TODO: The original code by Eori writes findById but I don't think that is correct...
db.userCardPrintState.findById(it)()?.apply {
hasCompleted = true
}
})
mapOf("returnCode" to 1, "apiName" to "CMUpsertUserPrintCancelApi")
}
"CMUpsertUserPrintSubtract" api@ {
val userCardPrintState = cmMapper.convert(data["userCardPrintState"], UserCardPrintState::class.java)
val userItemList = cmMapper.convert(data["userItemList"], object : TypeReference<List<UserItem>>() {})
val u = db.userData.findByCard_ExtId(uid)() ?: return@api null
db.userItem.saveAll(
userItemList.mapApply {
id = db.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0
user = u
}
)
// TODO: I also doubt this is correct... it shouldn't be ID
db.userCardPrintState.findById(userCardPrintState.id)()?.apply {
hasCompleted = true
db.userCardPrintState.save(this)
}
mapOf("returnCode" to 1, "apiName" to "CMUpsertUserPrintSubtractApi")
}
}

View File

@ -1,11 +1,12 @@
@file:Suppress("UNCHECKED_CAST")
package icu.samnyan.aqua.sega.chusan
package icu.samnyan.aqua.sega.chusan.handler
import ext.JDict
import ext.int
import ext.millis
import ext.parsing
import icu.samnyan.aqua.sega.chusan.ChusanController
import icu.samnyan.aqua.sega.chusan.model.request.MatchingWaitState
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3MatchingMemberReq
import kotlin.collections.MutableList

View File

@ -6,10 +6,11 @@ import java.time.LocalDateTime
@Entity(name = "ChusanUserCardPrintState")
@Table(name = "chusan_user_print_state")
class UserCardPrintState : Chu3UserEntity() {
var hasCompleted = false
var limitDate: LocalDateTime = LocalDateTime.now()
var placeId = 0
var cardId = 0
var gachaId = 0
}
class UserCardPrintState(
var hasCompleted: Boolean = false,
var limitDate: LocalDateTime = LocalDateTime.now(),
var placeId: Int = 0,
var cardId: Int = 0,
var gachaId: Int = 0
) : Chu3UserEntity()

View File

@ -1,37 +0,0 @@
package icu.samnyan.aqua.sega.chusan.service;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo;
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData;
import icu.samnyan.aqua.sega.general.model.Card;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Optional;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Service("ChusanUserDataService")
public class UserDataService {
private final Chu3UserDataRepo userDataRepository;
@Autowired
public UserDataService(Chu3UserDataRepo userDataRepository) {
this.userDataRepository = userDataRepository;
}
public Chu3UserData saveUserData(Chu3UserData userData) {
return userDataRepository.save(userData);
}
public Optional<Chu3UserData> getUserByExtId(String aimeId) {
return userDataRepository.findByCard_ExtId(Long.parseLong(aimeId));
}
public void updateLoginTime(Chu3UserData userData) {
userData.setLastLoginDate(LocalDateTime.now());
userDataRepository.save(userData);
}
}

View File

@ -1,60 +0,0 @@
package icu.samnyan.aqua.sega.chusan.service;
import icu.samnyan.aqua.sega.chusan.model.Chu3UserItemRepo;
import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData;
import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Service("ChusanUserItemService")
public class UserItemService {
private final Chu3UserItemRepo userItemRepository;
@Autowired
public UserItemService(Chu3UserItemRepo userItemRepository) {
this.userItemRepository = userItemRepository;
}
public UserItem save(UserItem userItem) {
return userItemRepository.save(userItem);
}
public List<UserItem> saveAll(Iterable<UserItem> userItem) {
return userItemRepository.saveAll(userItem);
}
public List<UserItem> getByUserId(String userId) {
List<UserItem> userItemList = userItemRepository.findByUser_Card_ExtId(Long.parseLong(userId));
userItemList.sort(Comparator.comparingInt(UserItem::getItemId));
return userItemList;
}
public Optional<UserItem> getByUserAndItemIdAndKind(Chu3UserData user, int itemId, int itemKind) {
return userItemRepository.findTopByUserAndItemIdAndItemKindOrderByIdDesc(user, itemId, itemKind);
}
public Page<UserItem> getByUserAndItemKind(String userId, int kind, int pageNumber, int maxCount) {
Pageable page = PageRequest.of(pageNumber, maxCount);
return userItemRepository.findAllByUser_Card_ExtIdAndItemKind(Long.parseLong(userId), kind, page);
}
public List<UserItem> getByUserAndItemKind(String userId, int kind) {
List<UserItem> userItemList = userItemRepository.findAllByUser_Card_ExtIdAndItemKind(Long.parseLong(userId), kind);
userItemList.sort(Comparator.comparingInt(UserItem::getItemId));
return userItemList;
}
public Page<UserItem> getByUserId(String userId, int page, int size) {
return userItemRepository.findByUser_Card_ExtId(Long.parseLong(userId), PageRequest.of(page, size));
}
}