presence.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. const presence = new Presence({
  2. clientId: "1232903356025143297",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. let veactionLast: string | null = null;
  6. function hasPermissions(): boolean {
  7. return !document.querySelector(".permissions-errors");
  8. }
  9. async function prepare(): Promise<PresenceData> {
  10. const presenceData: PresenceData = {
  11. startTimestamp: browsingTimestamp,
  12. },
  13. { href, search } = document.location,
  14. searchParams = new URLSearchParams(search),
  15. strings = await presence.getStrings({
  16. viewHome: "general.viewHome",
  17. viewUser: "general.viewUser",
  18. viewAThread: "general.viewAThread",
  19. buttonViewProfile: "general.buttonViewProfile",
  20. editing: "general.editing",
  21. advancedSettings: "minecraft wiki.settings",
  22. viewAPage: "general.viewAPage",
  23. buttonViewPage: "general.buttonViewPage",
  24. readingAbout: "general.readingAbout",
  25. moving: "minecraft wiki.moving",
  26. viewSourceOf: "minecraft wiki.viewSourceOf",
  27. viewHistory: "minecraft wiki.viewHistory",
  28. changeProtection: "minecraft wiki.changeProtection",
  29. viewProtection: "minecraft wiki.viewProtection",
  30. search: "general.search",
  31. upload: "minecraft wiki.upload",
  32. viewContributionsOf: "minecraft wiki.viewContributionsOf",
  33. viewRecentChanges: "minecraft wiki.viewRecentChanges",
  34. login: "minecraft wiki.login",
  35. btnViewThread: "minecraft wiki.btnViewThread",
  36. viewWatchlist: "minecraft wiki.viewWatchlist",
  37. }),
  38. {
  39. "mw.config.values.wgPageName": wgPageName,
  40. "mw.config.values.wgNamespaceNumber": wgNamespaceNumber,
  41. "mw.config.values.wgTitle": wgTitle,
  42. "mw.config.values.wgCanonicalSpecialPageName": wgCanonicalSpecialPageName,
  43. "mw.config.values.wgRelevantPageName": wgRelevantPageName,
  44. "mw.config.values.wgRelevantUserName": wgRelevantUserName,
  45. "mw.config.values.wgIsMainPage": wgIsMainPage,
  46. } = await presence.getPageVariable<{
  47. "mw.config.values.wgPageName": string;
  48. "mw.config.values.wgNamespaceNumber": number;
  49. "mw.config.values.wgTitle": string;
  50. "mw.config.values.wgCanonicalSpecialPageName": string | false;
  51. "mw.config.values.wgRelevantPageName": string;
  52. "mw.config.values.wgRelevantUserName": string | null;
  53. "mw.config.values.wgIsMainPage": boolean | null;
  54. }>(
  55. "mw.config.values.wgPageName",
  56. "mw.config.values.wgNamespaceNumber",
  57. "mw.config.values.wgTitle",
  58. "mw.config.values.wgCanonicalSpecialPageName",
  59. "mw.config.values.wgRelevantPageName",
  60. "mw.config.values.wgRelevantUserName",
  61. "mw.config.values.wgIsMainPage"
  62. ),
  63. pageTitle = wgPageName.replace(/_/g, " ");
  64. veactionLast = searchParams.get("veaction");
  65. presenceData.largeImageKey =
  66. getComputedStyle(
  67. document.querySelector<HTMLAnchorElement>(".mw-wiki-logo")
  68. ).backgroundImage.match(/url\("(.+)"\)/)[1] ??
  69. "https://cdn.rcd.gg/PreMiD/websites/M/Minecraft%20Wiki/assets/logo.png";
  70. if (
  71. searchParams.get("action") === "edit" ||
  72. searchParams.get("action") === "submit" ||
  73. searchParams.get("veaction") === "edit" ||
  74. searchParams.get("veaction") === "editsource"
  75. ) {
  76. presenceData.details = hasPermissions()
  77. ? strings.editing
  78. : strings.viewSourceOf;
  79. presenceData.state = pageTitle;
  80. } else if (searchParams.get("action") === "history") {
  81. presenceData.details = strings.viewHistory;
  82. presenceData.state = pageTitle;
  83. } else if (
  84. searchParams.get("action") === "protect" ||
  85. searchParams.get("action") === "unprotect"
  86. ) {
  87. presenceData.details = hasPermissions()
  88. ? strings.changeProtection
  89. : strings.viewProtection;
  90. presenceData.state = pageTitle;
  91. } else if (searchParams.get("search")) {
  92. presenceData.details = strings.search;
  93. presenceData.state = searchParams.get("search");
  94. } else if (wgNamespaceNumber === 2) {
  95. // User namespace
  96. presenceData.details = strings.viewUser;
  97. presenceData.state = wgTitle;
  98. presenceData.buttons = [{ label: strings.buttonViewProfile, url: href }];
  99. } else if (wgNamespaceNumber % 2 === 1) {
  100. // All talk namespaces
  101. presenceData.details = strings.viewAThread;
  102. presenceData.state = wgNamespaceNumber === 1 ? wgTitle : pageTitle;
  103. presenceData.buttons = [{ label: strings.btnViewThread, url: href }];
  104. } else if (wgNamespaceNumber === -1) {
  105. // Special namespace
  106. switch (wgCanonicalSpecialPageName) {
  107. case "Preferences":
  108. // Preferences (Special:Preferences)
  109. presenceData.details = strings.advancedSettings;
  110. break;
  111. case "Watchlist":
  112. // Subscriptions (Special:Watchlist)
  113. presenceData.details = strings.viewWatchlist;
  114. break;
  115. case "Recentchanges":
  116. // Recent changes (Special:RecentChanges)
  117. presenceData.details = strings.viewRecentChanges;
  118. break;
  119. case "Recentchangeslinked":
  120. // Related changes (Special:RecentChangesLinked)
  121. presenceData.details = strings.viewRecentChanges;
  122. presenceData.state = wgRelevantPageName.replace(/_/g, " ");
  123. break;
  124. case "Movepage":
  125. // Moving a page (Special:MovePage)
  126. presenceData.details = strings.moving;
  127. presenceData.state = wgRelevantPageName.replace(/_/g, " ");
  128. break;
  129. case "Userlogin":
  130. case "CreateAccount":
  131. // Logging in (Special:UserLogin, Special:CreateAccount)
  132. presenceData.details = strings.login;
  133. break;
  134. case "Upload":
  135. // Upload a file (Special:Upload)
  136. presenceData.details = strings.upload;
  137. presenceData.state = searchParams.get("wpDestFile");
  138. break;
  139. case "Contributions":
  140. // Contributions (Special:Contributions)
  141. presenceData.details = strings.viewContributionsOf;
  142. presenceData.state = wgRelevantUserName;
  143. break;
  144. default:
  145. presenceData.details = strings.viewAPage;
  146. presenceData.state = pageTitle;
  147. }
  148. } else if (wgNamespaceNumber) {
  149. // Not main namespace
  150. presenceData.details = `${strings.readingAbout} ${pageTitle.split(":")[0]}`;
  151. presenceData.state = wgTitle;
  152. presenceData.buttons = [{ label: strings.buttonViewPage, url: href }];
  153. } else if (wgIsMainPage) presenceData.details = strings.viewHome;
  154. else {
  155. presenceData.details = strings.viewAPage;
  156. presenceData.state = pageTitle;
  157. presenceData.buttons = [{ label: strings.buttonViewPage, url: href }];
  158. }
  159. return presenceData;
  160. }
  161. (async (): Promise<void> => {
  162. let presenceData = await prepare();
  163. presence.on("UpdateData", async () => {
  164. if (
  165. veactionLast !==
  166. new URLSearchParams(document.location.search).get("veaction")
  167. )
  168. presenceData = await prepare();
  169. else presence.setActivity(presenceData);
  170. });
  171. })();