This repository has been archived by the owner on Dec 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy pathindex.js
108 lines (89 loc) · 3.52 KB
/
index.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
'use strict'
const TelegramBot = require('node-telegram-bot-api'),
express = require('express'),
asyncHandler = require('express-async-handler'),
randomUUID = require('crypto').randomUUID,
handlers = require('./handlers'),
jobs = require('./jobs'),
db = require('./db'),
cfg = require('./config'),
metrics = require('./metrics'),
noop = require('./middlewares/noop'),
rateLimit = require('./middlewares/rate_imit'),
maintenanceMode = require('./middlewares/maintenance_mode'),
alertMessage = require('./middlewares/alert_message')
async function trySelfRegister(bot, secret) {
if (cfg.PUBLIC_URL) {
console.log('⏳ Registering bot with Telegram API (setWebhook) ...')
bot.setWebHook(`${cfg.PUBLIC_URL}/updates`, {
secret_token: secret,
})
console.log(`✅ Successfully registered webhook '${cfg.PUBLIC_URL}/updates' (secret token: ${secret})`)
} else {
console.log(`⚠️ Auto-registration skipped, as no PUBLIC_URL was passed. You need to register the webhook yourself (secret token: ${secret}) (see https://core.telegram.org/bots/api#setwebhook)`)
}
}
async function run() {
// Initialization + checks
if (!cfg.BOT_TOKEN) throw Error('❌ You need to pass a bot token')
const secretToken = randomUUID()
const dbRoot = await db.connect()
// Bot setup
const bot = new TelegramBot(cfg.BOT_TOKEN, {
polling: !cfg.WEBHOOK_MODE,
})
// Middlewares
let middleware = noop(bot)
middleware = middleware.use(rateLimit(bot, 60 * 60, cfg.RATE_LIMIT || -1))
middleware = middleware.use(maintenanceMode(bot, cfg.MAINTENANCE_MESSAGE))
middleware = middleware.use(alertMessage(bot, cfg.ALERT_MESSAGE))
// Handler registration
handlers.registerAll(bot, middleware)
// Error handlers
bot.on('polling_error', (err) => {
console.error(`Polling error: ${err.code} - ${err.response?.body || ''}`)
})
bot.on('webhook_error', (err) => {
console.error(`Polling error: ${err.code} - ${err.response?.body || ''}`)
})
// Web server setup + route registration
if (cfg.WEBHOOK_MODE) {
const app = express()
app.use(express.json())
console.log('✅ Registering /updates route ...')
app.post('/updates', asyncHandler(async (req, res) => {
if (req.get('X-Telegram-Bot-Api-Secret-Token') !== secretToken) {
return res.sendStatus(401)
}
bot.processUpdate(req.body)
res.sendStatus(200)
}))
console.log('✅ Registering /metrics route ...')
app.get('/metrics', asyncHandler(async (req, res) => {
res.set('Content-Type', metrics.contentType)
res.end(await metrics.metrics())
}))
console.log('✅ Registering /health route ...')
app.get('/health', asyncHandler(async (req, res) => {
let dbState = 0
try {
await await dbRoot.command({ ping: 1 })
dbState = 1
} catch (e) { }
res.set('Content-Type', 'text/plain')
res.end(`app=1\ndb=${dbState}`)
}))
app.listen(cfg.PORT, cfg.BIND_IP4, () => {
console.log(`✅ Listening at ${cfg.BIND_IP4}:${cfg.PORT} ...`)
})
setTimeout(async () => trySelfRegister(bot, secretToken), 100)
}
// Job scheduling
jobs.runDefault(bot)
jobs.scheduleDefault(bot)
}
process.on('SIGINT', async () => {
await db.disconnect()
process.exit()
})
run()