presence.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. const presence = new Presence({
  2. clientId: "1208682131392565320",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets { // Other default assets can be found at index.d.ts
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/M/ModDB/assets/logo.png",
  7. }
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: Assets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. },
  13. { pathname, href } = document.location,
  14. locations = pathname.split("/"),
  15. showButtons = await presence.getSetting<boolean>("buttons");
  16. locations.shift();
  17. switch (true) {
  18. case pathname.startsWith("/members/register"):
  19. presenceData.details = "Registering";
  20. break;
  21. case /\/members\/[A-Za-z0-9-_.]*\/[a-z]*/.test(pathname):
  22. presenceData.details = `Viewing ${locations[1]}'s ${locations[2]}`;
  23. break;
  24. case pathname.startsWith("/members/"): {
  25. const name = document.querySelector(
  26. ".headercorner .title h2 a"
  27. )?.textContent;
  28. presenceData.details = "Viewing member information";
  29. if (name) presenceData.state = name;
  30. break;
  31. }
  32. case /\/(games|mods|addons|downloads|engines|company|groups)\/(top|latest)/.test(
  33. pathname
  34. ):
  35. showLinkButton();
  36. presenceData.details = `Viewing ${locations[1]} ${locations[0]}`;
  37. break;
  38. case /\/(games|mods|addons|downloads|articles|engines|company|groups)\/add/.test(
  39. pathname
  40. ): {
  41. const type = locations[0].split("");
  42. if (type.at(-1) === "s") type.pop();
  43. const typeJoined = type.join("");
  44. presenceData.details = `Adding a${
  45. typeJoined.startsWith("a") ? "n" : ""
  46. } ${typeJoined}`;
  47. break;
  48. }
  49. case /\/(games|mods)\/[A-Za-z0-9|-]{1,}\/(news|articles|tutorials|reviews|downloads|addons|mods|videos|images)(\/[A-Za-z0-9|-]{1,})?/.test(
  50. pathname
  51. ): {
  52. const gameName = document.querySelector(
  53. ".title h2[itemprop='name']"
  54. )?.textContent;
  55. showLinkButton();
  56. const type = locations[0].split("");
  57. if (type.at(-1) === "s") type.pop();
  58. const typeJoined = type.join("");
  59. presenceData.details = `Viewing ${
  60. gameName
  61. ? `${gameName} ${typeJoined}`
  62. : `${typeJoined.startsWith("a") ? "an" : "a"} ${typeJoined}`
  63. }'s ${locations[2]}`;
  64. const heading = document.querySelector(".normalcorner .title .heading");
  65. if (heading && !heading.textContent.startsWith("Reviews"))
  66. presenceData.state = heading.textContent;
  67. break;
  68. }
  69. case /\/(games|mods)\/[A-Za-z0-9|-]{1,}/.test(pathname): {
  70. const gameName = document.querySelector(
  71. ".title h2[itemprop='name']"
  72. )?.textContent;
  73. showLinkButton();
  74. const type = locations[0].split("");
  75. if (type.at(-1) === "s") type.pop();
  76. const typeJoined = type.join("");
  77. presenceData.details = `Viewing ${
  78. gameName
  79. ? `${gameName} ${typeJoined}`
  80. : `${typeJoined.startsWith("a") ? "an" : "a"} ${typeJoined}`
  81. }`;
  82. break;
  83. }
  84. case /\/mods\/[A-Za-z0-9|-]{1,}/.test(pathname): {
  85. const modName = document.querySelector(".title h2 a")?.textContent;
  86. showLinkButton();
  87. presenceData.details = `Viewing ${modName ? `${modName} mod` : "a mod"}`;
  88. break;
  89. }
  90. case /\/rtx(\/)?[a-z]?/.test(pathname):
  91. showLinkButton();
  92. presenceData.details = `Viewing ${
  93. document
  94. .querySelector(".normalcorner .title .heading")
  95. ?.textContent.split("  ")[0]
  96. }`;
  97. break;
  98. case pathname.startsWith("/jobs/add"):
  99. showLinkButton();
  100. presenceData.details = "Posting a job";
  101. break;
  102. case /\/games|mods|addons|downloads|videos|articles|engines|company|groups|jobs/.test(
  103. pathname
  104. ): {
  105. showLinkButton();
  106. let location = locations[0];
  107. if (location === "company") location = "developers";
  108. presenceData.details = `Viewing ${location}`;
  109. break;
  110. }
  111. case pathname.startsWith("/about"):
  112. showLinkButton();
  113. presenceData.details = "Viewing about page";
  114. break;
  115. case pathname === "/":
  116. showLinkButton();
  117. presenceData.details = "Viewing home page";
  118. break;
  119. case pathname.startsWith("/today"):
  120. showLinkButton();
  121. presenceData.details = "Viewing files uploaded today";
  122. break;
  123. case /(\/)(week|month|year)/.test(pathname):
  124. showLinkButton();
  125. presenceData.details = `Viewing files uploaded this ${locations[0]}`;
  126. break;
  127. case /reviews|headline|blogs|images|audio/.test(pathname):
  128. presenceData.details = `Viewing ${locations[0]}`;
  129. break;
  130. case pathname.startsWith("/forum"): {
  131. showLinkButton();
  132. presenceData.details = "Viewing forums";
  133. const heading = document.querySelector(
  134. "tr.category td .heading"
  135. )?.textContent;
  136. if (heading && heading !== "Your Favorites") presenceData.state = heading;
  137. else presenceData.state = "Site Forums";
  138. break;
  139. }
  140. }
  141. function showLinkButton() {
  142. if (!showButtons) return;
  143. presenceData.buttons = [
  144. {
  145. label: "View",
  146. url: href,
  147. },
  148. ];
  149. }
  150. presenceData.details = presenceData.details.toString();
  151. if (locations.includes("downloads"))
  152. presenceData.details = presenceData.details.replace("downloads", "files");
  153. if (locations.includes("top"))
  154. presenceData.details = presenceData.details.replace("top", "popular");
  155. presence.setActivity(presenceData);
  156. });