fix: decrement plays after playback
This commit is contained in:
6 files changed
+39
-4
No files matched your search
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user