diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java deleted file mode 100644 index cbd2df28..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java +++ /dev/null @@ -1,117 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.chusan.ChusanProps; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.chusan.model.gamedata.GameLoginBonus; -import icu.samnyan.aqua.sega.chusan.model.gamedata.GameLoginBonusPreset; -import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus; -import icu.samnyan.aqua.sega.chusan.service.*; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.ZoneOffset; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanGameLoginHandler") -public class GameLoginHandler implements BaseHandler { - private static final Logger logger = LoggerFactory.getLogger(GameLoginHandler.class); - private final ChusanProps props; - private final UserDataService userDataService; - private final UserItemService userItemService; - private final GameLoginBonusPresetService gameLoginBonusPresetService; - private final GameLoginBonusService gameLoginBonusService; - private final UserLoginBonusService userLoginBonusService; - - @Override - public String handle(Map request) throws JsonProcessingException { - String userId = (String) request.get("userId"); - Optional userDataOptional = userDataService.getUserByExtId(userId); - boolean userPresent = userDataOptional.isPresent(); - if (userPresent){ - userDataService.updateLoginTime(userDataOptional.get()); - if(props.getLoginBonusEnable()){ - List gameLoginBonusList = this.gameLoginBonusPresetService.getGameLoginBonusPresets(1); - - for (GameLoginBonusPreset preset: gameLoginBonusList) { - // check if a user already has some progress and if not, add the login bonus entry - Optional userLoginBonus = userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), preset.getId()); - if (userLoginBonus.isEmpty()){ - UserLoginBonus u = new UserLoginBonus(1, Integer.parseInt(userId), preset.getId()); - userLoginBonusService.saveUserLoginBonus(u); - userLoginBonus = userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), preset.getId()); - } - UserLoginBonus userLoginBonusResult = userLoginBonus.get(); - if (userLoginBonusResult.isFinished()){ - continue; - } - // last login is 24 hours+ ago - if (userLoginBonusResult.getLastUpdateDate().toEpochSecond(ZoneOffset.ofHours(0)) < (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0)))){ - int bonusCount = userLoginBonusResult.getBonusCount() + 1; - LocalDateTime lastUpdateDate = LocalDateTime.now(); - List allLoginBonus = gameLoginBonusService.getAllGameLoginBonus(preset.getId()); - if (allLoginBonus.size() == 0){ - logger.info("No bonus entry found for" + preset.getId()); - continue; - } - int maxNeededDays = allLoginBonus.get(0).getNeedLoginDayCount(); - - // if all items are redeemed, then don't show the login bonuses. - boolean isFinished = false; - if (bonusCount > maxNeededDays){ - if (preset.getId() < 3000){ - bonusCount = 1; - }else{ - isFinished = true; - } - } - Optional gameLoginBonus = this.gameLoginBonusService.getGameLoginBonusByDay(preset.getId(), bonusCount); - if(gameLoginBonus.isPresent()){ - GameLoginBonus gameLoginBonusResult = gameLoginBonus.get(); - Chu3UserData userData = this.userDataService.getUserByExtId(userId).orElseThrow(); - UserItem userItem = new UserItem(userData); - userItem.setItemId(gameLoginBonusResult.getPresentId()); - userItem.setItemKind(6); - userItem.setStock(gameLoginBonusResult.getItemNum()); - userItem.setValid(true); - this.userItemService.save(userItem); - } - Optional userLoginBonusOptional = this.userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), preset.getId()); - UserLoginBonus userLoginBonusSave; - if(userLoginBonusOptional.isPresent()){ - userLoginBonusSave = userLoginBonusOptional.get(); - userLoginBonusSave.setBonusCount(bonusCount); - userLoginBonusSave.setLastUpdateDate(lastUpdateDate); - userLoginBonusSave.setWatched(false); - userLoginBonusSave.setFinished(isFinished); - }else{ - userLoginBonusSave = new UserLoginBonus(); - userLoginBonusSave.setUser(Integer.parseInt(userId)); - userLoginBonusSave.setPresetId(preset.getId()); - userLoginBonusSave.setVersion(1); - userLoginBonusSave.setBonusCount(bonusCount); - userLoginBonusSave.setLastUpdateDate(lastUpdateDate); - userLoginBonusSave.setWatched(false); - userLoginBonusSave.setFinished(isFinished); - } - - this.userLoginBonusService.saveUserLoginBonus(userLoginBonusSave); - } - } - } - } - - return "{\"returnCode\":\"1\"}"; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt new file mode 100644 index 00000000..d3c10065 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.kt @@ -0,0 +1,81 @@ +package icu.samnyan.aqua.sega.chusan.handler + +import ext.int +import ext.invoke +import ext.long +import icu.samnyan.aqua.sega.chusan.ChusanProps +import icu.samnyan.aqua.sega.chusan.model.Chu3Repos +import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem +import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus +import icu.samnyan.aqua.sega.general.BaseHandler +import lombok.AllArgsConstructor +import org.springframework.stereotype.Component +import java.time.LocalDateTime +import java.time.ZoneOffset + +/** + * @author samnyan (privateamusement@protonmail.com) + */ +@AllArgsConstructor +@Component("ChusanGameLoginHandler") +class GameLoginHandler( + val props: ChusanProps, + val db: Chu3Repos +) : BaseHandler { + + override fun handle(request: Map): Any? { + val uid = request["userId"]!!.long + fun process() { + val u = db.userData.findByCard_ExtId(uid)() ?: return + db.userData.save(u.apply { lastLoginDate = LocalDateTime.now() }) + + if (!props.loginBonusEnable) return + val bonusList = db.gameLoginBonusPresets.findLoginBonusPresets(1, 1) + + bonusList.forEach { preset -> + // Check if a user already has some progress and if not, add the login bonus entry + val bonus = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() + ?: UserLoginBonus(1, uid.int, preset.id).let { db.userLoginBonus.save(it) } + if (bonus.isFinished) return@forEach + + // last login is 24 hours+ ago + if (bonus.lastUpdateDate.toEpochSecond(ZoneOffset.ofHours(0)) < + (LocalDateTime.now().minusHours(24).toEpochSecond(ZoneOffset.ofHours(0))) + ) { + var bCount = bonus.bonusCount + 1 + val lastUpdate = LocalDateTime.now() + val allLoginBonus = db.gameLoginBonus.findGameLoginBonus(1, preset.id) + .ifEmpty { return@forEach } + val maxNeededDays = allLoginBonus[0].needLoginDayCount + + // if all items are redeemed, then don't show the login bonuses. + var finished = false + if (bCount > maxNeededDays) { + if (preset.id < 3000) bCount = 1 + else finished = true + } + db.gameLoginBonus.findByRequiredDays(1, preset.id, bCount)()?.let { + db.userItem.save(UserItem(u).apply { + itemId = it.presentId + itemKind = 6 + stock = it.itemNum + isValid = true + }) + } + val toSave = db.userLoginBonus.findLoginBonus(uid.int, 1, preset.id)() + ?: UserLoginBonus().apply { user = uid.int; presetId = preset.id; version = 1 } + + db.userLoginBonus.save(toSave.apply { + bonusCount = bCount + lastUpdateDate = lastUpdate + isWatched = false + isFinished = finished + }) + } + } + } + process() + + return """{"returnCode":"1"}""" + } +}