[O] Rewrite login handler

This commit is contained in:
Azalea
2024-12-26 22:11:14 -05:00
parent 0f14326449
commit 4f6bd11a70
2 changed files with 81 additions and 117 deletions

View File

@@ -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<String, ?> request) throws JsonProcessingException {
String userId = (String) request.get("userId");
Optional<Chu3UserData> userDataOptional = userDataService.getUserByExtId(userId);
boolean userPresent = userDataOptional.isPresent();
if (userPresent){
userDataService.updateLoginTime(userDataOptional.get());
if(props.getLoginBonusEnable()){
List<GameLoginBonusPreset> 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> 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<GameLoginBonus> 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> 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<UserLoginBonus> 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\"}";
}
}

View File

@@ -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<String, Any>): 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"}"""
}
}