1 | const log = logger.withScope('errorHandler')
|
2 | const Sentry = require('@sentry/node')
|
3 |
|
4 | const bannedErrors = [
|
5 | 'Token/username/password not found.',
|
6 | 'Missing Permissions',
|
7 | 'Incorrect login details were provided.',
|
8 | 'Access token missing!',
|
9 | 'MQTT connection failed'
|
10 | ]
|
11 |
|
12 | const dataPath = process.env.DATA_PATH !== 'undefined' ? process.env.DATA_PATH : undefined
|
13 |
|
14 | module.exports = async error => {
|
15 | if (!(error instanceof Error)) {
|
16 | if (typeof error === 'string') error = new Error(error)
|
17 | if (error.err || error.error) {
|
18 | let err = error.err || error.error
|
19 | if (err instanceof Error) {
|
20 | error = err
|
21 | }
|
22 | }
|
23 | }
|
24 | log.error(error)
|
25 | if (!bannedErrors.some(banned => error.toString().includes(banned))) Sentry.captureException(error)
|
26 |
|
27 | console.log('')
|
28 | log.warn(`Logs from NPM are unnecessary and don't give much information.
|
29 | Miscord logs folder:
|
30 | ${dataPath || require('../lib/config/getConfigDir')()}/logs`)
|
31 |
|
32 | if (global.discord && discord.channels && discord.channels.error) {
|
33 | try {
|
34 | let errorMessage = error instanceof Error
|
35 | ? `${error.message}\n${error.stack}`
|
36 | : typeof error !== 'string' ? JSON.stringify(error) : error
|
37 | if (errorMessage.length >= 1900) {
|
38 | for (let i = 0; i < errorMessage.length; i += 1900) {
|
39 | await discord.channels.error.send(errorMessage.substring(i, i + 1900), { code: true })
|
40 | }
|
41 | } else {
|
42 | await discord.channels.error.send(errorMessage, { code: true })
|
43 | }
|
44 | } catch (err) {
|
45 | log.fatal(err)
|
46 | Sentry.captureException(err)
|
47 | } finally {
|
48 | await Sentry.getCurrentHub().getClient().close(2000)
|
49 | await discord.client.destroy()
|
50 | console.error('close')
|
51 | }
|
52 | } else {
|
53 | await Sentry.getCurrentHub().getClient().close(2000)
|
54 | if (global.discord) await discord.client.destroy()
|
55 | console.error('close')
|
56 | }
|
57 | }
|
58 | module.exports.initSentry = () => {
|
59 | const pkg = require('../package.json')
|
60 | Sentry.init({
|
61 | dsn: 'https://58fe91e28af9416eade1597c9c5448c0@sentry.miscord.net/2',
|
62 | maxBreadcrumbs: 0,
|
63 | release: `miscord@${pkg.version}`
|
64 | })
|
65 | Sentry.configureScope(scope => {
|
66 | scope.setTag('is_packaged', Boolean(process.pkg).toString().toLowerCase())
|
67 | scope.setTag('platform', require('os').platform())
|
68 | scope.setTag('version', pkg.version)
|
69 | scope.setTag('node_version', process.version)
|
70 | })
|
71 | }
|