feat(lio): support upload replay
This commit is contained in:
@@ -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),
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user