import disnake import os import asyncio import os import sys import traceback import motor.motor_asyncio from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase from dotenv import load_dotenv from disnake.ext import commands,tasks from loguru import logger load_dotenv(".env", override=True) INTENTS = disnake.Intents.all() SYNC_FLAGS = commands.CommandSyncFlags.default() TOKEN = os.getenv("BOT_TOKEN") class StronkBot(commands.InteractionBot): """base bot instance""" def __init__(self, **kwargs) -> None: super().__init__(**kwargs) self.db_client: AsyncIOMotorClient = motor.motor_asyncio.AsyncIOMotorClient('mongodb://sheriff:unnipus1213@192.168.1.109:27017/?retryWrites=true&serverSelectionTimeoutMS=5000&connectTimeoutMS=10000&authSource=stormbrigade&authMechanism=SCRAM-SHA-256', maxPoolSize=10) self.database: AsyncIOMotorDatabase = self.db_client.stormbrigade async def on_ready(self) -> None: logger.info(f"Ready - using {disnake.__version__}") def load_extensions(self, path: str) -> None: for module in os.listdir(path): name, ext = os.path.splitext(module) if "__" in name or ext != ".py": continue extension = f"cogs.{name}" super().load_extension(extension) logger.info(f"Cog loaded: {extension}") async def main() -> None: """Constructs bot, load extensions, and starts bot""" logger.add("info.log", rotation="500 MB") bot = StronkBot(command_sync_flags=SYNC_FLAGS,intents=INTENTS, reload=True) @bot.slash_command(guild_ids=[934462932669038732],description="Reloads all the cogs in the bot") async def reload(self,inter,cog:str = None): if not cog: for module in os.listdir("cogs/"): name, ext = os.path.splitext(module) if "__" in name or ext != ".py": continue extension = f"cogs.{name}" bot.reload_extension(extension) logger.info(f"Cog reloaded: {extension}") await inter.send("Reloaded all cogs") else: extension = f"cogs.{cog}" bot.reload_extension(extension) logger.info(f"Cog Reloading: {extension}") await inter.send(f"Reloaded - {extension}") @bot.slash_command(guild_ids=[934462932669038732],description="Add a new cog") async def load(self,inter:disnake.ApplicationCommandInteraction,cog:str): try: bot.load_extension(f"cogs.{cog}") logger.info(f"Loading: cogs.{cog}") await inter.send(f"Loaded: cogs.{cog}") except Exception as e: logger.exception(f"Failed:{traceback.format_exception(e)}") await inter.send(f"Failed:{traceback.format_exception(e)}") @bot.slash_command(guild_ids=[934462932669038732],description="Unload a cog") async def unload(self,inter:disnake.ApplicationCommandInteraction,cog:str): try: bot.unload_extension(f"cogs.{cog}") logger.info(f"Unloading: cogs.{cog}") await inter.send(f"Unloaded: cogs.{cog}") except Exception as e: logger.exception(f"Failed:{traceback.format_exception(e)}") await inter.send(f"Failed:{traceback.format_exception(e)}") @reload.autocomplete("cog") async def autocomp_input(self, inter:disnake.ApplicationCommandInteraction,user_input:str): return [x[:-3] for x in os.listdir("cogs/") if x.endswith(".py")] try: bot.load_extensions("cogs/") except Exception: await bot.close() raise logger.info("Starting bot") await bot.start(TOKEN or "") if __name__ == "__main__": sys.exit(asyncio.run(main()))