presence.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. const presence = new Presence({
  2. clientId: "1002899869599551508",
  3. });
  4. async function getStrings() {
  5. return presence.getStrings(
  6. {
  7. play: "general.playing",
  8. pause: "general.paused",
  9. browse: "general.browsing",
  10. },
  11. await presence.getSetting<string>("lang").catch(() => "en")
  12. );
  13. }
  14. let strings: Awaited<ReturnType<typeof getStrings>>,
  15. oldLang: string = null;
  16. presence.on("UpdateData", async () => {
  17. const presenceData: PresenceData = {
  18. largeImageKey:
  19. "https://cdn.rcd.gg/PreMiD/websites/U/UKTV/assets/logo.png",
  20. },
  21. video = document.querySelector<HTMLVideoElement>("video"),
  22. { href, pathname } = document.location,
  23. search = document.querySelector<HTMLInputElement>("#search-input"),
  24. [newLang, privacy, covers, buttons] = await Promise.all([
  25. presence.getSetting<string>("lang").catch(() => "en"),
  26. presence.getSetting<boolean>("privacy"),
  27. presence.getSetting<boolean>("covers"),
  28. presence.getSetting<boolean>("buttons"),
  29. ]);
  30. if (oldLang !== newLang || !strings) {
  31. oldLang = newLang;
  32. strings = await getStrings();
  33. }
  34. if (privacy) presenceData.details = strings.browse;
  35. else if (search) {
  36. presenceData.details = "Searching for";
  37. presenceData.state = search.value;
  38. presenceData.smallImageKey = Assets.Search;
  39. } else if (video?.duration) {
  40. const title = document.querySelector<HTMLMetaElement>(
  41. '[property="og:title"]'
  42. ),
  43. episodeSeason =
  44. document
  45. .querySelector('[class="vod-episode__ep-num"]')
  46. ?.lastChild?.textContent.replace(/,/gm, "") ??
  47. title.content.replace(title.content.split(",")[0], "");
  48. presenceData.details =
  49. document.querySelector(
  50. '[class="vod-episode__title margin-bottom--xxs invert-text semi-bold"]'
  51. )?.textContent ??
  52. document.querySelector('[id="brand-page"]')?.textContent ??
  53. title?.content.split(",")[0];
  54. presenceData.state = episodeSeason
  55. .split("-")[0]
  56. .replace(/,/gm, "")
  57. .replace("Series", "S")
  58. .replace("Episode", ":E")
  59. .replace(/ /gm, "")
  60. .trim();
  61. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play;
  62. presenceData.smallImageText = video.paused ? strings.pause : strings.play;
  63. [presenceData.startTimestamp, presenceData.endTimestamp] =
  64. presence.getTimestampsfromMedia(video);
  65. if (covers) {
  66. presenceData.largeImageKey =
  67. document
  68. .querySelector('[id="longInfo"]')
  69. ?.firstElementChild?.getAttribute("src") ??
  70. document.querySelector<HTMLMetaElement>('[property="og:image"]')
  71. .content ??
  72. "lm";
  73. }
  74. if (video.paused) {
  75. delete presenceData.startTimestamp;
  76. delete presenceData.endTimestamp;
  77. }
  78. presenceData.buttons = [
  79. {
  80. label: "View Show",
  81. url: href,
  82. },
  83. ];
  84. } else if (
  85. pathname.includes("/genre/") ||
  86. pathname.includes("/collections/")
  87. ) {
  88. presenceData.buttons = [
  89. {
  90. label: "Browse",
  91. url: href,
  92. },
  93. ];
  94. presenceData.details = "Browsing";
  95. presenceData.state = document.querySelector(
  96. '[class="dropdown-item nuxt-link-exact-active nuxt-link-active"]'
  97. ).textContent;
  98. } else if (pathname.includes("/box-sets/"))
  99. presenceData.details = "Viewing boxsets";
  100. else {
  101. presenceData.buttons = [
  102. {
  103. label: "Browse Boxsets",
  104. url: href,
  105. },
  106. ];
  107. presenceData.details = strings.browse;
  108. presenceData.smallImageKey = Assets.Search;
  109. presenceData.smallImageText = strings.browse;
  110. presenceData.buttons = [
  111. {
  112. label: "Browse",
  113. url: href,
  114. },
  115. ];
  116. }
  117. if (!buttons) delete presenceData.buttons;
  118. if (presenceData.details) presence.setActivity(presenceData);
  119. else presence.setActivity();
  120. });