diff options
| -rw-r--r-- | Pipfile | 1 | ||||
| -rw-r--r-- | Pipfile.lock | 78 | ||||
| -rw-r--r-- | bot/__main__.py | 13 | ||||
| -rw-r--r-- | bot/constants.py | 1 | ||||
| -rw-r--r-- | bot/seasons/evergreen/error_handler.py | 21 | 
5 files changed, 85 insertions, 29 deletions
@@ -11,6 +11,7 @@ discord-py = "~=1.3.2"  fuzzywuzzy = "~=0.17"  pillow = "~=6.2"  pytz = "~=2019.2" +sentry-sdk = "~=0.14.2"  [dev-packages]  flake8 = "~=3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 426514e5..ad92fcf1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@  {      "_meta": {          "hash": { -            "sha256": "b117417a1dbcc28039ecac9579d54efa6437c621f0132eb06a8aa4f990d30a00" +            "sha256": "d1c0feb610f6742095c50eb3049fdd308603c17e1a785c03d9bf703eda0af985"          },          "pipfile-spec": 6,          "requires": { @@ -72,6 +72,13 @@              "index": "pypi",              "version": "==4.8.2"          }, +        "certifi": { +            "hashes": [ +                "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", +                "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f" +            ], +            "version": "==2019.11.28" +        },          "cffi": {              "hashes": [                  "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff", @@ -248,6 +255,14 @@              "index": "pypi",              "version": "==2019.3"          }, +        "sentry-sdk": { +            "hashes": [ +                "sha256:23808d571d2461a4ce3784ec12bbee5bdb8c026c143fe79d36cef8a6d653e71f", +                "sha256:bb90a4e19c7233a580715fc986cc44be2c48fc10b31e71580a2037e1c94b6950" +            ], +            "index": "pypi", +            "version": "==0.14.3" +        },          "six": {              "hashes": [                  "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", @@ -262,6 +277,13 @@              ],              "version": "==2.0"          }, +        "urllib3": { +            "hashes": [ +                "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc", +                "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc" +            ], +            "version": "==1.25.8" +        },          "websockets": {              "hashes": [                  "sha256:0e4fb4de42701340bd2353bb2eee45314651caa6ccee80dbd5f5d5978888fed5", @@ -411,11 +433,11 @@          },          "flake8-tidy-imports": {              "hashes": [ -                "sha256:8aa34384b45137d4cf33f5818b8e7897dc903b1d1e10a503fa7dd193a9a710ba", -                "sha256:b26461561bcc80e8012e46846630ecf0aaa59314f362a94cb7800dfdb32fa413" +                "sha256:62059ca07d8a4926b561d392cbab7f09ee042350214a25cf12823384a45d27dd", +                "sha256:c30b40337a2e6802ba3bb611c26611154a27e94c53fc45639e3e282169574fd3"              ],              "index": "pypi", -            "version": "==4.0.0" +            "version": "==4.1.0"          },          "flake8-todo": {              "hashes": [ @@ -426,10 +448,10 @@          },          "identify": {              "hashes": [ -                "sha256:1222b648251bdcb8deb240b294f450fbf704c7984e08baa92507e4ea10b436d5", -                "sha256:d824ebe21f38325c771c41b08a95a761db1982f1fc0eee37c6c97df3f1636b96" +                "sha256:a7577a1f55cee1d21953a5cf11a3c839ab87f5ef909a4cba6cf52ed72b4c6059", +                "sha256:ab246293e6585a1c6361a505b68d5b501a0409310932b7de2c2ead667b564d89"              ], -            "version": "==1.4.11" +            "version": "==1.4.13"          },          "mccabe": {              "hashes": [ @@ -446,19 +468,19 @@          },          "pep8-naming": {              "hashes": [ -                "sha256:45f330db8fcfb0fba57458c77385e288e7a3be1d01e8ea4268263ef677ceea5f", -                "sha256:a33d38177056321a167decd6ba70b890856ba5025f0a8eca6a3eda607da93caf" +                "sha256:5d9f1056cb9427ce344e98d1a7f5665710e2f20f748438e308995852cfa24164", +                "sha256:f3b4a5f9dd72b991bf7d8e2a341d2e1aa3a884a769b5aaac4f56825c1763bf3a"              ],              "index": "pypi", -            "version": "==0.9.1" +            "version": "==0.10.0"          },          "pre-commit": {              "hashes": [ -                "sha256:09ebe467f43ce24377f8c2f200fe3cd2570d328eb2ce0568c8e96ce19da45fa6", -                "sha256:f8d555e31e2051892c7f7b3ad9f620bd2c09271d87e9eedb2ad831737d6211eb" +                "sha256:487c675916e6f99d355ec5595ad77b325689d423ef4839db1ed2f02f639c9522", +                "sha256:c0aa11bce04a7b46c5544723aedf4e81a4d5f64ad1205a30a9ea12d5e81969e1"              ],              "index": "pypi", -            "version": "==2.1.1" +            "version": "==2.2.0"          },          "pycodestyle": {              "hashes": [ @@ -483,19 +505,19 @@          },          "pyyaml": {              "hashes": [ -                "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6", -                "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf", -                "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5", -                "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e", -                "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811", -                "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e", -                "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d", -                "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20", -                "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689", -                "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994", -                "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615" +                "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", +                "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", +                "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", +                "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", +                "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", +                "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", +                "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", +                "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", +                "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", +                "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", +                "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"              ], -            "version": "==5.3" +            "version": "==5.3.1"          },          "six": {              "hashes": [ @@ -520,10 +542,10 @@          },          "virtualenv": {              "hashes": [ -                "sha256:5eba85dfa176fde0425b9b3042ed83f05a1b6309a616b8a3e2a9a94f4bfa27b7", -                "sha256:99f131be2f90ff2a8fd711261a27845b6c50fc008bef815e710c7fa844eb1467" +                "sha256:6f4c2882a943d20714076679f8dcc5675e953d6c29bfea3bc5d08bb6cdea5d36", +                "sha256:cb1dab893f9e39b3e68d9118c555dcd86526d531c128c3f72e1551939723b72f"              ], -            "version": "==20.0.9" +            "version": "==20.0.14"          }      }  } 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:  |