Add webhook update

This commit is contained in:
2022-02-17 10:22:19 +03:00
parent 4217fc85c0
commit 73c72d881f

View File

@@ -12,6 +12,7 @@ import { Telegraf } from 'telegraf';
import env from '@/config'; import env from '@/config';
import getBot, { BotStatuses } from './factory/index'; import getBot, { BotStatuses } from './factory/index';
import UsersCounter from '@/analytics/users_counter'; import UsersCounter from '@/analytics/users_counter';
import { WebhookInfo } from 'telegraf/typings/core/types/typegram';
Sentry.init({ Sentry.init({
@@ -55,16 +56,40 @@ export default class BotsManager {
static bots: {[key: number]: Telegraf} = {}; static bots: {[key: number]: Telegraf} = {};
static botsStates: {[key: number]: BotState} = {}; static botsStates: {[key: number]: BotState} = {};
static syncInterval: NodeJS.Timer | null = null; static syncInterval: NodeJS.Timer | null = null;
static checkStateInterval: NodeJS.Timer | null = null;
static server: Server | null = null; static server: Server | null = null;
static async start() { static async start() {
await this.sync();
this.launch(); this.launch();
await this.sync();
if (this.syncInterval === null) { if (this.syncInterval === null) {
this.syncInterval = setInterval(() => this.sync(), 30_000); this.syncInterval = setInterval(() => this.sync(), 30_000);
} }
if (this.checkStateInterval === null) {
this.checkStateInterval = setInterval(() => this.checkBotStatus(), 60_000);
}
}
static async checkBotStatus() {
Object.values(this.bots).forEach((bot) => this._checkBotState(bot));
}
static async _checkBotState(bot: Telegraf) {
let webhookInfo: WebhookInfo | null = null;
try {
webhookInfo = await bot.telegram.getWebhookInfo();
} catch (e) {}
if (webhookInfo === null) return;
if (webhookInfo.pending_update_count <= 5 || webhookInfo.url === undefined) return;
try {
await bot.telegram.setWebhook(webhookInfo.url);
} catch (e) {}
} }
static async sync() { static async sync() {
@@ -75,6 +100,22 @@ export default class BotsManager {
} }
} }
static async setWebhook(bot: Telegraf, state: BotState): Promise<boolean> {
const dockerIps = (await dockerIpTools.getContainerIp()).split(" ");
for (const dockerIp of dockerIps) {
try {
await bot.telegram.setWebhook(
`${env.WEBHOOK_BASE_URL}:${env.WEBHOOK_PORT}/${state.id}/${bot.telegram.token}`, {
ip_address: dockerIp,
}
);
return true;
} catch (e) {}
}
return false;
}
static async updateBotState(state: BotState) { static async updateBotState(state: BotState) {
const isExists = this.bots[state.id] !== undefined; const isExists = this.bots[state.id] !== undefined;
@@ -102,23 +143,7 @@ export default class BotsManager {
return; return;
} }
let success = false; if (!(await this.setWebhook(bot, state))) return;
const dockerIps = (await dockerIpTools.getContainerIp()).split(" ");
for (let i = 0; i < dockerIps.length; i++) {
const dockerIp = dockerIps[i];
try {
await bot.telegram.setWebhook(
`${env.WEBHOOK_BASE_URL}:${env.WEBHOOK_PORT}/${state.id}/${bot.telegram.token}`, {
ip_address: dockerIp,
}
);
success = true;
} catch (e) {}
}
if (!success) return;
this.bots[state.id] = bot; this.bots[state.id] = bot;
this.botsStates[state.id] = state; this.botsStates[state.id] = state;