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
import base64
import json
from typing import Any
@@ -12,10 +13,12 @@ from app.database.room import Room
from app.database.room_participated_user import RoomParticipatedUser
from app.dependencies.database import Database, get_redis
from app.dependencies.fetcher import get_fetcher
from app.dependencies.storage import get_storage_service
from app.fetcher import Fetcher
from app.log import logger
from app.models.multiplayer_hub import PlaylistItem as HubPlaylistItem
from app.models.room import MatchType, QueueMode, RoomStatus
from app.storage.base import StorageService
from app.utils import utcnow
from .notification.server import server
@@ -26,7 +29,7 @@ from redis.asyncio import Redis
from sqlalchemy import func, update
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(
@@ -41,8 +44,8 @@ async def _ensure_room_chat_channel(
# 1) 按 channel_id 查是否已存在
try:
# Use db.execute instead of db.exec for better async compatibility
result = await db.execute(select(ChatChannel).where(ChatChannel.channel_id == room.channel_id))
ch = result.scalar_one_or_none()
result = await db.exec(select(ChatChannel).where(ChatChannel.channel_id == room.channel_id))
ch = result.first()
except Exception as e:
logger.debug(f"Error querying ChatChannel: {e}")
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")
room_owner_id = room.host_id
room_status = room.status
current_participant_count = room.participant_count
ends_at = room.ends_at
channel_id = room.channel_id
@@ -742,6 +743,25 @@ async def ensure_beatmap_present(
except Exception as e:
await db.rollback()
logger.debug(f"Error ensuring beatmap: {e!s}")
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"Failed to ensure beatmap: {e!s}"
)
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Failed to ensure beatmap")
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),
)