diff --git a/tests/test_music_player.py b/tests/test_music_player.py index 09f70c8..fa71a18 100644 --- a/tests/test_music_player.py +++ b/tests/test_music_player.py @@ -289,6 +289,13 @@ class MusicPlayerQueueTest(unittest.IsolatedAsyncioTestCase): await asyncio.sleep(0) self.assertEqual([track.id for track in player.state(GUILD).queue], ["restored"]) + async def test_restore_requires_voice_connection(self): + player, _ = build_player() + player.voice_client = lambda guild_id: None # type: ignore[method-assign] + + with self.assertRaisesRegex(ValueError, "not connected"): + await player.restore_queue(GUILD) + class LoopModeTest(unittest.TestCase): def test_cycle_order(self): diff --git a/zyrarbot/music/music_player.py b/zyrarbot/music/music_player.py index 583b506..319e025 100644 --- a/zyrarbot/music/music_player.py +++ b/zyrarbot/music/music_player.py @@ -145,6 +145,8 @@ class MusicPlayer: voice_client.stop() async def restore_queue(self, guild_id: int) -> int: + if self.voice_client(guild_id) is None: + raise ValueError("Bot is not connected to a voice channel on this server") if not self._queues: return 0 diff --git a/zyrarbot/ui/api/routers/queue_router.py b/zyrarbot/ui/api/routers/queue_router.py index 1d39a2a..4d7e2ea 100644 --- a/zyrarbot/ui/api/routers/queue_router.py +++ b/zyrarbot/ui/api/routers/queue_router.py @@ -29,7 +29,10 @@ async def restore_queue( player: MusicPlayer = Depends(get_player), broadcaster: StatusBroadcaster = Depends(get_broadcaster), ) -> dict[str, int | str]: - count = await player.restore_queue(guild.id) + try: + count = await player.restore_queue(guild.id) + except ValueError as error: + raise HTTPException(status_code=400, detail=str(error)) from error if count == 0: raise HTTPException(status_code=404, detail="No saved queue for this server") await broadcaster.broadcast() diff --git a/zyrarbot/ui/bot/cogs/player_cog.py b/zyrarbot/ui/bot/cogs/player_cog.py index 04c04a7..262431f 100644 --- a/zyrarbot/ui/bot/cogs/player_cog.py +++ b/zyrarbot/ui/bot/cogs/player_cog.py @@ -135,7 +135,13 @@ class PlayerView(discord.ui.View): label="Przywróć kolejkę", emoji="↩️", style=discord.ButtonStyle.success, row=1 ) async def restore(self, interaction: discord.Interaction, _: discord.ui.Button) -> None: - count = await self.player.restore_queue(self.guild_id) + try: + count = await self.player.restore_queue(self.guild_id) + except ValueError as error: + await interaction.response.send_message( + embed=message_embed("Kolejka", str(error)), ephemeral=True + ) + return if not count: await interaction.response.send_message( embed=message_embed("Kolejka", "Nie ma zapisanej kolejki dla tego serwera."), diff --git a/zyrarbot/ui/bot/cogs/queue_cog.py b/zyrarbot/ui/bot/cogs/queue_cog.py index d7bcd9e..9265347 100644 --- a/zyrarbot/ui/bot/cogs/queue_cog.py +++ b/zyrarbot/ui/bot/cogs/queue_cog.py @@ -78,7 +78,13 @@ class QueueCog(MusicCogBase, name="Queue"): @app_commands.command(name="restorequeue", description="Przywróć ostatnią zapisaną kolejkę") async def restore_queue(self, interaction: discord.Interaction) -> None: - count = await self.player.restore_queue(interaction.guild.id) + try: + count = await self.player.restore_queue(interaction.guild.id) + except ValueError as error: + await interaction.response.send_message( + embed=message_embed("Przywracanie kolejki", str(error)), ephemeral=True + ) + return if not count: await interaction.response.send_message( embed=message_embed(