1
0
Fork 0
mirror of synced 2024-05-03 04:02:28 +12:00
Bonfire/bot.py

147 lines
4.5 KiB
Python
Raw Normal View History

2016-07-09 11:26:43 +12:00
import discord
2016-07-31 02:59:35 +12:00
import logging
import pendulum
import aiohttp
import asyncio
from discord.ext import commands
import utils
2020-10-07 15:15:09 +13:00
intent = discord.Intents.all()
intent.presences = False
2018-10-05 08:38:15 +13:00
opts = {
2020-09-14 06:06:02 +12:00
"command_prefix": utils.command_prefix,
"description": utils.bot_description,
"pm_help": None,
"command_not_found": "",
"activity": discord.Activity(name=utils.default_status, type=0),
"allowed_mentions": discord.AllowedMentions(everyone=False),
2020-10-07 15:15:09 +13:00
"intents": intent,
"chunk_guilds_at_startup": False,
2018-10-05 08:38:15 +13:00
}
2017-03-06 09:40:00 +13:00
bot = commands.AutoShardedBot(**opts)
2020-09-14 06:06:02 +12:00
logging.basicConfig(level=logging.INFO, filename="bonfire.log")
2016-07-08 10:10:24 +12:00
2016-07-31 12:20:55 +12:00
2019-01-28 15:58:39 +13:00
@bot.before_invoke
async def before_invocation(ctx):
# Start typing
try:
await ctx.trigger_typing()
except (discord.Forbidden, discord.HTTPException):
pass
2019-01-28 15:58:39 +13:00
# If this is a DM, or the guild has been chunked, we're done
if not ctx.guild or ctx.guild.chunked:
return
2019-01-28 15:58:39 +13:00
# Get a lock for the guild
lock = bot.chunked_guild_locks.get(ctx.guild.id)
# If one hasn't been created yet, create it
if lock is None:
lock = asyncio.Lock()
bot.chunked_guild_locks[ctx.guild.id] = lock
# Now only try to chunk when the lock is available
async with lock:
# Recheck if it's been chunked just in case, don't want to chunk if we don't have to
if ctx.guild and not ctx.guild.chunked:
await ctx.guild.chunk()
2016-09-24 14:38:58 +12:00
@bot.event
async def on_command_completion(ctx):
2019-01-28 15:58:39 +13:00
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,
2020-09-14 06:06:02 +12:00
author,
2019-01-28 15:58:39 +13:00
)
# 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):
2019-01-28 15:58:39 +13:00
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):
2016-09-18 13:29:48 +12:00
return
2019-01-28 15:58:39 +13:00
elif isinstance(error, discord.HTTPException) and (
2020-09-14 06:06:02 +12:00
"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)
):
2019-01-28 15:58:39 +13:00
return
2020-09-14 06:06:02 +12:00
elif isinstance(error, discord.NotFound) and "Unknown Channel" in str(error):
return
try:
if isinstance(error, (commands.BadArgument, commands.BadUnionArgument)):
2020-09-14 06:06:02 +12:00
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)
2020-09-14 06:06:02 +12:00
elif isinstance(
error,
(
2019-12-01 10:24:17 +13:00
commands.InvalidEndOfQuotedStringError,
commands.ExpectedClosingQuoteError,
2020-09-14 06:06:02 +12:00
commands.UnexpectedQuoteError,
),
):
await ctx.message.channel.send(
"Quotes must go around the arguments you want to provide to the command,"
" recheck where your quotes are"
)
else:
await utils.log_error(error, ctx.bot, ctx)
except discord.HTTPException:
pass
2016-07-31 12:20:55 +12:00
2020-09-14 06:06:02 +12:00
if __name__ == "__main__":
bot.remove_command("help")
2019-01-28 15:58:39 +13:00
# Setup our bot vars, db and cache
2017-06-28 14:01:36 +12:00
bot.db = utils.DB()
2019-01-28 15:58:39 +13:00
bot.cache = utils.Cache(bot.db)
2019-11-20 12:22:42 +13:00
bot.error_channel = utils.error_channel
# Start our startup task (cache sets up the database, so just this)
2019-01-28 15:58:39 +13:00
bot.loop.create_task(bot.cache.setup())
for e in utils.extensions:
2016-07-09 13:27:19 +12:00
bot.load_extension(e)
2017-06-07 20:30:19 +12:00
2018-09-24 10:41:05 +12:00
bot.uptime = pendulum.now(tz="UTC")
bot.chunked_guild_locks = {}
bot.run(utils.bot_token)