diff options
Diffstat (limited to 'bot')
-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: |