[maimai2] Implement game event and user playlog for possible future use

pull/1/head
Dom Eori 2021-08-30 22:31:32 +09:00
parent 0cf5039ede
commit b2e2b36b6f
10 changed files with 644 additions and 8 deletions

View File

@ -44,6 +44,7 @@ public class Maimai2ServletController {
private final GetUserChargeHandler getUserChargeHandler;
private final GetUserCourseHandler getUserCourseHandler;
private final UploadUserPhotoHandler uploadUserPhotoHandler;
private final UploadUserPlaylogHandler uploadUserPlaylogHandler;
public Maimai2ServletController(GetGameSettingHandler getGameSettingHandler, GetGameEventHandler getGameEventHandler, GetGameRankingHandler getGameRankingHandler, GetGameTournamentInfoHandler getGameTournamentInfoHandler,
GetTransferFriendHandler getTransferFriendHandler, GetUserActivityHandler getUserActivityHandler, UserLoginHandler userLoginHandler, UserLogoutHandler userLogoutHandler,
@ -51,7 +52,8 @@ public class Maimai2ServletController {
GetUserOptionHandler getUserOptionHandler, GetUserItemHandler getUserItemHandler, GetUserExtendHandler getUserExtendHandler, GetUserGhostHandler getUserGhostHandler,
GetUserLoginBonusHandler getUserLoginBonusHandler, GetUserMapHandler getUserMapHandler, GetUserFavoriteHandler getUserFavoriteHandler,
GetUserCardHandler getUserCardHandler, GetUserMusicHandler getUserMusicHandler, GetUserRatingHandler getUserRatingHandler, GetUserRegionHandler getUserRegionHandler,
GetGameChargeHandler getGameChargeHandler, GetUserChargeHandler getUserChargeHandler, GetUserCourseHandler getUserCourseHandler, UploadUserPhotoHandler uploadUserPhotoHandler) {
GetGameChargeHandler getGameChargeHandler, GetUserChargeHandler getUserChargeHandler, GetUserCourseHandler getUserCourseHandler, UploadUserPhotoHandler uploadUserPhotoHandler,
UploadUserPlaylogHandler uploadUserPlaylogHandler) {
this.getGameSettingHandler = getGameSettingHandler;
this.getGameEventHandler = getGameEventHandler;
this.getGameRankingHandler = getGameRankingHandler;
@ -79,6 +81,7 @@ public class Maimai2ServletController {
this.getUserChargeHandler = getUserChargeHandler;
this.getUserCourseHandler = getUserCourseHandler;
this.uploadUserPhotoHandler = uploadUserPhotoHandler;
this.uploadUserPlaylogHandler = uploadUserPlaylogHandler;
}
// Mandatory for boot
@ -205,7 +208,7 @@ public class Maimai2ServletController {
@PostMapping("UploadUserPlaylogApi")
public String uploadUserPlaylogHandler(@ModelAttribute Map<String, Object> request) throws JsonProcessingException {
return "{\"returnCode\":1,\"apiName\":\"com.sega.maimai2servlet.api.UploadUserPlaylogApi\"}";
return uploadUserPlaylogHandler.handle(request);
}
// No support, return error code

View File

@ -0,0 +1,16 @@
package icu.samnyan.aqua.sega.maimai2.dao.gamedata;
import icu.samnyan.aqua.sega.maimai2.model.gamedata.GameEvent;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Repository("Maimai2GameEventRepository")
public interface GameEventRepository extends JpaRepository<GameEvent, Integer> {
List<GameEvent> findByTypeAndEnable(int type, boolean enable);
}

View File

@ -0,0 +1,13 @@
package icu.samnyan.aqua.sega.maimai2.dao.userdata;
import icu.samnyan.aqua.sega.maimai2.model.userdata.UserPlaylog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Repository
public interface UserPlaylogRepository extends JpaRepository<UserPlaylog, Long> {
}

View File

@ -1,14 +1,15 @@
package icu.samnyan.aqua.sega.maimai2.handler.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.maimai2.dao.gamedata.GameEventRepository;
import icu.samnyan.aqua.sega.maimai2.handler.BaseHandler;
import icu.samnyan.aqua.sega.maimai2.model.gamedata.GameEvent;
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.stereotype.Component;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -21,19 +22,20 @@ public class GetGameEventHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(GetGameEventHandler.class);
//private final GameEventRepository gameEventRepository;
private final GameEventRepository gameEventRepository;
private final StringMapper mapper;
public GetGameEventHandler(StringMapper mapper) {
public GetGameEventHandler(GameEventRepository gameEventRepository, StringMapper mapper) {
this.gameEventRepository = gameEventRepository;
this.mapper = mapper;
}
@Override
public String handle(Map<String, Object> request) throws JsonProcessingException {
String type = Integer.toString((int) request.get("type"));
int type = ((Number) request.get("type")).intValue();
List<Object> gameEventList = new ArrayList<>();
List<GameEvent> gameEventList = gameEventRepository.findByTypeAndEnable(type, true);
Map<String, Object> resultMap = new LinkedHashMap<>();
resultMap.put("type", type);

View File

@ -0,0 +1,50 @@
package icu.samnyan.aqua.sega.maimai2.handler.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserDataRepository;
import icu.samnyan.aqua.sega.maimai2.dao.userdata.UserPlaylogRepository;
import icu.samnyan.aqua.sega.maimai2.handler.BaseHandler;
import icu.samnyan.aqua.sega.maimai2.model.request.UploadUserPlaylog;
import icu.samnyan.aqua.sega.maimai2.model.userdata.UserDetail;
import icu.samnyan.aqua.sega.maimai2.model.userdata.UserPlaylog;
import icu.samnyan.aqua.sega.util.jackson.BasicMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Optional;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Component
public class UploadUserPlaylogHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(UploadUserPlaylogHandler.class);
private final BasicMapper mapper;
private final UserPlaylogRepository userPlaylogRepository;
private final UserDataRepository userDataRepository;
public UploadUserPlaylogHandler(UserDataRepository userDataRepository, UserPlaylogRepository userPlaylogRepository, BasicMapper mapper) {
this.userDataRepository = userDataRepository;
this.userPlaylogRepository = userPlaylogRepository;
this.mapper = mapper;
}
@Override
public String handle(Map<String, Object> request) throws JsonProcessingException {
UploadUserPlaylog uploadUserPlaylog = mapper.convert(request, UploadUserPlaylog.class);
Optional<UserDetail> userOptional = userDataRepository.findByCard_ExtId(uploadUserPlaylog.getUserId());
UserDetail userDetail = userOptional.orElseThrow();
UserPlaylog userPlaylog = uploadUserPlaylog.getUserPlaylog();
userPlaylog.setUser(userDetail);
userPlaylogRepository.save(userPlaylog);
return "{\"returnCode\":1,\"apiName\":\"com.sega.maimai2servlet.api.UploadUserPlaylogApi\"}";
}
}

View File

@ -0,0 +1,36 @@
package icu.samnyan.aqua.sega.maimai2.model.gamedata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Entity(name = "Maimai2GameEvent")
@Table(name = "maimai2_game_event")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GameEvent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private int id;
private int type;
private String startDate;
private String endDate;
@JsonIgnore
private boolean enable;
}

View File

@ -0,0 +1,20 @@
package icu.samnyan.aqua.sega.maimai2.model.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import icu.samnyan.aqua.sega.maimai2.model.userdata.UserPlaylog;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UploadUserPlaylog implements Serializable {
private long userId;
private UserPlaylog userPlaylog;
}

View File

@ -0,0 +1,256 @@
package icu.samnyan.aqua.sega.maimai2.model.userdata;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
/**
* @author samnyan (privateamusement@protonmail.com)
*/
@Entity(name = "Maimai2UserPlaylog")
@Table(name = "maimai2_user_playlog")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserPlaylog implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonIgnore
private long id;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "user_id")
private UserDetail user;
private int orderId;
private long playlogId;
private int version;
private int placeId;
private String placeName;
private long loginDate;
private String playDate;
private String userPlayDate;
private int type;
private int musicId;
private int level;
private int trackNo;
private int vsMode;
private String vsUserName;
private int vsStatus;
private int vsUserRating;
private int vsUserAchievement;
private int vsUserGradeRank;
private int vsRank;
private int playerNum;
private long playedUserId1;
private String playedUserName1;
private int playedMusicLevel1;
private long playedUserId2;
private String playedUserName2;
private int playedMusicLevel2;
private long playedUserId3;
private String playedUserName3;
private int playedMusicLevel3;
private int characterId1;
private int characterLevel1;
private int characterAwakening1;
private int characterId2;
private int characterLevel2;
private int characterAwakening2;
private int characterId3;
private int characterLevel3;
private int characterAwakening3;
private int characterId4;
private int characterLevel4;
private int characterAwakening4;
private int characterId5;
private int characterLevel5;
private int characterAwakening5;
private int achievement;
private int deluxscore;
private int scoreRank;
private int maxCombo;
private int totalCombo;
private int maxSync;
private int totalSync;
private int tapCriticalPerfect;
private int tapPerfect;
private int tapGreat;
private int tapGood;
private int tapMiss;
private int holdCriticalPerfect;
private int holdPerfect;
private int holdGreat;
private int holdGood;
private int holdMiss;
private int slideCriticalPerfect;
private int slidePerfect;
private int slideGreat;
private int slideGood;
private int slideMiss;
private int touchCriticalPerfect;
private int touchPerfect;
private int touchGreat;
private int touchGood;
private int touchMiss;
private int breakCriticalPerfect;
private int breakPerfect;
private int breakGreat;
private int breakGood;
private int breakMiss;
@JsonProperty("Tap")
private boolean isTap;
@JsonProperty("Hold")
private boolean isHold;
@JsonProperty("Slide")
private boolean isSlide;
@JsonProperty("Touch")
private boolean isTouch;
@JsonProperty("Break")
private boolean isBreak;
@JsonProperty("CriticalDisp")
private boolean isCriticalDisp;
@JsonProperty("FastLateDisp")
private boolean isFastLateDisp;
private int fastCount;
private int lateCount;
@JsonProperty("AchieveNewRecord")
private boolean isAchieveNewRecord;
@JsonProperty("DeluxscoreNewRecord")
private boolean isDeluxscoreNewRecord;
private int comboStatus;
private int syncStatus;
@JsonProperty("Clear")
private boolean isClear;
private int beforeRating;
private int afterRating;
private int beforeGrade;
private int afterGrade;
private int afterGradeRank;
private int beforeDeluxRating;
private int afterDeluxRating;
@JsonProperty("PlayTutorial")
private boolean isPlayTutorial;
@JsonProperty("EventMode")
private boolean isEventMode;
@JsonProperty("FreedomMode")
private boolean isFreedomMode;
private int playMode;
@JsonProperty("NewFree")
private boolean isNewFree;
private int extNum1;
private int extNum2;
}

View File

@ -0,0 +1,118 @@
CREATE TABLE maimai2_game_event (
id BIGINT auto_increment PRIMARY KEY,
type INTEGER NOT NULL,
start_date VARCHAR (255),
end_date VARCHAR (255),
enable BOOLEAN NOT NULL
);
CREATE TABLE maimai2_user_playlog (
id BIGINT auto_increment PRIMARY KEY,
order_id INTEGER,
playlog_id BIGINT,
version INTEGER,
place_id INTEGER,
place_name VARCHAR (255),
login_date BIGINT,
play_date VARCHAR (255),
user_play_date VARCHAR (255),
type INTEGER,
music_id INTEGER,
level INTEGER,
track_no INTEGER,
vs_mode INTEGER,
vs_user_name VARCHAR (255),
vs_status INTEGER,
vs_user_rating INTEGER,
vs_user_achievement INTEGER,
vs_user_grade_rank INTEGER,
vs_rank INTEGER,
player_num INTEGER,
played_user_id1 BIGINT,
played_user_name1 VARCHAR (255),
played_music_level1 INTEGER,
played_user_id2 BIGINT,
played_user_name2 VARCHAR (255),
played_music_level2 INTEGER,
played_user_id3 BIGINT,
played_user_name3 VARCHAR (255),
played_music_level3 INTEGER,
character_id1 INTEGER,
character_level1 INTEGER,
character_awakening1 INTEGER,
character_id2 INTEGER,
character_level2 INTEGER,
character_awakening2 INTEGER,
character_id3 INTEGER,
character_level3 INTEGER,
character_awakening3 INTEGER,
character_id4 INTEGER,
character_level4 INTEGER,
character_awakening4 INTEGER,
character_id5 INTEGER,
character_level5 INTEGER,
character_awakening5 INTEGER,
achievement INTEGER,
deluxscore INTEGER,
score_rank INTEGER,
max_combo INTEGER,
total_combo INTEGER,
max_sync INTEGER,
total_sync INTEGER,
tap_critical_perfect INTEGER,
tap_perfect INTEGER,
tap_great INTEGER,
tap_good INTEGER,
tap_miss INTEGER,
hold_critical_perfect INTEGER,
hold_perfect INTEGER,
hold_great INTEGER,
hold_good INTEGER,
hold_miss INTEGER,
slide_critical_perfect INTEGER,
slide_perfect INTEGER,
slide_great INTEGER,
slide_good INTEGER,
slide_miss INTEGER,
touch_critical_perfect INTEGER,
touch_perfect INTEGER,
touch_great INTEGER,
touch_good INTEGER,
touch_miss INTEGER,
break_critical_perfect INTEGER,
break_perfect INTEGER,
break_great INTEGER,
break_good INTEGER,
break_miss INTEGER,
is_tap BOOLEAN,
is_hold BOOLEAN,
is_slide BOOLEAN,
is_touch BOOLEAN,
is_break BOOLEAN,
is_critical_disp BOOLEAN,
is_fast_late_disp BOOLEAN,
fast_count INTEGER,
late_count INTEGER,
is_achieve_new_record BOOLEAN,
is_deluxscore_new_record BOOLEAN,
combo_status INTEGER,
sync_status INTEGER,
is_clear BOOLEAN,
before_rating INTEGER,
after_rating INTEGER,
before_grade INTEGER,
after_grade INTEGER,
after_grade_rank INTEGER,
before_delux_rating INTEGER,
after_delux_rating INTEGER,
is_play_tutorial BOOLEAN,
is_event_mode BOOLEAN,
is_freedom_mode BOOLEAN,
play_mode INTEGER,
is_new_free BOOLEAN,
ext_num1 INTEGER,
ext_num2 INTEGER,
user_id BIGINT,
constraint FKcszan6hmc7eyjp37
foreign key (user_id) references maimai2_user_detail (id)
);

View File

@ -0,0 +1,122 @@
CREATE TABLE maimai2_game_event (
id INTEGER NOT NULL,
type INTEGER NOT NULL,
start_date VARCHAR (255),
end_date VARCHAR (255),
enable BOOLEAN NOT NULL,
PRIMARY KEY (
id
)
);
CREATE TABLE maimai2_user_playlog (
id INTEGER,
order_id INTEGER,
playlog_id BIGINT,
version INTEGER,
place_id INTEGER,
place_name VARCHAR (255),
login_date BIGINT,
play_date VARCHAR (255),
user_play_date VARCHAR (255),
type INTEGER,
music_id INTEGER,
level INTEGER,
track_no INTEGER,
vs_mode INTEGER,
vs_user_name VARCHAR (255),
vs_status INTEGER,
vs_user_rating INTEGER,
vs_user_achievement INTEGER,
vs_user_grade_rank INTEGER,
vs_rank INTEGER,
player_num INTEGER,
played_user_id1 BIGINT,
played_user_name1 VARCHAR (255),
played_music_level1 INTEGER,
played_user_id2 BIGINT,
played_user_name2 VARCHAR (255),
played_music_level2 INTEGER,
played_user_id3 BIGINT,
played_user_name3 VARCHAR (255),
played_music_level3 INTEGER,
character_id1 INTEGER,
character_level1 INTEGER,
character_awakening1 INTEGER,
character_id2 INTEGER,
character_level2 INTEGER,
character_awakening2 INTEGER,
character_id3 INTEGER,
character_level3 INTEGER,
character_awakening3 INTEGER,
character_id4 INTEGER,
character_level4 INTEGER,
character_awakening4 INTEGER,
character_id5 INTEGER,
character_level5 INTEGER,
character_awakening5 INTEGER,
achievement INTEGER,
deluxscore INTEGER,
score_rank INTEGER,
max_combo INTEGER,
total_combo INTEGER,
max_sync INTEGER,
total_sync INTEGER,
tap_critical_perfect INTEGER,
tap_perfect INTEGER,
tap_great INTEGER,
tap_good INTEGER,
tap_miss INTEGER,
hold_critical_perfect INTEGER,
hold_perfect INTEGER,
hold_great INTEGER,
hold_good INTEGER,
hold_miss INTEGER,
slide_critical_perfect INTEGER,
slide_perfect INTEGER,
slide_great INTEGER,
slide_good INTEGER,
slide_miss INTEGER,
touch_critical_perfect INTEGER,
touch_perfect INTEGER,
touch_great INTEGER,
touch_good INTEGER,
touch_miss INTEGER,
break_critical_perfect INTEGER,
break_perfect INTEGER,
break_great INTEGER,
break_good INTEGER,
break_miss INTEGER,
is_tap BOOLEAN,
is_hold BOOLEAN,
is_slide BOOLEAN,
is_touch BOOLEAN,
is_break BOOLEAN,
is_critical_disp BOOLEAN,
is_fast_late_disp BOOLEAN,
fast_count INTEGER,
late_count INTEGER,
is_achieve_new_record BOOLEAN,
is_deluxscore_new_record BOOLEAN,
combo_status INTEGER,
sync_status INTEGER,
is_clear BOOLEAN,
before_rating INTEGER,
after_rating INTEGER,
before_grade INTEGER,
after_grade INTEGER,
after_grade_rank INTEGER,
before_delux_rating INTEGER,
after_delux_rating INTEGER,
is_play_tutorial BOOLEAN,
is_event_mode BOOLEAN,
is_freedom_mode BOOLEAN,
play_mode INTEGER,
is_new_free BOOLEAN,
ext_num1 INTEGER,
ext_num2 INTEGER,
user_id BIGINT REFERENCES maimai2_user_detail (id) ON DELETE CASCADE,
PRIMARY KEY (
id
)
);