From f361409271faebd3b5551f0a767ebce10de63bd5 Mon Sep 17 00:00:00 2001 From: Synxx12 Date: Tue, 1 Oct 2024 21:05:41 +0700 Subject: [PATCH] feat(Weverse): add presence (#8724) --- package-lock.json | 2 +- websites/W/Weverse/metadata.json | 24 ++++ websites/W/Weverse/presence.ts | 189 +++++++++++++++++++++++++++++++ 3 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 websites/W/Weverse/metadata.json create mode 100644 websites/W/Weverse/presence.ts diff --git a/package-lock.json b/package-lock.json index d65205dd2ea0..9d9badbe25fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ }, "cli": { "name": "@pmd/cli", - "version": "1.3.2", + "version": "1.3.4", "license": "MPL-2.0", "dependencies": { "@apollo/client": "^3.6.9", diff --git a/websites/W/Weverse/metadata.json b/websites/W/Weverse/metadata.json new file mode 100644 index 000000000000..f3d74a3ea972 --- /dev/null +++ b/websites/W/Weverse/metadata.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://schemas.premid.app/metadata/1.10", + "author": { + "id": "712745906876842025", + "name": "hanifhan1f" + }, + "service": "Weverse", + "description": { + "en": "Displays the current live stream activity for a Weverse live page." + }, + "url": "weverse.io", + "version": "1.0.0", + "logo": "https://res.cloudinary.com/debvitdiw/image/upload/v1726211085/Presences/weverse.jpg", + "thumbnail": "https://res.cloudinary.com/debvitdiw/image/upload/v1726211170/Presences/thumbnail.png", + "color": "#08ccc9", + "category": "music", + "tags": [ + "weverse", + "kpop", + "live", + "streaming", + "music" + ] +} \ No newline at end of file diff --git a/websites/W/Weverse/presence.ts b/websites/W/Weverse/presence.ts new file mode 100644 index 000000000000..8eaf45580fad --- /dev/null +++ b/websites/W/Weverse/presence.ts @@ -0,0 +1,189 @@ +class Weverse extends Presence { + constructor(options: PresenceOptions) { + super(options); + } + + getArtistName(): string { + return ( + document + .querySelector(".LiveArtistProfileView_name_item__8W66y") + ?.textContent?.trim() ?? "Unknown Artist" + ); + } + + getStreamTitle(): string { + const titleElement = document.querySelector("h2.TitleView_title__SSnHb"); + if (titleElement) { + const titleTextNodes = Array.from(titleElement.childNodes).filter( + node => + !( + node instanceof HTMLElement && + node.matches(".LiveBadgeView_badge__o2vFt") + ) + ); + + return ( + titleTextNodes + .map(node => node.textContent) + .join("") + .trim() || "Unknown Title" + ); + } + return "Unknown Title"; + } + + getThumbnailUrl(): string | undefined { + return document.querySelector( + ".ProfileThumbnailView_thumbnail_wrap__ZgeTf img" + )?.src; + } + + getCommunityName(): string { + return ( + document + .querySelector(".HeaderCommunityDropdownWrapperView_name__FZXsx") + ?.textContent?.trim() ?? "Unknown Community" + ); + } + + getCommunityImageUrl(): string | undefined { + return document.querySelector( + ".CommunityAsideWelcomeView_thumbnail__5MVun" + )?.src; + } + + getArtistPageName(): string { + return ( + document + .querySelector(".HeaderCommunityDropdownWrapperView_name__FZXsx") + ?.textContent?.trim() ?? "Unknown Artist" + ); + } + + getMomentThumbnailUrl(): string | undefined { + return document.querySelector( + ".ProfileThumbnailView_thumbnail_wrap__ZgeTf img" + )?.src; + } + + getMomentNickname(): string { + return ( + document + .querySelector(".PostHeaderView_nickname__6Cb7X") + ?.textContent?.trim() ?? "Unknown User" + ); + } +} + +const presence = new Weverse({ + clientId: "1284048129414402109", +}); + +presence.on("UpdateData", async () => { + const presenceData: PresenceData = { + largeImageKey: + "https://res.cloudinary.com/debvitdiw/image/upload/v1726211085/Presences/weverse.jpg", + }; + + if (document.location.pathname.includes("/live/")) { + const thumbnailUrl = presence.getThumbnailUrl(); + presenceData.details = presence.getStreamTitle(); + presenceData.state = presence.getArtistName(); + + const video = document.querySelector("video"); + if (document.querySelector(".LiveBadgeView_-replay__nNx34") !== null) { + presenceData.smallImageKey = Assets.Play; + presenceData.smallImageText = "Replay"; + presenceData.buttons = [ + { + label: `Watch ${presence.getArtistName()} Replay`, + url: document.location.href, + }, + ]; + } else if (video) { + if (video.paused) { + presenceData.smallImageKey = Assets.Play; + presenceData.smallImageText = "Paused"; + } else { + presenceData.smallImageKey = Assets.Live; + presenceData.smallImageText = "Live"; + } + presenceData.buttons = [ + { + label: `Visit ${presence.getArtistName()} Live`, + url: document.location.href, + }, + ]; + } else { + presenceData.smallImageKey = Assets.Play; + presenceData.smallImageText = "Playing"; + presenceData.buttons = [ + { + label: `Watch ${presence.getArtistName()} Replay`, + url: document.location.href, + }, + ]; + } + + if (thumbnailUrl) presenceData.largeImageKey = thumbnailUrl; + } else if (document.location.pathname === "/") { + presenceData.details = "Browsing Weverse"; + presenceData.state = "On Homepage"; + } else if (document.location.pathname.includes("/feed")) { + presenceData.details = "Viewing Community Feed"; + presenceData.state = presence.getCommunityName(); + + const communityImageUrl = presence.getCommunityImageUrl(); + if (communityImageUrl) presenceData.largeImageKey = communityImageUrl; + + presenceData.buttons = [ + { + label: `Visit ${presence.getCommunityName()} Feed`, + url: document.location.href, + }, + ]; + } else if (document.location.pathname.includes("/artist")) { + presenceData.details = "Viewing Artist"; + presenceData.state = presence.getArtistPageName(); + + presenceData.buttons = [ + { + label: `Visit ${presence.getArtistPageName()} Artist`, + url: document.location.href, + }, + ]; + } else if (document.location.pathname.includes("/moment")) { + presenceData.details = "Viewing Moment"; + presenceData.state = presence.getMomentNickname(); + + const momentThumbnailUrl = presence.getMomentThumbnailUrl(); + if (momentThumbnailUrl) presenceData.largeImageKey = momentThumbnailUrl; + + presenceData.buttons = [ + { + label: `Visit ${presence.getMomentNickname()} Moment`, + url: document.location.href, + }, + ]; + } else if (document.location.pathname.includes("/media")) { + presenceData.details = "Viewing Media"; + presenceData.state = presence.getCommunityName(); + + presenceData.buttons = [ + { + label: `Visit ${presence.getCommunityName()} Media`, + url: document.location.href, + }, + ]; + } else { + presenceData.details = "Browsing Weverse"; + presenceData.buttons = [ + { + label: "Go to Weverse", + url: "https://weverse.io", + }, + ]; + } + + presence.setActivity(presenceData); +});