presence.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. const presence = new Presence({
  2. clientId: "1047847313118351421",
  3. }),
  4. browsingStamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/H/History%20Vault/assets/logo.png",
  7. }
  8. async function getStrings() {
  9. return presence.getStrings(
  10. {
  11. browse: "general.browsing",
  12. buttonWatchVideo: "general.buttonWatchVideo",
  13. home: "general.viewHome",
  14. paused: "general.paused",
  15. play: "general.playing",
  16. search: "general.searchFor",
  17. viewShow: "general.viewShow",
  18. },
  19. await presence.getSetting<string>("lang").catch(() => "en")
  20. );
  21. }
  22. async function imgPath(path: string) {
  23. if (path) return `https://${path.replace("//", "")}`;
  24. else return Assets.Logo;
  25. }
  26. let strings: Awaited<ReturnType<typeof getStrings>>,
  27. oldLang: string = null;
  28. presence.on("UpdateData", async () => {
  29. const presenceData: PresenceData = {
  30. startTimestamp: browsingStamp,
  31. largeImageKey: Assets.Logo,
  32. },
  33. { href, pathname } = document.location,
  34. [newLang, privacy, buttons, covers] = await Promise.all([
  35. presence.getSetting<string>("lang").catch(() => "en"),
  36. presence.getSetting<boolean>("privacy"),
  37. presence.getSetting<boolean>("buttons"),
  38. presence.getSetting<boolean>("covers"),
  39. ]),
  40. search = document.querySelector<HTMLInputElement>(
  41. 'input[class*="Component-input-"]'
  42. ),
  43. video =
  44. document.querySelectorAll("video")[1] ?? document.querySelector("video");
  45. if (oldLang !== newLang || !strings) {
  46. oldLang = newLang;
  47. strings = await getStrings();
  48. }
  49. if (privacy) {
  50. presenceData.details = strings.browse;
  51. presence.setActivity(presenceData);
  52. return;
  53. }
  54. if (search?.value && pathname.includes("search")) {
  55. presenceData.details = strings.search;
  56. presenceData.state = search.value;
  57. presenceData.smallImageKey = Assets.Search;
  58. presence.setActivity(presenceData);
  59. return;
  60. }
  61. switch (pathname.split("/")[1]) {
  62. case "": {
  63. presenceData.details = strings.home;
  64. break;
  65. }
  66. case "documentaries": {
  67. presenceData.details = `${strings.viewShow} ${
  68. document
  69. .querySelector('[id="hero-section"]')
  70. .querySelector('[class*="Component-title-"]')?.textContent
  71. }`;
  72. presenceData.state = document
  73. .querySelector('[aria-label="Select season dropdown"]')
  74. ?.textContent?.replace(/\)k/g, "")
  75. .replace("(", " - ");
  76. presenceData.buttons = [
  77. {
  78. label: "Browse",
  79. url: href,
  80. },
  81. ];
  82. break;
  83. }
  84. case "topics": {
  85. presenceData.details = "Viewing shows about";
  86. presenceData.state = document.querySelector(
  87. '[data-testid="typography"]'
  88. )?.textContent;
  89. presenceData.buttons = [
  90. {
  91. label: "Browse",
  92. url: href,
  93. },
  94. ];
  95. break;
  96. }
  97. case "shows":
  98. case "specials": {
  99. if (pathname === "/shows" || pathname === "/documentaries")
  100. presenceData.details = "Viewing all documentaries";
  101. else {
  102. const img = await imgPath(
  103. document
  104. .querySelector('img[class*="Component-imageImg-"]')
  105. ?.getAttribute("src")
  106. .slice(2)
  107. );
  108. if (img) presenceData.largeImageKey = `https://${img}`;
  109. if (video?.duration) {
  110. delete presenceData.startTimestamp;
  111. presenceData.details = document.querySelector(
  112. '[class*="Component-typeSectionTitleMd"]'
  113. )?.textContent;
  114. if (video.duration && !video.paused) {
  115. [presenceData.startTimestamp, presenceData.endTimestamp] =
  116. presence.getTimestampsfromMedia(video);
  117. }
  118. presenceData.smallImageKey = video.paused
  119. ? Assets.Pause
  120. : Assets.Play;
  121. presenceData.smallImageText = video.paused
  122. ? strings.paused
  123. : strings.play;
  124. presenceData.buttons = [
  125. {
  126. label: strings.buttonWatchVideo,
  127. url: href,
  128. },
  129. ];
  130. } else {
  131. presenceData.details = "Viewing show";
  132. presenceData.state = document
  133. .querySelector('[class*="Component-contentWrapper"]')
  134. ?.querySelector('[data-testid="typography"]')?.textContent;
  135. presenceData.buttons = [
  136. {
  137. label: "Browse",
  138. url: href,
  139. },
  140. ];
  141. }
  142. }
  143. break;
  144. }
  145. default: {
  146. presenceData.details = strings.browse;
  147. break;
  148. }
  149. }
  150. if (!covers && presenceData.largeImageKey !== Assets.Logo)
  151. presenceData.largeImageKey = Assets.Logo;
  152. if (!buttons && presenceData.buttons) delete presenceData.buttons;
  153. if (presenceData.details) presence.setActivity(presenceData);
  154. else presence.setActivity();
  155. });