From f4c34966bc5d116d1d666e577c0b77032f9861c2 Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Wed, 10 May 2023 17:01:31 +0530 Subject: [PATCH] Fixes: Discord Presence not rendering properly --- components/about.jsx | 1 - components/discord-activity.jsx | 254 +++-------------------- components/footer.jsx | 10 +- components/footer.style.jsx | 15 +- components/skillCard.jsx | 1 - components/status.jsx | 35 ++++ components/toots.jsx | 4 +- libs/discord-parser.js | 90 ++++++++ public/images/brandlogos/SpotifyLogo.png | Bin 0 -> 8853 bytes 9 files changed, 173 insertions(+), 237 deletions(-) create mode 100644 libs/discord-parser.js create mode 100644 public/images/brandlogos/SpotifyLogo.png diff --git a/components/about.jsx b/components/about.jsx index 76de20e..46db61e 100644 --- a/components/about.jsx +++ b/components/about.jsx @@ -2,7 +2,6 @@ import { LanguagesKnownCategory, description1, description2 } from "config"; import { AboutStyle } from "./about.style"; function about() { - // console.log(LanguagesKnown); return (
diff --git a/components/discord-activity.jsx b/components/discord-activity.jsx index 46be694..04c6280 100644 --- a/components/discord-activity.jsx +++ b/components/discord-activity.jsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from "react"; import { DicordActivityStyle } from "./discord-activity.style"; import { useLanyard } from "react-use-lanyard"; import { discord_id } from "config"; +import DiscordParser from "../libs/discord-parser" /*
{!loading && JSON.stringify(status, null, 4)}
; */ @@ -11,10 +12,11 @@ const customStatus = [ "Sleeping", "Studying", ]; -const statusPicker = () => { - return customStatus[Math.floor(Math.random() * customStatus.length)]; -}; + export default function DiscordActivity() { + const statusPicker = () => { + return customStatus[Math.floor(Math.random() * customStatus.length)]; + }; const { loading, status } = useLanyard({ userId: discord_id, socket: true, @@ -37,9 +39,16 @@ export default function DiscordActivity() { seconds )} elapsed`; }; - const baseURL = "https://cdn.discordapp.com/app-assets/"; const [currentTs, setCurrentTs] = useState(Date.now()); + const [parsedStatus, setParsedStatus] = useState(null); + + useEffect(() => { + if(!loading){ + setParsedStatus(DiscordParser(status)); + } + }, [status, loading]) + useEffect(() => { let interval = setInterval(() => { if (!loading) { @@ -47,257 +56,44 @@ export default function DiscordActivity() { let timeElapsed = convertMsToHM( currentTs - new Date(status?.activities[1]?.timestamps.start) ); - // console.log(timeElapsed); setTime(timeElapsed); } - // console.log("Intervcal"); }, 1000); return () => { clearInterval(interval); }; }, [currentTs, loading]); + if ( - !loading && - (status.discord_status === "online" || - status.discord_status === "idle" || - status.discord_status === "dnd") && - status.activities.length - ) { - if (status.activities[0].id === "custom" && status.activities.length == 1) { - return ( - -
-
- -
-
- -
-
-
-
- - {status?.discord_user.username + - "#" + - status?.discord_user.discriminator} - -
-
- is {status?.discord_status} -
-
- {status?.activities[0].state} -
-
-
-
- ); - } else { - if (status.activities[1]?.name === "Spotify") { - return ( - - {!loading && ( - <> -
-
- {} -
-
- { - - } -
-
-
-
- {status.activities[1] && status.activities[1].name} -
-
- {status.activities[1] && status.activities[1].details} -
-
- {status.activities[1] && status.activities[1].state - ? status.activities[1].state - : null} -
-
-
- {status?.activities[1]?.timestamps?.start && time} -
-
- - )} -
- ); - } - // else if (status.activities[0]) { - // return ( - // - // {!loading && ( - // <> - //
- //
- // {status.activities[0] && ( - // - // )} - //
- //
- // {status.activities[0] && ( - // - // )} - //
- //
- //
- //
- // {status.activities[0].name} - //
- //
- // {status.activities[0].details} - //
- //
- // {status.activities[0].state - // ? status.activities[0].state - // : null} - //
- //
- //
- // {status?.activities[0]?.timestamps?.start && time} - //
- //
- // - // )} - //
- // ); - // } - else { - return ( - - {!loading && ( - <> -
-
- {status.activities[1] && ( - - )} -
-
- {status.activities[1] && ( - - )} -
-
-
-
- {status.activities[1] && status.activities[1].name} -
-
- {status.activities[1] && status.activities[1].details} -
-
- {status.activities[1] && status.activities[1].state - ? status.activities[1].state - : null} -
-
-
- {status?.activities[1]?.timestamps?.start && time} -
-
- - )} -
- ); - } - } - } else if ( - !loading && - status.activities.length === 0 && - (status.discord_status === "online" || - status.discord_status === "idle" || - status.discord_status === "dnd") + !loading && parsedStatus ) { return (
- +
- +
- - {status?.discord_user.username + - "#" + - status?.discord_user.discriminator} - + {parsedStatus.discord.username + "#" + parsedStatus.discord.discriminator}
- is Online -
-
- {status?.activities[0]?.state} + {parsedStatus.activity.details}

-
{}
+
+ {parsedStatus.activity.state} +
+ {/*
00:00:00 elapsed
*/}
); - } else { + } + else { let restData = { username: "Bravo68-DF_Techs", public_flags: 64, diff --git a/components/footer.jsx b/components/footer.jsx index 2eb58af..6e596a6 100644 --- a/components/footer.jsx +++ b/components/footer.jsx @@ -1,9 +1,17 @@ import React from "react"; import FooterStyle from "./footer.style"; import { name } from "config"; +import Status from "./status"; function footer() { - return Build By {name}; + return +
+ Build By {name} +
+
+ +
+
; } export default footer; diff --git a/components/footer.style.jsx b/components/footer.style.jsx index e155251..e98021d 100644 --- a/components/footer.style.jsx +++ b/components/footer.style.jsx @@ -9,6 +9,17 @@ export default styled.div` background: var(--color1); display: flex; justify-content: center; - align-items: center; - font-size: 1.2rem; + .main-footer { + display: flex; + justify-content: center; + align-items: center; + font-size: 1.2rem; + .api-status { + justify-content: right; + align-items: right; + font-size: 1.2rem; + padding-bottom: 20px; + } + + } `; diff --git a/components/skillCard.jsx b/components/skillCard.jsx index 372c70a..9a98b61 100644 --- a/components/skillCard.jsx +++ b/components/skillCard.jsx @@ -2,7 +2,6 @@ import React from "react"; import SkillCardStyle from "./skillCard.styled"; function SkillCard({ title, children, image, bannerImage, url }) { - // console.log(image); return (
diff --git a/components/status.jsx b/components/status.jsx index e69de29..7849b9e 100644 --- a/components/status.jsx +++ b/components/status.jsx @@ -0,0 +1,35 @@ +import React, { useEffect, useState } from "react"; +import axios from "handlers/axios"; +import Box from "@mui/material/Box"; +import LinearProgress from "@mui/material/LinearProgress"; + +export default function Status() { + const [status, setStatus] = useState({}); + const [loading, setLoading] = useState(true); + + async function requestStatus() { + await axios.get("/health/health").then((res) => { + setStatus(res.data); + setLoading(false); + }); + } + + useEffect(() => { + requestStatus(); + }, [loading]); + + if (loading) { + return ( + + + Requesting Live API data... + + ); + } else { + return ( +
+ {(status.status)} +
+ ); + } +} \ No newline at end of file diff --git a/components/toots.jsx b/components/toots.jsx index dc056b2..d1ad363 100644 --- a/components/toots.jsx +++ b/components/toots.jsx @@ -21,7 +21,7 @@ function Toots () { useEffect(() => { requestAPIS(); - }, [loading, APISDK]); + }, [loading]); let image = skills?.logo?.masto; if (loading) { return ( @@ -34,8 +34,6 @@ function Toots () { ); } else { - - console.log(skills.data); return ( <> diff --git a/libs/discord-parser.js b/libs/discord-parser.js new file mode 100644 index 0000000..99b1d0c --- /dev/null +++ b/libs/discord-parser.js @@ -0,0 +1,90 @@ +export default function parse(data) { + const output = {}; + const act = []; + + const PrirorityActivityType = ['Coding', 'Listening to Spotify', 'Playing', 'Custom Status', 'Streaming', 'Watching', 'Competing', 'Unknown']; + + output.discord = { + id: data.discord_user.id, + username: data.discord_user.username, + discriminator: data.discord_user.discriminator, + avatar_url: "https://cdn.discordapp.com/avatars/" + data.discord_user.id + "/" + data.discord_user.avatar + ".png", + avatar_decoration_url: "https://cdn.discordapp.com/avatar-decoration-presets/" + data.discord_user.avatar_decoration + ".png" + } + + output.kv = data.kv; + + if (data.listening_to_spotify) { + output.spotify = { + album: data.spotify.album, + artist: data.spotify.artist, + song: data.spotify.song, + album_art_url: data.spotify.album_art_url, + timestamps: data.spotify.timestamps, + track_id: data.spotify.track_id + } + } + + for(const activity of data.activities) { + if(activity.name.includes("Visual Studio Code")){ + act.push({ + prirority_id: PrirorityActivityType.indexOf('Coding'), + ...activity + }); + } + else if(activity.name.includes("Spotify")){ + act.push({ + prirority_id: PrirorityActivityType.indexOf('Listening to Spotify'), + ...activity + }); + } + else if(activity.name.includes("Custom Status")){ + act.push({ + prirority_id: PrirorityActivityType.indexOf('Custom Status'), + ...activity + }); + output.custom_status = { + state: activity.state, + emoji: { + name: activity.emoji?.name, + id: activity.emoji?.id, + animated: activity.emoji?.animated, + emoji_url: "https://cdn.discordapp.com/emojis/" + activity.emoji?.id + ".webp?size=44&quality=lossless" + } + + }; + } + else { + act.push({ + prirority_id: PrirorityActivityType.indexOf('Unknown'), + ...activity + }); + break; + } + } + + act.sort((a, b) => a.prirority_id - b.prirority_id); + + output.activity = act[0]; + + if(output.activity.prirority_id == 1){ + output.activity.assets = { + large_image : output.spotify.album_art_url, + small_image : "/images/brandlogos/SpotifyLogo.png" + } + } + else if(output.activity.prirority_id == 3){ + output.activity.assets = { + large_image : "/images/anime-profile-pic.png", + small_image : output.custom_status.emoji.emoji_url, + } + } + else { + output.activity.assets = { + large_image : "https://cdn.discordapp.com/app-assets/"+output.activity.application_id+"/"+output.activity.assets.large_image+".png", + small_image : "https://cdn.discordapp.com/app-assets/"+output.activity.application_id+"/"+output.activity.assets.small_image+".png", + } + } + + return output; +} \ No newline at end of file diff --git a/public/images/brandlogos/SpotifyLogo.png b/public/images/brandlogos/SpotifyLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8aab702cec3c10cde8f78e29e0a91513778223d GIT binary patch literal 8853 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 QN5%1UwTv`Bs@sJBH?qdc3jhEB literal 0 HcmV?d00001