feat(lio): support upload replay

This commit is contained in:
MingxuanGame
2025-08-24 14:07:14 +00:00
parent 86c6c291e4
commit 6c04b15764

View File

@@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
import base64
import json import json
from typing import Any from typing import Any
@@ -12,10 +13,12 @@ from app.database.room import Room
from app.database.room_participated_user import RoomParticipatedUser from app.database.room_participated_user import RoomParticipatedUser
from app.dependencies.database import Database, get_redis from app.dependencies.database import Database, get_redis
from app.dependencies.fetcher import get_fetcher from app.dependencies.fetcher import get_fetcher
from app.dependencies.storage import get_storage_service
from app.fetcher import Fetcher from app.fetcher import Fetcher
from app.log import logger from app.log import logger
from app.models.multiplayer_hub import PlaylistItem as HubPlaylistItem from app.models.multiplayer_hub import PlaylistItem as HubPlaylistItem
from app.models.room import MatchType, QueueMode, RoomStatus from app.models.room import MatchType, QueueMode, RoomStatus
from app.storage.base import StorageService
from app.utils import utcnow from app.utils import utcnow
from .notification.server import server from .notification.server import server
@@ -26,7 +29,7 @@ from redis.asyncio import Redis
from sqlalchemy import func, update from sqlalchemy import func, update
from sqlmodel import col, select from sqlmodel import col, select
router = APIRouter(prefix="/_lio", tags=["LIO"]) router = APIRouter(prefix="/_lio", include_in_schema=False)
async def _ensure_room_chat_channel( async def _ensure_room_chat_channel(
@@ -41,8 +44,8 @@ async def _ensure_room_chat_channel(
# 1) 按 channel_id 查是否已存在 # 1) 按 channel_id 查是否已存在
try: try:
# Use db.execute instead of db.exec for better async compatibility # Use db.execute instead of db.exec for better async compatibility
result = await db.execute(select(ChatChannel).where(ChatChannel.channel_id == room.channel_id)) result = await db.exec(select(ChatChannel).where(ChatChannel.channel_id == room.channel_id))
ch = result.scalar_one_or_none() ch = result.first()
except Exception as e: except Exception as e:
logger.debug(f"Error querying ChatChannel: {e}") logger.debug(f"Error querying ChatChannel: {e}")
ch = None ch = None
@@ -547,8 +550,6 @@ async def remove_user_from_room(
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Room not found") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Room not found")
room_owner_id = room.host_id room_owner_id = room.host_id
room_status = room.status
current_participant_count = room.participant_count
ends_at = room.ends_at ends_at = room.ends_at
channel_id = room.channel_id channel_id = room.channel_id
@@ -742,6 +743,25 @@ async def ensure_beatmap_present(
except Exception as e: except Exception as e:
await db.rollback() await db.rollback()
logger.debug(f"Error ensuring beatmap: {e!s}") logger.debug(f"Error ensuring beatmap: {e!s}")
raise HTTPException( raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to ensure beatmap")
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to ensure beatmap: {e!s}"
)
class ReplayDataRequest(BaseModel):
score_id: int
user_id: int
mreplay: str
beatmap_id: int
@router.post("/scores/replay")
async def save_replay(
req: ReplayDataRequest,
storage_service: StorageService = Depends(get_storage_service),
timestamp: str = "",
):
replay_data = req.mreplay
replay_path = f"replays/{req.score_id}_{req.beatmap_id}_{req.user_id}_lazer_replay.osr"
await storage_service.write_file(
replay_path,
base64.b64decode(replay_data),
)