[refactor]: Dicts to Dataclasses
This commit is contained in:
parent
9b66edeb62
commit
b12f947109
@ -7,6 +7,7 @@ from loguru import logger
|
|||||||
from json import dumps
|
from json import dumps
|
||||||
from discord import app_commands
|
from discord import app_commands
|
||||||
from discord.ext import commands
|
from discord.ext import commands
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from bot import db
|
from bot import db
|
||||||
|
|
||||||
@ -15,10 +16,25 @@ YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist':'True'}
|
|||||||
|
|
||||||
# TODO: locale
|
# 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="Музыка"):
|
class Music(commands.Cog, name="Музыка"):
|
||||||
def __init__(self, bot):
|
def __init__(self, bot):
|
||||||
self.bot = bot
|
self.bot = bot
|
||||||
self.queue = {}
|
self.queue: Dict[int, Channel] = {}
|
||||||
|
|
||||||
def play_(self, inter, info):
|
def play_(self, inter, info):
|
||||||
try:
|
try:
|
||||||
@ -62,13 +78,7 @@ class Music(commands.Cog, name="Музыка"):
|
|||||||
return
|
return
|
||||||
if inter.guild.voice_client is None:
|
if inter.guild.voice_client is None:
|
||||||
await channel.connect()
|
await channel.connect()
|
||||||
self.queue[channel.id] = {
|
self.queue[channel.id] = Channel(inter.user, 0, [], inter)
|
||||||
"adder": inter.user.id,
|
|
||||||
"cur_pos": 0,
|
|
||||||
"queue": [],
|
|
||||||
"context": inter,
|
|
||||||
"skip_policy": "everyone"
|
|
||||||
}
|
|
||||||
elif inter.user.voice.channel != inter.guild.voice_client.channel:
|
elif inter.user.voice.channel != inter.guild.voice_client.channel:
|
||||||
await inter.response.send_message(f"Занято каналом {inter.guild.voice_client.channel.mention}")
|
await inter.response.send_message(f"Занято каналом {inter.guild.voice_client.channel.mention}")
|
||||||
return
|
return
|
||||||
@ -78,7 +88,7 @@ class Music(commands.Cog, name="Музыка"):
|
|||||||
with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
|
with youtube_dl.YoutubeDL(YDL_OPTIONS) as ydl:
|
||||||
info = ydl.extract_info(url, download=False)
|
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():
|
if client.is_playing() or client.is_paused():
|
||||||
await inter.response.send_message("Добавлена новая песня в очередь")
|
await inter.response.send_message("Добавлена новая песня в очередь")
|
||||||
@ -91,7 +101,7 @@ class Music(commands.Cog, name="Музыка"):
|
|||||||
@app_commands.command()
|
@app_commands.command()
|
||||||
async def stop(self, inter):
|
async def stop(self, inter):
|
||||||
queue = self.queue[inter.user.voice.channel.id]
|
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()
|
inter.guild.voice_client.stop()
|
||||||
await inter.response.send_message("Остановлено")
|
await inter.response.send_message("Остановлено")
|
||||||
|
|
||||||
@ -119,12 +129,12 @@ class Music(commands.Cog, name="Музыка"):
|
|||||||
queue = self.queue[inter.user.voice.channel.id]
|
queue = self.queue[inter.user.voice.channel.id]
|
||||||
text = ''
|
text = ''
|
||||||
for pos, item in enumerate(queue['queue']):
|
for pos, item in enumerate(queue['queue']):
|
||||||
if queue['cur_pos'] == pos: text += '>>> '
|
if queue.cur_pos == pos: text += '>>> '
|
||||||
else: text += ' '
|
else: text += ' '
|
||||||
|
|
||||||
text += f"{pos+1}. "
|
text += f"{pos+1}. "
|
||||||
text += item['info']['title']
|
text += item.info['title']
|
||||||
text += '\n - Запросил: ' + self.bot.get_user(item['requester']).name
|
text += '\n - Запросил: ' + item.requester.name
|
||||||
|
|
||||||
text += '\n'
|
text += '\n'
|
||||||
await inter.response.send_message(f"```\n{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()
|
inter.guild.voice_client.stop()
|
||||||
|
|
||||||
queue = self.queue[inter.user.voice.channel.id]
|
queue = self.queue[inter.user.voice.channel.id]
|
||||||
queue["cur_pos"] += 1
|
queue.cur_pos += 1
|
||||||
logger.debug((len(queue["queue"]), queue["cur_pos"]))
|
logger.debug((len(queue.queue), queue.cur_pos))
|
||||||
if 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)
|
asyncio.run_coroutine_threadsafe(self.end_of_queue_(inter), self.bot.loop)
|
||||||
return
|
return
|
||||||
|
|
||||||
#logger.debug([query["music_pos"]])
|
#logger.debug([query["music_pos"]])
|
||||||
info = queue["queue"][queue["cur_pos"]]['info']
|
info = queue.queue[queue.cur_pos].info
|
||||||
self.play_(inter, info)
|
self.play_(inter, info)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user