presence.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. const presence = new Presence({
  2. clientId: "1079522783974920212",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. presence.on("UpdateData", async () => {
  6. const presenceData: PresenceData = {
  7. details: "Other",
  8. largeImageKey:
  9. "https://cdn.rcd.gg/PreMiD/websites/V/Video%20Game%20Mods/assets/logo.png",
  10. startTimestamp: browsingTimestamp,
  11. buttons: [
  12. {
  13. label: "View Page",
  14. url: document.location.href,
  15. },
  16. ],
  17. },
  18. urlpath = document.location.pathname.split("/");
  19. switch (true) {
  20. case !urlpath[1]:
  21. presenceData.details = "Home";
  22. break;
  23. case urlpath[1].startsWith("members"):
  24. presenceData.details = `In ${
  25. document.querySelector('[class="data"]')?.textContent
  26. }`;
  27. presenceData.state = urlpath[2];
  28. break;
  29. case urlpath[1].startsWith("forums"):
  30. if (urlpath[2]) {
  31. if (urlpath[2].startsWith("search")) {
  32. presenceData.details = "Searching for:";
  33. presenceData.state = decodeURI(urlpath[3]).replace("+", " ");
  34. break;
  35. } else {
  36. presenceData.details = `In a discussion of ${
  37. document.querySelector<HTMLHeadingElement>("a.bbp-breadcrumb-forum")
  38. ?.textContent
  39. }:`;
  40. presenceData.state =
  41. document.querySelector<HTMLHeadingElement>(
  42. "h1.entry-title"
  43. )?.textContent;
  44. break;
  45. }
  46. }
  47. if (urlpath[3]) {
  48. presenceData.details = "In forum:";
  49. presenceData.state = urlpath[4]
  50. ? `${
  51. document.querySelector<HTMLHeadingElement>(
  52. "a.bbp-breadcrumb-forum"
  53. )?.textContent
  54. } - ${
  55. document.querySelector<HTMLHeadingElement>("h1.entry-title")
  56. ?.textContent
  57. }`
  58. : document.querySelector<HTMLHeadingElement>("h1.entry-title")
  59. ?.textContent;
  60. break;
  61. }
  62. presenceData.details = "In Forums";
  63. break;
  64. default:
  65. if (urlpath[1] && !urlpath[2]) {
  66. switch (urlpath[1]) {
  67. case "register":
  68. presenceData.details = "Register a new account";
  69. break;
  70. case "wp-login.php":
  71. presenceData.details = "Login";
  72. break;
  73. case "privacy-policy":
  74. presenceData.details = "Privacy Policy";
  75. break;
  76. default:
  77. presenceData.details = "Viewing Page of";
  78. presenceData.state =
  79. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  80. break;
  81. }
  82. }
  83. if (urlpath[1] && urlpath[2]) {
  84. switch (urlpath[2]) {
  85. case "mods": {
  86. if (urlpath[3] !== "categories") {
  87. presenceData.details = `Viewing mod of ${
  88. document.querySelector<HTMLHeadingElement>("h1")?.textContent
  89. }`;
  90. presenceData.state = document.querySelector<HTMLHeadingElement>(
  91. "div.site-content h1"
  92. )?.textContent;
  93. presenceData.largeImageKey = document
  94. .querySelector<HTMLImageElement>("div.modsmedia img")
  95. ?.getAttribute("src");
  96. break;
  97. } else {
  98. presenceData.details = "Viewing mods of";
  99. presenceData.state =
  100. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  101. break;
  102. }
  103. }
  104. case "upload-mod":
  105. presenceData.details = "Uploading mod of";
  106. presenceData.state =
  107. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  108. break;
  109. case "manage-mods":
  110. presenceData.details = "Managing mods of";
  111. presenceData.state =
  112. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  113. break;
  114. case "modder":
  115. presenceData.details = `Viewing ${
  116. document.querySelector<HTMLHeadingElement>("h1")?.textContent
  117. } mods by Modder`;
  118. presenceData.state = document.querySelector<HTMLHeadingElement>(
  119. "div.modderprofilebox h2"
  120. )?.textContent;
  121. break;
  122. case "category":
  123. switch (urlpath[3]) {
  124. case "guides":
  125. presenceData.details = "Viewing Guides of";
  126. presenceData.state =
  127. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  128. break;
  129. case "updates":
  130. presenceData.details = "Viewing Updates of";
  131. presenceData.state =
  132. document.querySelector<HTMLHeadingElement>("h1")?.textContent;
  133. break;
  134. }
  135. break;
  136. default:
  137. presenceData.details = `Viewing ${
  138. document.querySelector<HTMLHeadingElement>("h1")?.textContent
  139. }`;
  140. presenceData.largeImageKey =
  141. document
  142. .querySelector<HTMLImageElement>("div.post-thumbnail img")
  143. ?.getAttribute("src") ??
  144. "https://cdn.rcd.gg/PreMiD/websites/V/Video%20Game%20Mods/assets/logo.png";
  145. presenceData.state =
  146. document.querySelector<HTMLHeadingElement>(
  147. "h1.entry-title"
  148. )?.textContent;
  149. }
  150. break;
  151. }
  152. }
  153. if (presenceData.details) presence.setActivity(presenceData);
  154. else presence.setActivity();
  155. });