auction-scrapper/commands/start_telegram_bot.ts
Vakula Uladimir 12f005e335 init
2025-10-17 11:27:52 +03:00

86 lines
2.5 KiB
TypeScript

import { BaseCommand } from '@adonisjs/core/ace'
import type { CommandOptions } from '@adonisjs/core/types/ace'
import { TelegramService } from '#services/telegram_service'
import logger from '@adonisjs/core/services/logger'
/**
* Command to start Telegram bot
*
* Usage:
* node ace telegram:start
*
* This command runs as a long-lived process and handles graceful shutdown.
*/
export default class StartTelegramBot extends BaseCommand {
static commandName = 'telegram:start'
static description = 'Start the Telegram bot for auction notifications'
static options: CommandOptions = {
startApp: true,
staysAlive: true,
}
private telegramService: TelegramService | null = null
async run() {
try {
this.logger.info('Initializing Telegram bot service...')
// Get singleton instance
this.telegramService = TelegramService.getInstance()
// Setup graceful shutdown handlers
this.setupShutdownHandlers()
// Start the bot
this.logger.info('Starting Telegram bot...')
await this.telegramService.start()
this.logger.success('Telegram bot is running! Press Ctrl+C to stop.')
} catch (error) {
const errorMsg = error instanceof Error ? error.message : String(error)
this.logger.error(`Failed to start Telegram bot: ${errorMsg}`)
logger.error('Telegram bot startup failed', { error: errorMsg })
this.exitCode = 1
await this.terminate()
}
}
/**
* Setup handlers for graceful shutdown
*/
private setupShutdownHandlers(): void {
const shutdown = async (signal: string) => {
this.logger.info(`Received ${signal}, shutting down gracefully...`)
if (this.telegramService) {
try {
await this.telegramService.stop()
this.logger.success('Telegram bot stopped successfully')
} catch (error) {
const errorMsg = error instanceof Error ? error.message : String(error)
this.logger.error(`Error during shutdown: ${errorMsg}`)
logger.error('Telegram bot shutdown error', { error: errorMsg })
}
}
await this.terminate()
}
// Handle SIGINT (Ctrl+C)
process.on('SIGINT', () => shutdown('SIGINT'))
// Handle SIGTERM (kill command)
process.on('SIGTERM', () => shutdown('SIGTERM'))
}
/**
* Command termination handler
*/
async completed() {
if (this.telegramService && this.telegramService.getIsRunning()) {
this.logger.info('Stopping Telegram bot...')
await this.telegramService.stop()
}
}
}