[ongeki,api] support ongeki rival

This commit is contained in:
Mikira Sora
2022-12-17 11:50:36 +00:00
committed by Dom Eori
parent 9a80592e38
commit da793e9881
21 changed files with 461 additions and 21 deletions

View File

@@ -51,6 +51,7 @@ public class OngekiController {
private final GetUserRegionHandler getUserRegionHandler;
private final GetUserRivalHandler getUserRivalHandler;
private final GetUserRivalMusicHandler getUserRivalMusicHandler;
private final GetUserRivalDataHandler getUserRivalDataHandler;
private final GetUserScenarioHandler getUserScenarioHandler;
private final GetUserStoryHandler getUserStoryHandler;
private final GetUserTechCountHandler getUserTechCountHandler;
@@ -65,7 +66,7 @@ public class OngekiController {
private final GetGameMusicReleaseStateHandler getGameMusicReleaseStateHandler;
@Autowired
public OngekiController(GetGameEventHandler getGameEventHandler, GetGameIdlistHandler getGameIdlistHandler, GetGameMessageHandler getGameMessageHandler, GetGamePointHandler getGamePointHandler, GetGamePresentHandler getGamePresentHandler, GetGameRankingHandler getGameRankingHandler, GetGameRewardHandler getGameRewardHandler, GetGameSettingHandler getGameSettingHandler, GetUserActivityHandler getUserActivityHandler, GetUserBossHandler getUserBossHandler, GetUserBpBaseHandler getUserBpBaseHandler, GetUserCardHandler getUserCardHandler, GetUserChapterHandler getUserChapterHandler, GetUserCharacterHandler getUserCharacterHandler, GetUserDataHandler getUserDataHandler, GetUserDeckByKeyHandler getUserDeckByKeyHandler, GetUserEventPointHandler getUserEventPointHandler, GetUserEventRankingHandler getUserEventRankingHandler, GetUserItemHandler getUserItemHandler, GetUserLoginBonusHandler getUserLoginBonusHandler, GetUserMissionPointHandler getUserMissionPointHandler, GetUserMusicHandler getUserMusicHandler, GetUserMusicItemHandler getUserMusicItemHandler, GetUserOptionHandler getUserOptionHandler, GetUserPreviewHandler getUserPreviewHandler, GetUserRatinglogListHandler getUserRatinglogListHandler, GetUserRecentRatingHandler getUserRecentRatingHandler, GetUserRegionHandler getUserRegionHandler, GetUserRivalHandler getUserRivalHandler, GetUserRivalMusicHandler getUserRivalMusicHandler, GetUserScenarioHandler getUserScenarioHandler, GetUserStoryHandler getUserStoryHandler, GetUserTechCountHandler getUserTechCountHandler, GetUserTrainingRoomByKeyHandler getUserTrainingRoomByKeyHandler, UpsertUserAllHandler upsertUserAllHandler, GetGameTechMusicHandler getGameTechMusicHandler, GetUserTechEventHandler getUserTechEventHandler, GetUserTechEventRankingHandler getUserTechEventRankingHandler, GetUserEventMusicHandler getUserEventMusicHandler, GetUserTradeItemHandler getUserTradeItemHandler, GetUserKopHandler getUserKopHandler, GetClientBookkeepingHandler getClientBookkeepingHandler, GetClientTestmodeHandler getClientTestmodeHandler, GetGameMusicReleaseStateHandler getGameMusicReleaseStateHandler, GetUserMemoryChapterHandler getUserMemoryChapterHandler) {
public OngekiController(GetGameEventHandler getGameEventHandler, GetGameIdlistHandler getGameIdlistHandler, GetGameMessageHandler getGameMessageHandler, GetGamePointHandler getGamePointHandler, GetGamePresentHandler getGamePresentHandler, GetGameRankingHandler getGameRankingHandler, GetGameRewardHandler getGameRewardHandler, GetGameSettingHandler getGameSettingHandler, GetUserActivityHandler getUserActivityHandler, GetUserBossHandler getUserBossHandler, GetUserBpBaseHandler getUserBpBaseHandler, GetUserCardHandler getUserCardHandler, GetUserChapterHandler getUserChapterHandler, GetUserCharacterHandler getUserCharacterHandler, GetUserDataHandler getUserDataHandler, GetUserDeckByKeyHandler getUserDeckByKeyHandler, GetUserEventPointHandler getUserEventPointHandler, GetUserEventRankingHandler getUserEventRankingHandler, GetUserItemHandler getUserItemHandler, GetUserLoginBonusHandler getUserLoginBonusHandler, GetUserMissionPointHandler getUserMissionPointHandler, GetUserMusicHandler getUserMusicHandler, GetUserMusicItemHandler getUserMusicItemHandler, GetUserOptionHandler getUserOptionHandler, GetUserPreviewHandler getUserPreviewHandler, GetUserRatinglogListHandler getUserRatinglogListHandler, GetUserRecentRatingHandler getUserRecentRatingHandler, GetUserRegionHandler getUserRegionHandler, GetUserRivalHandler getUserRivalHandler, GetUserRivalMusicHandler getUserRivalMusicHandler, GetUserScenarioHandler getUserScenarioHandler, GetUserStoryHandler getUserStoryHandler, GetUserTechCountHandler getUserTechCountHandler, GetUserTrainingRoomByKeyHandler getUserTrainingRoomByKeyHandler, UpsertUserAllHandler upsertUserAllHandler, GetGameTechMusicHandler getGameTechMusicHandler, GetUserTechEventHandler getUserTechEventHandler, GetUserTechEventRankingHandler getUserTechEventRankingHandler, GetUserEventMusicHandler getUserEventMusicHandler, GetUserTradeItemHandler getUserTradeItemHandler, GetUserKopHandler getUserKopHandler, GetClientBookkeepingHandler getClientBookkeepingHandler, GetClientTestmodeHandler getClientTestmodeHandler, GetGameMusicReleaseStateHandler getGameMusicReleaseStateHandler, GetUserMemoryChapterHandler getUserMemoryChapterHandler, GetUserRivalDataHandler getUserRivalDataHandler) {
this.getGameEventHandler = getGameEventHandler;
this.getGameIdlistHandler = getGameIdlistHandler;
this.getGameMessageHandler = getGameMessageHandler;
@@ -97,6 +98,7 @@ public class OngekiController {
this.getUserRegionHandler = getUserRegionHandler;
this.getUserRivalHandler = getUserRivalHandler;
this.getUserRivalMusicHandler = getUserRivalMusicHandler;
this.getUserRivalDataHandler = getUserRivalDataHandler;
this.getUserScenarioHandler = getUserScenarioHandler;
this.getUserStoryHandler = getUserStoryHandler;
this.getUserTechCountHandler = getUserTechCountHandler;
@@ -308,13 +310,11 @@ public class OngekiController {
return getUserRivalHandler.handle(request);
}
// seems same as GetUserRivalApi
@PostMapping("GetUserRivalDataApi")
public String getUserRivalData(@ModelAttribute Map<String, Object> request) throws JsonProcessingException {
return getUserRivalHandler.handle(request);
return getUserRivalDataHandler.handle(request);
}
// dummy for now
@PostMapping("GetUserRivalMusicApi")
public String getUserRivalMusic(@ModelAttribute Map<String, Object> request) throws JsonProcessingException {
return getUserRivalMusicHandler.handle(request);

View File

@@ -6,6 +6,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
/**
@@ -13,6 +15,7 @@ import java.util.Optional;
*/
@Repository("OngekiUserDataRepository")
public interface UserDataRepository extends JpaRepository<UserData, Long> {
List<UserData> findByCard_ExtIdIn(Collection<Long> userIds);
Optional<UserData> findByCard(Card card);

View File

@@ -0,0 +1,24 @@
package icu.samnyan.aqua.sega.ongeki.dao.userdata;
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData;
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserRival;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author dp (privateamusement@protonmail.com)
*/
@Repository("OngekiUserRivalDataRepository")
public interface UserRivalDataRepository extends JpaRepository<UserRival, Long> {
List<UserRival> findByUser_Card_ExtId(long userId);
@Transactional
void removeByUser_Card_ExtIdAndRivalUserId(long userId,long rivalUserId);
@Transactional
void deleteByUser(UserData user);
}

View File

@@ -0,0 +1,63 @@
package icu.samnyan.aqua.sega.ongeki.handler.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserDataRepository;
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserRivalDataRepository;
import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler;
import icu.samnyan.aqua.sega.ongeki.model.response.data.UserRivalData;
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.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author GEEKiDoS (geek_ds@foxmail.com)
*/
@Component("OngekiGetUserRivalDataHandler")
public class GetUserRivalDataHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(GetUserRivalDataHandler.class);
private final BasicMapper mapper;
private final UserRivalDataRepository userRivalDataRepository;
private final UserDataRepository userDataRepository;
@Autowired
public GetUserRivalDataHandler(BasicMapper mapper, UserRivalDataRepository userRivalDataRepository, UserDataRepository userDataRepository) {
this.mapper = mapper;
this.userRivalDataRepository = userRivalDataRepository;
this.userDataRepository = userDataRepository;
}
@Override
public String handle(Map<String, Object> request) throws JsonProcessingException {
var userRivalId = ((Number) request.get("userId")).longValue();
var userRivalList = ((Collection<HashMap<String,Object>>)request.get("userRivalList"))
.stream()
.map(x->((Number)x.get("rivalUserId")).longValue())
.collect(Collectors.toList());
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("userId", userRivalId);
var userInfos = userDataRepository
.findByCard_ExtIdIn(userRivalList)
.stream()
.map(x -> new UserRivalData(x.getCard().getExtId().longValue(), x.getUserName()))
.toArray();
resultMap.put("length", userInfos.length);
resultMap.put("userRivalDataList", userInfos);
String json = mapper.write(resultMap);
logger.info("Response: " + json);
return json;
}
}

View File

@@ -1,6 +1,7 @@
package icu.samnyan.aqua.sega.ongeki.handler.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserRivalDataRepository;
import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler;
import icu.samnyan.aqua.sega.util.jackson.BasicMapper;
import org.slf4j.Logger;
@@ -20,10 +21,12 @@ public class GetUserRivalHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(GetUserRivalHandler.class);
private final BasicMapper mapper;
private final UserRivalDataRepository userRivalDataRepository;
@Autowired
public GetUserRivalHandler(BasicMapper mapper) {
public GetUserRivalHandler(BasicMapper mapper, UserRivalDataRepository userRivalDataRepository) {
this.mapper = mapper;
this.userRivalDataRepository = userRivalDataRepository;
}
@Override
@@ -32,8 +35,10 @@ public class GetUserRivalHandler implements BaseHandler {
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("userId", userRivalId);
resultMap.put("length", 0);
resultMap.put("userRivalList", new List[]{});
var result = userRivalDataRepository.findByUser_Card_ExtId(userRivalId);//.stream().map(x->x.getUser().getCard().getExtId()).toArray();
resultMap.put("length", result.size());
resultMap.put("userRivalList", result);
String json = mapper.write(resultMap);

View File

@@ -1,16 +1,19 @@
package icu.samnyan.aqua.sega.ongeki.handler.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserMusicDetailRepository;
import icu.samnyan.aqua.sega.ongeki.handler.BaseHandler;
import icu.samnyan.aqua.sega.ongeki.model.response.data.UserRivalMusic;
import icu.samnyan.aqua.sega.util.jackson.BasicMapper;
import icu.samnyan.aqua.spring.data.OffsetPageRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author GEEKiDoS (geek_ds@foxmail.com)
@@ -20,26 +23,57 @@ public class GetUserRivalMusicHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(GetUserRivalMusicHandler.class);
private final BasicMapper mapper;
private final UserMusicDetailRepository userMusicDetailRepository;
@Autowired
public GetUserRivalMusicHandler(BasicMapper mapper) {
public GetUserRivalMusicHandler(BasicMapper mapper, UserMusicDetailRepository userMusicDetailRepository) {
this.mapper = mapper;
this.userMusicDetailRepository = userMusicDetailRepository;
}
@Override
public String handle(Map<String, Object> request) throws JsonProcessingException {
var userId = (long)request.get("userId");
var rivalUserId = (int)request.get("rivalUserId");
/* var nextIndex = (int)request.get("nextIndex");
var maxCount = (int)request.get("maxCount"); */
var userId = ((Number) request.get("userId")).longValue();
var rivalUserId = ((Number) request.get("rivalUserId")).longValue();
var nextIndex = ((Number) request.get("nextIndex")).intValue();
var maxCount = ((Number) request.get("maxCount")).intValue();
//fix maxCount and sort by musicId so that we could fetch entity music with full fumen diffs.
var fixedMaxCount = maxCount + (maxCount % 5 == 0 ? 0 : 5);
var sorter = Sort.by(Sort.Direction.ASC, "musicId");
var groupedMusicDetailsItor = userMusicDetailRepository
.findByUser_Card_ExtId(rivalUserId, OffsetPageRequest.of(nextIndex, fixedMaxCount, sorter))
.stream()
.collect(Collectors.groupingBy(x -> x.getMusicId()))
.values()
.stream()
.map(x -> new UserRivalMusic(x,x.size()))
.iterator();
var filterMusicDetails = new ArrayList<UserRivalMusic>();
var actualReadCount = 0;
while(groupedMusicDetailsItor.hasNext()){
var musicDetail = groupedMusicDetailsItor.next();
if (musicDetail.getLength() + actualReadCount > maxCount)
break;
filterMusicDetails.add(musicDetail);
actualReadCount += musicDetail.getLength();
}
var respNextIndex = nextIndex + actualReadCount;
if (filterMusicDetails.size() <= 0)
respNextIndex = 0; //nofity client that All music details had been sent (for this rival).
else
filterMusicDetails.sort(Comparator.comparingInt(a -> a.getUserRivalMusicDetailList().get(0).getMusicId()));
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("userId", userId);
resultMap.put("rivalUserId", rivalUserId);
resultMap.put("length", 0);
resultMap.put("nextIndex", 0);
resultMap.put("userRivalMusicList", new List[]{});
resultMap.put("length", filterMusicDetails.size());
resultMap.put("nextIndex", respNextIndex);
resultMap.put("userRivalMusicList", filterMusicDetails);
String json = mapper.write(resultMap);

View File

@@ -27,5 +27,5 @@ public class GameSetting {
private int maxCountItem;
private int maxCountMusic;
private int maxCountMusicItem;
private int macCountRivalMusic;
private int maxCountRivalMusic;
}

View File

@@ -0,0 +1,16 @@
package icu.samnyan.aqua.sega.ongeki.model.response.data;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRivalData {
private long rivalUserId;
private String rivalUserName;
}

View File

@@ -0,0 +1,19 @@
package icu.samnyan.aqua.sega.ongeki.model.response.data;
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMusicDetail;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRivalMusic {
private List<UserMusicDetail> userRivalMusicDetailList;
private int length;
}

View File

@@ -0,0 +1,38 @@
package icu.samnyan.aqua.sega.ongeki.model.userdata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import icu.samnyan.aqua.sega.util.jackson.UserIdSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Entity(name = "OngekiUserRival")
@Table(name = "ongeki_user_rival")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserRival implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private long id;
@ManyToOne
@JsonIgnore
@JoinColumn(name = "user_id")
private UserData user;
@JoinColumn(name = "rival_user_id")
@JsonProperty("rivalUserId")
private long rivalUserId;
}

View File

@@ -0,0 +1,27 @@
package icu.samnyan.aqua.sega.util.jackson;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData;
import java.io.IOException;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
public class UserIdSerializer extends StdSerializer<UserData> {
public UserIdSerializer() {
this(null);
}
public UserIdSerializer(Class<UserData> t) {
super(t);
}
@Override
public void serialize(UserData value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeNumber(value.getCard().getExtId());
}
}