Files
zyrarbot/zyrarbot/ui/api/routers/queue_router.py
T
mmacierzanka d6bd302165
Backend / Lint i formatowanie (pull_request) Successful in 3s
Backend / Testy i kontrakt API (pull_request) Successful in 10s
Panel / Lint, typy i build (pull_request) Successful in 18s
Backend / Testowy build obrazu (pull_request) Successful in 15s
feat: restore the last queue per server
2026-08-21 17:10:40 +02:00

115 lines
4.0 KiB
Python

from __future__ import annotations
from typing import Any
import discord
from fastapi import APIRouter, Depends, HTTPException
from zyrarbot.music.music_player import MusicPlayer
from zyrarbot.settings import Settings
from zyrarbot.ui.api.dependencies import (
get_active_guild,
get_broadcaster,
get_player,
get_settings,
)
from zyrarbot.ui.api.requests.default_plays_request import DefaultPlaysRequest
from zyrarbot.ui.api.requests.jump_request import JumpRequest
from zyrarbot.ui.api.requests.remove_request import RemoveRequest
from zyrarbot.ui.api.requests.reorder_request import ReorderRequest
from zyrarbot.ui.api.requests.track_plays_request import TrackPlaysRequest
from zyrarbot.ui.api.status_broadcaster import StatusBroadcaster
router = APIRouter(prefix="/api", tags=["queue"])
@router.post("/queue/restore")
async def restore_queue(
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, int | str]:
count = await player.restore_queue(guild.id)
if count == 0:
raise HTTPException(status_code=404, detail="No saved queue for this server")
await broadcaster.broadcast()
return {"status": "restored", "count": count}
@router.post("/default_plays")
async def set_default_plays(
request: DefaultPlaysRequest,
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
settings: Settings = Depends(get_settings),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, int | str]:
if not settings.is_valid_plays(request.default_plays):
raise HTTPException(status_code=400, detail="Invalid default plays value")
player.set_default_plays(guild.id, request.default_plays)
await broadcaster.broadcast()
return {"status": "success", "default_plays": request.default_plays}
@router.post("/jump")
async def jump(
request: JumpRequest,
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, str]:
queue = player.state(guild.id).queue
if not 0 <= request.index < len(queue):
raise HTTPException(status_code=400, detail="Invalid track index")
await player.jump(guild.id, request.index)
await broadcaster.broadcast()
return {"status": "jumped"}
@router.post("/remove")
async def remove(
request: RemoveRequest,
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, str]:
if not await player.remove(guild.id, request.id):
raise HTTPException(status_code=404, detail="Track not found in queue")
await broadcaster.broadcast()
return {"status": "removed"}
@router.post("/reorder")
async def reorder(
request: ReorderRequest,
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, str]:
player.reorder(guild.id, request.queue_ids)
await broadcaster.broadcast()
return {"status": "success"}
@router.post("/queue/plays")
async def set_track_plays(
request: TrackPlaysRequest,
guild: discord.Guild = Depends(get_active_guild),
player: MusicPlayer = Depends(get_player),
settings: Settings = Depends(get_settings),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, Any]:
if not settings.is_valid_plays(request.plays):
raise HTTPException(status_code=400, detail="Invalid plays value")
track = player.state(guild.id).find(request.id)
if track is None:
raise HTTPException(status_code=404, detail="Track not found in queue")
track.plays_left = request.plays
await broadcaster.broadcast()
return {"status": "success", "id": request.id, "plays": request.plays}