refactor(commands/voice): split into separate files
This commit is contained in:
85
commands/voice/utils.py
Normal file
85
commands/voice/utils.py
Normal file
@@ -0,0 +1,85 @@
|
||||
import constants
|
||||
import disnake
|
||||
import youtubedl
|
||||
from state import client, players
|
||||
|
||||
import utils
|
||||
|
||||
|
||||
def play_after_callback(e, message, once):
|
||||
if e:
|
||||
print(f"player error: {e}")
|
||||
if not once:
|
||||
play_next(message)
|
||||
|
||||
|
||||
def play_next(message, once=False, first=False):
|
||||
if not message.guild.voice_client:
|
||||
return
|
||||
|
||||
message.guild.voice_client.stop()
|
||||
if message.guild.id in players and players[message.guild.id].queue:
|
||||
queued = players[message.guild.id].queue_pop()
|
||||
try:
|
||||
message.guild.voice_client.play(
|
||||
queued.player, after=lambda e: play_after_callback(e, message, once)
|
||||
)
|
||||
except disnake.opus.OpusNotLoaded:
|
||||
utils.load_opus()
|
||||
message.guild.voice_client.play(
|
||||
queued.player, after=lambda e: play_after_callback(e, message, once)
|
||||
)
|
||||
|
||||
embed = disnake.Embed(
|
||||
color=constants.EMBED_COLOR,
|
||||
title=queued.player.title,
|
||||
url=queued.player.original_url,
|
||||
description=f"`[{'-'*constants.BAR_LENGTH}]` **{youtubedl.format_duration(0)}** / **{youtubedl.format_duration(queued.player.duration)}**",
|
||||
)
|
||||
embed.add_field(name="Volume", value=f"{int(queued.player.volume*100)}%")
|
||||
embed.add_field(name="Views", value=f"{queued.player.view_count:,}")
|
||||
embed.add_field(
|
||||
name="Queuer",
|
||||
value=players[message.guild.id].current.trigger_message.author.mention,
|
||||
)
|
||||
embed.set_image(queued.player.thumbnail_url)
|
||||
|
||||
if first and len(players[message.guild.id].queue) == 0:
|
||||
client.loop.create_task(utils.reply(message, embed=embed))
|
||||
else:
|
||||
client.loop.create_task(utils.channel_send(message, embed=embed))
|
||||
|
||||
|
||||
def remove_queued(messages):
|
||||
if messages[0].guild.id not in players:
|
||||
return
|
||||
|
||||
if len(players[messages[0].guild.id].queue) == 0:
|
||||
return
|
||||
|
||||
found = []
|
||||
for message in messages:
|
||||
for queued in players[message.guild.id].queue:
|
||||
if queued.trigger_message.id == message.id:
|
||||
found.append(queued)
|
||||
for queued in found:
|
||||
players[messages[0].guild.id].queue.remove(queued)
|
||||
|
||||
|
||||
async def ensure_joined(message):
|
||||
if message.guild.voice_client is None:
|
||||
if message.author.voice:
|
||||
await message.author.voice.channel.connect()
|
||||
else:
|
||||
await utils.reply(message, "you are not connected to a voice channel!")
|
||||
|
||||
|
||||
def command_allowed(message, immutable=False):
|
||||
if not message.guild.voice_client:
|
||||
return
|
||||
if immutable:
|
||||
return message.channel.id == message.guild.voice_client.channel.id
|
||||
else:
|
||||
if not message.author.voice:
|
||||
return False
|
||||
return message.author.voice.channel.id == message.guild.voice_client.channel.id
|
||||
Reference in New Issue
Block a user