86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
import discord
|
|
from discord.ext import commands
|
|
|
|
from zyrarbot.audio.track_factory import TrackFactory
|
|
from zyrarbot.music.music_player import MusicPlayer
|
|
from zyrarbot.settings import Settings
|
|
from zyrarbot.storage.guild_config_repository import GuildConfigRepository
|
|
from zyrarbot.storage.history_repository import HistoryRepository
|
|
from zyrarbot.storage.uploads_repository import UploadsRepository
|
|
from zyrarbot.ui.bot.cogs.control_cog import ControlCog
|
|
from zyrarbot.ui.bot.cogs.playback_cog import PlaybackCog
|
|
from zyrarbot.ui.bot.cogs.queue_cog import QueueCog
|
|
from zyrarbot.ui.bot.cogs.settings_cog import SettingsCog
|
|
from zyrarbot.ui.bot.cogs.voice_cog import VoiceCog
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class MusicBot(commands.Bot):
|
|
"""Klient Discorda rejestrujący cog muzyczny i synchronizujący komendy.
|
|
|
|
``player`` przypisuje kompozycja aplikacji tuż po utworzeniu klienta -
|
|
odtwarzacz potrzebuje bota, a bot odtwarzacza, więc pętlę domykamy tutaj.
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
settings: Settings,
|
|
tracks: TrackFactory,
|
|
uploads: UploadsRepository,
|
|
config: GuildConfigRepository,
|
|
history: HistoryRepository,
|
|
):
|
|
intents = discord.Intents.default()
|
|
intents.message_content = True
|
|
intents.voice_states = True
|
|
super().__init__(command_prefix="!", intents=intents)
|
|
|
|
self.settings = settings
|
|
self.tracks = tracks
|
|
self.uploads = uploads
|
|
self.config = config
|
|
self.history = history
|
|
self.player: MusicPlayer | None = None
|
|
|
|
def _create_music_cogs(self) -> tuple[commands.Cog, ...]:
|
|
if self.player is None:
|
|
raise RuntimeError("MusicPlayer musi zostać przypisany przed utworzeniem Cogów")
|
|
|
|
return (
|
|
PlaybackCog(self, self.player, self.tracks, self.uploads),
|
|
QueueCog(self, self.player, self.settings),
|
|
ControlCog(self, self.player),
|
|
VoiceCog(self, self.player),
|
|
SettingsCog(self, self.player, self.settings),
|
|
)
|
|
|
|
async def setup_hook(self) -> None:
|
|
if self.player is None:
|
|
raise RuntimeError("MusicPlayer musi zostać przypisany przed startem bota")
|
|
|
|
for cog in self._create_music_cogs():
|
|
await self.add_cog(cog)
|
|
|
|
if self.settings.guild_id:
|
|
guild = discord.Object(id=self.settings.guild_id)
|
|
self.tree.copy_global_to(guild=guild)
|
|
await self.tree.sync(guild=guild)
|
|
logger.info("Zsynchronizowano komendy z serwerem %s", self.settings.guild_id)
|
|
else:
|
|
await self.tree.sync()
|
|
logger.info("Zsynchronizowano komendy globalnie")
|
|
|
|
async def on_ready(self) -> None:
|
|
if self.guilds:
|
|
first_guild_id = self.guilds[0].id
|
|
self.uploads.migrate_legacy(first_guild_id)
|
|
self.config.migrate_legacy(first_guild_id)
|
|
self.history.migrate_legacy(first_guild_id)
|
|
if self.user:
|
|
logger.info("Zalogowano jako %s (%s)", self.user.name, self.user.id)
|