/
main.js
133 lines (112 loc) · 4.41 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
if (Number(process.versions.node.split('.')[0]) < 11) {
console.log('Upgrade your version of NodeJs! You need at least NodeJs 11.0.0, https://nodejs.org/en/. Current version is ' + process.versions.node)
process.exit(1)
}
import { Workers } from './workers';
import { Permissions } from './permissions';
import { Events } from './events';
import { OAuth } from './oauth';
import { Currency } from './currency';
import { error, info, warning } from './helpers/log';
import { TMI } from './tmi';
import { API } from './api';
import { Twitch } from './twitch';
import { Socket } from './socket';
import { Webhooks } from './webhooks';
import { Users } from './users';
import { UI } from './ui';
const figlet = require('figlet')
const os = require('os')
const util = require('util')
const _ = require('lodash')
const chalk = require('chalk')
const gitCommitInfo = require('git-commit-info');
const { isMainThread, } = require('worker_threads');
const { autoLoad } = require('./commons');
const constants = require('./constants')
const config = require('../config.json')
global.workers = new Workers()
global.startedClusters = 0
global.linesParsed = 0
global.avgResponse = []
global.status = { // TODO: move it?
'TMI': constants.DISCONNECTED,
'API': constants.DISCONNECTED,
'MOD': false,
'RES': 0
}
const isNeDB = config.database.type === 'nedb'
global.cpu = config.threads === 'auto' ? os.cpus().length : parseInt(_.get(config, 'cpu', 1), 10)
if (config.database.type === 'nedb') global.cpu = 1 // nedb can have only one fork
if (!isMainThread) {
global.db = new (require('./databases/database'))(isNeDB, isNeDB)
require('./cluster.js')
} else {
global.db = new (require('./databases/database'))(!isNeDB, !isNeDB)
// spin up forks first
for (let i = 0; i < global.cpu; i++) {
global.workers.newWorker();
}
main()
}
async function main () {
if (!global.db.engine.connected || global.cpu !== global.workers.onlineCount) return setTimeout(() => main(), 10)
try {
global.general = new (require('./general.js'))()
global.socket = new Socket()
global.ui = new UI()
global.currency = new Currency()
global.stats2 = new (require('./stats.js'))()
global.users = new Users();
global.events = new Events();
global.customvariables = new (require('./customvariables.js'))()
global.panel = new (require('./panel'))()
global.twitch = new Twitch()
global.permissions = new Permissions()
global.lib = {}
global.lib.translate = new (require('./translate'))()
global.translate = global.lib.translate.translate
global.oauth = new OAuth();
global.webhooks = new Webhooks();
global.api = new API();
} catch (e) {
error(e)
process.exit()
}
const version = _.get(process, 'env.npm_package_version', 'x.y.z')
console.log(figlet.textSync('sogeBot ' + version.replace('SNAPSHOT', gitCommitInfo().shortHash || 'SNAPSHOT'), {
font: 'ANSI Shadow',
horizontalLayout: 'default',
verticalLayout: 'default'
}));
info('Bot is starting up')
global.lib.translate._load().then(async () => {
global.stats = await autoLoad('./dest/stats/')
global.registries = await autoLoad('./dest/registries/')
global.systems = await autoLoad('./dest/systems/');
global.widgets = await autoLoad('./dest/widgets/')
global.overlays = await autoLoad('./dest/overlays/')
global.games = await autoLoad('./dest/games/')
global.integrations = await autoLoad('./dest/integrations/')
global.panel.expose()
if (process.env.HEAP && process.env.HEAP.toLowerCase() === 'true') {
warning(chalk.bgRed.bold('HEAP debugging is ENABLED'))
setTimeout(() => require('./heapdump.js').init('heap/'), 120000)
}
global.tmi = new TMI();
})
}
if (isMainThread) {
process.on('unhandledRejection', function (reason, p) {
error(`Possibly Unhandled Rejection at: ${util.inspect(p)} reason: ${reason}`)
})
process.on('uncaughtException', (err) => {
error(util.inspect(err))
error('+------------------------------------------------------------------------------+')
error('| BOT HAS UNEXPECTEDLY CRASHED |')
error('| PLEASE CHECK https://github.com/sogehige/SogeBot/wiki/How-to-report-an-issue |')
error('| AND ADD logs/sogebot.log file to your report |')
error('+------------------------------------------------------------------------------+')
process.exit(1)
})
}