修复选图时候还可以开始观察问题
This commit is contained in:
@@ -385,6 +385,8 @@ class SpectatorHub(Hub[StoreClientState]):
|
|||||||
user_id = int(client.connection_id)
|
user_id = int(client.connection_id)
|
||||||
store = self.get_or_create_state(client)
|
store = self.get_or_create_state(client)
|
||||||
score = store.score
|
score = store.score
|
||||||
|
|
||||||
|
# Early return if no active session
|
||||||
if (
|
if (
|
||||||
score is None
|
score is None
|
||||||
or store.score_token is None
|
or store.score_token is None
|
||||||
@@ -394,24 +396,31 @@ class SpectatorHub(Hub[StoreClientState]):
|
|||||||
):
|
):
|
||||||
return
|
return
|
||||||
|
|
||||||
if (
|
try:
|
||||||
settings.enable_all_beatmap_leaderboard
|
# Process score if conditions are met
|
||||||
and store.beatmap_status.has_leaderboard()
|
if (
|
||||||
) and any(k.is_hit() and v > 0 for k, v in score.score_info.statistics.items()):
|
settings.enable_all_beatmap_leaderboard
|
||||||
await self._process_score(store, client)
|
and store.beatmap_status.has_leaderboard()
|
||||||
await self._end_session(user_id, state, store)
|
) and any(k.is_hit() and v > 0 for k, v in score.score_info.statistics.items()):
|
||||||
|
await self._process_score(store, client)
|
||||||
|
|
||||||
# Remove from playing user tracking
|
# End the play session and notify watchers
|
||||||
from app.router.v2.stats import remove_playing_user
|
await self._end_session(user_id, state, store)
|
||||||
|
|
||||||
asyncio.create_task(remove_playing_user(user_id))
|
# Remove from playing user tracking
|
||||||
|
from app.router.v2.stats import remove_playing_user
|
||||||
|
asyncio.create_task(remove_playing_user(user_id))
|
||||||
|
|
||||||
store.state = None
|
finally:
|
||||||
store.beatmap_status = None
|
# CRITICAL FIX: Always clear state in finally block to ensure cleanup
|
||||||
store.checksum = None
|
# This matches the official C# implementation pattern
|
||||||
store.ruleset_id = None
|
store.state = None
|
||||||
store.score_token = None
|
store.beatmap_status = None
|
||||||
store.score = None
|
store.checksum = None
|
||||||
|
store.ruleset_id = None
|
||||||
|
store.score_token = None
|
||||||
|
store.score = None
|
||||||
|
logger.info(f"[SpectatorHub] Cleared all session state for user {user_id}")
|
||||||
|
|
||||||
async def _process_score(self, store: StoreClientState, client: Client) -> None:
|
async def _process_score(self, store: StoreClientState, client: Client) -> None:
|
||||||
user_id = int(client.connection_id)
|
user_id = int(client.connection_id)
|
||||||
@@ -573,16 +582,23 @@ class SpectatorHub(Hub[StoreClientState]):
|
|||||||
# Get target user's current state if it exists
|
# Get target user's current state if it exists
|
||||||
target_store = self.state.get(target_id)
|
target_store = self.state.get(target_id)
|
||||||
if target_store and target_store.state:
|
if target_store and target_store.state:
|
||||||
logger.debug(
|
# CRITICAL FIX: Only send state if user is actually playing
|
||||||
f"[SpectatorHub] {target_id} is currently {target_store.state.state}"
|
# Don't send state for finished/quit games
|
||||||
)
|
if target_store.state.state == SpectatedUserState.Playing:
|
||||||
# Send current state to the watcher immediately
|
logger.debug(
|
||||||
await self.call_noblock(
|
f"[SpectatorHub] {target_id} is currently playing, sending state"
|
||||||
client,
|
)
|
||||||
"UserBeganPlaying",
|
# Send current state to the watcher immediately
|
||||||
target_id,
|
await self.call_noblock(
|
||||||
target_store.state,
|
client,
|
||||||
)
|
"UserBeganPlaying",
|
||||||
|
target_id,
|
||||||
|
target_store.state,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
logger.debug(
|
||||||
|
f"[SpectatorHub] {target_id} state is {target_store.state.state}, not sending to watcher"
|
||||||
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# User isn't tracked or error occurred - this is not critical
|
# User isn't tracked or error occurred - this is not critical
|
||||||
logger.debug(f"[SpectatorHub] Could not get state for {target_id}: {e}")
|
logger.debug(f"[SpectatorHub] Could not get state for {target_id}: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user