Kord/apps/bot/src/shard.ts

56 lines
1.6 KiB
TypeScript

import { ShardingManager } from 'discord.js';
import path from 'path';
import { config } from 'dotenv';
import { existsSync } from 'fs';
import * as grpc from '@grpc/grpc-js';
import { kordProto } from '@kord/grpc-contracts';
const envPath = path.resolve(process.cwd(), '../../.env');
if (existsSync(envPath)) {
config({ path: envPath });
} else {
// Fallback for direct execution from root
config({ path: path.resolve(process.cwd(), '.env') });
}
if (!process.env.DISCORD_TOKEN) {
console.error('❌ DISCORD_TOKEN is missing in shard manager! Current CWD:', process.cwd());
}
const manager = new ShardingManager(path.resolve(__dirname, 'index.ts'), {
token: process.env.DISCORD_TOKEN,
execArgv: ['--import', 'tsx'], // Node.js v22 compatibility
});
manager.on('shardCreate', (shard) => {
console.log(`Launched shard ${shard.id}`);
shard.on('ready', () => {
console.log(`Shard ${shard.id} is ready`);
});
shard.on('disconnect', () => {
console.warn(`Shard ${shard.id} disconnected`);
});
shard.on('reconnecting', () => {
console.warn(`Shard ${shard.id} reconnecting`);
});
});
import { startGrpcServer } from './utils/grpcServer';
// ... (existing env/manager setup)
// --- gRPC Proxy Server Setup ---
// We start the gRPC server early to ensure the dashboard can connect
// even if Discord sharding takes time to initialize.
startGrpcServer(manager as any);
// Only spawn shards after gRPC server is successfully bound
console.log('Starting Discord ShardingManager...');
manager.spawn().catch(err => {
console.error('Failed to spawn shards:', err);
});