From 94584f1028c09c91c70f6d001225a5eac6d14b2a Mon Sep 17 00:00:00 2001 From: top1055 <123alexfeetham@gmail.com> Date: Wed, 24 May 2023 09:23:30 +0100 Subject: [PATCH] added db functions and join/leave vc --- cogs/music/help.py | 4 ++ cogs/music/main.py | 26 +++++++++-- cogs/music/queue.py | 104 ++++++++++++++++++++++++++++++++++++++++++++ cogs/music/util.py | 47 ++++++++++++++++++++ 4 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 cogs/music/help.py create mode 100644 cogs/music/queue.py create mode 100644 cogs/music/util.py diff --git a/cogs/music/help.py b/cogs/music/help.py new file mode 100644 index 0000000..2847fce --- /dev/null +++ b/cogs/music/help.py @@ -0,0 +1,4 @@ +from discord.ext import commands + +class music_help(commands.MinimalHelpCommand): + pass #TODO diff --git a/cogs/music/main.py b/cogs/music/main.py index 525b201..f8ad3c0 100644 --- a/cogs/music/main.py +++ b/cogs/music/main.py @@ -1,23 +1,41 @@ import discord from discord.ext import commands from discord.ext.commands.context import Context +import cogs.music.util as util import datetime import pytz +from cogs.music.help import music_help + class music(commands.Cog): def __init__(self, client): + self.client = client + self.name = "🎶 Music" self.emoji = "🎶" - self.client = client + + help_command = music_help() + help_command.cog = self + self.help_command = help_command @commands.command( help="Displays latency from the bot", aliases=['delay']) - async def ping(self, e: Context): + async def ping(self, ctx: Context): start_time = datetime.datetime.now(pytz.utc) - end_time = e.message.created_at + end_time = ctx.message.created_at delay = int((end_time - start_time).total_seconds() * 1000) - await e.send(f"Pong! `{delay}MS`") + await ctx.send(f"Pong! `{delay}MS`") + + + @commands.command( + help="Connects to your current voice channel", + aliases=['connect']) + async def join(self, ctx: Context): + await util.join_vc(ctx) + await ctx.message.add_reaction('👍') + + diff --git a/cogs/music/queue.py b/cogs/music/queue.py new file mode 100644 index 0000000..863fb8f --- /dev/null +++ b/cogs/music/queue.py @@ -0,0 +1,104 @@ +import sqlite3 + +db_path = "./data/music.db" + + +# Creates the tables if they don't exist +def initialize_tables(): + # Connect to the database + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + + # Create servers table if it doesn't exist + cursor.execute('''CREATE TABLE IF NOT EXISTS servers ( + server_id TEXT PRIMARY KEY, + )''') + + # Create queue table if it doesn't exist + cursor.execute('''CREATE TABLE IF NOT EXISTS queue ( + server_id TEXT, + song_link TEXT, + queued_by TEXT, + index INTEGER, + has_played INTEGER DEFAULT 0, + PRIMARY KEY (server_id, order_num) + )''') + + # Commit the changes and close the connection + conn.commit() + conn.close() + + +# Queue a song in the db +def add_song(server_id, song_link, queued_by): + # Connect to db + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + + # Grab current index + cursor.execute(f""" + SELECT MAX(index) + FROM queue + WHERE server_id = ? + """, (server_id,)) + result = cursor.fetchone() + + # Highnest number or 0 + max_order_num = result[0] + 1 if result[0] is not None else 0 + + cursor.execute(""" + INSERT INTO queue (server_id, song_link, queued_by, index) + VALUES (?, ?, ?, ?) + """, (server_id, song_link, queued_by, max_order_num)) + + conn.commit() + conn.close() + + +# Add server to db if first time queuing +def add_server(server_id, cursor): + # Check if the server exists + cursor.execute('''SELECT COUNT(*) + FROM servers + WHERE server_id = ?''', (server_id,)) + + result = cursor.fetchone() + server_exists = result[0] > 0 + + # If the server doesn't exist, add it + if not server_exists: + cursor.execute('''INSERT INTO servers (server_id) + VALUES (?)''', (server_id,)) + + +# set song as played and update indexes +def mark_song_as_finished(server_id, order_num): + # Connect to the database + conn = sqlite3.connect(db_path) + cursor = conn.cursor() + + # Update the song as finished + cursor.execute('''DELETE FROM queue + WHERE server_id = ? AND order_num = ?''', + (server_id, order_num)) + #cursor.execute('''UPDATE queue + # SET is_finished = 1 + # WHERE server_id = ? AND index = ?''', + # (server_id, order_num)) + + # Get the order numbers of unplayed songs + cursor.execute('''SELECT index + FROM queue + WHERE server_id = ? AND is_finished = 0''', (server_id,)) + unplayed_order_nums = [row[0] for row in cursor.fetchall()] + + # Update the order numbers of unplayed songs + for new_order, old_order in enumerate(unplayed_order_nums, start=1): + cursor.execute('''UPDATE queue + SET order_num = ? + WHERE server_id = ? AND order_num = ?''', + (new_order, server_id, old_order)) + + # Close connection + conn.commit() + conn.close() diff --git a/cogs/music/util.py b/cogs/music/util.py new file mode 100644 index 0000000..caf735a --- /dev/null +++ b/cogs/music/util.py @@ -0,0 +1,47 @@ +import discord +from discord.ext import commands +from discord.ext.commands.context import Context +from discord.ext.commands.converter import CommandError + + +# Joining/moving to the user's vc in a guild +async def join_vc(ctx: Context): + + # Get the user's vc + author_voice = getattr(ctx.author, "voice") + if author_voice is None: + # Raise exception if user is not in vc + raise CommandError("User is not in voice channel") + + # Get user's vc + vc = getattr(author_voice, "channel") + if vc is None: + raise CommandError("Unable to find voice channel") + + # Join or move to the user's vc + if ctx.voice_client is None: + await vc.connect() + else: + # Safe to ignore type error for now + await ctx.voice_client.move_to(vc) + + +# Leaving the voice channel of a user +async def leave_vc(ctx: Context): + # If the bot is not in a vc of this server + if ctx.voice_client is None: + raise CommandError("I am not in a voice channel") + + # if user is not in voice of the server + author_voice = getattr(ctx.author, "voice") + if author_voice is None: + raise CommandError("You are not in a voice channel") + + # Make sure both bot and User are in same vc + vc = ctx.voice_client.channel + author_vc = getattr(author_voice, "channel") + if author_vc is None or vc != author_vc: + raise CommandError("You are not in this voice channel") + + # Disconnect + await ctx.voice_client.disconnect(force=False)