forked from Cookies_Github_mirror/AquaDX
[ongeki,api] support ongeki rival
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -27,5 +27,5 @@ public class GameSetting {
|
||||
private int maxCountItem;
|
||||
private int maxCountMusic;
|
||||
private int maxCountMusicItem;
|
||||
private int macCountRivalMusic;
|
||||
private int maxCountRivalMusic;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user