feat: restore the last queue per server
This commit is contained in:
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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.")
|
||||
Reference in new issue
Block a user