feat(game): 添加连胜触发的奖池刷新功能
- 添加奖池刷新定时器和延迟配置 - 实现从游戏大厅初始化获取最新奖池数据 - 添加连胜计数达到阈值时的奖池刷新调度逻辑 - 在用户连胜状态更新时触发奖池刷新检查 - 添加错误处理和调试日志 - 确保定时器正确清理避免内存泄漏
This commit is contained in:
@@ -221,6 +221,55 @@ function applyPeriodPayoutMessage(
|
|||||||
useGameRoundStore.getState().playPreparedRevealAnimation(roundId || null)
|
useGameRoundStore.getState().playPreparedRevealAnimation(roundId || null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let jackpotPoolRefreshTimerId: number | null = null
|
||||||
|
|
||||||
|
const JACKPOT_STREAK_TRIGGER_COUNT = 10
|
||||||
|
const JACKPOT_POOL_REFRESH_DELAY_MS = 2_000
|
||||||
|
|
||||||
|
async function refreshJackpotPoolFromLobbyInit() {
|
||||||
|
const authState = useAuthStore.getState()
|
||||||
|
|
||||||
|
if (authState.status !== 'authenticated' || !authState.accessToken) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await getGameLobbyInit()
|
||||||
|
|
||||||
|
useGameSessionStore.getState().syncDashboard({
|
||||||
|
jackpotPool: result.snapshot.dashboard.jackpotPool,
|
||||||
|
updatedAt: result.snapshot.dashboard.updatedAt,
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error(
|
||||||
|
'Failed to refresh jackpot pool after streak milestone',
|
||||||
|
error,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function scheduleJackpotPoolRefreshForStreak(
|
||||||
|
previousStreak: number,
|
||||||
|
nextStreak: number | undefined,
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
nextStreak !== JACKPOT_STREAK_TRIGGER_COUNT ||
|
||||||
|
previousStreak >= JACKPOT_STREAK_TRIGGER_COUNT ||
|
||||||
|
typeof window === 'undefined'
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jackpotPoolRefreshTimerId !== null) {
|
||||||
|
window.clearTimeout(jackpotPoolRefreshTimerId)
|
||||||
|
}
|
||||||
|
|
||||||
|
jackpotPoolRefreshTimerId = window.setTimeout(() => {
|
||||||
|
jackpotPoolRefreshTimerId = null
|
||||||
|
void refreshJackpotPoolFromLobbyInit()
|
||||||
|
}, JACKPOT_POOL_REFRESH_DELAY_MS)
|
||||||
|
}
|
||||||
|
|
||||||
function applyUserStreakMessage(message: GameSocketMessage) {
|
function applyUserStreakMessage(message: GameSocketMessage) {
|
||||||
const streakData = extractUserStreakMessageData(message)
|
const streakData = extractUserStreakMessageData(message)
|
||||||
const currentUser = useAuthStore.getState().currentUser
|
const currentUser = useAuthStore.getState().currentUser
|
||||||
@@ -229,6 +278,11 @@ function applyUserStreakMessage(message: GameSocketMessage) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scheduleJackpotPoolRefreshForStreak(
|
||||||
|
currentUser.currentStreak ?? 0,
|
||||||
|
streakData.currentStreak,
|
||||||
|
)
|
||||||
|
|
||||||
useAuthStore.getState().setCurrentUser({
|
useAuthStore.getState().setCurrentUser({
|
||||||
...currentUser,
|
...currentUser,
|
||||||
currentStreak: streakData.currentStreak,
|
currentStreak: streakData.currentStreak,
|
||||||
@@ -299,6 +353,11 @@ function applyBetWinMessage(message: GameSocketMessage) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scheduleJackpotPoolRefreshForStreak(
|
||||||
|
currentUser.currentStreak ?? 0,
|
||||||
|
betWinData.current_streak,
|
||||||
|
)
|
||||||
|
|
||||||
useAuthStore.getState().setCurrentUser({
|
useAuthStore.getState().setCurrentUser({
|
||||||
...currentUser,
|
...currentUser,
|
||||||
coin: betWinData.balance_after ?? currentUser.coin,
|
coin: betWinData.balance_after ?? currentUser.coin,
|
||||||
|
|||||||
Reference in New Issue
Block a user