Commit 254f0527 authored by 陈冲's avatar 陈冲

feat: 修复排名提交

parent c6bf1726
......@@ -49,6 +49,14 @@ function getGameHomePath(data: any) {
return `/game${gameIndex}`
}
function getServerRank(data: any) {
const value = typeof data === 'object' && data
? data.rank ?? data.rank_no ?? data.rankNo ?? data.game_rank ?? data.gameRank
: data
const rank = Number(value)
return Number.isFinite(rank) && rank > 0 ? rank : 0
}
export function joinSharedRoom(nickname: string, token: string, avatar: string, gameId: string) {
return sendSocketMessage('room_join', { nickname: nickname, token, avatar, gameId: gameId })
}
......@@ -77,6 +85,31 @@ export function useGameSocket(options: GameSocketOptions) {
let statusTimer: ReturnType<typeof window.setInterval> | undefined
const domain = $read('domain', '');
let resubmitcount = 0;
let pendingSubmittedScore: SubmittedGameScore | undefined
let finalScorePosted = false
const postFinalScoreIfReady = (data: any) => {
if (finalScorePosted || !pendingSubmittedScore || Number(data?.status) !== 4) {
return
}
const token_origin = $getWechat()?.token_origin
if (!token_origin || !Number.isFinite(pendingSubmittedScore.score)) {
return
}
const finalRank = getServerRank(data)
const finalScore = Number(data?.score)
const batch_no = $read('batch_no')
finalScorePosted = true
void postScreenGameScore({
code: pendingSubmittedScore.code,
score: Number.isFinite(finalScore) ? finalScore : pendingSubmittedScore.score,
batch_no,
rank_no: finalRank,
})
}
const stopStatusPolling = () => {
if (statusTimer) {
......@@ -186,6 +219,8 @@ export function useGameSocket(options: GameSocketOptions) {
case 'game_start_result': {
if (data.index === options.gameId) {
$save('batch_no', data.batch_no);
pendingSubmittedScore = undefined
finalScorePosted = false
options.onGameStart?.(data)
}
break
......@@ -195,17 +230,7 @@ export function useGameSocket(options: GameSocketOptions) {
break
}
case 'submit_score_save_result': {
const submittedScore = options.onScoreSubmitted?.(true, data)
const token_origin = $getWechat()?.token_origin
if (token_origin && submittedScore && Number.isFinite(submittedScore.score)) {
let batch_no = $read('batch_no')
void postScreenGameScore({
code: submittedScore.code,
score: submittedScore.score,
batch_no: batch_no,
rank_no: submittedScore.rank_no,
})
}
pendingSubmittedScore = options.onScoreSubmitted?.(true, data) || pendingSubmittedScore
break
}
case 'status_result': {
......@@ -213,6 +238,7 @@ export function useGameSocket(options: GameSocketOptions) {
return
}
options.onStatus?.(data)
postFinalScoreIfReady(data)
break
}
case 'room_back_result': {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment