added db functions and join/leave vc

This commit is contained in:
2023-05-24 09:23:30 +01:00
parent 2cd080bf02
commit 94584f1028
4 changed files with 177 additions and 4 deletions

4
cogs/music/help.py Normal file
View File

@@ -0,0 +1,4 @@
from discord.ext import commands
class music_help(commands.MinimalHelpCommand):
pass #TODO

View File

@@ -1,23 +1,41 @@
import discord import discord
from discord.ext import commands from discord.ext import commands
from discord.ext.commands.context import Context from discord.ext.commands.context import Context
import cogs.music.util as util
import datetime import datetime
import pytz import pytz
from cogs.music.help import music_help
class music(commands.Cog): class music(commands.Cog):
def __init__(self, client): def __init__(self, client):
self.client = client
self.name = "🎶 Music" self.name = "🎶 Music"
self.emoji = "🎶" self.emoji = "🎶"
self.client = client
help_command = music_help()
help_command.cog = self
self.help_command = help_command
@commands.command( @commands.command(
help="Displays latency from the bot", help="Displays latency from the bot",
aliases=['delay']) aliases=['delay'])
async def ping(self, e: Context): async def ping(self, ctx: Context):
start_time = datetime.datetime.now(pytz.utc) 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) 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('👍')

104
cogs/music/queue.py Normal file
View File

@@ -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()

47
cogs/music/util.py Normal file
View File

@@ -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)