def load_master(): global MASTER_CONFIG, MASTER_LOADED try: with open('config/master.json', 'r') as jsonfile: MASTER_CONFIG = json.load(jsonfile) MASTER_LOADED = True except FileNotFoundError: Logging.error("Unable to load config, running with defaults.") except Exception as e: Logging.error("Failed to parse configuration.") print(e) raise e
async def on_ready(): global STARTED if not STARTED: await Logging.onReady(bot, Configuration.get_master_var("BOT_LOG_CHANNEL")) await Configuration.on_ready(bot) for e in ["Maintenance", "Moderation", "BadNames"]: try: bot.load_extension("Cogs." + e) except Exception as ex: Logging.error(f"Failed to load cog {e}") await handle_exception(f"Loading cog {e}", ex) Logging.info("Cogs loaded") await Logging.bot_log("Outboard engine running at full speed!") STARTED = True
async def handle_exception(exception_type, exception, event=None, message=None, ctx=None, *args, **kwargs): embed = discord.Embed(colour=discord.Colour(0xff0000), timestamp=datetime.datetime.utcfromtimestamp( time.time())) # something went wrong and it might have been in on_command_error, make sure we log to the log file first lines = [ "\n===========================================EXCEPTION CAUGHT, DUMPING ALL AVAILABLE INFO===========================================", f"Type: {exception_type}" ] arg_info = "" for arg in list(args): arg_info += extract_info(arg) + "\n" if arg_info == "": arg_info = "No arguments" kwarg_info = "" for name, arg in kwargs.items(): kwarg_info += "{}: {}\n".format(name, extract_info(arg)) if kwarg_info == "": kwarg_info = "No keyword arguments" lines.append("======================Exception======================") lines.append(f"{str(exception)} ({type(exception)})") lines.append("======================ARG INFO======================") lines.append(arg_info) lines.append("======================KWARG INFO======================") lines.append(kwarg_info) lines.append("======================STACKTRACE======================") tb = "".join(traceback.format_tb(exception.__traceback__)) lines.append(tb) if message is None and event is not None and hasattr(event, "message"): message = event.message if message is None and ctx is not None: message = ctx.message if message is not None and hasattr(message, "content"): lines.append( "======================ORIGINAL MESSAGE======================") lines.append(message.content) if message.content is None or message.content == "": content = "<no content>" else: content = message.content embed.add_field(name="Original message", value=content, inline=False) lines.append( "======================ORIGINAL MESSAGE (DETAILED)======================" ) lines.append(extract_info(message)) if event is not None: lines.append("======================EVENT NAME======================") lines.append(event) embed.add_field(name="Event", value=event) if ctx is not None: lines.append( "======================COMMAND INFO======================") lines.append(f"Command: {ctx.command}") embed.add_field(name="Command", value=ctx.command) channel_name = 'Private Message' if isinstance( ctx.channel, discord.abc.PrivateChannel ) else f"{ctx.channel.name} (`{ctx.channel.id}`)" lines.append(f"Channel: {channel_name}") embed.add_field(name="Channel", value=channel_name, inline=False) sender = f"{ctx.author.name}#{ctx.author.discriminator} (`{ctx.author.id}`)" lines.append(f"Sender: {sender}") embed.add_field(name="Sender", value=sender, inline=False) lines.append( "===========================================DATA DUMP COMPLETE===========================================" ) Logging.error("\n".join(lines)) # nice embed for info on discord embed.set_author(name=exception_type) embed.add_field(name="Exception", value=f"{str(exception)} (`{type(exception)}`)", inline=False) parts = Utils.paginate(tb, max_chars=1024) num = 1 for part in parts: embed.add_field(name=f"Traceback {num}/{len(parts)}", value=part) num += 1 # try logging to botlog, wrapped in an try catch as there is no higher lvl catching to prevent taking down the bot (and if we ended here it might have even been due to trying to log to botlog try: await Logging.bot_log(embed=embed) except Exception as ex: Logging.error( f"Failed to log to botlog, either Discord broke or something is seriously wrong!\n{ex}" ) Logging.error(traceback.format_exc())