Files
zyrarbot/zyrarbot/ui/bot/client.py
T

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)