+2
-2
@@ -42,8 +42,8 @@
|
||||
"new_achievement_cnt": 5,
|
||||
"unaccomplished_achievement_cnt": 15,
|
||||
"live_daily_reward_exist": false,
|
||||
"training_energy": 10,
|
||||
"training_energy_max": 10,
|
||||
"training_energy": 999,
|
||||
"training_energy_max": 999,
|
||||
"notification": {
|
||||
"push": true,
|
||||
"lp": true,
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"response_data": [],
|
||||
"release_info": [],
|
||||
"status_code": 200
|
||||
}
|
||||
@@ -0,0 +1,215 @@
|
||||
{
|
||||
"response_data": {
|
||||
"party_list": [
|
||||
{
|
||||
"user_info": {
|
||||
"user_id": 5762285,
|
||||
"name": "\u840c\u840c\u5ba1\u795e\u8005",
|
||||
"level": 21
|
||||
},
|
||||
"center_unit_info": {
|
||||
"unit_owning_user_id": 1000880096808,
|
||||
"unit_id": 855,
|
||||
"exp": 4394,
|
||||
"next_exp": 4560,
|
||||
"level": 11,
|
||||
"level_limit_id": 2,
|
||||
"max_level": 100,
|
||||
"rank": 2,
|
||||
"max_rank": 2,
|
||||
"love": 20,
|
||||
"max_love": 1000,
|
||||
"unit_skill_level": 1,
|
||||
"max_hp": 4,
|
||||
"favorite_flag": false,
|
||||
"display_rank": 2,
|
||||
"unit_skill_exp": 0,
|
||||
"unit_removable_skill_capacity": 4,
|
||||
"attribute": 1,
|
||||
"smile": 3540,
|
||||
"cute": 2410,
|
||||
"cool": 2870,
|
||||
"is_love_max": false,
|
||||
"is_level_max": false,
|
||||
"is_rank_max": true,
|
||||
"is_signed": false,
|
||||
"is_skill_level_max": false,
|
||||
"setting_award_id": 17,
|
||||
"removable_skill_ids": []
|
||||
},
|
||||
"setting_award_id": 17,
|
||||
"available_social_point": 10,
|
||||
"friend_status": 1
|
||||
},
|
||||
{
|
||||
"user_info": {
|
||||
"user_id": 5400659,
|
||||
"name": "\u9ed1\u6850-",
|
||||
"level": 37
|
||||
},
|
||||
"center_unit_info": {
|
||||
"unit_owning_user_id": 1001193273786,
|
||||
"unit_id": 13,
|
||||
"exp": 0,
|
||||
"next_exp": 6,
|
||||
"level": 1,
|
||||
"level_limit_id": 0,
|
||||
"max_level": 30,
|
||||
"rank": 1,
|
||||
"max_rank": 2,
|
||||
"love": 25,
|
||||
"max_love": 25,
|
||||
"unit_skill_level": 1,
|
||||
"max_hp": 2,
|
||||
"favorite_flag": false,
|
||||
"display_rank": 1,
|
||||
"unit_skill_exp": 0,
|
||||
"unit_removable_skill_capacity": 0,
|
||||
"attribute": 1,
|
||||
"smile": 1520,
|
||||
"cute": 550,
|
||||
"cool": 308,
|
||||
"is_love_max": false,
|
||||
"is_level_max": false,
|
||||
"is_rank_max": false,
|
||||
"is_signed": false,
|
||||
"is_skill_level_max": true,
|
||||
"setting_award_id": 17,
|
||||
"removable_skill_ids": []
|
||||
},
|
||||
"setting_award_id": 17,
|
||||
"available_social_point": 10,
|
||||
"friend_status": 1
|
||||
},
|
||||
{
|
||||
"user_info": {
|
||||
"user_id": 7663163,
|
||||
"name": "\u82b1\u82b1\u82b1\u6912",
|
||||
"level": 30
|
||||
},
|
||||
"center_unit_info": {
|
||||
"unit_owning_user_id": 1002061904425,
|
||||
"unit_id": 1131,
|
||||
"exp": 8400,
|
||||
"next_exp": 8659,
|
||||
"level": 18,
|
||||
"level_limit_id": 1,
|
||||
"max_level": 100,
|
||||
"rank": 2,
|
||||
"max_rank": 2,
|
||||
"love": 1000,
|
||||
"max_love": 1000,
|
||||
"unit_skill_level": 1,
|
||||
"max_hp": 5,
|
||||
"favorite_flag": true,
|
||||
"display_rank": 2,
|
||||
"unit_skill_exp": 0,
|
||||
"unit_removable_skill_capacity": 4,
|
||||
"attribute": 3,
|
||||
"smile": 3195,
|
||||
"cute": 2925,
|
||||
"cool": 4085,
|
||||
"is_love_max": true,
|
||||
"is_level_max": false,
|
||||
"is_rank_max": true,
|
||||
"is_signed": false,
|
||||
"is_skill_level_max": false,
|
||||
"setting_award_id": 17,
|
||||
"removable_skill_ids": []
|
||||
},
|
||||
"setting_award_id": 17,
|
||||
"available_social_point": 5,
|
||||
"friend_status": 0
|
||||
},
|
||||
{
|
||||
"user_info": {
|
||||
"user_id": 7663313,
|
||||
"name": "\u67f3\u4e95\u4e0e\u5b50",
|
||||
"level": 34
|
||||
},
|
||||
"center_unit_info": {
|
||||
"unit_owning_user_id": 1002062097329,
|
||||
"unit_id": 1372,
|
||||
"exp": 79700,
|
||||
"next_exp": 0,
|
||||
"level": 100,
|
||||
"level_limit_id": 1,
|
||||
"max_level": 100,
|
||||
"rank": 2,
|
||||
"max_rank": 2,
|
||||
"love": 1000,
|
||||
"max_love": 1000,
|
||||
"unit_skill_level": 1,
|
||||
"max_hp": 6,
|
||||
"favorite_flag": true,
|
||||
"display_rank": 2,
|
||||
"unit_skill_exp": 0,
|
||||
"unit_removable_skill_capacity": 4,
|
||||
"attribute": 1,
|
||||
"smile": 5370,
|
||||
"cute": 4080,
|
||||
"cool": 4500,
|
||||
"is_love_max": true,
|
||||
"is_level_max": true,
|
||||
"is_rank_max": true,
|
||||
"is_signed": false,
|
||||
"is_skill_level_max": false,
|
||||
"setting_award_id": 17,
|
||||
"removable_skill_ids": [
|
||||
3,
|
||||
2,
|
||||
1
|
||||
]
|
||||
},
|
||||
"setting_award_id": 17,
|
||||
"available_social_point": 5,
|
||||
"friend_status": 0
|
||||
},
|
||||
{
|
||||
"user_info": {
|
||||
"user_id": 7663527,
|
||||
"name": "\u6211\u63a8\u5c06\u519b",
|
||||
"level": 15
|
||||
},
|
||||
"center_unit_info": {
|
||||
"unit_owning_user_id": 1002062228744,
|
||||
"unit_id": 1912,
|
||||
"exp": 0,
|
||||
"next_exp": 201,
|
||||
"level": 1,
|
||||
"level_limit_id": 1,
|
||||
"max_level": 100,
|
||||
"rank": 2,
|
||||
"max_rank": 2,
|
||||
"love": 444,
|
||||
"max_love": 1000,
|
||||
"unit_skill_level": 1,
|
||||
"max_hp": 5,
|
||||
"favorite_flag": false,
|
||||
"display_rank": 2,
|
||||
"unit_skill_exp": 0,
|
||||
"unit_removable_skill_capacity": 4,
|
||||
"attribute": 1,
|
||||
"smile": 3870,
|
||||
"cute": 3090,
|
||||
"cool": 2470,
|
||||
"is_love_max": false,
|
||||
"is_level_max": false,
|
||||
"is_rank_max": true,
|
||||
"is_signed": false,
|
||||
"is_skill_level_max": false,
|
||||
"setting_award_id": 1,
|
||||
"removable_skill_ids": []
|
||||
},
|
||||
"setting_award_id": 1,
|
||||
"available_social_point": 5,
|
||||
"friend_status": 0
|
||||
}
|
||||
],
|
||||
"training_energy": 999,
|
||||
"training_energy_max": 999,
|
||||
"server_timestamp": 1679802984
|
||||
},
|
||||
"release_info": [],
|
||||
"status_code": 200
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+143
@@ -0,0 +1,143 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"honoka-chan/config"
|
||||
"honoka-chan/database"
|
||||
"honoka-chan/encrypt"
|
||||
"honoka-chan/utils"
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func PartyListHandler(ctx *gin.Context) {
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
authToken, err := utils.GetAuthorizeToken(authorizeStr)
|
||||
if err != nil {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
userId := ctx.Request.Header[http.CanonicalHeaderKey("User-ID")]
|
||||
if len(userId) == 0 {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
if !database.MatchTokenUid(authToken, userId[0]) {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
nonce, err := utils.GetAuthorizeNonce(authorizeStr)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
nonce++
|
||||
|
||||
respTime := time.Now().Unix()
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
resp := utils.ReadAllText("assets/partylist.json")
|
||||
xms := encrypt.RSA_Sign_SHA1([]byte(resp), "privatekey.pem")
|
||||
xms64 := base64.RawStdEncoding.EncodeToString(xms)
|
||||
|
||||
ctx.Header("Server-Version", config.Conf.Server.VersionNumber)
|
||||
ctx.Header("user_id", userId[0])
|
||||
ctx.Header("authorize", newAuthorizeStr)
|
||||
ctx.Header("X-Message-Sign", xms64)
|
||||
ctx.String(http.StatusOK, resp)
|
||||
}
|
||||
|
||||
func PlayLiveHandler(ctx *gin.Context) {
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
authToken, err := utils.GetAuthorizeToken(authorizeStr)
|
||||
if err != nil {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
userId := ctx.Request.Header[http.CanonicalHeaderKey("User-ID")]
|
||||
if len(userId) == 0 {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
if !database.MatchTokenUid(authToken, userId[0]) {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
nonce, err := utils.GetAuthorizeNonce(authorizeStr)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
nonce++
|
||||
|
||||
respTime := time.Now().Unix()
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
resp := utils.ReadAllText("assets/playsong.json")
|
||||
xms := encrypt.RSA_Sign_SHA1([]byte(resp), "privatekey.pem")
|
||||
xms64 := base64.RawStdEncoding.EncodeToString(xms)
|
||||
|
||||
ctx.Header("Server-Version", config.Conf.Server.VersionNumber)
|
||||
ctx.Header("user_id", userId[0])
|
||||
ctx.Header("authorize", newAuthorizeStr)
|
||||
ctx.Header("X-Message-Sign", xms64)
|
||||
ctx.String(http.StatusOK, resp)
|
||||
}
|
||||
|
||||
func GameOverHandler(ctx *gin.Context) {
|
||||
reqTime := time.Now().Unix()
|
||||
|
||||
authorizeStr := ctx.Request.Header["Authorize"]
|
||||
authToken, err := utils.GetAuthorizeToken(authorizeStr)
|
||||
if err != nil {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
userId := ctx.Request.Header[http.CanonicalHeaderKey("User-ID")]
|
||||
if len(userId) == 0 {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
if !database.MatchTokenUid(authToken, userId[0]) {
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
|
||||
nonce, err := utils.GetAuthorizeNonce(authorizeStr)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
ctx.String(http.StatusForbidden, "Fuck you!")
|
||||
return
|
||||
}
|
||||
nonce++
|
||||
|
||||
respTime := time.Now().Unix()
|
||||
newAuthorizeStr := fmt.Sprintf("consumerKey=lovelive_test&timeStamp=%d&version=1.1&token=%s&nonce=%d&user_id=%s&requestTimeStamp=%d", respTime, authToken, nonce, userId[0], reqTime)
|
||||
// fmt.Println(newAuthorizeStr)
|
||||
|
||||
resp := utils.ReadAllText("assets/gameover.json")
|
||||
xms := encrypt.RSA_Sign_SHA1([]byte(resp), "privatekey.pem")
|
||||
xms64 := base64.RawStdEncoding.EncodeToString(xms)
|
||||
|
||||
ctx.Header("Server-Version", config.Conf.Server.VersionNumber)
|
||||
ctx.Header("user_id", userId[0])
|
||||
ctx.Header("authorize", newAuthorizeStr)
|
||||
ctx.Header("X-Message-Sign", xms64)
|
||||
ctx.String(http.StatusOK, resp)
|
||||
}
|
||||
@@ -46,6 +46,9 @@ func main() {
|
||||
r.POST("/main.php/user/changeNavi", handler.SetNotificationTokenHandler)
|
||||
r.POST("/main.php/event/eventList", handler.EventListHandler)
|
||||
r.POST("/main.php/payment/productList", handler.ProductListHandler)
|
||||
r.POST("/main.php/live/partyList", handler.PartyListHandler)
|
||||
r.POST("/main.php/live/play", handler.PlayLiveHandler)
|
||||
r.POST("/main.php/live/gameover", handler.GameOverHandler)
|
||||
|
||||
r.Run(":8080") // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
|
||||
}
|
||||
|
||||
@@ -88,3 +88,68 @@ type LiveScheduleResp struct {
|
||||
CommandNum bool `json:"commandNum"`
|
||||
TimeStamp int64 `json:"timeStamp"`
|
||||
}
|
||||
|
||||
// Play
|
||||
type RankInfo struct {
|
||||
Rank int `json:"rank"`
|
||||
RankMin int `json:"rank_min"`
|
||||
RankMax int `json:"rank_max"`
|
||||
}
|
||||
|
||||
type NotesList struct {
|
||||
TimingSec float64 `json:"timing_sec"`
|
||||
NotesAttribute int `json:"notes_attribute"`
|
||||
NotesLevel int `json:"notes_level"`
|
||||
Effect int `json:"effect"`
|
||||
EffectValue int `json:"effect_value"`
|
||||
Position int `json:"position"`
|
||||
}
|
||||
|
||||
type LiveInfo struct {
|
||||
LiveDifficultyID int `json:"live_difficulty_id"`
|
||||
IsRandom bool `json:"is_random"`
|
||||
AcFlag int `json:"ac_flag"`
|
||||
SwingFlag int `json:"swing_flag"`
|
||||
NotesList []NotesList `json:"notes_list"`
|
||||
}
|
||||
|
||||
type PlayCostume struct {
|
||||
UnitID int `json:"unit_id"`
|
||||
IsRankMax bool `json:"is_rank_max"`
|
||||
IsSigned bool `json:"is_signed"`
|
||||
}
|
||||
|
||||
type UnitList struct {
|
||||
Smile int `json:"smile"`
|
||||
Cute int `json:"cute"`
|
||||
Cool int `json:"cool"`
|
||||
Costume PlayCostume `json:"costume,omitempty"`
|
||||
}
|
||||
|
||||
type DeckInfo struct {
|
||||
UnitDeckID int `json:"unit_deck_id"`
|
||||
TotalSmile int `json:"total_smile"`
|
||||
TotalCute int `json:"total_cute"`
|
||||
TotalCool int `json:"total_cool"`
|
||||
TotalHp int `json:"total_hp"`
|
||||
PreparedHpDamage int `json:"prepared_hp_damage"`
|
||||
UnitList []UnitList `json:"unit_list"`
|
||||
}
|
||||
|
||||
type PlayLiveList struct {
|
||||
LiveInfo LiveInfo `json:"live_info"`
|
||||
DeckInfo DeckInfo `json:"deck_info"`
|
||||
}
|
||||
|
||||
type PlayResponseData struct {
|
||||
RankInfo []RankInfo `json:"rank_info"`
|
||||
EnergyFullTime string `json:"energy_full_time"`
|
||||
OverMaxEnergy int `json:"over_max_energy"`
|
||||
AvailableLiveResume bool `json:"available_live_resume"`
|
||||
LiveList []PlayLiveList `json:"live_list"`
|
||||
IsMarathonEvent bool `json:"is_marathon_event"`
|
||||
MarathonEventID interface{} `json:"marathon_event_id"`
|
||||
NoSkill bool `json:"no_skill"`
|
||||
CanActivateEffect bool `json:"can_activate_effect"`
|
||||
ServerTimestamp int `json:"server_timestamp"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user