fix: decrement plays after playback

This commit is contained in:
mmacierzanka committed 2026-08-21 17:18:21 +02:00
1 parent d6bd302165
commit 6736329603
6 files changed
+39 -4

No files matched your search

+21 -2
View File
@@ -103,7 +103,23 @@ class MusicPlayer:
if not self._queues:
return
state = self.state(guild_id)
self._queues.save(guild_id, [self._track_snapshot(track) for track in state.queue])
self._queues.save(
guild_id,
[
self._track_snapshot(track)
for track in state.queue
if self.plays_left(track, guild_id) > 0
],
)
def finish_current(self, guild_id: int) -> None:
"""Consume one play when playback ends outside the regular callback."""
state = self.state(guild_id)
if state.current is None or not 0 <= state.index < len(state.queue):
return
current = state.queue[state.index]
if current is state.current:
current.plays_left = max(self.plays_left(current, guild_id) - 1, 0)
async def restore_queue(self, guild_id: int) -> int:
if not self._queues:
@@ -274,6 +290,9 @@ class MusicPlayer:
if state.consume_jump():
advance = False
if advance:
self.finish_current(guild_id)
# Utwór z ostatnim odtworzeniem musi pozostać w kolejce do chwili
# zakończenia źródła. W przeciwnym razie panel dostaje `current`, ale
# `queue_index` wskazuje pozycję spoza kolejki podczas faktycznego
@@ -320,7 +339,7 @@ class MusicPlayer:
return
track.played = True
track.plays_left = self.plays_left(track, guild_id) - 1
track.plays_left = self.plays_left(track, guild_id)
track.volume = state.volume
state.queue[next_index] = track
@@ -133,6 +133,7 @@ async def stop(
player: MusicPlayer = Depends(get_player),
broadcaster: StatusBroadcaster = Depends(get_broadcaster),
) -> dict[str, str]:
player.finish_current(guild.id)
player.save_queue(guild.id)
if player.is_active(guild.id):
player.voice_client(guild.id).stop()
+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.finish_current(guild.id)
player.save_queue(guild.id)
await voice_client.disconnect()
player.clear(guild.id)
+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.finish_current(guild_id)
self.player.save_queue(guild_id)
if voice_client and voice_client.is_playing():
voice_client.stop()
+2
View File
@@ -23,6 +23,7 @@ class VoiceCog(MusicCogBase, name="Voice"):
and after.channel is None
)
if is_bot_leaving:
self.player.finish_current(before.channel.guild.id)
self.player.save_queue(before.channel.guild.id)
self.player.clear(before.channel.guild.id)
await self.player.trigger_state_change()
@@ -34,6 +35,7 @@ class VoiceCog(MusicCogBase, name="Voice"):
"Nie jestem na kanale głosowym.", ephemeral=True
)
return
self.player.finish_current(interaction.guild.id)
self.player.save_queue(interaction.guild.id)
await interaction.guild.voice_client.disconnect()
self.player.clear(interaction.guild.id)