[chusan] Add login bonus feature

This commit is contained in:
Fleming Karlzett
2023-05-11 02:06:40 +00:00
committed by Dom Eori
parent 3f05b84c0f
commit b858d9a2cd
16 changed files with 536 additions and 6 deletions

View File

@@ -2,14 +2,26 @@ 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.gamedata.GameLoginBonus;
import icu.samnyan.aqua.sega.chusan.model.gamedata.GameLoginBonusPreset;
import icu.samnyan.aqua.sega.chusan.model.response.CodeResp;
import icu.samnyan.aqua.sega.chusan.model.userdata.UserData;
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.GameLoginBonusPresetService;
import icu.samnyan.aqua.sega.chusan.service.GameLoginBonusService;
import icu.samnyan.aqua.sega.chusan.service.UserDataService;
import icu.samnyan.aqua.sega.chusan.service.UserItemService;
import icu.samnyan.aqua.sega.chusan.service.UserLoginBonusService;
import icu.samnyan.aqua.sega.util.jackson.StringMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
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;
@@ -23,18 +35,112 @@ public class GameLoginHandler implements BaseHandler {
private final StringMapper mapper;
private boolean enableLoginBonus = false;
private final UserDataService userDataService;
public GameLoginHandler(StringMapper mapper, UserDataService userDataService) {
private final UserItemService userItemService;
private final GameLoginBonusPresetService gameLoginBonusPresetService;
private final GameLoginBonusService gameLoginBonusService;
private final UserLoginBonusService userLoginBonusService;
public GameLoginHandler(StringMapper mapper,
@Value("${game.chusan.loginbonus-enable:}") boolean enableLoginBonus,
UserDataService userDataService,
UserItemService userItemService,
GameLoginBonusPresetService gameLoginBonusPresetService,
GameLoginBonusService gameLoginBonusService,
UserLoginBonusService userLoginBonusService
) {
this.mapper = mapper;
this.enableLoginBonus = enableLoginBonus;
this.userDataService = userDataService;
this.userItemService = userItemService;
this.gameLoginBonusPresetService = gameLoginBonusPresetService;
this.gameLoginBonusService = gameLoginBonusService;
this.userLoginBonusService = userLoginBonusService;
}
@Override
public String handle(Map<String, Object> request) throws JsonProcessingException {
String userId = (String) request.get("userId");
Optional<UserData> userDataOptional = userDataService.getUserByExtId(userId);
userDataOptional.ifPresent(userDataService::updateLoginTime);
boolean userPresent = userDataOptional.isPresent();
if (userPresent){
userDataService.updateLoginTime(userDataOptional.get());
if(this.enableLoginBonus){
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();
UserData 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);
}
}
}
}
String json = mapper.write(new CodeResp(1));
logger.info("Response: " + json);

View File

@@ -2,15 +2,23 @@ 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.userdata.UserLoginBonus;
import icu.samnyan.aqua.sega.chusan.model.userdata.UserData;
import icu.samnyan.aqua.sega.chusan.service.UserDataService;
import icu.samnyan.aqua.sega.chusan.service.UserLoginBonusService;
import icu.samnyan.aqua.sega.util.jackson.StringMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
@Component("ChusanGetUserLoginBonusHandler")
public class GetUserLoginBonusHandler implements BaseHandler {
@@ -19,9 +27,21 @@ public class GetUserLoginBonusHandler implements BaseHandler {
private final StringMapper mapper;
private boolean enableLoginBonus = false;
private final UserDataService userDataService;
private final UserLoginBonusService userLoginBonusService;
@Autowired
public GetUserLoginBonusHandler(StringMapper mapper) {
public GetUserLoginBonusHandler(StringMapper mapper,
@Value("${game.chusan.loginbonus-enable:}") boolean enableLoginBonus,
UserDataService userDataService,
UserLoginBonusService userLoginBonusService) {
this.mapper = mapper;
this.enableLoginBonus = enableLoginBonus;
this.userLoginBonusService = userLoginBonusService;
this.userDataService = userDataService;
}
@Override
@@ -30,8 +50,23 @@ public class GetUserLoginBonusHandler implements BaseHandler {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("userId", userId);
resultMap.put("length", 0);
resultMap.put("userLoginBonusList", List.of());
if(!this.enableLoginBonus){
resultMap.put("length", 0);
resultMap.put("userLoginBonusList", List.of());
}else{
List<UserLoginBonus> userLoginBonusList = userLoginBonusService.getAllUserLoginBonus(Integer.parseInt(userId));
List<Map<String, String>> retList = new ArrayList<>();
resultMap.put("length", userLoginBonusList.size());
for (UserLoginBonus u: userLoginBonusList) {
Map<String, String> appendInfo = new HashMap<>();
appendInfo.put("presetId", String.valueOf(u.getPresetId()));
appendInfo.put("bonusCount", String.valueOf(u.getBonusCount()));
appendInfo.put("lastUpdateDate", u.getLastUpdateDate().toString());
appendInfo.put("isWatched", String.valueOf(u.isWatched()));
retList.add(appendInfo);
}
resultMap.put("userLoginBonusList", retList);
}
String json = mapper.write(resultMap);
logger.info("Response: " + json);

View File

@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.*;
/**
@@ -44,9 +45,24 @@ public class UpsertUserAllHandler implements BaseHandler {
private final UserCourseService userCourseService;
private final UserDuelService userDuelService;
private final UserGeneralDataService userGeneralDataService;
private final UserLoginBonusService userLoginBonusService;
@Autowired
public UpsertUserAllHandler(StringMapper mapper, CardService cardService, UserDataService userDataService, UserCharacterService userCharacterService, UserGameOptionService userGameOptionService, UserMapAreaService userMapService, UserItemService userItemService, UserMusicDetailService userMusicDetailService, UserActivityService userActivityService, UserPlaylogService userPlaylogService, UserChargeService userChargeService, UserCourseService userCourseService, UserDuelService userDuelService, UserGeneralDataService userGeneralDataService) {
public UpsertUserAllHandler(StringMapper mapper,
CardService cardService,
UserDataService userDataService,
UserCharacterService userCharacterService,
UserGameOptionService userGameOptionService,
UserMapAreaService userMapService,
UserItemService userItemService,
UserMusicDetailService userMusicDetailService,
UserActivityService userActivityService,
UserPlaylogService userPlaylogService,
UserChargeService userChargeService,
UserCourseService userCourseService,
UserDuelService userDuelService,
UserGeneralDataService userGeneralDataService,
UserLoginBonusService userLoginBonusService) {
this.mapper = mapper;
this.cardService = cardService;
this.userDataService = userDataService;
@@ -61,6 +77,7 @@ public class UpsertUserAllHandler implements BaseHandler {
this.userCourseService = userCourseService;
this.userDuelService = userDuelService;
this.userGeneralDataService = userGeneralDataService;
this.userLoginBonusService = userLoginBonusService;
}
@@ -304,6 +321,21 @@ public class UpsertUserAllHandler implements BaseHandler {
userDuelService.saveAll(newUserDuelMap.values());
}
if (upsertUserAll.getUserLoginBonusList() != null){
List<Map<String, Object>> userLoginBonusList = upsertUserAll.getUserLoginBonusList();
Map<Integer, UserLoginBonus> newUserLoginBonusMap = new HashMap<>();
userLoginBonusList.forEach(newUserLoginBonus -> {
int loginBonusPresetId = Integer.parseInt((String) newUserLoginBonus.get("presetId"));
Optional<UserLoginBonus> userLoginBonusOptional = userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), loginBonusPresetId);
UserLoginBonus userLoginBonus = userLoginBonusOptional.orElseGet(UserLoginBonus::new);
userLoginBonus.setLastUpdateDate(LocalDateTime.now());
userLoginBonus.setWatched(true);
newUserLoginBonusMap.put(loginBonusPresetId, userLoginBonus);
});
userLoginBonusService.saveAll(newUserLoginBonusMap.values());
}
String json = mapper.write(new CodeResp(1));
logger.info("Response: " + json);
return json;