feat(commands/voice/queue): add remove commands

This commit is contained in:
Ryan 2024-12-30 18:47:22 -05:00
parent 393403ef7d
commit f09e82c211
Signed by: ErrorNoInternet
GPG Key ID: 2486BFB7B1E6A4A3
3 changed files with 67 additions and 12 deletions

View File

@ -17,8 +17,11 @@ class ArgumentParser:
self.parser.print_help() self.parser.print_help()
return help_buffer.getvalue().replace(" and exit", "") return help_buffer.getvalue().replace(" and exit", "")
def add_mutually_exclusive_group(self, *args, **kwargs):
return self.parser.add_mutually_exclusive_group(*args, **kwargs)
def add_argument(self, *args, **kwargs): def add_argument(self, *args, **kwargs):
self.parser.add_argument(*args, **kwargs) return self.parser.add_argument(*args, **kwargs)
async def parse_args(self, message, tokens) -> argparse.Namespace | None: async def parse_args(self, message, tokens) -> argparse.Namespace | None:
try: try:

View File

@ -1,6 +1,7 @@
import re import re
import arguments import arguments
import commands import commands
import utils import utils

View File

@ -1,11 +1,12 @@
import functools import functools
import arguments import arguments
import commands
import utils
import youtubedl import youtubedl
from state import client, player_current, player_queue from state import client, player_current, player_queue
import commands
import utils
async def queue_or_play(message): async def queue_or_play(message):
await ensure_joined(message) await ensure_joined(message)
@ -20,13 +21,8 @@ async def queue_or_play(message):
tokens[0], "queue a song, list the queue, or resume playback" tokens[0], "queue a song, list the queue, or resume playback"
) )
parser.add_argument("query", nargs="?", help="yt-dlp URL or query to get song") parser.add_argument("query", nargs="?", help="yt-dlp URL or query to get song")
parser.add_argument( group = parser.add_mutually_exclusive_group()
"-c", group.add_argument(
"--clear",
action="store_true",
help="clear all queued songs",
)
parser.add_argument(
"-v", "-v",
"--volume", "--volume",
default=50, default=50,
@ -34,6 +30,35 @@ async def queue_or_play(message):
metavar="[0-150]", metavar="[0-150]",
help="the volume level (0 - 150)", help="the volume level (0 - 150)",
) )
group.add_argument(
"-i",
"--remove-index",
type=int,
help="remove a queued song by index",
)
group.add_argument(
"-m",
"--remove-multiple",
action="store_true",
help="continue removing queued songs after finding a match",
)
group.add_argument(
"-c",
"--clear",
action="store_true",
help="remove all queued songs",
)
parser.add_argument(
"-t",
"--remove-title",
help="remove queued songs by title",
)
parser.add_argument(
"-q",
"--remove-queuer",
type=int,
help="remove queued songs by queuer",
)
if not (args := await parser.parse_args(message, tokens)): if not (args := await parser.parse_args(message, tokens)):
return return
@ -41,6 +66,31 @@ async def queue_or_play(message):
player_queue[message.guild.id] = [] player_queue[message.guild.id] = []
await utils.add_check_reaction(message) await utils.add_check_reaction(message)
return return
elif i := args.remove_index:
try:
queued = player_queue[message.guild.id][i - 1]
del player_queue[message.guild.id][i - 1]
await utils.reply(message, f"**x** `{queued['player'].title}`")
except:
await utils.reply(message, "invalid index!")
elif args.remove_title or args.remove_queuer:
targets = []
for queued in player_queue[message.guild.id]:
if t := args.remove_title:
if t in queued["player"].title:
targets.append(queued)
if q := args.remove_queuer:
if q == queued["queuer"]:
targets.append(queued)
if not args.remove_multiple:
targets = targets[:1]
for target in targets:
if target in player_queue[message.guild.id]:
player_queue[message.guild.id].remove(target)
await utils.reply(
message,
f"removed **{len(targets)}** queued {'song' if len(targets) == 1 else 'songs'}",
)
elif query := args.query: elif query := args.query:
try: try:
async with message.channel.typing(): async with message.channel.typing():
@ -80,7 +130,7 @@ async def queue_or_play(message):
) )
else: else:
generate_currently_playing = ( generate_currently_playing = (
lambda: f"**0.** {'**paused:** ' if message.guild.voice_client.is_paused() else ''}`{message.guild.voice_client.source.title}` (<@{player_current[message.guild.id]['queuer']}>)" lambda: f"**0.** {'(paused) ' if message.guild.voice_client.is_paused() else ''}`{message.guild.voice_client.source.title}` (<@{player_current[message.guild.id]['queuer']}>)"
) )
if ( if (
not player_queue[message.guild.id] not player_queue[message.guild.id]
@ -201,7 +251,8 @@ async def volume(message):
def play_next(message, once=False): def play_next(message, once=False):
message.guild.voice_client.stop() message.guild.voice_client.stop()
if player_queue[message.guild.id]: if player_queue[message.guild.id]:
queued = player_queue[message.guild.id].pop() queued = player_queue[message.guild.id][0]
del player_queue[message.guild.id][0]
player_current[message.guild.id] = queued player_current[message.guild.id] = queued
message.guild.voice_client.play( message.guild.voice_client.play(
queued["player"], after=lambda _: play_next(message) if not once else None queued["player"], after=lambda _: play_next(message) if not once else None