diff --git a/app/controller/dyPushController.go b/app/controller/dyPushController.go index b77ef08071ad998e9b9aa401d1ebd036bfee6439..013835de2fe59b8d7b17d36fe52a054085cced3d 100644 --- a/app/controller/dyPushController.go +++ b/app/controller/dyPushController.go @@ -180,7 +180,7 @@ func (h *dyPushController) dyPushPingLun(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } diff --git a/app/controller/httpController.go b/app/controller/httpController.go index 8083de9051676d61102700ef36214732b1e06efb..d568dec439919c246fd2d7d237ce603a3a9807f0 100644 --- a/app/controller/httpController.go +++ b/app/controller/httpController.go @@ -702,7 +702,7 @@ func (h *HttpController) GetPingLun(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } @@ -890,7 +890,7 @@ func (h *HttpController) getPingLunChuanQi(c *gin.Context) { UserName: existingUser.UserName, HeadImg: existingUser.HeadImg, Level: existingUser.Level, - Rank: existingUser.Rank, + UserRank: existingUser.UserRank, Score: existingUser.Score, }) } diff --git a/app/controller/indexController.go b/app/controller/indexController.go index 74bd116a54cccece054a22d560d834713a3906a4..3810a0c5cc517e664845d0c75d48fe7818098bf0 100644 --- a/app/controller/indexController.go +++ b/app/controller/indexController.go @@ -227,6 +227,8 @@ func (i *IndexController) HandleStartGameMessage(conn *websocket.Conn, msg Messa Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -303,6 +305,8 @@ func (i *IndexController) HandleEndGameMessage(conn *websocket.Conn, msg Message Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -437,6 +441,8 @@ func (i *IndexController) GenerateScoreMessage(currentScore int) models.LiveEven Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) diff --git a/app/manager/gift_record_manager.go b/app/manager/gift_record_manager.go index 178949cbd7db7b4bddb8ea04f17da3113f898565..8bab313da01ac25a369eafe65a33ac9da7fc63df 100644 --- a/app/manager/gift_record_manager.go +++ b/app/manager/gift_record_manager.go @@ -48,6 +48,7 @@ type GiftRecordWithUserInfo struct { Value int `json:"value"` TotalValue int `json:"total_value"` Score int `json:"score"` + WinPoint int `json:"win_point"` TotalScore int `json:"total_score"` GiftLevel int `json:"gift_level"` GiftUpgrading int `json:"gift_upgrading"` @@ -290,6 +291,7 @@ func (grm *GiftRecordManager) GetGiftRecordWithUserInfoByLiveRoomAndTimes(liveRo Value: recordInfo.OneValue, // Value 对应 单个礼物的value TotalValue: recordInfo.TotalValue, Score: recordInfo.Score, + WinPoint: recordInfo.WinPoint, TotalScore: recordInfo.TotalScore, GiftLevel: recordInfo.GiftLevel, GiftUpgrading: recordInfo.GiftUpgrading, diff --git a/app/manager/gift_record_mysql_storage.go b/app/manager/gift_record_mysql_storage.go index e8a18f74eb7f9746a99fb2ba4a4689c52c0dfdea..d9c9b2f83a8f6641ee54361022f46cbd6c28fed7 100644 --- a/app/manager/gift_record_mysql_storage.go +++ b/app/manager/gift_record_mysql_storage.go @@ -43,6 +43,7 @@ type GiftRecordWithUserInfoMysqlInfo struct { OneValue int `db:"one_value"` TotalValue int `db:"total_value"` Score int `db:"score"` + WinPoint int `db:"win_point"` TotalScore int `db:"total_score"` GiftLevel int `db:"gift_level"` GiftUpgrading int `db:"gift_upgrading"` @@ -336,7 +337,7 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l SELECT grs.msg_id, grs.live_room_id, grs.times, grs.track, grs.job, grs.user_id, grs.gift_id, grs.gift_name, grs.amount, grs.one_value, grs.total_value, grs.score, grs.total_score, grs.gift_level, grs.gift_upgrading, - us.user_name, us.head_img, us.level, us.score, us.expire_at, + us.user_name, us.head_img, us.level, us.score, us.win_point, us.expire_at, grs.create_at, grs.update_at FROM gift_records grs left join users us on us.user_id = grs.user_id @@ -380,6 +381,7 @@ func (grm *GiftRecordMysqlStorage) GetGiftRecordWithUserInfoByLiveRoomAndTimes(l &record.UserHeadImg, &record.UserLevel, &record.UserScore, + &record.WinPoint, &record.ExpireAt, &record.CreateAt, &record.UpdateAt, diff --git a/app/manager/live_room_mamanger.go b/app/manager/live_room_mamanger.go index 168b9d48fa98497aa8a9c2751c8f39ddd634cde7..8cb77ae99729e03cf336de7ab07e5b5094ddd438 100644 --- a/app/manager/live_room_mamanger.go +++ b/app/manager/live_room_mamanger.go @@ -288,35 +288,39 @@ func (lrm *LiveRoomManager) BatchInsertLiveRoomResults(results []models.LiveRoom var mysqlResults []LiveRoomResultMysqlInfo for _, result := range results { mysqlResults = append(mysqlResults, LiveRoomResultMysqlInfo{ - LiveRoomID: result.LiveRoomID, - Times: result.Times, - UserID: result.UserID, - GameScore: result.GameScore, - Track: result.Track, - Job: result.Job, - IsChampion: result.IsChampion, - IsFinish: result.IsFinish, - IsBiggest: result.IsBiggest, - GiftValue: result.GiftValue, - GiftScore: result.GiftScore, - GetScore: result.GetScore, - HasDone: result.HasDone, - UserName: result.UserName, - HeadImg: result.HeadImg, - UserLevel: result.UserLevel, - UserScore: result.UserScore, - TargetLevel: result.TargetLevel, - TargetScore: result.TargetScore, - Mileage: result.Mileage, - JumpHeight: result.JumpHeight, - FinishTime: result.FinishTime, - FinishTime1: result.FinishTime1, - FinishTime2: result.FinishTime2, - FastestSpeed: result.FastestSpeed, - AttackPower: result.AttackPower, - ExpireAt: result.ExpireAt, - CreateAt: result.CreateAt, - UpdateAt: result.UpdateAt, + LiveRoomID: result.LiveRoomID, + Times: result.Times, + UserID: result.UserID, + GameScore: result.GameScore, + Track: result.Track, + Job: result.Job, + IsChampion: result.IsChampion, + IsFinish: result.IsFinish, + IsBiggest: result.IsBiggest, + GiftValue: result.GiftValue, + GiftScore: result.GiftScore, + GetExtraScore: result.GetExtraScore, + GetScore: result.GetScore, + NowWinPoint: result.NowWinPoint, + ChangeWinPoint: result.ChangeWinPoint, + TargetWinPoint: result.TargetWinPoint, + HasDone: result.HasDone, + UserName: result.UserName, + HeadImg: result.HeadImg, + UserLevel: result.UserLevel, + UserScore: result.UserScore, + TargetLevel: result.TargetLevel, + TargetScore: result.TargetScore, + Mileage: result.Mileage, + JumpHeight: result.JumpHeight, + FinishTime: result.FinishTime, + FinishTime1: result.FinishTime1, + FinishTime2: result.FinishTime2, + FastestSpeed: result.FastestSpeed, + AttackPower: result.AttackPower, + ExpireAt: result.ExpireAt, + CreateAt: result.CreateAt, + UpdateAt: result.UpdateAt, }) } diff --git a/app/manager/live_room_mysql_storage.go b/app/manager/live_room_mysql_storage.go index 2221b1e7a2edc06ab5283650c612e15ddf7257cd..a929d33d543e1ab3fdbeb6aaaa9e80cf2ad7b988 100644 --- a/app/manager/live_room_mysql_storage.go +++ b/app/manager/live_room_mysql_storage.go @@ -51,36 +51,40 @@ type LiveTrackWithUserMysqlInfo struct { // LiveRoomResultMysqlInfo 表示 live_room_result 表的结构 type LiveRoomResultMysqlInfo struct { - LiveRoomID string `db:"live_room_id"` - Times int `db:"times"` - UserID string `db:"user_id"` - GameScore int `db:"game_score"` - Track int `db:"track"` - Job int `db:"job"` - IsChampion int `db:"is_champion"` - IsFinish int `db:"is_finish"` - IsBiggest int `db:"is_biggest"` - GiftValue int `db:"gift_value"` - GiftScore int `db:"gift_score"` - GetScore int `db:"get_score"` - HasDone int `db:"has_done"` - UserName string `db:"user_name"` - HeadImg string `db:"head_img"` - UserLevel int `db:"user_level"` - UserScore int `db:"user_score"` - TargetLevel int `db:"target_level"` - TargetScore int `db:"target_score"` - Mileage int `db:"mileage"` - JumpHeight float32 `db:"jump_height"` - FinishTime int `db:"jump_height"` - FinishTime1 int `db:"jump_height1"` - FinishTime2 int `db:"jump_height2"` - FastestSpeed int `db:"jump_height"` - AttackPower int `db:"attack_power"` - ExpireAt sql.NullTime `db:"expire_at"` - CreateAt sql.NullTime `db:"create_at"` - UpdateAt sql.NullTime `db:"update_at"` - TotalRank int `db:"total_rank"` + LiveRoomID string `db:"live_room_id"` + Times int `db:"times"` + UserID string `db:"user_id"` + GameScore int `db:"game_score"` + Track int `db:"track"` + Job int `db:"job"` + IsChampion int `db:"is_champion"` + IsFinish int `db:"is_finish"` + IsBiggest int `db:"is_biggest"` + GiftValue int `db:"gift_value"` + GiftScore int `db:"gift_score"` + GetExtraScore int `db:"get_extra_score"` + GetScore int `db:"get_score"` + NowWinPoint int `db:"now_win_point"` + ChangeWinPoint int `db:"change_win_point"` + TargetWinPoint int `db:"target_win_point"` + HasDone int `db:"has_done"` + UserName string `db:"user_name"` + HeadImg string `db:"head_img"` + UserLevel int `db:"user_level"` + UserScore int `db:"user_score"` + TargetLevel int `db:"target_level"` + TargetScore int `db:"target_score"` + Mileage int `db:"mileage"` + JumpHeight float32 `db:"jump_height"` + FinishTime int `db:"jump_height"` + FinishTime1 int `db:"jump_height1"` + FinishTime2 int `db:"jump_height2"` + FastestSpeed int `db:"jump_height"` + AttackPower int `db:"attack_power"` + ExpireAt sql.NullTime `db:"expire_at"` + CreateAt sql.NullTime `db:"create_at"` + UpdateAt sql.NullTime `db:"update_at"` + TotalRank int `db:"total_rank"` } type GameDataMysqlInfo struct { @@ -403,10 +407,11 @@ func (lrm *LiveRoomMysqlStorage) GetLiveTrackInfosWithUserInfoByTime(liveRoomId func (lrm *LiveRoomMysqlStorage) BatchInsertLiveRoomResults(results []LiveRoomResultMysqlInfo) error { stmt, err := db.GetDB().Prepare(`INSERT INTO live_room_result ( live_room_id, times, user_id, game_score, track, job, is_champion, is_finish, is_biggest, gift_value, gift_score, - get_score, has_done, user_name, head_img, user_level, user_score, target_level, target_score, - mileage, jump_height, finish_time, finish_time1, finish_time2, fastest_speed, attack_power, + get_extra_score, get_score, has_done, user_name, head_img, user_level, user_score, target_level, target_score, + now_win_point, change_win_point, target_win_point, + mileage, jump_height, finish_time, finish_time1, finish_time2, fastest_speed, attack_power, expire_at, create_at, update_at - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`) if err != nil { return fmt.Errorf("prepare statement error: %v", err) } @@ -415,9 +420,10 @@ func (lrm *LiveRoomMysqlStorage) BatchInsertLiveRoomResults(results []LiveRoomRe for _, result := range results { _, err := stmt.Exec( result.LiveRoomID, result.Times, result.UserID, result.GameScore, result.Track, result.Job, - result.IsChampion, result.IsFinish, result.IsBiggest, result.GiftValue, result.GiftScore, result.GetScore, + result.IsChampion, result.IsFinish, result.IsBiggest, result.GiftValue, result.GiftScore, result.GetExtraScore, result.GetScore, result.HasDone, result.UserName, result.HeadImg, result.UserLevel, result.UserScore, - result.TargetLevel, result.TargetScore, result.Mileage, result.JumpHeight, + result.TargetLevel, result.TargetScore, result.NowWinPoint, result.ChangeWinPoint, result.TargetWinPoint, + result.Mileage, result.JumpHeight, result.FinishTime, result.FinishTime1, result.FinishTime2, result.FastestSpeed, result.AttackPower, result.ExpireAt, ) diff --git a/app/manager/user_manager.go b/app/manager/user_manager.go index c3caa17e87d35102f0fc1a70b6ca49b286cabab2..5281bfc41e477d0e6d947d9bb6cade63f2b1d494 100644 --- a/app/manager/user_manager.go +++ b/app/manager/user_manager.go @@ -12,7 +12,8 @@ type UserInfo struct { UserName string HeadImg string Level int - Rank int + UserRank int + WinPoint int Score int } diff --git a/app/manager/user_mysql_storage.go b/app/manager/user_mysql_storage.go index 8472b501dadcf9550f6727b9b3a09917c4f9e8ec..212fb60cd82bcfb882ddfd12a94dfe07972ad18a 100644 --- a/app/manager/user_mysql_storage.go +++ b/app/manager/user_mysql_storage.go @@ -41,7 +41,7 @@ func (s *userMySQLStorage) InitializeUser(userID, userName, headImg string, leve func (um *userMySQLStorage) GetUser(userID string) (*UserInfo, error) { var user UserInfo err := db.GetDB().QueryRow(` - SELECT user_id, user_name, head_img, level, score + SELECT user_id, user_name, head_img, level, score, user_rank, win_point FROM users WHERE user_id = ? `, userID).Scan( @@ -50,6 +50,8 @@ func (um *userMySQLStorage) GetUser(userID string) (*UserInfo, error) { &user.HeadImg, &user.Level, &user.Score, + &user.UserRank, + &user.WinPoint, ) if err != nil { @@ -96,26 +98,42 @@ func (um *userMySQLStorage) UpdateScore(userID string, delta int) error { func (um *userMySQLStorage) SetUserScoreByLiveRoomResult() error { // 更新用户积分 _, err := db.GetDB().Exec(` - INSERT INTO users (user_id, user_name, head_img, score, mileage, jump_height) - SELECT - lrr.user_id , - ANY_VALUE ( u.user_name ) AS user_name,-- 随机取一个值(因主键依赖,实际唯一) - ANY_VALUE ( u.head_img ) AS head_img, - SUM( - COALESCE ( lrr.get_score, 0 )) AS total_score, - SUM( - COALESCE ( lrr.mileage, 0 )) AS total_mileage, - SUM( - COALESCE ( lrr.jump_height, 0 )) AS total_jump_height - FROM - live_room_result lrr - left JOIN users u ON lrr.user_id = u.user_id - GROUP BY - user_id - ON DUPLICATE KEY UPDATE score = VALUES(score), - mileage = VALUES(mileage), - jump_height = VALUES(jump_height), - updated_at = CURRENT_TIMESTAMP; + INSERT INTO users (user_id, user_name, head_img, score, win_point, mileage, jump_height, user_rank) + SELECT + user_id, + user_name, + head_img, + total_score, + total_win_point, + total_mileage, + total_jump_height, + CASE + WHEN total_score > 0 + THEN RANK() OVER (ORDER BY total_score DESC) + ELSE NULL + END AS user_rank + FROM ( + SELECT + lrr.user_id, + ANY_VALUE(lrr.user_name) AS user_name, + ANY_VALUE(lrr.head_img) AS head_img, + SUM(IF(lrr.get_score > 0, COALESCE(lrr.get_score, 0), 0)) AS total_score, + SUM(COALESCE(lrr.change_win_point, 0)) + + COUNT(CASE WHEN lrr.is_champion = 1 THEN 1 END) AS total_win_point, + SUM(COALESCE(lrr.mileage, 0)) AS total_mileage, + SUM(COALESCE(lrr.jump_height, 0)) AS total_jump_height + FROM live_room_result lrr + GROUP BY lrr.user_id + ) AS aggregated_data + ON DUPLICATE KEY UPDATE + score = VALUES(score), + win_point = VALUES(win_point), + mileage = VALUES(mileage), + jump_height = VALUES(jump_height), + user_name = VALUES(user_name), + head_img = VALUES(head_img), + user_rank = VALUES(user_rank), + updated_at = CURRENT_TIMESTAMP; `) if err != nil { return err diff --git a/app/models/models.go b/app/models/models.go index 2062a1a2e608641812c97b57e2bf76c95ca52153..8f3b328c9f37fbadd558cdb51d91ca61b1c97985 100644 --- a/app/models/models.go +++ b/app/models/models.go @@ -19,6 +19,8 @@ type LiveEventData struct { Data struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -54,36 +56,40 @@ type FinishTrackInfo struct { // LiveRoomResult 表示 live_room_result 表的结构 type LiveRoomResult struct { - LiveRoomID string `json:"live_room_id"` - Times int `json:"times"` - UserID string `json:"user_id"` - GameScore int `json:"game_score"` - Track int `json:"track"` - Job int `json:"job"` - IsChampion int `json:"is_champion"` - IsFinish int `json:"is_finish"` - IsBiggest int `json:"is_biggest"` - GiftValue int `json:"gift_value"` - GiftScore int `json:"gift_score"` - GetScore int `json:"get_score"` - HasDone int `json:"has_done"` - UserName string `json:"user_name"` - HeadImg string `json:"head_img"` - UserLevel int `json:"user_level"` - UserScore int `json:"user_score"` - TargetLevel int `json:"target_level"` - TargetScore int `json:"target_score"` - Mileage int `json:"mileage"` - JumpHeight float32 `json:"jump_height"` - FinishTime int `json:"finish_time"` - FinishTime1 int `json:"finish_time1"` - FinishTime2 int `json:"finish_time2"` - FastestSpeed int `json:"fastest_speed"` - AttackPower int `json:"attack_power"` - ExpireAt sql.NullTime `json:"expire_at"` - CreateAt sql.NullTime `json:"create_at"` - UpdateAt sql.NullTime `json:"update_at"` - TotalRank int `json:"total_rank"` + LiveRoomID string `json:"live_room_id"` + Times int `json:"times"` + UserID string `json:"user_id"` + GameScore int `json:"game_score"` + Track int `json:"track"` + Job int `json:"job"` + IsChampion int `json:"is_champion"` + IsFinish int `json:"is_finish"` + IsBiggest int `json:"is_biggest"` + GiftValue int `json:"gift_value"` + GiftScore int `json:"gift_score"` + GetScore int `json:"get_score"` + HasDone int `json:"has_done"` + UserName string `json:"user_name"` + HeadImg string `json:"head_img"` + UserLevel int `json:"user_level"` + UserScore int `json:"user_score"` + TargetLevel int `json:"target_level"` + GetExtraScore int `json:"get_extra_score"` + TargetScore int `json:"target_score"` + NowWinPoint int `json:"now_win_point"` + ChangeWinPoint int `json:"change_win_point"` + TargetWinPoint int `json:"target_win_point"` + Mileage int `json:"mileage"` + JumpHeight float32 `json:"jump_height"` + FinishTime int `json:"finish_time"` + FinishTime1 int `json:"finish_time1"` + FinishTime2 int `json:"finish_time2"` + FastestSpeed int `json:"fastest_speed"` + AttackPower int `json:"attack_power"` + ExpireAt sql.NullTime `json:"expire_at"` + CreateAt sql.NullTime `json:"create_at"` + UpdateAt sql.NullTime `json:"update_at"` + TotalRank int `json:"total_rank"` } type RankInfo struct { Index int `json:"index"` diff --git a/app/service/live_room_service.go b/app/service/live_room_service.go index 49249e63a042e4782909a6626195dc70ff938317..72a9c82bd24d125453fac43a73bc6d6159e720f9 100644 --- a/app/service/live_room_service.go +++ b/app/service/live_room_service.go @@ -8,6 +8,7 @@ import ( "fmt" "github.com/google/uuid" "github.com/gorilla/websocket" + "math" "strconv" "time" ) @@ -48,14 +49,18 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic userName := "" userHeadImg := "" level := 0 - UserScore := 0 + userScore := 0 + userRank := 0 + winPoint := 0 //userInfo, err := i.userManager.GetUser(userId) userInfo, err := manager.Get().UserManager().GetUser(userId) if err == nil { userName = userInfo.UserName userHeadImg = userInfo.HeadImg level = userInfo.Level - UserScore = userInfo.Score + userScore = userInfo.Score + userRank = userInfo.UserRank + winPoint = userInfo.WinPoint } if liveRoomID != utils.TestRoomId { @@ -71,6 +76,8 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -103,7 +110,9 @@ func (ls LiveRoomService) OneUserJoinTrack(liveRoomID string, userId string, nic Nickname: userName, Level: level, AvatarURL: userHeadImg, - UserScore: UserScore, + UserScore: userScore, + UserRank: userRank, + WinPoint: winPoint, Timestamp: now.UnixMilli(), }, } @@ -120,6 +129,8 @@ func (ls LiveRoomService) SendTestPingLunNoStoage(liveRoomID string, userId, use Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -295,6 +306,8 @@ func (ls LiveRoomService) OneUserSendGift(msgID string, liveRoomID string, userI Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -360,6 +373,8 @@ func (ls LiveRoomService) SendTestGiftNoStoage(liveRoomID string, userId, userNa Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -425,6 +440,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -488,8 +505,10 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac type userScoreRecord struct { Value int Score int + WinPoint int Track int Job int + UserId string UserName string HeadImg string UserLevel int @@ -515,8 +534,10 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac liveRoomUserScoreRecord[giftRecord.UserId] = userScoreRecord{ Value: scoreRecord.Value + giftRecord.TotalValue, Score: scoreRecord.Score + giftRecord.TotalScore, + WinPoint: giftRecord.WinPoint, Track: giftRecord.Track, Job: giftRecord.Job, + UserId: giftRecord.UserId, UserName: giftRecord.UserName, HeadImg: giftRecord.UserHeadImg, UserLevel: giftRecord.UserLevel, @@ -528,8 +549,10 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac liveRoomUserScoreRecord[giftRecord.UserId] = userScoreRecord{ Value: giftRecord.TotalValue, Score: giftRecord.TotalScore, + WinPoint: giftRecord.WinPoint, Track: giftRecord.Track, Job: giftRecord.Job, + UserId: giftRecord.UserId, UserName: giftRecord.UserName, HeadImg: giftRecord.UserHeadImg, UserLevel: giftRecord.UserLevel, @@ -579,20 +602,50 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac championScore := partScore * championShare // 冠军队伍分得积分 remainingScore := partScore * remainingShare //非冠军完成队伍分得积分 + winPointRobedNum := 0 + + // 计算获胜方能够获得多少的胜点 + for _, scoreRecord := range liveRoomUserScoreRecord { + // 没有完赛的队伍的连胜需要分给冠军队伍30% + if scoreRecord.Track != championTrack && !utils.Exists(finishTrackArr, scoreRecord.Track) { + winPointRobedNum += int(math.Floor(float64(scoreRecord.WinPoint)*0.3 + 0.5)) + } + } + results := []models.LiveRoomResult{} for userId, scoreRecord := range liveRoomUserScoreRecord { - getScore := 0 + getOriginScore := 0 + getExtraScore := 0 + getFinalScore := 0 isFinish := 0 isChampion := 0 + changeWinPoint := 0 if scoreRecord.Track == championTrack { - getScore = championScore * scoreRecord.Score / liveRoomChampionTrackTotalScore + getOriginScore = championScore * scoreRecord.Score / liveRoomChampionTrackTotalScore + // 按照积分贡献比例,分赢得的积分 + fmt.Println("here111", float64(winPointRobedNum)) + fmt.Println("here222", float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)) + fmt.Println("here333", float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5) + fmt.Println("here444", math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5)) + fmt.Println("here555", int(math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore)+0.5))) + changeWinPoint = int(math.Floor(float64(winPointRobedNum)*float64(scoreRecord.Score)/float64(liveRoomChampionTrackTotalScore) + 0.5)) + isFinish = 1 isChampion = 1 } else if utils.Exists(finishTrackArr, scoreRecord.Track) { - getScore = remainingScore * scoreRecord.Score / liveRoomOtherFinishTrackTotalScore + getOriginScore = remainingScore * scoreRecord.Score / liveRoomOtherFinishTrackTotalScore isFinish = 1 isChampion = 0 + } else { + // 未完赛就被抢夺一部分胜点 + changeWinPoint = -int(math.Floor(float64(scoreRecord.WinPoint)*0.3 + 0.5)) } + + // 根据胜场次数计算获得的加成分数 + getExtraScore, _ = utils.CalculateExtraScoreByWinPoint(getOriginScore, changeWinPoint) + + getFinalScore = getOriginScore + getExtraScore + isBiggest := 0 if trackBiggestInfo, exists := trackBiggestMap[scoreRecord.Track]; exists { if trackBiggestInfo.UserId == userId { @@ -601,7 +654,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac } // 计算用户将获得的积分和等级 - targetScore := scoreRecord.UserScore + getScore + targetWinPoint := scoreRecord.WinPoint + changeWinPoint + isChampion + targetScore := scoreRecord.UserScore + getFinalScore targetLevelInfo, err := manager.Get().LevelManager().GetLevelInfoByUpperScore(targetScore) targetLevel := 1 if err != nil { @@ -637,32 +691,36 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac } results = append(results, models.LiveRoomResult{ - LiveRoomID: liveRoomId, - Times: liveRoomInfo.Times, - UserID: userId, - GameScore: liveRoomTotalScore, - Track: scoreRecord.Track, // 需要根据实际情况设置 - Job: scoreRecord.Job, // 需要根据实际情况设置 - IsChampion: isChampion, - IsFinish: isFinish, - IsBiggest: isBiggest, - GiftValue: scoreRecord.Value, // 需要根据实际情况设置 - GiftScore: scoreRecord.Score, - GetScore: getScore, - HasDone: 0, - UserName: scoreRecord.UserName, - HeadImg: scoreRecord.HeadImg, - UserLevel: scoreRecord.UserLevel, - UserScore: scoreRecord.UserScore, - TargetLevel: targetLevel, - TargetScore: targetScore, - Mileage: mileage, - JumpHeight: jumpHeight, - FinishTime: finishTime, - FinishTime1: finishTime1, - FinishTime2: finishTime2, - FastestSpeed: fastestSpeed, - AttackPower: attackPower, + LiveRoomID: liveRoomId, + Times: liveRoomInfo.Times, + UserID: userId, + GameScore: liveRoomTotalScore, + Track: scoreRecord.Track, // 需要根据实际情况设置 + Job: scoreRecord.Job, // 需要根据实际情况设置 + IsChampion: isChampion, + IsFinish: isFinish, + IsBiggest: isBiggest, + GiftValue: scoreRecord.Value, // 需要根据实际情况设置 + GiftScore: scoreRecord.Score, + GetExtraScore: getExtraScore, + GetScore: getFinalScore, + NowWinPoint: scoreRecord.WinPoint, + ChangeWinPoint: changeWinPoint, + TargetWinPoint: targetWinPoint, + HasDone: 0, + UserName: scoreRecord.UserName, + HeadImg: scoreRecord.HeadImg, + UserLevel: scoreRecord.UserLevel, + UserScore: scoreRecord.UserScore, + TargetLevel: targetLevel, + TargetScore: targetScore, + Mileage: mileage, + JumpHeight: jumpHeight, + FinishTime: finishTime, + FinishTime1: finishTime1, + FinishTime2: finishTime2, + FastestSpeed: fastestSpeed, + AttackPower: attackPower, ExpireAt: sql.NullTime{ Time: time.Now(), Valid: true, @@ -684,6 +742,8 @@ func (ls LiveRoomService) FinishGame(msgID string, liveRoomId string, finishTrac Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 @@ -766,6 +826,8 @@ func DealBackDataByTime(conn *websocket.Conn, liveRoomId string, times int, time Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 评论内容(仅评论有效) @@ -832,6 +894,8 @@ func DealBackDataByTime(conn *websocket.Conn, liveRoomId string, times int, time Data: struct { MsgID string `json:"msg_id"` // 事件的ID SecOpenID string `json:"sec_openid"` // 用户的加密openid + UserRank int `json:"user_rank"` // 用户排行 + WinPoint int `json:"win_point"` // 用户的胜场数 Type string `json:"type"` // 事件类型:comment, gift, like Content string `json:"content"` // 评论内容(仅评论有效) Camp int `json:"camp"` // 所属阵营 diff --git a/app/utils/game.go b/app/utils/game.go index 9a13b4a65cf6f03938956f1cfb6fe4e33d6885ca..37a132b9535b90c6beef7ba6ebb175fc95d9a215 100644 --- a/app/utils/game.go +++ b/app/utils/game.go @@ -4,6 +4,7 @@ package utils import ( "BlazeRider-backend/config" "fmt" + "math" "math/rand" "strconv" "strings" @@ -83,3 +84,41 @@ func GetRandomJobId() (int, error) { track := jobArr[randomIndex] // 获取随机值 return track, nil } + +// CalculateExtraScoreByWinPoint 通过配置的胜点抢夺积分倍率来计算额外获取积分 +func CalculateExtraScoreByWinPoint(score int, winPoint int) (int, error) { + rate := float64(0) + // 10 ~ 20 5% + // 20 ~ 50 8% + // 50 ~ 100 12% + // 100 ~ 200 15% + // 200 ~ 500 18% + // 500 ~ 1000 22% + // 1000 ~ 2000 25% + // 2000 ~ 3000 30% + // 3000 ~ 5000 40% + // 5000 50% + if winPoint >= 10 && winPoint < 20 { + rate = 0.05 + } else if winPoint >= 20 && winPoint < 50 { + rate = 0.08 + } else if winPoint >= 50 && winPoint < 100 { + rate = 0.12 + } else if winPoint >= 100 && winPoint < 200 { + rate = 0.15 + } else if winPoint >= 200 && winPoint < 500 { + rate = 0.18 + } else if winPoint >= 500 && winPoint < 1000 { + rate = 0.22 + } else if winPoint >= 1000 && winPoint < 2000 { + rate = 0.25 + } else if winPoint >= 2000 && winPoint < 3000 { + rate = 0.3 + } else if winPoint >= 3000 && winPoint < 5000 { + rate = 0.4 + } else if winPoint >= 5000 { + rate = 0.5 + } + extraScore := int(math.Floor(rate * float64(score))) + return extraScore, nil +} diff --git a/config/config.go b/config/config.go index 46d73c376f5a7658fe28f3769df256d7beca43ca..d7986d45d4164476fd3f99016d04c1adb3355885 100644 --- a/config/config.go +++ b/config/config.go @@ -34,8 +34,9 @@ type DouyinConfig struct { } type GameConfig struct { - Team string `yaml:"team"` - Job string `yaml:"job"` + Team string `yaml:"team"` + Job string `yaml:"job"` + WinPointRobRate float32 `yaml:"win_point_rob_rate"` // 胜点抢夺倍率 } type Config struct { @@ -252,5 +253,8 @@ func mergeGameConfig(base, override GameConfig) GameConfig { if override.Job != "" { base.Job = override.Job } + if override.WinPointRobRate != 0 { + base.WinPointRobRate = override.WinPointRobRate + } return base } diff --git a/configs/config.prod.yaml b/configs/config.prod.yaml index 4a9b1d278c68db70efcc6bfa5f85c6d8e553ad5d..ef3141ec3282f2cc8b90226b77498a40bdb3ec21 100644 --- a/configs/config.prod.yaml +++ b/configs/config.prod.yaml @@ -14,4 +14,6 @@ database: game: team: "1,2,3" - job: "" \ No newline at end of file + job: "" + # 胜场抢夺比例 + win_point_rob_rate: 0.3 \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index e6eb3551cf1f4c49d4aafee64d36b3c76ebc7258..f0f3f8774135e294082c8578756f8913e633857f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -868,6 +868,8 @@ sec_gift_id: data.sec_gift_id, content: data.content, camp: data.camp, + rank: data.user_rank, + win_point: data.win_point, job: data.job, gift_num: data.gift_num, gift_value: data.gift_value, @@ -875,7 +877,9 @@ nickname: data.nickname, timestamp: data.timestamp }; - consoleText('有用户 :', JoinTrackEvent.nickname, "(", JoinTrackEvent.sec_openid, "),加入摩托:", JoinTrackEvent.camp, ",选择职业:", JoinTrackEvent.job); + consoleText('有用户 :', JoinTrackEvent.nickname, "(", JoinTrackEvent.sec_openid, "),加入摩托:", JoinTrackEvent.camp, ",选择职业:", JoinTrackEvent.job + , ", 排名:" , JoinTrackEvent.rank, ", 胜场数:" , JoinTrackEvent.win_point + ); } // 处理用户加入直播间