import datetime import logging import traceback from logging import FileHandler from pathlib import Path import discord import toml from discord.ext import commands from rich.logging import RichHandler log = logging.getLogger("jimmy") logging.basicConfig( format="%(asctime)s %(levelname)s %(name)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=CONFIG.get("logging", {}).get("level", "INFO"), handlers=[ RichHandler( level=CONFIG.get("logging", {}).get("level", "INFO"), show_time=False, show_path=False, markup=True ), FileHandler( filename=CONFIG.get("logging", {}).get("file", "jimmy.log"), mode="a", ) ] ) bot = commands.Bot( command_prefix=commands.when_mentioned_or("h!", "H!"), case_insensitive=True, strip_after_prefix=True, debug_guilds=CONFIG["jimmy"].get("debug_guilds") ) bot.load_extension("cogs.ytdl") bot.load_extension("cogs.net") bot.load_extension("cogs.screenshot") @bot.event async def on_ready(): log.info(f"Logged in as {bot.user} ({bot.user.id})") @bot.listen() async def on_application_command(ctx: discord.ApplicationContext): log.info(f"Received command [b]{ctx.command}[/] from {ctx.author} in {ctx.guild}") ctx.start_time = discord.utils.utcnow() @bot.listen() async def on_application_command_error(ctx: discord.ApplicationContext, exc: Exception): log.error(f"Error in {ctx.command} from {ctx.author} in {ctx.guild}", exc_info=exc) if isinstance(exc, commands.CommandOnCooldown): expires = discord.utils.utcnow() + datetime.timedelta(seconds=exc.retry_after) await ctx.respond(f"Command on cooldown. Try again {discord.utils.format_dt(expires, style='R')}.") elif isinstance(exc, commands.MaxConcurrencyReached): await ctx.respond("You've reached the maximum number of concurrent uses for this command.") else: if await bot.is_owner(ctx.author): paginator = commands.Paginator(prefix="```py") for line in traceback.format_exception(type(exc), exc, exc.__traceback__): paginator.add_line(line[:1990]) for page in paginator.pages: await ctx.respond(page) else: await ctx.respond(f"An error occurred while processing your command. Please try again later.\n" f"{exc}") @bot.listen() async def on_application_command_completion(ctx: discord.ApplicationContext): time_taken = discord.utils.utcnow() - ctx.start_time log.info( f"Completed command [b]{ctx.command}[/] from {ctx.author} in " f"{ctx.guild} in {time_taken.total_seconds():.2f} seconds." ) bot.run(CONFIG["jimmy"]["token"])