From 13803c7054bea43f3e717cf3c8d9180d32f58fb7 Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Mon, 18 Aug 2025 14:02:33 +0000 Subject: [PATCH] fix(multiplayer): try to fix cannot spectate by changing state one by one --- app/signalr/hub/multiplayer.py | 23 ++++++++++++----------- app/signalr/hub/spectator.py | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/signalr/hub/multiplayer.py b/app/signalr/hub/multiplayer.py index 0a5330e..2fbc028 100644 --- a/app/signalr/hub/multiplayer.py +++ b/app/signalr/hub/multiplayer.py @@ -660,10 +660,6 @@ class MultiplayerHub(Hub[MultiplayerClientState]): if user.state == state: return - logger.info( - f"[MultiplayerHub] {user.user_id}'s state " - f"changed from {user.state} to {state}" - ) match state: case MultiplayerUserState.IDLE: if user.state.is_playing: @@ -691,6 +687,10 @@ class MultiplayerHub(Hub[MultiplayerClientState]): user: MultiplayerRoomUser, state: MultiplayerUserState, ): + logger.info( + f"[MultiplayerHub] {user.user_id}'s state " + f"changed from {user.state} to {state}" + ) user.state = state await self.broadcast_group_call( self.group_id(room.room.room_id), @@ -796,7 +796,6 @@ class MultiplayerHub(Hub[MultiplayerClientState]): if all(u.state != MultiplayerUserState.READY for u in room.users): raise InvokeException("Can't start match when no users are ready.") - logger.info(f"[MultiplayerHub] Room {room.room_id} match started") await self.start_match(server_room) async def start_match(self, room: ServerMultiplayerRoom): @@ -804,6 +803,12 @@ class MultiplayerHub(Hub[MultiplayerClientState]): raise InvokeException("Can't start match when already in a running state.") if room.queue.current_item.expired: raise InvokeException("Current playlist item is expired") + + if all(u.state != MultiplayerUserState.READY for u in room.room.users): + await room.queue.finish_current_item() + + logger.info(f"[MultiplayerHub] Room {room.room.room_id} match started") + ready_users = [ u for u in room.room.users @@ -813,12 +818,8 @@ class MultiplayerHub(Hub[MultiplayerClientState]): or u.state == MultiplayerUserState.IDLE ) ] - await asyncio.gather( - *[ - self.change_user_state(room, u, MultiplayerUserState.WAITING_FOR_LOAD) - for u in ready_users - ] - ) + for u in ready_users: + await self.change_user_state(room, u, MultiplayerUserState.WAITING_FOR_LOAD) await self.change_room_state( room, MultiplayerRoomState.WAITING_FOR_LOAD, diff --git a/app/signalr/hub/spectator.py b/app/signalr/hub/spectator.py index 12e7fe7..a89020e 100644 --- a/app/signalr/hub/spectator.py +++ b/app/signalr/hub/spectator.py @@ -6,7 +6,6 @@ import lzma import struct import time from typing import override -from venv import logger from app.calculator import clamp from app.config import settings @@ -19,6 +18,7 @@ from app.dependencies.database import engine, get_redis from app.dependencies.fetcher import get_fetcher from app.dependencies.storage import get_storage_service from app.exception import InvokeException +from app.log import logger from app.models.mods import APIMod, mods_to_int from app.models.score import GameMode, LegacyReplaySoloScoreInfo, ScoreStatistics from app.models.spectator_hub import (