diff options
Diffstat (limited to '')
| -rw-r--r-- | bot/__main__.py | 13 | ||||
| -rw-r--r-- | bot/constants.py | 1 | ||||
| -rw-r--r-- | bot/seasons/evergreen/error_handler.py | 21 | 
3 files changed, 34 insertions, 1 deletions
| diff --git a/bot/__main__.py b/bot/__main__.py index a169257f..2e68a9a4 100644 --- a/bot/__main__.py +++ b/bot/__main__.py @@ -1,9 +1,22 @@  import logging +import sentry_sdk +from sentry_sdk.integrations.logging import LoggingIntegration +  from bot.bot import bot  from bot.constants import Client, STAFF_ROLES, WHITELISTED_CHANNELS  from bot.decorators import in_channel_check +sentry_logging = LoggingIntegration( +    level=logging.DEBUG, +    event_level=logging.WARNING +) + +sentry_sdk.init( +    dsn=Client.sentry_dsn, +    integrations=[sentry_logging] +) +  log = logging.getLogger(__name__)  bot.add_check(in_channel_check(*WHITELISTED_CHANNELS, bypass_roles=STAFF_ROLES)) diff --git a/bot/constants.py b/bot/constants.py index 26cc9715..051bd62a 100644 --- a/bot/constants.py +++ b/bot/constants.py @@ -66,6 +66,7 @@ class Client(NamedTuple):      guild = int(environ.get("SEASONALBOT_GUILD", 267624335836053506))      prefix = environ.get("PREFIX", ".")      token = environ.get("SEASONALBOT_TOKEN") +    sentry_dsn = environ.get("SEASONALBOT_SENTRY_DSN")      debug = environ.get("SEASONALBOT_DEBUG", "").lower() == "true"      season_override = environ.get("SEASON_OVERRIDE")      icon_cycle_frequency = 3  # N days to wait between cycling server icons within a single season diff --git a/bot/seasons/evergreen/error_handler.py b/bot/seasons/evergreen/error_handler.py index 0d8bb0bb..2753a6df 100644 --- a/bot/seasons/evergreen/error_handler.py +++ b/bot/seasons/evergreen/error_handler.py @@ -5,6 +5,7 @@ from typing import Iterable, Union  from discord import Embed, Message  from discord.ext import commands +from sentry_sdk import push_scope  from bot.constants import Colours, ERROR_REPLIES, NEGATIVE_REPLIES  from bot.decorators import InChannelCheckFailure @@ -97,7 +98,25 @@ class CommandErrorHandler(commands.Cog):              await ctx.send(embed=self.error_embed("You are not authorized to use this command.", NEGATIVE_REPLIES))              return -        log.exception(f"Unhandled command error: {str(error)}", exc_info=error) +        with push_scope() as scope: +            scope.user = { +                "id": ctx.author.id, +                "username": str(ctx.author) +            } + +            scope.set_tag("command", ctx.command.qualified_name) +            scope.set_tag("message_id", ctx.message.id) +            scope.set_tag("channel_id", ctx.channel.id) + +            scope.set_extra("full_message", ctx.message.content) + +            if ctx.guild is not None: +                scope.set_extra( +                    "jump_to", +                    f"https://discordapp.com/channels/{ctx.guild.id}/{ctx.channel.id}/{ctx.message.id}" +                ) + +            log.exception(f"Unhandled command error: {str(error)}", exc_info=error)  def setup(bot: commands.Bot) -> None: | 
