From d9ce5f47974c24b97e28376dd26a59a050ad4c27 Mon Sep 17 00:00:00 2001 From: insert Date: Sun, 14 Jul 2024 16:26:43 -0400 Subject: [PATCH] Initial commit --- .gitignore | 4 ++ bot.py | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++ shell.nix | 13 +++++ 3 files changed, 165 insertions(+) create mode 100644 bot.py create mode 100644 shell.nix diff --git a/.gitignore b/.gitignore index cdba39e..f89fbc1 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,10 @@ __pycache__/ build/ develop-eggs/ dist/ +.direnv +.envrc +waitingforvideo.png +youtube downloads/ eggs/ .eggs/ diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..7d17e8e --- /dev/null +++ b/bot.py @@ -0,0 +1,148 @@ +from selenium.webdriver.firefox.options import Options +from selenium import webdriver +from selenium.webdriver.common.keys import Keys +from selenium.webdriver.common.by import By +from time import sleep +import disnake +from urllib.parse import urlparse +from disnake.ext import commands +from disnake import TextInputStyle +import asyncio +from dotenv import load_dotenv +import os +import logging + +logger = logging.getLogger('disnake') +logger.setLevel(logging.DEBUG) +handler = logging.FileHandler(filename='disnake.log', encoding='utf-8', mode='w') +handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s')) +logger.addHandler(handler) + +queue = [] +load_dotenv() +options = Options() +options.profile = webdriver.FirefoxProfile(os.getenv("PROFILE_PATH")) +driver = webdriver.Firefox(options=options) +intents = disnake.Intents.default() +intents.message_content = False +bot = commands.Bot(intents=intents, command_prefix=".", test_guilds=[int(os.getenv("GUILD_ID"))]) + +@bot.event +async def on_ready(): + global queuetask + queuetask = asyncio.create_task(queuehandler()) #this will just fail but it establishes checks + +def play_video(videourl): + driver.get(videourl) + sleep(4) + elem = driver.find_element(By.CLASS_NAME, "ytp-fullscreen-button") + elem.send_keys(Keys.RETURN) + #guess I don't need this + #sleep(1.5) + #elem = driver.find_element(By.XPATH, '//button[@aria-keyshortcuts="k"]') + #elem.send_keys(Keys.RETURN) + try: + elem = driver.find_element(By.XPATH, '//button[@data-tooltip-target-id="ytp-autonav-toggle-button"][@aria-label="Autoplay is on"]') + elem.send_keys(Keys.RETURN) + except Exception: + pass + sleep(10) + try: + elem = driver.find_element(By.XPATH, '//button[@aria-label="Dismiss"]') + elem.send_keys(Keys.RETURN) + except Exception: + pass + endscreen = driver.find_element(By.CLASS_NAME, "html5-endscreen") + while str(endscreen.get_attribute('style')) == "display: none;": + pass + sleep(2) + return + +@bot.slash_command( + name="play", + description="adds a video to the queue", +) +async def play(inter: disnake.AppCmdInter, link: str): + await inter.response.defer(ephemeral=True) + if urlparse(link).netloc == 'youtube.com' or urlparse(link).netloc == 'www.youtube.com' or urlparse(link).netloc == 'youtu.be': + queue.append(link) + await inter.edit_original_response(f"added to queue!") + global queuetask + if queuetask.done(): + queuetask = asyncio.create_task(queuehandler()) + return + else: + await inter.edit_original_response(f"This bot only accepts youtube links") + return + +@bot.slash_command( + name="queue", + description="list the videos in queue", +) +async def getqueue(inter: disnake.AppCmdInter): + await inter.response.defer(ephemeral=True) + if not queue: + await inter.edit_original_response("There are no items in queue") + message = "" + for idx, item in enumerate(queue): + if idx == 0: + message = message + "Now playing: <{item}>\n" + continue + message = message + f"{idx}. <{item}>\n" + await inter.edit_original_response(message) + +@bot.slash_command( + name="toggleplayback", + description="pauses or unpauses the video", +) +async def toggleplayback(inter: disnake.AppCmdInter): + await inter.response.defer(ephemeral=True) + try: + elem = driver.find_element(By.XPATH, '//button[@aria-keyshortcuts="k"]') + elem.send_keys(Keys.RETURN) + except Exception: + pass + await inter.edit_original_response("toggled!") + +@bot.slash_command( + name="skip", + description="skips the current video DON'T SKIP LESS THAN 18 SECONDS INTO A VIDEO", +) +async def skip(inter: disnake.AppCmdInter): + await inter.response.defer(ephemeral=True) + global queuetask + queuetask.cancel() + try: + await queuetask + except asyncio.CancelledError: + queue.pop(0) + if len(queue) < 1: + driver.get(f"file://{os.getcwd()}/waitingforvideo.png") + driver.fullscreen_window() + else: + queuetask = asyncio.create_task(queuehandler()) + await inter.edit_original_response("skipepd") + +@bot.slash_command( + name="remove", + description="removes a video from the queue", +) +async def remove(inter: disnake.AppCmdInter, toremove: int): + await inter.response.defer(ephemeral=True) + if toremove == 0: + await inter.edit_original_response("that is the currently playing video!", ephemeral=True) + return + else: + queue.pop(toremove) + await inter.edit_original_response("removed!") + +async def queuehandler(): + loop = asyncio.get_running_loop() + while queue: + driver.maximize_window() + await loop.run_in_executor(None, play_video, queue[0]) + queue.pop(0) + driver.get(f"file://{os.getcwd()}/waitingforvideo.png") + driver.fullscreen_window() + +bot.run(os.getenv("TOKEN")) \ No newline at end of file diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..123508f --- /dev/null +++ b/shell.nix @@ -0,0 +1,13 @@ +{ pkgs ? import {}}: + +pkgs.mkShell { + packages = [ + pkgs.python311 + pkgs.python311Packages.selenium + pkgs.python311Packages.discordpy + pkgs.python311Packages.pip + pkgs.python311Packages.python-dotenv + pkgs.obs-studio + pkgs.discord + ]; +} \ No newline at end of file