"""Main script to define bot methods, and start the bot."""

import logging
from platform import release, system

from discord import Game
from discord.ext.commands import Bot, when_mentioned_or
from sentry_sdk import configure_scope

from cdbot.log import DiscordHandler

logger = logging.getLogger(__name__)

bot = Bot(command_prefix=when_mentioned_or("...", ":"), activity=Game(name=":help"))

logger.addHandler(DiscordHandler(bot))
logger.setLevel(logging.INFO)

bot.muted = []
bot.banned_ids = []
bot.log = logger


@bot.before_invoke
async def register_metadata(ctx):
    """Attach additional data to sentry events."""
    with configure_scope() as scope:
        scope.user = {"id": ctx.author.id, "username": str(ctx.author)}
        scope.set_context("client_os", {"name": system(), "version": release()})
        scope.set_tag("command", ctx.message.content)
        scope.set_tag("channel", str(ctx.channel))


@bot.check
async def block_banned_ids(ctx):
    """Check for if a user is banned."""
    return ctx.author.id not in bot.banned_ids


@bot.check
async def block_muted(ctx):
    """Check for if a user is muted."""
    return ctx.author.id not in bot.muted


# Load cogs
bot.load_extension("cdbot.cogs.general")
bot.load_extension("cdbot.cogs.cyber")
bot.load_extension("cdbot.cogs.fun")
bot.load_extension("cdbot.cogs.admin")
bot.load_extension("cdbot.cogs.maths")