From ac6cfac0d32208063da10d4a72cdbfc59fec2f52 Mon Sep 17 00:00:00 2001 From: ionburger Date: Thu, 9 Feb 2023 19:42:08 -0700 Subject: [PATCH] beansd --- py.zip | Bin 34861 -> 0 bytes py/bot.py | 1 + py/cogs/voice.py | 107 ++++++++++++++------------------ py/cogs/voice_old.py | 143 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 189 insertions(+), 62 deletions(-) delete mode 100644 py.zip create mode 100644 py/cogs/voice_old.py diff --git a/py.zip b/py.zip deleted file mode 100644 index e41d1d4a24ae6ecce3d6e376e8361cf4d4e80a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34861 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

#-%>-p9 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 b!$J!gamc#|c|e074M-je2#A>-;M4yD1NufB diff --git a/py/bot.py b/py/bot.py index 9b6fd4e..7762655 100644 --- a/py/bot.py +++ b/py/bot.py @@ -13,6 +13,7 @@ intents = discord.Intents.all() bot = bridge.Bot(intents=intents,command_prefix=".") config = configparser.ConfigParser() config.read("config/config.conf") +bot.config = config bot.db = MongoClient(config["mongodb"]["host"],int(config["mongodb"]["port"]),username=config["mongodb"]["username"],password=config["mongodb"]["password"])['data'] bot.version = "2.0.0" diff --git a/py/cogs/voice.py b/py/cogs/voice.py index 9a30172..a654519 100644 --- a/py/cogs/voice.py +++ b/py/cogs/voice.py @@ -1,12 +1,19 @@ import discord from discord.ext import bridge, commands -from yt_dlp import YoutubeDL +import wavelink from bin.storage import Config class Voice(commands.Cog): def __init__(self, bot): self.bot = bot + @commands.Cog.listener() + async def on_ready(self): + await wavelink.NodePool.create_node(bot=self.bot, + host=self.bot.config["wavelink"]["host"], + port=self.bot.config["wavelink"]["port"], + password=self.bot.config["wavelink"]["password"],) + def qhandler(error=None,self=None, ctx=None, st=None): print("test") queue = (st.read("voice", "queue")).split("/./") @@ -43,34 +50,36 @@ class Voice(commands.Cog): await ctx.voice_client.disconnect() @bridge.bridge_command(aliases=["p"]) - async def play(self, ctx, *, video: str=""): - await ctx.defer() - args = video.split(" ") - providedchannel = False + async def play(self, ctx, *, link: str): + # await ctx.defer() + # args = video.split(" ") + # providedchannel = False channel = "" - for arg in range(len(args)-1): - if args[arg] == "-channel" or args[arg] == "-c": - channel = self.bot.get_channel(discord.utils.get(ctx.guild.channels, name=args.pop(arg+1)).id) - print(type(channel)) - print(channel) - args.pop(arg) - providedchannel = True - break - else: - channel = ctx.author.voice.channel + # for arg in range(len(args)-1): + # if args[arg] == "-channel" or args[arg] == "-c": + # channel = self.bot.get_channel(discord.utils.get(ctx.guild.channels, name=args.pop(arg+1)).id) + # print(type(channel)) + # print(channel) + # args.pop(arg) + # providedchannel = True + # break + # else: + # channel = ctx.author.voice.channel - link = " ".join(args) + # link = " ".join(args) - if providedchannel and ctx.author.guild_permissions.administrator == False: - await ctx.respond("You do not have permission to specify a channel") - return + # if providedchannel and ctx.author.guild_permissions.administrator == False: + # await ctx.respond("You do not have permission to specify a channel") + # return if ctx.author.voice is None and channel == "": await ctx.respond("You are not in a voice channel, to specify a channel use `play -channel `") return if ctx.voice_client is None: - await channel.connect() + if channel == "": + channel = ctx.author.voice.channel + vc = await channel.connect(cls=wavelink.Player) if link == "" and ctx.voice_client.is_paused(): ctx.voice_client.resume() @@ -78,46 +87,21 @@ class Voice(commands.Cog): if ctx.voice_client.is_paused(): ctx.voice_client.resume() - - ffmpeg_options = { - 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', - 'options': '-vn' - } - ytdl_format_options = { - 'format': 'bestaudio/best', - 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', - 'restrictfilenames': True, - 'noplaylist': True, - 'nocheckcertificate': True, - 'ignoreerrors': False, - 'logtostderr': False, - 'quiet': True, - 'no_warnings': True, - 'default_search': 'auto', - 'source_address': '0.0.0.0', - } - - with YoutubeDL(ytdl_format_options) as ydl: - st = Config(ctx.guild.id, self.bot.db) - if link.startswith("https://"): - info_dict = ydl.extract_info(link, download=False) - video_url = info_dict.get("url", None) - video_id = info_dict.get("id", None) - video_title = info_dict.get('title', None) - else: - info_dict = ydl.extract_info(f"ytsearch:{link}", download=False)["entries"][0] - video_url = info_dict.get("url", None) - video_id = info_dict.get("id", None) - video_title = info_dict.get('title', None) - if not ctx.voice_client.is_playing(): - ctx.voice_client.play(discord.FFmpegPCMAudio(video_url, **ffmpeg_options), after=self.qhandler(self=self, ctx=ctx, st=st)) - await ctx.respond(f"Now playing: {video_title}") - else: - print("Added to queue") - queue = st.read("voice", "queue").split("/./") - queue.append(info_dict.get("url",None)) - st.write("voice", "queue", "/./".join(queue)) - await ctx.respond(f"Added to queue: {video_title}") + await vc.play(await wavelink.YouTubeTrack.search(link,return_first=True)) + await ctx.respond(f"Now playing: {link}") + # ffmpeg_options = { + # 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', + # 'options': '-vn' + # } + # if not ctx.voice_client.is_playing(): + # ctx.voice_client.play(discord.FFmpegPCMAudio(video_url, **ffmpeg_options), after=self.qhandler(self=self, ctx=ctx, st=st)) + # await ctx.respond(f"Now playing: {video_title}") + # else: + # print("Added to queue") + # queue = st.read("voice", "queue").split("/./") + # queue.append(info_dict.get("url",None)) + # st.write("voice", "queue", "/./".join(queue)) + # await ctx.respond(f"Added to queue: {video_title}") @bridge.bridge_command(aliases=["stop"]) async def pause(self, ctx): @@ -125,7 +109,7 @@ class Voice(commands.Cog): if ctx.voice_client is None: await ctx.respond("I am not in a voice channel") else: - ctx.voice_client.pause() + await ctx.voice_client.pause() await ctx.respond("Paused") @bridge.bridge_command(alias=["next", "n","s"]) @@ -140,4 +124,3 @@ class Voice(commands.Cog): def setup(bot): bot.add_cog(Voice(bot)) - \ No newline at end of file diff --git a/py/cogs/voice_old.py b/py/cogs/voice_old.py new file mode 100644 index 0000000..9a30172 --- /dev/null +++ b/py/cogs/voice_old.py @@ -0,0 +1,143 @@ +import discord +from discord.ext import bridge, commands +from yt_dlp import YoutubeDL +from bin.storage import Config + +class Voice(commands.Cog): + def __init__(self, bot): + self.bot = bot + + def qhandler(error=None,self=None, ctx=None, st=None): + print("test") + queue = (st.read("voice", "queue")).split("/./") + try: + queue.pop(0) + except: + pass + st.write("voice", "queue", "/./".join(queue)) + ffmpeg_options = { + 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', + 'options': '-vn' + } + if len(queue) > 0: + ctx.voice_client.play(discord.FFmpegPCMAudio(queue[0]), **ffmpeg_options, after=self.qhandler(self, ctx)) + ctx.respond(f"Now playing: {queue[0]}") + + @bridge.bridge_command(alises=["j"]) + async def join(self, ctx): + await ctx.defer() + if ctx.author.voice is None: + await ctx.respond("You are not in a voice channel") + else: + channel = ctx.author.voice.channel + await channel.connect() + + @bridge.bridge_command(alises=["l"]) + async def leave(self, ctx): + await ctx.defer() + st = Config(ctx.guild.id, self.bot.db) + st.write("voice", "queue", "") + if ctx.voice_client is None: + await ctx.respond("I am not in a voice channel") + else: + await ctx.voice_client.disconnect() + + @bridge.bridge_command(aliases=["p"]) + async def play(self, ctx, *, video: str=""): + await ctx.defer() + args = video.split(" ") + providedchannel = False + channel = "" + for arg in range(len(args)-1): + if args[arg] == "-channel" or args[arg] == "-c": + channel = self.bot.get_channel(discord.utils.get(ctx.guild.channels, name=args.pop(arg+1)).id) + print(type(channel)) + print(channel) + args.pop(arg) + providedchannel = True + break + else: + channel = ctx.author.voice.channel + + link = " ".join(args) + + if providedchannel and ctx.author.guild_permissions.administrator == False: + await ctx.respond("You do not have permission to specify a channel") + return + + if ctx.author.voice is None and channel == "": + await ctx.respond("You are not in a voice channel, to specify a channel use `play -channel `") + return + + if ctx.voice_client is None: + await channel.connect() + + if link == "" and ctx.voice_client.is_paused(): + ctx.voice_client.resume() + return + + if ctx.voice_client.is_paused(): + ctx.voice_client.resume() + + ffmpeg_options = { + 'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', + 'options': '-vn' + } + ytdl_format_options = { + 'format': 'bestaudio/best', + 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', + 'restrictfilenames': True, + 'noplaylist': True, + 'nocheckcertificate': True, + 'ignoreerrors': False, + 'logtostderr': False, + 'quiet': True, + 'no_warnings': True, + 'default_search': 'auto', + 'source_address': '0.0.0.0', + } + + with YoutubeDL(ytdl_format_options) as ydl: + st = Config(ctx.guild.id, self.bot.db) + if link.startswith("https://"): + info_dict = ydl.extract_info(link, download=False) + video_url = info_dict.get("url", None) + video_id = info_dict.get("id", None) + video_title = info_dict.get('title', None) + else: + info_dict = ydl.extract_info(f"ytsearch:{link}", download=False)["entries"][0] + video_url = info_dict.get("url", None) + video_id = info_dict.get("id", None) + video_title = info_dict.get('title', None) + if not ctx.voice_client.is_playing(): + ctx.voice_client.play(discord.FFmpegPCMAudio(video_url, **ffmpeg_options), after=self.qhandler(self=self, ctx=ctx, st=st)) + await ctx.respond(f"Now playing: {video_title}") + else: + print("Added to queue") + queue = st.read("voice", "queue").split("/./") + queue.append(info_dict.get("url",None)) + st.write("voice", "queue", "/./".join(queue)) + await ctx.respond(f"Added to queue: {video_title}") + + @bridge.bridge_command(aliases=["stop"]) + async def pause(self, ctx): + await ctx.defer() + if ctx.voice_client is None: + await ctx.respond("I am not in a voice channel") + else: + ctx.voice_client.pause() + await ctx.respond("Paused") + + @bridge.bridge_command(alias=["next", "n","s"]) + async def skip(self, ctx): + await ctx.defer() + if ctx.voice_client is None: + await ctx.respond("I am not in a voice channel") + else: + ctx.voice_client.stop() + await ctx.respond("Skipped") + +def setup(bot): + bot.add_cog(Voice(bot)) + + \ No newline at end of file