56 lines
1.1 KiB
TypeScript
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
|
|
);
|
|
}
|
|
}
|
|
};
|
|
}
|