├── LICENSE ├── README.md ├── example.html └── lanyard.js /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Xaronnn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JS-Lanyard 2 | 3 | Use Lanyard in your Web App. [Phineas](https://github.com/Phineas) - Creator of [Lanyard API](https://github.com/Phineas/lanyard) 4 | 5 | # CDN 6 | 7 | - Call to your page (`https://cdn.jsdelivr.net/gh/0x5841524f4e/js-lanyard/lanyard.js`) 8 | 9 | # Usage 10 | 11 | Using without websocket: 12 | 13 | ```javascript 14 | // rest with single user example 15 | lanyard({ 16 | userId: "213325478096797697", 17 | }).then(console.log) // presenceData 18 | 19 | // rest with multiple users example 20 | lanyard({ 21 | userId: ["213325478096797697", "331846231514939392"], 22 | }).then(console.log) // presenceData[] 23 | ``` 24 | 25 | Using with websocket: 26 | 27 | ```javascript 28 | // websocket with single user example 29 | lanyard({ 30 | userId: "213325478096797697", 31 | socket: true, 32 | onPresenceUpdate: console.log // presenceData 33 | }) // returns a websocket 34 | 35 | // websocket with multiple users example 36 | lanyard({ 37 | userId: ["213325478096797697", "331846231514939392"], 38 | socket: true, 39 | onPresenceUpdate: console.log // presenceData[] 40 | }) // returns a websocket 41 | ``` 42 | 43 | # License 44 | 45 | Distributed under the [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html) License. See `LICENSE` for more information. 46 | -------------------------------------------------------------------------------- /example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Lanyard 8 | 9 | 10 | 11 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lanyard.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const CONSTANTS = { 4 | API_URL: "https://api.lanyard.rest/v1", 5 | WEBSOCKET_URL: "wss://api.lanyard.rest/socket", 6 | HEARTBEAT_PERIOD: 1000 * 30 7 | } 8 | 9 | async function lanyard(opts) { 10 | if (!opts) throw new Error("Specify an options object"); 11 | if (!opts.userId) throw new Error("Specify a user ID"); 12 | 13 | if (opts.socket) { 14 | if (!opts.onPresenceUpdate) throw new Error("Specify onPresenceUpdate callback"); 15 | 16 | const supportsWebSocket = "WebSocket" in window || "MozWebSocket" in window; 17 | if (!supportsWebSocket) throw new Error( "Browser doesn't support WebSocket connections.",); 18 | 19 | const socket = new WebSocket(CONSTANTS.WEBSOCKET_URL); 20 | const subscription = typeof opts.userId == "string" ? "subscribe_to_id" : "subscribe_to_ids" 21 | let heartbeat = null 22 | 23 | socket.addEventListener("open", () => { 24 | socket.send( 25 | JSON.stringify({ 26 | op: 2, 27 | d: { 28 | [subscription]: opts.userId, 29 | }, 30 | }), 31 | ); 32 | 33 | heartbeat = setInterval(() => { 34 | socket.send( 35 | JSON.stringify({ 36 | op: 3, 37 | }), 38 | ); 39 | }, CONSTANTS.HEARTBEAT_PERIOD); 40 | }); 41 | 42 | socket.addEventListener("message", ({ data }) => { 43 | const { t, d } = JSON.parse(data) 44 | 45 | if (t === "INIT_STATE" || t === "PRESENCE_UPDATE") { 46 | opts.onPresenceUpdate(d) 47 | } 48 | }); 49 | 50 | socket.onclose = (event) => { 51 | try { 52 | console.log("Socket closed") 53 | clearInterval(heartbeat) 54 | setTimeout(() => { 55 | console.log("Trying to reconnect") 56 | lanyard(opts) 57 | }, 3000) 58 | } catch(err) { 59 | console.log("Socket closed") 60 | } 61 | console.log(event) 62 | }; 63 | return socket; 64 | } else { 65 | if (typeof opts.userId == "string") { 66 | const res = await fetch(`${CONSTANTS.API_URL}/users/${opts.userId}`); 67 | const body = await res.json(); 68 | 69 | if (!body.success) throw new Error(body.error?.message || "An invalid error occured"); 70 | 71 | return body.data; 72 | } else { 73 | const val = []; 74 | 75 | for (const userId of opts.userId) { 76 | const res = await fetch(`${CONSTANTS.API_URL}/users/${userId}`); 77 | const body = await res.json(); 78 | 79 | if (!body.success) throw new Error(body.error?.message || "An invalid error occured"); 80 | 81 | val.push(body.data) 82 | } 83 | 84 | return val; 85 | } 86 | } 87 | } 88 | --------------------------------------------------------------------------------