From 61639454a346b8260eaef4457f514d20f19b8915 Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Sun, 14 Sep 2025 06:31:29 +0000 Subject: [PATCH] feat(room): use participated user count as participant count for playlist room --- app/database/playlist_attempts.py | 5 +++-- app/database/room.py | 37 ++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/database/playlist_attempts.py b/app/database/playlist_attempts.py index 4b7530d..ccb7704 100644 --- a/app/database/playlist_attempts.py +++ b/app/database/playlist_attempts.py @@ -59,9 +59,10 @@ class ItemAttemptsCount(AsyncAttrs, ItemAttemptsCountBase, table=True): self.attempts = sum(score.attempts for score in playlist_scores) self.total_score = sum(score.total_score for score in playlist_scores) self.pp = sum(score.score.pp for score in playlist_scores) - self.completed = len([score for score in playlist_scores if score.score.passed]) + passed_scores = [score for score in playlist_scores if score.score.passed] + self.completed = len(passed_scores) self.accuracy = ( - sum(score.score.accuracy for score in playlist_scores) / self.completed if self.completed > 0 else 0.0 + sum(score.score.accuracy for score in passed_scores) / self.completed if self.completed > 0 else 0.0 ) await session.commit() await session.refresh(self) diff --git a/app/database/room.py b/app/database/room.py index c777a52..f4844b1 100644 --- a/app/database/room.py +++ b/app/database/room.py @@ -27,6 +27,7 @@ from sqlmodel import ( Relationship, SQLModel, col, + func, select, ) from sqlmodel.ext.asyncio.session import AsyncSession @@ -118,15 +119,35 @@ class RoomResp(RoomBase): resp.difficulty_range = difficulty_range resp.current_playlist_item = resp.playlist[-1] if resp.playlist else None resp.recent_participants = [] - for recent_participant in await session.exec( - select(RoomParticipatedUser) - .where( - RoomParticipatedUser.room_id == room.id, - col(RoomParticipatedUser.left_at).is_(None), + if room.category == RoomCategory.REALTIME: + query = ( + select(RoomParticipatedUser) + .where( + RoomParticipatedUser.room_id == room.id, + col(RoomParticipatedUser.left_at).is_(None), + ) + .limit(8) + .order_by(col(RoomParticipatedUser.joined_at).desc()) ) - .limit(8) - .order_by(col(RoomParticipatedUser.joined_at).desc()) - ): + else: + query = ( + select(RoomParticipatedUser) + .where( + RoomParticipatedUser.room_id == room.id, + ) + .limit(8) + .order_by(col(RoomParticipatedUser.joined_at).desc()) + ) + resp.participant_count = ( + await session.exec( + select(func.count()) + .select_from(RoomParticipatedUser) + .where( + RoomParticipatedUser.room_id == room.id, + ) + ) + ).first() or 0 + for recent_participant in await session.exec(query): resp.recent_participants.append( await UserResp.from_db( await recent_participant.awaitable_attrs.user,