aboutsummaryrefslogtreecommitdiffstats
path: root/bot
diff options
context:
space:
mode:
Diffstat (limited to 'bot')
-rw-r--r--bot/__main__.py13
-rw-r--r--bot/constants.py1
-rw-r--r--bot/seasons/evergreen/error_handler.py21
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: