Initial Commit

This commit is contained in:
samnyan
2020-01-16 00:50:52 +09:00
commit 89771b7b51
331 changed files with 32076 additions and 0 deletions
@@ -0,0 +1,30 @@
package icu.samnyan.aqua.api.controller;
import icu.samnyan.aqua.sega.general.dao.CardRepository;
import icu.samnyan.aqua.sega.general.model.Card;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.Optional;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestController
@RequestMapping("api/sega/aime")
public class ApiAimeController {
private final CardRepository cardRepository;
public ApiAimeController(CardRepository cardRepository) {
this.cardRepository = cardRepository;
}
@PostMapping("getByAccessCode")
public Optional<Card> getByAccessCode(@RequestBody Map<String, String> request) {
return cardRepository.findByLuid(request.get("accessCode"));
}
}
@@ -0,0 +1,19 @@
package icu.samnyan.aqua.api.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.NoSuchElementException;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestControllerAdvice(basePackages = "icu.samnyan.aqua.api")
public class ApiControllerAdvice {
@ExceptionHandler(NoSuchElementException.class)
public ResponseEntity<Object> noSuchElement() {
return ResponseEntity.notFound().build();
}
}
@@ -0,0 +1,148 @@
package icu.samnyan.aqua.api.controller.sega.chuni.amazon;
import com.fasterxml.jackson.core.type.TypeReference;
import icu.samnyan.aqua.api.model.resp.sega.chuni.amazon.ProfileResp;
import icu.samnyan.aqua.api.model.resp.sega.chuni.amazon.RatingItem;
import icu.samnyan.aqua.api.model.resp.sega.chuni.amazon.RecentResp;
import icu.samnyan.aqua.api.model.resp.sega.chuni.amazon.ScoreResp;
import icu.samnyan.aqua.api.util.ApiMapper;
import icu.samnyan.aqua.sega.chunithm.model.gamedata.Level;
import icu.samnyan.aqua.sega.chunithm.model.gamedata.Music;
import icu.samnyan.aqua.sega.chunithm.model.userdata.UserCourse;
import icu.samnyan.aqua.sega.chunithm.model.userdata.UserMusicDetail;
import icu.samnyan.aqua.sega.chunithm.model.userdata.UserPlaylog;
import icu.samnyan.aqua.sega.chunithm.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestController
@RequestMapping("api/game/chuni/amazon")
public class ApiAmazonController {
private final ApiMapper mapper;
private final UserDataService userDataService;
private final UserPlaylogService userPlaylogService;
private final UserMusicDetailService userMusicDetailService;
private final UserCourseService userCourseService;
private final GameMusicService gameMusicService;
@Autowired
public ApiAmazonController(ApiMapper mapper, UserDataService userDataService, UserPlaylogService userPlaylogService, UserMusicDetailService userMusicDetailService, UserCourseService userCourseService, GameMusicService gameMusicService) {
this.mapper = mapper;
this.userDataService = userDataService;
this.userPlaylogService = userPlaylogService;
this.userMusicDetailService = userMusicDetailService;
this.userCourseService = userCourseService;
this.gameMusicService = gameMusicService;
}
/**
* Get Basic info
*
* @return
*/
@GetMapping("profile")
public ProfileResp getProfile(@RequestParam String aimeId) {
ProfileResp resp = mapper.convert(userDataService.getUserByExtId(aimeId).orElseThrow(), new TypeReference<>() {
});
UserCourse course = userCourseService.getByUser(aimeId)
.stream()
.filter(UserCourse::isClear)
.max(Comparator.comparingInt(UserCourse::getClassId))
.orElseGet(() -> new UserCourse(0));
resp.setCourseClass(course.getClassId());
return resp;
}
@GetMapping("recent")
public List<RecentResp> getRecentPlay(@RequestParam String aimeId) {
return mapper.convert(userPlaylogService.getRecentPlays(aimeId), new TypeReference<>() {
});
}
@GetMapping("rating")
public List<RatingItem> getRating(@RequestParam String aimeId) {
Map<Integer, Music> musicMap = gameMusicService.getIdMap();
List<UserMusicDetail> details = userMusicDetailService.getByUser(aimeId);
List<RatingItem> result = new ArrayList<>();
for (UserMusicDetail detail : details) {
Music music = musicMap.get(detail.getMusicId());
Level level = music.getLevels().get(detail.getLevel());
int levelBase = level.getLevel() * 100 + level.getLevelDecimal();
int score = detail.getScoreMax();
int rating = calculateRating(levelBase, score);
result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating));
}
return result.stream()
.filter(detail -> detail.getLevel() != 4)
.sorted(Comparator.comparingInt(RatingItem::getRating).reversed())
.limit(30)
.collect(Collectors.toList());
}
@GetMapping("rating/recent")
public List<RatingItem> getRecentRating(@RequestParam String aimeId) {
Map<Integer, Music> musicMap = gameMusicService.getIdMap();
List<UserPlaylog> logList = userPlaylogService.getRecent30Plays(aimeId);
List<RatingItem> result = new ArrayList<>();
for (UserPlaylog log : logList) {
Music music = musicMap.get(log.getMusicId());
Level level = music.getLevels().get(log.getLevel());
int levelBase = level.getLevel() * 100 + level.getLevelDecimal();
int score = log.getScore();
int rating = calculateRating(levelBase, score);
result.add(new RatingItem(music.getMusicId(), music.getName(), music.getArtistName(), level.getDiff(), score, levelBase, rating));
}
List<String> keys = new ArrayList<>();
return result.stream()
.filter(detail -> detail.getLevel() != 4)
.sorted(Comparator.comparingInt(RatingItem::getRating).reversed())
.limit(10)
.collect(Collectors.toList());
}
@GetMapping("score/list")
public List<ScoreResp> getScoreList(@RequestParam String aimeId) {
return mapper.convert(userMusicDetailService.getByUser(aimeId), new TypeReference<>() {
});
}
@GetMapping("music")
public List<Music> getMusicList() {
return gameMusicService.getAll();
}
@PostMapping("music/import")
public List<Music> addMusic(@RequestBody List<Music> musicList) {
musicList.forEach(music -> music.getLevels().forEach((integer, level) -> level.setMusic(music)));
return gameMusicService.saveAll(musicList);
}
private int calculateRating(int levelBase, int score) {
if (score >= 1007500) return levelBase + 200;
if (score >= 1005000) return levelBase + 150 + (score - 1005000) * 10 / 500;
if (score >= 1000000) return levelBase + 100 + (score - 1000000) * 5 / 500;
if (score >= 975000) return levelBase + (score - 975000) * 2 / 500;
if (score >= 950000) return levelBase - 150 + (score - 950000) * 3 / 500;
if (score >= 925000) return levelBase - 300 + (score - 925000) * 3 / 500;
if (score >= 900000) return levelBase - 500 + (score - 900000) * 4 / 500;
return 0;
}
}
@@ -0,0 +1,23 @@
package icu.samnyan.aqua.api.controller.sega.diva;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestController
@RequestMapping("api/game/diva/data")
public class ApiDivaGameDataController {
@GetMapping(value = "musicList", produces = MediaType.APPLICATION_JSON_VALUE)
public byte[] musicList() throws IOException {
return Files.readAllBytes(Paths.get("data/diva_musiclist.json"));
}
}
@@ -0,0 +1,113 @@
package icu.samnyan.aqua.api.controller.sega.diva;
import icu.samnyan.aqua.api.model.OkResponse;
import icu.samnyan.aqua.api.model.req.sega.diva.ModuleEntry;
import icu.samnyan.aqua.api.model.req.sega.diva.PvListEntry;
import icu.samnyan.aqua.api.model.req.sega.diva.PvListRequest;
import icu.samnyan.aqua.sega.diva.dao.gamedata.*;
import icu.samnyan.aqua.sega.diva.model.common.Difficulty;
import icu.samnyan.aqua.sega.diva.model.common.Edition;
import icu.samnyan.aqua.sega.diva.model.gamedata.*;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestController
@RequestMapping("api/game/diva/manage")
public class ApiDivaManageController {
private final PvEntryRepository pvEntryRepository;
private final DivaModuleRepository moduleRepository;
private final DivaCustomizeRepository customizeRepository;
private final FestaRepository festaRepository;
private final ContestRepository contestRepository;
public ApiDivaManageController(PvEntryRepository pvEntryRepository, DivaModuleRepository moduleRepository, DivaCustomizeRepository customizeRepository, FestaRepository festaRepository, ContestRepository contestRepository) {
this.pvEntryRepository = pvEntryRepository;
this.moduleRepository = moduleRepository;
this.customizeRepository = customizeRepository;
this.festaRepository = festaRepository;
this.contestRepository = contestRepository;
}
@PostMapping("pvList")
public List<PvEntry> updatePvList(@RequestBody PvListRequest request) {
request.getEasy().forEach(x -> savePv(x, Difficulty.EASY));
request.getNormal().forEach(x -> savePv(x, Difficulty.NORMAL));
request.getHard().forEach(x -> savePv(x, Difficulty.HARD));
request.getExtreme().forEach(x -> savePv(x, Difficulty.EXTREME));
return pvEntryRepository.findAll();
}
@PostMapping("module")
public List<DivaModule> updateModuleList(@RequestBody List<ModuleEntry> request) {
List<DivaModule> moduleList = new ArrayList<>();
request.forEach(x -> moduleList.add(new DivaModule(x.getID(), x.getName(), x.getPrice(), x.getReleaseDate(), x.getEndDate(), x.getSortOrder())));
return moduleRepository.saveAll(moduleList);
}
@PostMapping("item")
public List<DivaCustomize> updateItemList(@RequestBody List<ModuleEntry> request) {
List<DivaCustomize> itemList = new ArrayList<>();
request.forEach(x -> itemList.add(new DivaCustomize(x.getID(), x.getName(), x.getPrice(), x.getReleaseDate(), x.getEndDate(), x.getSortOrder())));
return customizeRepository.saveAll(itemList);
}
private void savePv(PvListEntry x, Difficulty difficulty) {
pvEntryRepository.save(new PvEntry(x.getPVID(),
difficulty,
x.getVersion(),
Edition.fromValue(x.getEdition()),
x.getAdvDemo().getStart(),
x.getAdvDemo().getEnd(),
x.getPlayable().getStart(),
x.getPlayable().getEnd()
));
}
@GetMapping("festa")
public List<Festa> getFesta() {
return festaRepository.findAll();
}
@PutMapping("festa")
public Festa updateFesta(@RequestBody Festa festa) {
return festaRepository.save(festa);
}
@DeleteMapping("festa/{id}")
public OkResponse getFesta(@PathVariable int id) {
festaRepository.deleteById(id);
return new OkResponse("Deleted " + id);
}
@GetMapping("contest")
public List<Contest> getContest() {
return contestRepository.findAll();
}
@PutMapping("contest")
public Contest updateContest(@RequestBody Contest contest) {
return contestRepository.save(contest);
}
@DeleteMapping("contest/{id}")
public OkResponse deleteContest(@PathVariable int id) {
contestRepository.deleteById(id);
return new OkResponse("Deleted " + id);
}
@GetMapping("module")
public List<DivaModule> getModule() {
return moduleRepository.findAll();
}
@GetMapping("customize")
public List<DivaCustomize> getCustomize() {
return customizeRepository.findAll();
}
}
@@ -0,0 +1,183 @@
package icu.samnyan.aqua.api.controller.sega.diva;
import icu.samnyan.aqua.api.model.ReducedPageResponse;
import icu.samnyan.aqua.sega.diva.dao.userdata.*;
import icu.samnyan.aqua.sega.diva.model.userdata.*;
import icu.samnyan.aqua.sega.diva.service.PlayerProfileService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@RestController
@RequestMapping("api/game/diva")
public class ApiDivaPlayerDataController {
private final PlayerProfileService playerProfileService;
private final PlayLogRepository playLogRepository;
private final PlayerPvRecordRepository playerPvRecordRepository;
private final PlayerPvCustomizeRepository playerPvCustomizeRepository;
private final PlayerModuleRepository playerModuleRepository;
private final PlayerCustomizeRepository playerCustomizeRepository;
public ApiDivaPlayerDataController(PlayerProfileService playerProfileService, PlayLogRepository playLogRepository, PlayerPvRecordRepository playerPvRecordRepository, PlayerPvCustomizeRepository playerPvCustomizeRepository, PlayerModuleRepository playerModuleRepository, PlayerCustomizeRepository playerCustomizeRepository) {
this.playerProfileService = playerProfileService;
this.playLogRepository = playLogRepository;
this.playerPvRecordRepository = playerPvRecordRepository;
this.playerPvCustomizeRepository = playerPvCustomizeRepository;
this.playerModuleRepository = playerModuleRepository;
this.playerCustomizeRepository = playerCustomizeRepository;
}
@GetMapping("playerInfo")
public Optional<PlayerProfile> getPlayerInfo(@RequestParam int pdId) {
return playerProfileService.findByPdId(pdId);
}
@PutMapping("playerInfo/playerName")
public PlayerProfile updateName(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setPlayerName((String) request.get("playerName"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/title")
public PlayerProfile updateTitle(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setLevelTitle((String) request.get("title"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/plate")
public PlayerProfile updatePlate(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setPlateId((Integer) request.get("plateId"));
profile.setPlateEffectId((Integer) request.get("plateEffectId"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/commonModule")
public PlayerProfile updateModule(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setCommonModule((String) request.get("commonModule"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/commonCustomize")
public PlayerProfile updateCustomize(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setCommonCustomizeItems((String) request.get("commonCustomize"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/commonSkin")
public PlayerProfile updateSkin(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setCommonSkin((Integer) request.get("skinId"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/myList")
public PlayerProfile updateMyList(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
switch ((Integer) request.get("myListId")) {
case 0:
profile.setMyList0((String) request.get("myListData"));
break;
case 1:
profile.setMyList1((String) request.get("myListData"));
break;
case 2:
profile.setMyList2((String) request.get("myListData"));
break;
}
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/se")
public PlayerProfile updateSe(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setButtonSe((Integer) request.get("buttonSe"));
profile.setChainSlideSe((Integer) request.get("chainSlideSe"));
profile.setSlideSe((Integer) request.get("slideSe"));
profile.setSliderTouchSe((Integer) request.get("sliderTouchSe"));
return playerProfileService.save(profile);
}
@PutMapping("playerInfo/display")
public PlayerProfile updateDisplay(@RequestBody Map<String, Object> request) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
profile.setShowInterimRanking((Boolean) request.get("showInterimRanking"));
profile.setShowClearStatus((Boolean) request.get("showClearStatus"));
profile.setShowClearBorder((Boolean) request.get("showClearBorder"));
profile.setShowRgoSetting((Boolean) request.get("showRgoSetting"));
return playerProfileService.save(profile);
}
@GetMapping("playLog")
public ReducedPageResponse<PlayLog> getPlayLogs(@RequestParam int pdId,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int size) {
Page<PlayLog> playLogs = playLogRepository.findByPdId_PdIdOrderByDateTimeDesc(pdId, PageRequest.of(page, size));
return new ReducedPageResponse<>(playLogs.getContent(), playLogs.getPageable().getPageNumber(), playLogs.getTotalPages(), playLogs.getTotalElements());
}
/**
* PvRecord
*/
@GetMapping("pvRecord")
public ReducedPageResponse<PlayerPvRecord> getPvRecords(@RequestParam int pdId,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int size) {
Page<PlayerPvRecord> pvRecords = playerPvRecordRepository.findByPdId_PdIdOrderByPvId(pdId, PageRequest.of(page, size));
return new ReducedPageResponse<>(pvRecords.getContent(), pvRecords.getPageable().getPageNumber(), pvRecords.getTotalPages(), pvRecords.getTotalElements());
}
@GetMapping("pvRecord/{pvId}")
public Map<String, Object> getPvRecord(@RequestParam int pdId, @PathVariable int pvId) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("records", playerPvRecordRepository.findByPdId_PdIdAndPvId(pdId, pvId));
playerPvCustomizeRepository.findByPdId_PdIdAndPvId(pdId, pvId).ifPresent(x -> resultMap.put("customize", x));
return resultMap;
}
@PutMapping("pvRecord/{pvId}")
public PlayerPvCustomize updatePvCustomize(@RequestBody Map<String, Object> request, @PathVariable int pvId) {
PlayerProfile profile = playerProfileService.findByPdId((Integer) request.get("pdId")).orElseThrow();
PlayerPvCustomize playerPvCustomize = playerPvCustomizeRepository.findByPdIdAndPvId(profile, pvId)
.orElseGet(() -> new PlayerPvCustomize(profile, pvId));
playerPvCustomize.setModule((String) request.get("module"));
playerPvCustomize.setCustomize((String) request.get("customize"));
playerPvCustomize.setCustomizeFlag((String) request.get("customizeFlag"));
playerPvCustomize.setSkin((Integer) request.get("skin"));
playerPvCustomize.setButtonSe((Integer) request.get("buttonSe"));
playerPvCustomize.setSlideSe((Integer) request.get("slideSe"));
playerPvCustomize.setChainSlideSe((Integer) request.get("chainSlideSe"));
playerPvCustomize.setSliderTouchSe((Integer) request.get("sliderTouchSe"));
return playerPvCustomizeRepository.save(playerPvCustomize);
}
@GetMapping("module")
public ReducedPageResponse<PlayerModule> getModules(@RequestParam int pdId,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int size) {
Page<PlayerModule> modules = playerModuleRepository.findByPdId_PdId(pdId, PageRequest.of(page, size));
return new ReducedPageResponse<>(modules.getContent(), modules.getPageable().getPageNumber(), modules.getTotalPages(), modules.getTotalElements());
}
@GetMapping("customize")
public ReducedPageResponse<PlayerCustomize> getCustomizes(@RequestParam int pdId,
@RequestParam(required = false, defaultValue = "0") int page,
@RequestParam(required = false, defaultValue = "10") int size) {
Page<PlayerCustomize> customizes = playerCustomizeRepository.findByPdId_PdId(pdId, PageRequest.of(page, size));
return new ReducedPageResponse<>(customizes.getContent(), customizes.getPageable().getPageNumber(), customizes.getTotalPages(), customizes.getTotalElements());
}
}
@@ -0,0 +1,23 @@
package icu.samnyan.aqua.api.model;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
public class OkResponse {
private String message = "ok";
public OkResponse(String message) {
this.message = message;
}
public OkResponse() {
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
@@ -0,0 +1,25 @@
package icu.samnyan.aqua.api.model;
import lombok.Getter;
import lombok.Setter;
import java.util.Collection;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Getter
@Setter
public class ReducedPageResponse<T> {
private Collection<T> content;
private Integer page;
private Integer totalPages;
private Long totalElements;
public ReducedPageResponse(Collection<T> content, Integer page, Integer totalPages, Long totalElements) {
this.content = content;
this.page = page;
this.totalPages = totalPages;
this.totalElements = totalElements;
}
}
@@ -0,0 +1,21 @@
package icu.samnyan.aqua.api.model.req.sega.diva;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DatePair {
@JsonProperty("Start")
private LocalDateTime Start;
@JsonProperty("End")
private LocalDateTime End;
}
@@ -0,0 +1,29 @@
package icu.samnyan.aqua.api.model.req.sega.diva;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ModuleEntry {
@JsonProperty("ID")
private int ID;
@JsonProperty("Name")
private String Name;
@JsonProperty("Price")
private int Price;
@JsonProperty("ReleaseDate")
private LocalDateTime ReleaseDate;
@JsonProperty("EndDate")
private LocalDateTime EndDate;
@JsonProperty("SortOrder")
private int SortOrder;
}
@@ -0,0 +1,25 @@
package icu.samnyan.aqua.api.model.req.sega.diva;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PvListEntry {
@JsonProperty("PVID")
private int PVID;
@JsonProperty("Version")
private int Version;
@JsonProperty("Edition")
private int Edition;
@JsonProperty("AdvDemo")
private DatePair AdvDemo;
@JsonProperty("Playable")
private DatePair Playable;
}
@@ -0,0 +1,28 @@
package icu.samnyan.aqua.api.model.req.sega.diva;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PvListRequest {
@JsonProperty("CreationDate")
private LocalDateTime CreationDate;
@JsonProperty("Easy")
private List<PvListEntry> Easy;
@JsonProperty("Normal")
private List<PvListEntry> Normal;
@JsonProperty("Hard")
private List<PvListEntry> Hard;
@JsonProperty("Extreme")
private List<PvListEntry> Extreme;
}
@@ -0,0 +1,60 @@
package icu.samnyan.aqua.api.model.resp.sega.chuni.amazon;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ProfileResp {
private String userName;
private int level;
private String exp;
private long point;
private long totalPoint;
private int playCount;
private int playerRating;
private int highestRating;
private int nameplateId;
private int frameId;
private int characterId;
private int trophyId;
private int totalMapNum;
private long totalHiScore;
private long totalBasicHighScore;
private long totalAdvancedHighScore;
private long totalExpertHighScore;
private long totalMasterHighScore;
private int friendCount;
private LocalDateTime firstPlayDate;
private LocalDateTime lastPlayDate;
private int courseClass;
}
@@ -0,0 +1,28 @@
package icu.samnyan.aqua.api.model.resp.sega.chuni.amazon;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RatingItem {
private int musicId;
private String musicName;
private String artistName;
private int level;
private int score;
private int ratingBase;
private int rating;
}
@@ -0,0 +1,87 @@
package icu.samnyan.aqua.api.model.resp.sega.chuni.amazon;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RecentResp {
private LocalDateTime playDate;
private LocalDateTime userPlayDate;
private int musicId;
private int level;
private int customId;
private int playedCustom1;
private int playedCustom2;
private int playedCustom3;
private int track;
private int score;
private int rank;
private int maxCombo;
private int maxChain;
private int rateTap;
private int rateHold;
private int rateSlide;
private int rateAir;
private int rateFlick;
private int judgeGuilty;
private int judgeAttack;
private int judgeJustice;
private int judgeCritical;
private int playerRating;
@JsonProperty("isNewRecord")
private boolean isNewRecord;
@JsonProperty("isFullCombo")
private boolean isFullCombo;
private int fullChainKind;
@JsonProperty("isAllJustice")
private boolean isAllJustice;
private int characterId;
private int skillId;
private int playKind;
@JsonProperty("isClear")
private boolean isClear;
private int skillLevel;
private int skillEffect;
}
@@ -0,0 +1,48 @@
package icu.samnyan.aqua.api.model.resp.sega.chuni.amazon;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ScoreResp {
private int musicId;
private int level;
private int playCount;
private int scoreMax;
private int resRequestCount;
private int resAcceptCount;
private int resSuccessCount;
private int missCount;
private int maxComboCount;
@JsonProperty("isFullCombo")
private boolean isFullCombo;
@JsonProperty("isAllJustice")
private boolean isAllJustice;
@JsonProperty("isSuccess")
private boolean isSuccess;
private int fullChain;
private int maxChain;
private int scoreRank;
}
@@ -0,0 +1,13 @@
package icu.samnyan.aqua.api.model.resp.sega.diva;
import lombok.Data;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
public class PlayerInfo {
private int pdId;
private String playerName;
private int vocaloidPoints;
}
@@ -0,0 +1,35 @@
package icu.samnyan.aqua.api.util;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.stereotype.Component;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Component
public class ApiMapper {
private final ObjectMapper mapper;
public ApiMapper() {
mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
SimpleModule module = new SimpleModule();
mapper.registerModule(new JavaTimeModule());
mapper.registerModule(module);
}
public String write(Object o) throws JsonProcessingException {
return mapper.writeValueAsString(o);
}
public <T> T convert(Object object, TypeReference<T> toClass) {
return mapper.convertValue(object, toClass);
}
}