presence.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. const presence = new Presence({
  2. clientId: "968880591003082783",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/T/Trakt/assets/logo.png",
  7. }
  8. presence.on("UpdateData", async () => {
  9. let presenceData: PresenceData = {
  10. largeImageKey: Assets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. };
  13. const { pathname, href } = document.location,
  14. pages: Record<string, PresenceData> = {
  15. "/": { details: "Browsing the home page" },
  16. "/dashboard": { details: "Browsing dashboard" },
  17. "/shows/trending": { state: "Trending shows" },
  18. "/shows/popular": { state: "Popular shows" },
  19. "/shows/recommended": { state: "Recommended shows" },
  20. "/shows/anticipated": { state: "Anticipated shows" },
  21. "/shows/watched": { state: "The most watched shows" },
  22. "/shows/collected": { state: "The most collected shows" },
  23. "/movies/trending": { state: "Trending movies" },
  24. "/movies/popular": { state: "Popular movies" },
  25. "/movies/recommended": { state: "Recommended movies" },
  26. "/movies/anticipated": { state: "Anticipated movies" },
  27. "/movies/watched": { state: "The most watched movies" },
  28. "/movies/collected": { state: "The most collected movies" },
  29. "/movies/boxoffice": { state: "Top 10 grossing movies" },
  30. "/calendars/my": { details: "Browsing my calendar" },
  31. "/calendars/my/shows": {
  32. details: "Browsing their calendar",
  33. state: "Shows",
  34. },
  35. "/calendars/my/premieres": {
  36. details: "Browsing their calendar",
  37. state: "Premieres",
  38. },
  39. "/calendars/my/new-shows": {
  40. details: "Browsing their calendar",
  41. state: "New shows",
  42. },
  43. "/calendars/my/movies": {
  44. details: "Browsing their calendar",
  45. state: "Movies",
  46. },
  47. "/calendars/my/dvd": {
  48. details: "Browsing their calendar",
  49. state: "DVD & Blu-ray",
  50. },
  51. "/calendars/shows": {
  52. details: "Browsing calendar",
  53. state: "Shows",
  54. },
  55. "/calendars/premieres": {
  56. details: "Browsing calendar",
  57. state: "Premieres",
  58. },
  59. "/calendars/new-shows": {
  60. details: "Browsing calendar",
  61. state: "New shows",
  62. },
  63. "/calendars/movies": {
  64. details: "Browsing calendar",
  65. state: "Movies",
  66. },
  67. "/calendars/dvd": {
  68. details: "Browsing calendar",
  69. state: "DVD & Blu-ray",
  70. },
  71. "/discover": { details: "Finding new shows/movies" },
  72. "/apps": { details: "Browsing apps" },
  73. "/vip": { details: "Browsing VIP features" },
  74. "/settings": { details: "Browsing settings" },
  75. "/auth/signin": { details: "Registering on Trakt" },
  76. "/auth/login": { details: "Logging in to Trakt" },
  77. "/widgets": { details: "Browsing widgets" },
  78. },
  79. imagePath = document.querySelector("img.real")?.getAttribute("src");
  80. for (const [path, data] of Object.entries(pages))
  81. if (pathname.includes(path)) presenceData = { ...presenceData, ...data };
  82. if (pathname.includes("/users")) {
  83. const username = document.querySelector(
  84. "#avatar-wrapper > .emojis-supported > a"
  85. ).textContent;
  86. presenceData.buttons = [{ label: "Check profile", url: href }];
  87. if (pathname.includes("/history"))
  88. presenceData.details = `Browsing ${username}'s history`;
  89. else if (pathname.includes("/progress"))
  90. presenceData.details = `Browsing ${username}'s progress`;
  91. else if (pathname.includes("/collection"))
  92. presenceData.details = `Browsing ${username}'s collection`;
  93. else if (pathname.includes("/ratings"))
  94. presenceData.details = `Browsing ${username}'s ratings`;
  95. else if (pathname.includes("/lists"))
  96. presenceData.details = `Browsing ${username}'s lists`;
  97. else if (pathname.includes("/comments"))
  98. presenceData.details = `Browsing ${username}'s comments`;
  99. else if (pathname.includes("/network"))
  100. presenceData.details = `Browsing ${username}'s friends`;
  101. else presenceData.details = `Browsing ${username}'s profile`;
  102. } else if (pathname.includes("/shows/")) {
  103. if (pathname.includes("/episodes/")) {
  104. presenceData.details = document
  105. .querySelector(
  106. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h2 > a:nth-child(1)"
  107. )
  108. .textContent.replace(":", "");
  109. presenceData.state = `${
  110. document.querySelector(
  111. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1 > span.main-title-sxe"
  112. ).textContent
  113. }: ${
  114. document.querySelector(
  115. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1 > span.main-title"
  116. ).textContent
  117. }`;
  118. presenceData.largeImageKey = imagePath;
  119. presenceData.smallImageKey = Assets.Logo;
  120. presenceData.buttons = [{ label: "Check episode", url: href }];
  121. } else if (pathname.includes("/seasons/")) {
  122. presenceData.details = "Browsing season";
  123. presenceData.state = `${
  124. document.querySelector("#level-up-link").textContent
  125. }: ${
  126. document.querySelector(
  127. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1"
  128. ).firstChild.textContent
  129. }`;
  130. presenceData.largeImageKey = imagePath;
  131. presenceData.smallImageKey = Assets.Logo;
  132. presenceData.buttons = [{ label: "Check season", url: href }];
  133. } else {
  134. try {
  135. presenceData.details = "Browsing TV show";
  136. presenceData.state = document.querySelector(
  137. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1"
  138. ).firstChild.textContent;
  139. presenceData.largeImageKey = imagePath;
  140. presenceData.smallImageKey = Assets.Logo;
  141. presenceData.buttons = [{ label: "Check TV show", url: href }];
  142. } catch {
  143. presenceData.details = "Browsing";
  144. }
  145. }
  146. } else if (pathname.includes("/movies")) {
  147. try {
  148. presenceData.details = "Browsing movie";
  149. presenceData.state = document.querySelector(
  150. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1"
  151. ).childNodes[0].textContent;
  152. presenceData.largeImageKey = imagePath;
  153. presenceData.smallImageKey = Assets.Logo;
  154. presenceData.buttons = [{ label: "Check movie", url: href }];
  155. } catch {
  156. presenceData.details = "Browsing";
  157. }
  158. } else if (pathname.includes("/people")) {
  159. presenceData.details = "Browsing actor";
  160. presenceData.state = document.querySelector(
  161. "#summary-wrapper > div.container.summary > div > div > div.col-md-10.col-md-offset-2.col-sm-9.col-sm-offset-3.mobile-title > h1"
  162. ).textContent;
  163. presenceData.largeImageKey = imagePath;
  164. presenceData.smallImageKey = Assets.Logo;
  165. presenceData.buttons = [{ label: "Check actor", url: href }];
  166. } else if (pathname.includes("/search")) {
  167. presenceData.details = "Searching for";
  168. presenceData.state = new URLSearchParams(window.location.search).get(
  169. "query"
  170. );
  171. }
  172. if (presenceData.details) presence.setActivity(presenceData);
  173. else presence.setActivity();
  174. });