Initial commit

This commit is contained in:
insert 2024-07-14 16:26:43 -04:00
parent 6335d2a2cb
commit d9ce5f4797
Signed by: insert
GPG key ID: A70775C389ACF105
3 changed files with 165 additions and 0 deletions

4
.gitignore vendored
View file

@ -12,6 +12,10 @@ __pycache__/
build/
develop-eggs/
dist/
.direnv
.envrc
waitingforvideo.png
youtube
downloads/
eggs/
.eggs/

148
bot.py Normal file
View file

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

13
shell.nix Normal file
View file

@ -0,0 +1,13 @@
{ pkgs ? import <nixpkgs> {}}:
pkgs.mkShell {
packages = [
pkgs.python311
pkgs.python311Packages.selenium
pkgs.python311Packages.discordpy
pkgs.python311Packages.pip
pkgs.python311Packages.python-dotenv
pkgs.obs-studio
pkgs.discord
];
}