55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Literal
|
|
|
|
from app.database.lazer_user import User
|
|
from app.database.room import RoomResp
|
|
from app.dependencies.database import get_db, get_redis
|
|
from app.dependencies.fetcher import get_fetcher
|
|
from app.dependencies.user import get_current_user
|
|
from app.fetcher import Fetcher
|
|
from app.models.room import RoomStatus
|
|
from app.signalr.hub import MultiplayerHubs
|
|
|
|
from .api_router import router
|
|
|
|
from fastapi import Depends, Query
|
|
from redis.asyncio import Redis
|
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
|
|
|
|
@router.get("/rooms", tags=["rooms"], response_model=list[RoomResp])
|
|
async def get_all_rooms(
|
|
mode: Literal["open", "ended", "participated", "owned", None] = Query(
|
|
default="open"
|
|
), # TODO: 对房间根据状态进行筛选
|
|
category: str = Query(default="realtime"), # TODO
|
|
status: RoomStatus | None = Query(None),
|
|
db: AsyncSession = Depends(get_db),
|
|
fetcher: Fetcher = Depends(get_fetcher),
|
|
redis: Redis = Depends(get_redis),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
rooms = MultiplayerHubs.rooms.values()
|
|
resp_list: list[RoomResp] = []
|
|
for room in rooms:
|
|
if category != "realtime": # 歌单模式的处理逻辑
|
|
if room.category == category:
|
|
if mode == "owned":
|
|
if (
|
|
room.room.host.user_id if room.room.host is not None else 0
|
|
) != current_user.id:
|
|
continue
|
|
else:
|
|
continue
|
|
else:
|
|
if mode == "owned":
|
|
if (
|
|
room.room.host.user_id if room.room.host is not None else 0
|
|
) != current_user.id:
|
|
continue
|
|
if room.status != status:
|
|
continue
|
|
resp_list.append(await RoomResp.from_hub(room))
|
|
return resp_list
|