refactor: split music cog by responsibility
This commit is contained in:
8 files changed
+428
-380
No files matched your search
@@ -0,0 +1,95 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import discord
|
||||
from discord import app_commands
|
||||
from discord.ext import commands
|
||||
|
||||
from zyrarbot.music.music_player import MusicPlayer
|
||||
from zyrarbot.settings import Settings
|
||||
from zyrarbot.ui.bot.cogs.common import MusicCogBase
|
||||
|
||||
QUEUE_PREVIEW_LIMIT = 30
|
||||
HISTORY_PREVIEW_LIMIT = 15
|
||||
AUTOCOMPLETE_LIMIT = 25
|
||||
|
||||
|
||||
class QueueCog(MusicCogBase, name="Queue"):
|
||||
"""Komendy podglądu kolejki i historii odtwarzania."""
|
||||
|
||||
def __init__(self, bot: commands.Bot, player: MusicPlayer, settings: Settings):
|
||||
super().__init__(bot, player)
|
||||
self._settings = settings
|
||||
|
||||
@app_commands.command(name="queue", description="Pokaż aktualną kolejkę")
|
||||
async def show_queue(self, interaction: discord.Interaction) -> None:
|
||||
state = self.player.state(interaction.guild.id)
|
||||
if not state.queue:
|
||||
await interaction.response.send_message("Kolejka jest pusta.", ephemeral=True)
|
||||
return
|
||||
lines: list[str] = []
|
||||
if state.current and not 0 <= state.index < len(state.queue):
|
||||
title = discord.utils.escape_markdown(state.current.title or "")
|
||||
plays = self.player.plays_left(state.current)
|
||||
lines.append(
|
||||
f"▶️ **{title}** (obecnie odtwarzane - ostatnie odtworzenie) [🔁 {plays}]\n---"
|
||||
)
|
||||
for position, track in enumerate(state.queue):
|
||||
is_current = position == state.index
|
||||
prefix = "▶️ **" if is_current else f"{position + 1}. "
|
||||
suffix = "** (obecnie odtwarzane)" if is_current else ""
|
||||
title = discord.utils.escape_markdown(track.title or "")
|
||||
lines.append(f"{prefix}{title}{suffix} [🔁 {self.player.plays_left(track)}]")
|
||||
preview = "\n".join(lines[:QUEUE_PREVIEW_LIMIT])
|
||||
if len(lines) > QUEUE_PREVIEW_LIMIT:
|
||||
preview += f"\n... i {len(lines) - QUEUE_PREVIEW_LIMIT} więcej."
|
||||
await interaction.response.send_message(f"Aktualna kolejka:\n{preview}")
|
||||
|
||||
async def _history_autocomplete(
|
||||
self, interaction: discord.Interaction, current: str
|
||||
) -> list[app_commands.Choice[str]]:
|
||||
entries = self.player.history(interaction.guild.id)
|
||||
matches = [entry for entry in entries if current.lower() in entry.title.lower()]
|
||||
return [
|
||||
app_commands.Choice(name=entry.title[:100], value=entry.id)
|
||||
for entry in matches[:AUTOCOMPLETE_LIMIT]
|
||||
]
|
||||
|
||||
@app_commands.command(name="history", description="Pokaż historię ostatnio odtwarzanych utworów")
|
||||
async def show_history(self, interaction: discord.Interaction) -> None:
|
||||
entries = self.player.history(interaction.guild.id)
|
||||
if not entries:
|
||||
await interaction.response.send_message(
|
||||
"Historia odtwarzania jest pusta.", ephemeral=True
|
||||
)
|
||||
return
|
||||
listing = "\n".join(
|
||||
f"{position + 1}. {discord.utils.escape_markdown(entry.title)}"
|
||||
for position, entry in enumerate(entries[:HISTORY_PREVIEW_LIMIT])
|
||||
)
|
||||
await interaction.response.send_message(
|
||||
f"📜 Historia odtwarzania (ostatnie {HISTORY_PREVIEW_LIMIT}):\n{listing}"
|
||||
)
|
||||
|
||||
@app_commands.command(name="trackplays", description="Zmień liczbę odtworzeń dla utworu w kolejce")
|
||||
@app_commands.describe(index="Pozycja w kolejce (od 1)", count="Nowa liczba odtworzeń (1-999)")
|
||||
async def track_plays_command(
|
||||
self, interaction: discord.Interaction, index: int, count: int
|
||||
) -> None:
|
||||
queue = self.player.state(interaction.guild.id).queue
|
||||
if not 1 <= index <= len(queue):
|
||||
await interaction.response.send_message(
|
||||
"❌ Nieprawidłowy numer utworu w kolejce.", ephemeral=True
|
||||
)
|
||||
return
|
||||
if not self._settings.is_valid_plays(count):
|
||||
await interaction.response.send_message(
|
||||
"❌ Liczba odtworzeń musi być z przedziału 1-999.", ephemeral=True
|
||||
)
|
||||
return
|
||||
track = queue[index - 1]
|
||||
track.plays_left = count
|
||||
await self.player.trigger_state_change()
|
||||
title = discord.utils.escape_markdown(track.title or "")
|
||||
await interaction.response.send_message(
|
||||
f"✅ Ustawiono liczbę odtworzeń dla utworu **{title}** na **{count}**."
|
||||
)
|
||||
Reference in new issue
Block a user