import { WebSocketManager, WebSocketShardEvents, type SessionInfo } from '@discordjs/ws'; import { REST } from '@discordjs/rest'; import { env } from './env'; import type Logger from './structures/Logger'; const sessionStore: Record = {}; 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 { return ( sessionStore[shardId] || { shardId, shardCount: 1, sequence: 0, resumeURL: 'wss://gateway.discord.gg/?v=10&encoding=json', sessionId: 'uwu', } ); }, 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}`); 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, }; } 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', }; } }); await manager.connect(); logger.start('[CLIENT] Socket connected.'); }