presence.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. const presence = new Presence({
  2. clientId: "735229766701154357",
  3. }),
  4. strings = presence.getStrings({
  5. browse: "general.browsing",
  6. search: "general.searching",
  7. }),
  8. getElement = (query: string): string | undefined => {
  9. return document.querySelector(query)?.textContent;
  10. };
  11. let elapsed = Math.floor(Date.now() / 1000),
  12. prevUrl = document.location.href;
  13. const statics = {
  14. "/pages/global/pagegone.jsf/": {
  15. details: "404",
  16. state: "Not Found",
  17. },
  18. "/page/login/": {
  19. details: "Logging In...",
  20. },
  21. "/page/register/": {
  22. details: "Registering...",
  23. },
  24. "/page/about/": {
  25. details: "Viewing Page...",
  26. state: "About",
  27. },
  28. "/page/guide/": {
  29. details: "Viewing Page...",
  30. state: "User Guide",
  31. },
  32. "/page/privacy/": {
  33. details: "Viewing Page...",
  34. state: "Privacy Policy",
  35. },
  36. "/page/developer/": {
  37. details: "Viewing Page...",
  38. state: "Developer Resources",
  39. },
  40. "/Top/": {
  41. details: "Viewing Page...",
  42. state: "Top Hardware",
  43. },
  44. "/Software/": {
  45. details: "Viewing Page...",
  46. state: "PC Software",
  47. },
  48. },
  49. assets = {
  50. ssd: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/0.png",
  51. cpu: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/1.png",
  52. usb: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/2.png",
  53. hdd: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/3.png",
  54. gpu: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/4.png",
  55. ram: "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/5.png",
  56. };
  57. presence.on("UpdateData", async () => {
  58. const { host, pathname, href } = document.location,
  59. path = pathname.replace(/\/?$/, "/"),
  60. showSearch = await presence.getSetting<boolean>("search"),
  61. showTimestamps = await presence.getSetting<boolean>("timestamp");
  62. let presenceData: PresenceData = {
  63. largeImageKey:
  64. "https://cdn.rcd.gg/PreMiD/websites/U/UserBenchmark/assets/logo.png",
  65. startTimestamp: elapsed,
  66. };
  67. if (href !== prevUrl) {
  68. prevUrl = href;
  69. elapsed = Math.floor(Date.now() / 1000);
  70. }
  71. for (const [k, v] of Object.entries(statics))
  72. if (path.match(k)) presenceData = { ...presenceData, ...v };
  73. if (path === "/") {
  74. presenceData.details = "Browsing...";
  75. presenceData.state = "Home";
  76. }
  77. if (path.includes("/Compare/")) {
  78. presenceData.details = `Comparing ${getElement(
  79. ".fastinslowout.active"
  80. )}s...`;
  81. const parseComparison = (text: string, date: string): string => {
  82. return date ? text : "Unspecified";
  83. };
  84. presenceData.state = `${parseComparison(
  85. getElement("#select2-chosen-1"),
  86. getElement(".cmp-cpt-l")
  87. )} vs ${parseComparison(
  88. getElement("#select2-chosen-2"),
  89. getElement(".cmp-cpt-r")
  90. )}`;
  91. }
  92. if (path.includes("/EFps/")) {
  93. presenceData.details = "Comparing PC with EFps...";
  94. const activeBtn = document.querySelector(
  95. ".btn-group-justified > .btn.btn-default.active"
  96. );
  97. presenceData.state = [
  98. "Counter Strike: Global Offensive",
  99. "Grand Theft Auto 5",
  100. "Overwatch",
  101. "PlayerUnknown's Battlegrounds",
  102. "Fortnite",
  103. ][Array.from(activeBtn.parentNode.children).indexOf(activeBtn)];
  104. }
  105. if (path.includes("/User/")) {
  106. presenceData.details = "Viewing Profile...";
  107. presenceData.state = `${getElement(".lightblacktext > span")} (${getElement(
  108. "li.active > a"
  109. )
  110. .split(" ")
  111. .shift()})`;
  112. }
  113. if (path.includes("/UserRun/")) {
  114. presenceData.details = "Viewing Performance Report...";
  115. presenceData.state = `${path.split("/").slice(-2)[0]} - ${getElement(
  116. ".pg-head-toption-post"
  117. )}`;
  118. }
  119. if (path.includes("/PCGame/")) {
  120. presenceData.details = "Viewing PC Game...";
  121. presenceData.state = getElement(".stealthlink");
  122. }
  123. if (showSearch && path.includes("/Search/")) {
  124. presenceData.details = "Searching...";
  125. presenceData.state = document.querySelector<HTMLInputElement>(
  126. ".top-menu-search-input"
  127. ).value;
  128. }
  129. if (path.includes("/Faq/")) {
  130. presenceData.details = "Viewing FAQ...";
  131. presenceData.state = getElement(".stealthlink");
  132. }
  133. if (host === "www.userbenchmark.com") {
  134. if (path.includes("/PCBuilder/")) {
  135. presenceData.details = "Building PC...";
  136. presenceData.state = `${
  137. document.querySelector(".container-fluid table > tbody:nth-child(2)")
  138. ?.childElementCount
  139. } Components`;
  140. }
  141. if (path.includes("/System/")) {
  142. presenceData.details = "Viewing Motherboard...";
  143. presenceData.state = `${getElement(".pg-head-toption > a")} ${getElement(
  144. ".stealthlink"
  145. )}`;
  146. }
  147. } else {
  148. const product = getElement(".pg-head-title .stealthlink");
  149. if (product) {
  150. presenceData.details = `Viewing ${getElement(
  151. ".fastinslowout.active"
  152. )}...`;
  153. presenceData.state = `${getElement(".pg-head-toption > a")} ${product}`;
  154. }
  155. }
  156. if (presenceData.details && typeof presenceData.details === "string") {
  157. if (presenceData.details.match("(Browsing|Viewing)")) {
  158. presenceData.smallImageKey = Assets.Reading;
  159. presenceData.smallImageText = (await strings).browse;
  160. }
  161. if (presenceData.details.match("(Searching)")) {
  162. presenceData.smallImageKey = Assets.Search;
  163. presenceData.smallImageText = (await strings).search;
  164. }
  165. if (!showTimestamps) {
  166. delete presenceData.startTimestamp;
  167. delete presenceData.endTimestamp;
  168. }
  169. if (path === "/" && !host.startsWith("www")) {
  170. const hardware = host.split(".").shift();
  171. presenceData.smallImageKey = assets[hardware as keyof typeof assets];
  172. presenceData.smallImageText = hardware.toUpperCase();
  173. }
  174. presence.setActivity(presenceData);
  175. } else presence.setActivity();
  176. });