diff --git a/websites/M/Minecraft Wiki/metadata.json b/websites/M/Minecraft Wiki/metadata.json index e39f3077d1b3..989d69a9457c 100644 --- a/websites/M/Minecraft Wiki/metadata.json +++ b/websites/M/Minecraft Wiki/metadata.json @@ -38,7 +38,8 @@ "google classroom", "youtube", "kahoot", - "amazon" + "amazon", + "apple" ], "id": "lang" } diff --git a/websites/M/Minecraft Wiki/presence.ts b/websites/M/Minecraft Wiki/presence.ts index 768e3ac8daf6..1aa2b4b413ea 100644 --- a/websites/M/Minecraft Wiki/presence.ts +++ b/websites/M/Minecraft Wiki/presence.ts @@ -1,3 +1,5 @@ +import { getUserNamespace, getTalkNamespace } from "./util"; + const presence = new Presence({ clientId: "1232903356025143297", }), @@ -34,6 +36,7 @@ presence.on("UpdateData", async () => { viewRecentChanges: "minecraft wiki.viewRecentChanges", login: "kahoot.login", subscriptions: "amazon.subscriptions", + btnViewThread: "apple.btnViewThread", }), mainPath = pathname.split("/").filter(Boolean)[1] ?? "/", pageTitle = document.querySelector( @@ -47,7 +50,7 @@ presence.on("UpdateData", async () => { .match(/.*(?=:[^_])/)?.[0], userNamespace = await getUserNamespace(), talkNamespace = await getTalkNamespace(), - currentNamespace = pageTitle.match(/.*(?=:[^_])/)?.[0] ?? ""; + currentNamespace = mainPath.match(/.*(?=:[^_])/)?.[0] ?? ""; presenceData.largeImageKey = getComputedStyle( document.querySelector(".mw-wiki-logo") @@ -78,7 +81,9 @@ presence.on("UpdateData", async () => { } else if (mainPath === "/") presenceData.details = strings.viewHome; else if (currentNamespace === userNamespace) { presenceData.details = strings.viewUser; - presenceData.state = pageTitle.slice(5); + presenceData.state = pageTitle.slice( + decodeURIComponent(userNamespace).length + 1 + ); presenceData.buttons = [{ label: strings.buttonViewProfile, url: href }]; } else if ( currentNamespace.toLowerCase().includes(talkNamespace.toLowerCase()) @@ -88,6 +93,7 @@ presence.on("UpdateData", async () => { currentNamespace === talkNamespace ? document.querySelector(".mw-page-title-main") : pageTitle; + presenceData.buttons = [{ label: strings.btnViewThread, url: href }]; } else if (currentNamespace === specialNamespace) { // Preferences (Special:Preferences) if (document.querySelector("#mw-prefs-form")) @@ -118,10 +124,7 @@ presence.on("UpdateData", async () => { presenceData.state = pageTitle; } } else if (currentNamespace) { - const namespace = pageTitle.slice( - 0, - mainPath.match(/.*(?=:[^_])/)[0].length - ); + const namespace = decodeURIComponent(currentNamespace); presenceData.details = `${strings.readingAbout} ${namespace}`; presenceData.state = pageTitle.slice(namespace.length + 1); presenceData.buttons = [{ label: strings.buttonViewPage, url: href }]; diff --git a/websites/M/Minecraft Wiki/util.ts b/websites/M/Minecraft Wiki/util.ts index 2f2968c745d8..300b35161757 100644 --- a/websites/M/Minecraft Wiki/util.ts +++ b/websites/M/Minecraft Wiki/util.ts @@ -1,21 +1,41 @@ -async function getUserNamespace() { +const promiseCache = new Map>(); + +export async function getUserNamespace() { const cached = sessionStorage.getItem("PMD_UserNamespace"); if (cached) return cached; - const response = await fetch("/w/User:Example"); + let response: Response; + const promise = promiseCache.get("getUserNamespace"); + if (promise) response = await promise; + else { + const promise = fetch( + `https://${document.location.hostname}/w/User:Example` + ); + promiseCache.set("getUserNamespace", promise); + response = await promise; + } sessionStorage.setItem( "PMD_UserNamespace", - response.url.split("/").filter(Boolean)[1].split(":")[0] + new URL(response.url).pathname.split("/").filter(Boolean)[1].split(":")[0] ); return sessionStorage.getItem("PMD_UserNamespace"); } -async function getTalkNamespace() { +export async function getTalkNamespace() { const cached = sessionStorage.getItem("PMD_TalkNamespace"); if (cached) return cached; - const response = await fetch("/w/Talk:Example"); + let response: Response; + const promise = promiseCache.get("getTalkNamespace"); + if (promise) response = await promise; + else { + const promise = fetch( + `https://${document.location.hostname}/w/Talk:Example` + ); + promiseCache.set("getTalkNamespace", promise); + response = await promise; + } sessionStorage.setItem( "PMD_TalkNamespace", - response.url.split("/").filter(Boolean)[1].split(":")[0] + new URL(response.url).pathname.split("/").filter(Boolean)[1].split(":")[0] ); return sessionStorage.getItem("PMD_TalkNamespace"); }