import discord import traceback import logging import datetime import pendulum import os import aiohttp os.chdir(os.path.dirname(os.path.realpath(__file__))) from discord.ext import commands import utils opts = { 'command_prefix': utils.command_prefix, 'description': utils.bot_description, 'pm_help': None, 'command_not_found': '', 'activity': discord.Activity(name=utils.default_status, type=0) } bot = commands.AutoShardedBot(**opts) logging.basicConfig(level=logging.INFO, filename='bonfire.log') @bot.before_invoke async def start_typing(ctx): try: await ctx.trigger_typing() except (discord.Forbidden, discord.HTTPException): pass @bot.event async def on_command_completion(ctx): author = ctx.author.id guild = ctx.guild.id if ctx.guild else None command = ctx.command.qualified_name await bot.db.execute( "INSERT INTO command_usage(command, guild, author) VALUES ($1, $2, $3)", command, guild, author ) # Now add credits to a users amount # user_credits = bot.db.load('credits', key=ctx.author.id, pluck='credits') or 1000 # user_credits = int(user_credits) + 5 # update = { # 'member_id': str(ctx.author.id), # 'credits': user_credits # } # await bot.db.save('credits', update) @bot.event async def on_command_error(ctx, error): error = error.original if hasattr(error, "original") else error ignored_errors = ( commands.CommandNotFound, commands.DisabledCommand, discord.Forbidden, aiohttp.ClientOSError, commands.CheckFailure, commands.CommandOnCooldown, ) if isinstance(error, ignored_errors): return elif isinstance(error, discord.HTTPException) and ( 'empty message' in str(error) or 'INTERNAL SERVER ERROR' in str(error) or 'REQUEST ENTITY TOO LARGE' in str(error) or 'Unknown Message' in str(error) or 'Origin Time-out' in str(error) or 'Bad Gateway' in str(error) or 'Gateway Time-out' in str(error) or 'Explicit content' in str(error)): return elif isinstance(error, discord.NotFound) and 'Unknown Channel' in str(error): return try: if isinstance(error, commands.BadArgument): fmt = "Please provide a valid argument to pass to the command: {}".format(error) await ctx.message.channel.send(fmt) elif isinstance(error, commands.NoPrivateMessage): fmt = "This command cannot be used in a private message" await ctx.message.channel.send(fmt) elif isinstance(error, commands.MissingRequiredArgument): await ctx.message.channel.send(error) else: now = datetime.datetime.now() with open("error_log", 'a') as f: print("In server '{0.message.guild}' at {1}\nFull command: `{0.message.content}`".format(ctx, str(now)), file=f) traceback.print_tb(error.__traceback__, file=f) print('{0.__class__.__name__}: {0}'.format(error), file=f) except discord.HTTPException: pass if __name__ == '__main__': bot.remove_command('help') # Setup our bot vars, db and cache bot.db = utils.DB() bot.cache = utils.Cache(bot.db) # Start our startup task (cache sets up the database, so just this) bot.loop.create_task(bot.cache.setup()) for e in utils.extensions: bot.load_extension(e) bot.uptime = pendulum.now(tz="UTC") bot.run(utils.bot_token)