import { WebSocketManager, WebSocketShardEvents, type SessionInfo } from '@discordjs/ws'; import { REST } from '@discordjs/rest'; import { env } from './env'; import { readFileSync, writeFileSync, existsSync } from 'fs'; import type Logger from './structures/Logger'; const sessionFile = './sessions.json'; function loadSessions(): Record { try { if (existsSync(sessionFile)) { const data = readFileSync(sessionFile, 'utf8'); return JSON.parse(data) as Record; } } catch (error) { console.error('Failed to load session store:', error); } return {}; } function saveSessions(sessionStore: Record) { try { writeFileSync(sessionFile, JSON.stringify(sessionStore, null, 2)); console.log('Session store saved.'); } catch (error) { console.error('Failed to save session store:', error); } } const sessionStore = loadSessions(); export async function SocketStart(logger: Logger) { const manager = new WebSocketManager({ token: env.TOKEN, intents: 0, shardCount: 1, rest: new REST().setToken(env.TOKEN), retrieveSessionInfo(shardId: number): SessionInfo | null { if (sessionStore[shardId]) { logger.start(`[CLIENT] Retrieved session info for shard ${shardId}`); return sessionStore[shardId]; } return null; }, updateSessionInfo(shardId: number, sessionInfo: SessionInfo | null): Promise { return new Promise((resolve) => { if (sessionInfo) { sessionStore[shardId] = sessionInfo; logger.start(`[CLIENT] Updated session info for shard ${shardId}`); saveSessions(sessionStore); resolve(); } }); }, }); manager .on(WebSocketShardEvents.Debug, (shardId, message) => console.log('Debug', shardId, message)) .on(WebSocketShardEvents.Hello, (shardId) => { console.log('Hello', shardId); }) .on(WebSocketShardEvents.Ready, (shardId) => { console.log('Ready', shardId); }) .on(WebSocketShardEvents.Resumed, async (shardId) => { console.log('Resumed', shardId); const sessionInfo = sessionStore[shardId]; if (sessionInfo?.resumeURL && sessionInfo.sessionId) { sessionStore[shardId] = { shardId, shardCount: 1, sequence: sessionInfo.sequence, resumeURL: sessionInfo.resumeURL, sessionId: sessionInfo.sessionId, }; saveSessions(sessionStore); } else { console.warn(`No valid session info for shard ${shardId}, starting a new session.`); sessionStore[shardId] = { shardId, shardCount: 1, sequence: 0, resumeURL: 'wss://gateway.discord.gg/?v=10&encoding=json', sessionId: 'owo', }; saveSessions(sessionStore); } }); await manager.connect(); logger.start('[CLIENT] Socket connected.'); }