diff --git a/core/bot.py b/core/bot.py index a3363b08c..a8157ae52 100644 --- a/core/bot.py +++ b/core/bot.py @@ -17,7 +17,8 @@ class Red(commands.Bot): packages=[], coowners=[], whitelist=[], - blacklist=[] + blacklist=[], + enable_sentry=None ) self.db.register_guild( diff --git a/core/cli.py b/core/cli.py index a985ea2b9..3dcbd1bb7 100644 --- a/core/cli.py +++ b/core/cli.py @@ -1,6 +1,8 @@ import argparse import asyncio +from core.bot import Red + def confirm(m=""): return input(m).lower().strip() in ("y", "yes") @@ -39,9 +41,26 @@ def interactive_config(red, token_set, prefix_set): if prefix: loop.run_until_complete(red.db.set("prefix", [prefix])) + ask_sentry(red) + return token +def ask_sentry(red: Red): + loop = asyncio.get_event_loop() + print("\nThank you for installing Red V3 alpha! The current version\n" + " is not suited for production use and is aimed at testing\n" + " the current and upcoming featureset, that's why we will\n" + " also collect the fatal error logs to help us fix any new\n" + " found issues in a timely manner. If you wish to opt in\n" + " the process please type \"yes\":\n") + if not confirm("> "): + loop.run_until_complete(red.db.set("enable_sentry", False)) + else: + loop.run_until_complete(red.db.set("enable_sentry", True)) + print("\nThank you for helping us with the development process!") + + def parse_cli_flags(): parser = argparse.ArgumentParser(description="Red - Discord Bot") parser.add_argument("--owner", help="ID of the owner. Only who hosts " @@ -83,4 +102,4 @@ def parse_cli_flags(): else: args.prefix = [] - return args \ No newline at end of file + return args diff --git a/core/sentry_setup.py b/core/sentry_setup.py new file mode 100644 index 000000000..11bc85923 --- /dev/null +++ b/core/sentry_setup.py @@ -0,0 +1,42 @@ +from raven import Client +from raven.versioning import fetch_git_sha +from raven.conf import setup_logging +from raven.handlers.logging import SentryHandler + +from pathlib import Path + + +client = None + + +def init_sentry_logging(): + global client + client = Client( + dsn=("https://27f3915ba0144725a53ea5a99c9ae6f3:87913fb5d0894251821dcf06e5e9cfe6@" + "sentry.telemetry.red/19?verify_ssl=0"), + include_paths=( + 'core', + 'cogs.alias', + 'cogs.audio', + 'cogs.downloader', + 'cogs.economy', + 'cogs.general', + 'cogs.image', + 'cogs.streams', + 'cogs.trivia', + 'cogs.utils', + 'tests.core.test_sentry', + 'main', + 'launcher' + ), + release=fetch_git_sha(str(Path.cwd())) + ) + + handler = SentryHandler(client) + setup_logging( + handler, + exclude=( + "asyncio", + "discord" + ) + ) diff --git a/main.py b/main.py index 2613d0328..d095999dd 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,8 @@ from core.bot import Red, ExitCodes from core.global_checks import init_global_checks from core.events import init_events -from core.cli import interactive_config, confirm, parse_cli_flags +from core.sentry_setup import init_sentry_logging +from core.cli import interactive_config, confirm, parse_cli_flags, ask_sentry from core.core_commands import Core from core.dev_commands import Dev import asyncio @@ -59,6 +60,7 @@ if __name__ == '__main__': red = Red(cli_flags, description=description, pm_help=None) init_global_checks(red) init_events(red, cli_flags) + red.add_cog(Core()) if cli_flags.dev: @@ -77,6 +79,12 @@ if __name__ == '__main__': log.critical("Token and prefix must be set in order to login.") sys.exit(1) + if red.db.enable_sentry() is None: + ask_sentry(red) + + if red.db.enable_sentry(): + init_sentry_logging() + loop = asyncio.get_event_loop() cleanup_tasks = True diff --git a/requirements.txt b/requirements.txt index 08a4d6f99..3b936bc89 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ git+https://github.com/Rapptz/discord.py@rewrite#egg=discord.py[voice] youtube_dl pytest git+https://github.com/pytest-dev/pytest-asyncio -pymongo \ No newline at end of file +pymongo +git+https://github.com/getsentry/raven-python \ No newline at end of file diff --git a/tests/core/test_sentry.py b/tests/core/test_sentry.py new file mode 100644 index 000000000..df64f5125 --- /dev/null +++ b/tests/core/test_sentry.py @@ -0,0 +1,9 @@ +from core import sentry_setup + + +def test_sentry_capture(): + sentry_setup.init_sentry_logging() + + assert sentry_setup.client is not None + + sentry_setup.client.captureMessage("Message from test_sentry module.") \ No newline at end of file