import type { AnyLanyardPayload, LanyardInitStatePayload, LanyardPayload, LanyardPresence, LanyardPresenceUpdatePayload } from "./types"; function sendToSocket(socket: WebSocket, data: AnyLanyardPayload) { socket.send(JSON.stringify(data)); } export function initLanyard( updateCallback: (presence: LanyardPresence) => void ) { const socket = new WebSocket("wss://api.lanyard.rest/socket"); socket.onmessage = data => { const payload: LanyardPayload = JSON.parse(data.data); switch (payload.op) { case 1: { // Initialize sendToSocket(socket, { op: 2, d: { subscribe_to_ids: ["886685857560539176"] } }); sendToSocket(socket, { op: 3 }); setInterval( () => { sendToSocket(socket, { op: 3 }); }, "heartbeat_interval" in payload.d ? payload.d.heartbeat_interval : 30000 ); break; } case 0: { const typedPayload = payload as | LanyardInitStatePayload | LanyardPresenceUpdatePayload; updateCallback( typedPayload.t === "INIT_STATE" ? typedPayload.d["886685857560539176"] : typedPayload.d ); } } }; }