stormbrigade_sheriff/main.py

105 lines
3.7 KiB
Python

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()))