const winston = require('winston'); const { createClient } = require('@supabase/supabase-js'); const Bot = require('./src/Bot'); require('dotenv').config(); // Import Express and create an app for health checks and webhooks const express = require('express'); const app = express(); // Middleware for parsing JSON app.use(express.json()); // Initialize logger const logger = winston.createLogger({ level: 'debug', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), winston.format.simple() ) }) ] }); // Initialize Supabase client const supabase = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_KEY ); // Initialize bot const bot = new Bot(process.env.DISCORD_TOKEN, supabase, logger); // Add health check endpoint app.get('/health', (req, res) => { res.status(200).json({ status: 'healthy' }); }); // Add notification webhook endpoint (this will be used by the NotificationService) app.post('/api/match-notification', async (req, res) => { if (bot.notificationService && bot.notificationService.handleMatchNotification) { await bot.notificationService.handleMatchNotification(req, res); } else { res.status(503).json({ error: 'Notification service not ready' }); } }); // Start the server const PORT = process.env.PORT || 3000; app.listen(PORT, () => { logger.info(`Health check server listening on port ${PORT}`); }); // Initialize and start bot bot.start().catch(error => { console.error('Failed to start bot:', error); process.exit(1); }); // Handle process termination process.on('SIGINT', async () => { console.log('Received SIGINT. Shutting down...'); try { await bot.stop(); process.exit(0); } catch (error) { console.error('Error during shutdown:', error); process.exit(1); } }); process.on('SIGTERM', async () => { console.log('Received SIGTERM. Shutting down...'); try { await bot.stop(); process.exit(0); } catch (error) { console.error('Error during shutdown:', error); process.exit(1); } });