From a00a006995eefc6d7313a8ded05ca0a4758eb619 Mon Sep 17 00:00:00 2001 From: tavo-wasd Date: Sun, 31 Mar 2024 10:53:37 -0600 Subject: [PATCH] queue --- .env.example | 2 ++ .gitignore | 1 + bootstrap.sh | 1 + main.py | 60 +++++++++++++++++++++++++++++++++++++++------------- 4 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3b600ed --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +DISCORD_TOKEN=abcdefg +SONGS_DIR=/path/to/songs diff --git a/.gitignore b/.gitignore index 728cf4e..118e11c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ bin/ lib/ lib64 pyvenv.cfg +.env diff --git a/bootstrap.sh b/bootstrap.sh index a3acf15..e9b5243 100644 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -6,4 +6,5 @@ pip install discord ; pip install PyNaCl ; pip install fuzzywuzzy ; + pip install python-dotenv ; ) diff --git a/main.py b/main.py index 25430b6..62d47d6 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,9 @@ from discord.ext import commands import asyncio import os from fuzzywuzzy import process +from dotenv import load_dotenv + +load_dotenv() # Load environment variables from .env file intents = discord.Intents.default() intents.message_content = True @@ -10,20 +13,17 @@ intents.voice_states = True bot = commands.Bot(command_prefix='!', intents=intents) -def find_song(query): - # Define the base directory - base_dir = "songs/" - +def find_song(query, songs_dir): # Initialize variables to store the best match and confidence best_match = None best_confidence = 0 # Recursively search through directories for song files - for root, dirs, files in os.walk(base_dir): + for root, dirs, files in os.walk(songs_dir): for file in files: if file.endswith(".mp3"): song_path = os.path.join(root, file) - song_name = os.path.splitext(file)[0] # Get the song name without extension + song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir confidence = process.extractOne(query, [song_name])[1] # Update best match if confidence is higher @@ -33,23 +33,53 @@ def find_song(query): return best_match, best_confidence +# Define a global list to store the queued songs +queued_songs = [] + @bot.command() async def play(ctx, *, query): + voice_client = discord.utils.get(bot.voice_clients, guild=ctx.guild) + if voice_client and voice_client.is_connected(): + await add_to_queue(ctx, query) + else: + await connect_and_play(ctx, query) + +async def add_to_queue(ctx, query): + songs_dir = os.getenv("SONGS_DIR") + # Find the closest match to the query + song_path, confidence = find_song(query, songs_dir) + + if confidence >= 70 and song_path: # Adjust confidence threshold as needed + song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir + queued_songs.append((song_path, song_name)) + await ctx.send(f"Added to queue: {song_name}") + else: + await ctx.send("Sorry, couldn't find a match for that song.") + +async def connect_and_play(ctx, query): voice_channel = ctx.author.voice.channel if voice_channel: - voice_client = await voice_channel.connect() - + songs_dir = os.getenv("SONGS_DIR") # Find the closest match to the query - song_path, confidence = find_song(query) + song_path, confidence = find_song(query, songs_dir) - if confidence >= 70: # Adjust confidence threshold as needed - voice_client.play(discord.FFmpegPCMAudio(song_path)) - while voice_client.is_playing(): - await asyncio.sleep(1) - await voice_client.disconnect() + if confidence >= 70 and song_path: # Adjust confidence threshold as needed + song_name = os.path.relpath(song_path, start=songs_dir) # Get the song name relative to songs_dir + queued_songs.append((song_path, song_name)) + await play_queued_songs(ctx, voice_channel) else: await ctx.send("Sorry, couldn't find a match for that song.") else: await ctx.send("You need to be in a voice channel to use this command!") -bot.run('TOKEN') +async def play_queued_songs(ctx, voice_channel): + voice_client = await voice_channel.connect() + while queued_songs: + song_path, song_name = queued_songs.pop(0) # Get the first song in the queue + await ctx.send(f"Now playing: {song_name}") + voice_client.play(discord.FFmpegPCMAudio(song_path)) + while voice_client.is_playing(): + await asyncio.sleep(1) + await voice_client.disconnect() + +bot.run(os.getenv("DISCORD_TOKEN"))