diff --git a/bot.py b/bot.py index cd85216..b1e30f3 100644 --- a/bot.py +++ b/bot.py @@ -1,9 +1,10 @@ # Imports import os +from discord.webhook.async_ import interaction_message_response_params import requests import discord from discord.ext import commands -from discord import DiscordException, NotFound, app_commands, guild, voice_client +from discord import DiscordException, NotFound, app_commands, guild, user, voice_client from dotenv import load_dotenv @@ -99,7 +100,7 @@ async def playTrack(interaction: discord.Interaction): # on the play command, we add that song to the list headers_str = f"-headers \"X-Emby-Token: {JELLYFIN_API_KEY}\"" try: - while guild_queue_dict[interaction.guild_id].count() > 0: + while len(guild_queue_dict[interaction.guild_id]) > 0: # Get song information song = guild_queue_dict[interaction.guild_id][0] @@ -158,6 +159,27 @@ async def connect(interaction: discord.Interaction): # Makes the reaction visible to everyone await interaction.response.defer() + try: + voice_status = await interaction.user.fetch_voice() + user_channel = voice_status.channel + voice_client = interaction.guild.voice_client + if voice_client is None: + voice_client = await user_channel.connect() + elif voice_client.channel != user_channel: + await voice_client.disconnect() + voice_client = await user_channel.connect() + + except discord.errors.NotFound as e: + print(f"Error: {e}") + await interaction.followup.send("You are not in a voice channel!") + return + except discord.errors.Forbidden as e: + print(f"Error: {e}") + await interaction.followup.send(f"I am not allowed in that voice channel!") + return + + + await interaction.followup.send(f"Connected!") return @@ -198,6 +220,9 @@ async def play(interaction: discord.Interaction): # Makes the reaction visible to everyone await interaction.response.defer() + if guild_queue_dict.get(interaction.guild_id) == None: + guild_queue_dict[interaction.guild_id] = [] + # Some basic checks try: # Check if the bot is connected to a channel @@ -205,19 +230,17 @@ async def play(interaction: discord.Interaction): await interaction.followup.send(f"Not connected to your voice channel!") return # After this point, we know that it is in a channel + # Check if the queue is empty - if guild_queue_dict[interaction.guild_id].count() == 0: + if len(guild_queue_dict[interaction.guild_id]) == 0: await interaction.followup.send(f"Queue is empty!") return # After this point, we know the queue has something in it - except: + except discord.errors.NotFound: await interaction.followup.send(f"You're not connected to a voice channel!") - - + return # Play all items in the queue - playTrack(interaction) - - + await playTrack(interaction) return @@ -267,13 +290,16 @@ async def search(interaction: discord.Interaction, title: str): if not data: await interaction.followup.send(f"No song found matching `{title}`.") return + + result_list = [] for song in data: result_list.append(f"**{song.get("Name")}** by *{song.get("AlbumArtist", ["Unknown Artist"])}*") await interaction.followup.send("\n".join(result_list)) -# end search ----- + return + # Skip @@ -368,13 +394,23 @@ async def add(interaction: discord.Interaction, title: str): # query the item data = await make_request(title, interaction) + # Check if data is bogus + if not data: + await interaction.followup.send(f"Couldn't find a song matching {title}") + return + + # Gets song information query_song = data[0] query_song_id = query_song.get('Id') query_song_title = query_song.get('Name') query_song_artist = query_song.get('AlbumArtist', ['Unknown Artist']) + print(f"Found: {query_song_id}, with the title {query_song_title} and artist {query_song_artist}") + # Add song information as a tuple + if guild_queue_dict.get(interaction.guild_id) == None: + guild_queue_dict[interaction.guild_id] = [] guild_queue_dict[interaction.guild_id].append((query_song_id, query_song_title, query_song_artist)) @@ -382,11 +418,11 @@ async def add(interaction: discord.Interaction, title: str): # Sends informational message await interaction.followup.send(f"Added **{query_song_title}** by *{query_song_artist}*!") - tracks_queued = guild_queue_dict[interaction.guild_id].count() + tracks_queued = len(guild_queue_dict[interaction.guild_id]) # Helpfully tells the user how many tracks until their track is played - if tracks_queued > 0: - await interaction.followup.send(f"Plays after {tracks_queued} more tracks.") + if tracks_queued > 1: + await interaction.followup.send(f"Plays after **{tracks_queued}** more tracks.") return @@ -411,7 +447,16 @@ async def queue(interaction: discord.Interaction): # Makes the reaction visible to everyone await interaction.response.defer() + # Check if queue is uninitialized + if guild_queue_dict.get(interaction.guild_id) == None: + guild_queue_dict[interaction.guild_id] = [] + # Add all the items in a queue to a list + if len(guild_queue_dict[interaction.guild_id]) == 0: + await interaction.followup.send(f"The queue is empty!") + return + + # The queue has something in it result_list = [] for song in guild_queue_dict[interaction.guild_id]: result_list.append(f"**{song[1]}** by *{song[2]}*")