bot/bot.py
from typing import Iterable import sentry_sdkfrom discord import Guild, Intents, Messagefrom discord.ext.commands import Bot, CommandError, CommandInvokeError, CommandNotFound, Context, UserInputError from PyDrocsid.cog import load_cogsfrom PyDrocsid.command import make_error, replyfrom PyDrocsid.database import dbfrom PyDrocsid.environment import TOKENfrom PyDrocsid.events import listenerfrom PyDrocsid.logger import get_loggerfrom PyDrocsid.prefix import get_prefixfrom PyDrocsid.translations import t from cogs.custom.server_info import CustomServerInfoCogfrom cogs.library.administration import PermissionsCog, RolesCog, SettingsCog, SudoCogfrom cogs.library.general import CustomCommandsCog, PollsCog, ReactionRoleCog, UtilsCog, VoiceChannelCogfrom cogs.library.information import BotInfoCog, HeartbeatCog, InactivityCog, UserInfoCogfrom cogs.library.information.help.cog import HelpCog, send_helpfrom cogs.library.integrations import PythonDocsCog, RedditCog, RunCodeCogfrom cogs.library.moderation import ( AutoRoleCog, InvitesCog, LoggingCog, MessageCog, RoleNotificationsCog, SpamDetectionCog, ThreadsCog,)from cogs.library.moderation.mod.cog import ModCog, UserCommandErrorfrom cogs.library.pubsub import send_alert logger = get_logger(__name__) t = t.g async def fetch_prefix(_, msg: Message) -> Iterable[str]: prefix = [await get_prefix(), f"<@!{bot.user.id}> ", f"<@{bot.user.id}> "] if msg.guild is None: prefix.append("") return prefix bot = Bot(command_prefix=fetch_prefix, case_insensitive=True, intents=(Intents.all()))bot.remove_command("help") @listenerasync def on_ready(): logger.info(f"\033[1m\033[36mLogged in as {bot.user}\033[0m") @bot.eventasync def on_error(*_, **__): sentry_sdk.capture_exception() raise # skipcq: PYL-E0704 @listenerasync def on_command_error(ctx: Context, error: CommandError): if isinstance(error, CommandInvokeError): await reply(ctx, embed=make_error(t.internal_error)) raise error.original if isinstance(error, CommandNotFound) and ctx.guild is not None and ctx.prefix == await get_prefix(): return if isinstance(error, UserInputError): await send_help(ctx, ctx.command) elif isinstance(error, UserCommandError): await reply(ctx, embed=make_error(str(error), error.user)) else: await reply(ctx, embed=make_error(str(error))) @listenerasync def on_permission_error(guild: Guild, error: str): await send_alert(guild, error) # fmt: offload_cogs( bot, # Administration RolesCog(), PermissionsCog(), SettingsCog(), SudoCog(), # Moderation AutoRoleCog(), InvitesCog(), LoggingCog(), MessageCog(), ModCog(), RoleNotificationsCog(), SpamDetectionCog(), ThreadsCog(), # Information BotInfoCog(info_icon="https://github.com/cryptic-game.png"), HeartbeatCog(), HelpCog(), UserInfoCog(), CustomServerInfoCog(), InactivityCog(), # Integrations PythonDocsCog(), RedditCog(), RunCodeCog(), # General CustomCommandsCog(), PollsCog(team_roles=["head", "head_assistant"]), ReactionRoleCog(), UtilsCog(), VoiceChannelCog(team_roles=["head", "head_assistant"]),)# fmt: on def run(): bot.loop.run_until_complete(db.create_tables()) logger.debug("logging in") bot.run(TOKEN)