feat: restore the last queue per server
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

This commit is contained in:
mmacierzanka committed 2026-08-21 17:10:40 +02:00
1 parent 3624c152f5
commit d6bd302165
18 files changed
+237 -3

No files matched your search

@@ -133,6 +133,7 @@ async def stop(
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, str]:
player.save_queue(guild.id)
if player.is_active(guild.id):
player.voice_client(guild.id).stop()
player.clear(guild.id)
+13
View File
@@ -23,6 +23,19 @@ 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,
+1
View File
@@ -90,6 +90,7 @@ async def disconnect(
if not voice_client:
raise HTTPException(status_code=400, detail="Bot not connected to voice on this server")
player.save_queue(guild.id)
await voice_client.disconnect()
player.clear(guild.id)
await broadcaster.broadcast()
+2
View File
@@ -31,6 +31,7 @@ class StatusService:
"default_plays": self._player.guild_default_plays(guild.id)
if guild
else self._player.default_plays,
"saved_queue_available": self._player.has_saved_queue(guild.id) if guild else False,
}
if guild is None:
payload.update(self._idle_payload())
@@ -55,6 +56,7 @@ class StatusService:
"active_voice_channel": None,
"text_channels": [],
"active_text_channel_id": None,
"saved_queue_available": False,
}
def _guild_payload(self, guild: discord.Guild) -> dict[str, Any]:
+1
View File
@@ -49,6 +49,7 @@ class ControlCog(MusicCogBase, name="Control"):
async def stop(self, interaction: discord.Interaction) -> None:
guild_id = interaction.guild.id
voice_client = interaction.guild.voice_client
self.player.save_queue(guild_id)
if voice_client and voice_client.is_playing():
voice_client.stop()
self.player.clear(guild_id)
+2
View File
@@ -23,6 +23,7 @@ class VoiceCog(MusicCogBase, name="Voice"):
and after.channel is None
)
if is_bot_leaving:
self.player.save_queue(before.channel.guild.id)
self.player.clear(before.channel.guild.id)
await self.player.trigger_state_change()
@@ -33,6 +34,7 @@ class VoiceCog(MusicCogBase, name="Voice"):
"Nie jestem na kanale głosowym.", ephemeral=True
)
return
self.player.save_queue(interaction.guild.id)
await interaction.guild.voice_client.disconnect()
self.player.clear(interaction.guild.id)
await interaction.response.send_message("Rozłączono z kanału głosowego.")