commit f8e8188a357d2581ad9d42fd6446582cfa06c027 Author: Wizzard Date: Thu Jul 13 15:33:59 2023 +0000 Upload files to "" diff --git a/main.js b/main.js new file mode 100644 index 0000000..70e7a2e --- /dev/null +++ b/main.js @@ -0,0 +1,134 @@ +const rpc = require("discord-rpc"); +const fetch = require("request-promise"); +const prettyMilliseconds = require("pretty-ms"); +const fs = require("fs"); + +const config = JSON.parse(fs.readFileSync("config.json")); + +const updateInterval = 5000; +const retryInterval = 30000; + +let rp; + +function formatNumber(number) { + var x = number.split("."); + var x1 = x[0]; + var x2 = x.length > 1 ? "." + x[1] : ""; + var rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, "$1" + "," + "$2"); + } + return x1 + x2; +} + +function createClient() { + rp = new rpc.Client({ transport: "ipc" }); + + rp.on("ready", () => { + console.log("Connected to Discord!"); + updateStatus(); + }); + + rp.on("disconnected", () => { + console.log("Disconnected from Discord!"); + rp = null; + setTimeout(createClient, retryInterval); + }); + + rp.login({ clientId: config.clientId }).catch((error) => { + console.error("Error connecting to Discord:", error); + rp = null; + setTimeout(createClient, retryInterval); + }); +} + +createClient(); + +async function updateStatus() { + try { + const data = await fetchCurrentScrobble(config.username); + if (!data || !rp) { + console.log("Reconnecting to Discord..."); + setTimeout(updateStatus, retryInterval); + return; + } + + await rp.setActivity({ + largeImageKey: data.album !== "Unknown Album" ? data.cover : "default_cover", + largeImageText: `${data.playcount} plays.`, + smallImageKey: data.whenScrobbled ? "playing" : "stopped", + smallImageText: data.scrobbleStatus, + details: data.trackName, + state: `${data.artist} - ${data.album}`, + buttons: [ + { + label: `${formatNumber(data.scrobbles)} total shits.`, + url: "javascript:void(0);", + }, + ], + }); + + console.log("Discord status updated."); + setTimeout(updateStatus, updateInterval); + } catch (error) { + console.error("Failed to update status:", error); + rp = null; + setTimeout(updateStatus, retryInterval); + } +} + +async function fetchCurrentScrobble(user) { + try { + const optionsGetTrack = { + uri: "http://ws.audioscrobbler.com/2.0/", + json: true, + qs: { + method: "user.getrecenttracks", + user: user, + api_key: config.apiKey, + format: "json", + limit: "1", + }, + }; + + const lastTrack = await fetch(optionsGetTrack); + + let lastArtist = lastTrack.recenttracks.track[0].artist["#text"]; + let lastTrackName = lastTrack.recenttracks.track[0].name; + + const options = { + uri: "http://ws.audioscrobbler.com/2.0/", + json: true, + qs: { + method: "track.getInfo", + user: user, + track: lastTrackName, + artist: lastArtist, + api_key: config.apiKey, + format: "json", + }, + }; + + const rData = await fetch(options); + + let images = lastTrack.recenttracks.track[0].image; + let coverURL = images && images[images.length - 1]["#text"].trim() ? images[images.length - 1]["#text"].trim() : "default_cover"; + + const data = { + artist: lastArtist, + album: lastTrack.recenttracks.track[0].album["#text"] || "Unknown Album", + trackName: lastTrackName, + playcount: rData.track.userplaycount ? rData.track.userplaycount : "0", + scrobbles: lastTrack.recenttracks["@attr"].total, + whenScrobbled: lastTrack.recenttracks.track[0]["@attr"], + scrobbleStatus: !lastTrack.recenttracks.track[0]["@attr"] ? `Last scrobbled ${prettyMilliseconds(Date.now() - lastTrack.recenttracks.track[0].date.uts * 1000)} ago.` : "Now scrobbling.", + cover: coverURL, + }; + + return data; + } catch (error) { + console.error("Failed to fetch current scrobble:", error); + return null; + } +} +