From b12f9471092ca75f83eb9fc47a43b69d6486a7f0 Mon Sep 17 00:00:00 2001 From: Sweetbread Date: Fri, 12 May 2023 23:43:24 +0300 Subject: [PATCH] [refactor]: Dicts to Dataclasses --- cogs/music.py | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/cogs/music.py b/cogs/music.py index 5afa0e2..d5e969c 100644 --- a/cogs/music.py +++ b/cogs/music.py @@ -7,6 +7,7 @@ from loguru import logger from json import dumps from discord import app_commands from discord.ext import commands +from dataclasses import dataclass from bot import db @@ -15,10 +16,25 @@ YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist':'True'} # TODO: locale +@dataclass +class Song: + register: int + url: str + info: Dict[str, Any] + +@dataclass +class Channel: + adder: discord.Member + cur_pos: int + queue: List[Song] + context: discord.Interaction + # skip_policy: Enum "everyone" + + class Music(commands.Cog, name="Музыка"): def __init__(self, bot): self.bot = bot - self.queue = {} + self.queue: Dict[int, Channel] = {} def play_(self, inter, info): try: @@ -62,13 +78,7 @@ class Music(commands.Cog, name="Музыка"): return if inter.guild.voice_client is None: await channel.connect() - self.queue[channel.id] = { - "adder": inter.user.id, - "cur_pos": 0, - "queue": [], - "context": inter, - "skip_policy": "everyone" - } + self.queue[channel.id] = Channel(inter.user, 0, [], inter) elif inter.user.voice.channel != inter.guild.voice_client.channel: await inter.response.send_message(f"Занято каналом {inter.guild.voice_client.channel.mention}") return @@ -78,7 +88,7 @@ class Music(commands.Cog, name="Музыка"): with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl: info = ydl.extract_info(url, download=False) - self.queue[channel.id]["queue"].append({'requester': inter.user.id, 'url': url, 'info': info}) + self.queue[channel.id].queue.append(Song(url, inter.user, info)) if client.is_playing() or client.is_paused(): await inter.response.send_message("Добавлена новая песня в очередь") @@ -91,7 +101,7 @@ class Music(commands.Cog, name="Музыка"): @app_commands.command() async def stop(self, inter): queue = self.queue[inter.user.voice.channel.id] - queue['cur_pos'] = len(queue['queue'])-1 + queue.cur_pos = len(queue.queue)-1 inter.guild.voice_client.stop() await inter.response.send_message("Остановлено") @@ -119,12 +129,12 @@ class Music(commands.Cog, name="Музыка"): queue = self.queue[inter.user.voice.channel.id] text = '' for pos, item in enumerate(queue['queue']): - if queue['cur_pos'] == pos: text += '>>> ' + if queue.cur_pos == pos: text += '>>> ' else: text += ' ' text += f"{pos+1}. " - text += item['info']['title'] - text += '\n - Запросил: ' + self.bot.get_user(item['requester']).name + text += item.info['title'] + text += '\n - Запросил: ' + item.requester.name text += '\n' await inter.response.send_message(f"```\n{text}\n```") @@ -138,14 +148,14 @@ class Music(commands.Cog, name="Музыка"): inter.guild.voice_client.stop() queue = self.queue[inter.user.voice.channel.id] - queue["cur_pos"] += 1 - logger.debug((len(queue["queue"]), queue["cur_pos"])) - if len(queue["queue"]) == queue["cur_pos"]: + queue.cur_pos += 1 + logger.debug((len(queue.queue), queue.cur_pos)) + if len(queue.queue) == queue.cur_pos: asyncio.run_coroutine_threadsafe(self.end_of_queue_(inter), self.bot.loop) return #logger.debug([query["music_pos"]]) - info = queue["queue"][queue["cur_pos"]]['info'] + info = queue.queue[queue.cur_pos].info self.play_(inter, info)