You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.5 KiB

import sys,discord,logging,logging.handlers,datetime,os,subprocess
from discord.ext import commands
from discord import app_commands
from signal import signal, SIGINT
# BOT STATICS
discordtoken='put yer token here, matey'
botowner='your id goes here :D'
botname='ytdlp-bot'
dependencies=['yt-dlp']
# BOT SETTINGS INIT
intents = discord.Intents.default()
intents.message_content=True
intents.members=True
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
reqperms=discord.Permissions()
reqperms.manage_messages = True
# LOGGING INIT
logging.basicConfig()
logger=logging.getLogger(botname)
logger.setLevel(logging.DEBUG)
formatter=logging.Formatter('[{asctime}] [{levelname:<8}] {name}: {message}', '%Y-%m-%d %H:%M:%S', style='{')
handler=logging.handlers.RotatingFileHandler(filename=f"{botname}.log", encoding='utf-8', maxBytes=32*1024*1024, backupCount=5)
handler.setFormatter(formatter)
logger.addHandler(handler)
# HELPER FUNCTIONS
def debug(a):
logger.debug(a)
def info(a):
logger.info(a)
def warn(a):
logger.warning(a)
def error(a):
logger.error(a)
def critical(a):
logger.critical(a)
def timestr(time):
return f"{datestr(time)} {time.hour:02}:{time.minute:02}"
def datestr(time):
return f"{time.year}-{time.month:02}-{time.day:02}"
def timemath(delta): # delta = # of days in the past
now=datetime.datetime.now()
then=now-datetime.timedelta(days=delta)
return then
def bincheck(binary):
ytdlpid = subprocess.Popen(["which", binary], stdout=subprocess.PIPE)
exit_code = ytdlpid.wait()
return True if exit_code == 0 else False
def cleanstr(string):
return string.encode('ascii', errors='ignore').decode().lower()[:20]
def isntowner(ctx):
return False if str(ctx.author.id) == botowner else True
info("")
info("-- STARTING UP --")
info("")
async def ytdl(message,ytdlink):
# https://stackoverflow.com/a/707001
ytdlpid = subprocess.Popen(["yt-dlp", ytdlink], stdout=subprocess.PIPE,text=True)
(output, err) = ytdlpid.communicate()
exit_code = ytdlpid.wait()
arrput=output.split('\n')
filename=''
if exit_code != 0:
return (exit_code,err)
for line in arrput:
if "Destination:" in line:
filename=' '.join(line.split(' ')[2:])
return (exit_code,filename)
# Dependency check
for dep in dependencies:
if (not bincheck(dep)):
critical(f"Cannot find dependency {dep} - exiting")
sys.exit(1)
info("Dependency check completed successfully")
@client.event
async def on_message(message):
if message.author == client.user:
return
if isntowner(message):
return
if "instagram.com/reel" in message.content or "instagram.com/p" in message.content:
debug(f"Detected instagram link in message '{message.content}' from '{message.author.name}'")
if "bot trigger word" not in message.content:
debug(f"'{message.author.name}' not owner >:(")
return
iglink=message.content.split(' ')[-1]
if "instagram.com" not in iglink:
error(f"Detected link in message.content is invalid: {iglink}")
await message.reply(content=f"bruh {iglink} is broken or somethin...")
# invalid lunk
return
(ytdlcode,strdata) = await ytdl(message,iglink)
if ytdlcode == 0:
info(f"Successfully downloaded video - uploading now...")
myfile=discord.File(f"{strdata}")
await message.reply(file=myfile)
info(f"deleting {strdata} file...")
os.remove(f"{strdata}")
else:
error(f"ytdl exited ({ytdlcode}) - {strdata}")
await message.reply(content=f"encountered an error, send help pls: {strdata}")
client.run(discordtoken