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