website/src/js/lanyard/lanyard.ts

56 lines
1.1 KiB
TypeScript

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
);
}
}
};
}