presence.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. enum PresenceClients {
  2. Reddit = "609183409440555018",
  3. RedditNetflix = "869992823854870588",
  4. }
  5. let presence = new Presence({ clientId: PresenceClients.Reddit }),
  6. subReddit: string,
  7. postTitle: string,
  8. username: string,
  9. nickname: string,
  10. rpanTitle: string,
  11. strings: Awaited<ReturnType<typeof getStrings>>,
  12. oldLang: string = null,
  13. containsNetflix: boolean;
  14. const enum Assets {
  15. Logo = "https://cdn.rcd.gg/PreMiD/websites/R/Reddit/assets/logo.png",
  16. NetflixLogo = "https://i.imgur.com/Aw5rIOI\u002egif",
  17. }
  18. async function getStrings() {
  19. return presence.getStrings(
  20. {
  21. browsing: "general.browsing",
  22. live: "general.live",
  23. profile: "general.viewProfile",
  24. searchSomething: "general.searchSomething",
  25. searching: "general.search",
  26. reading: "general.readingPost",
  27. watching: "general.watching",
  28. readButton: "general.buttonReadArticle",
  29. viewProfileButton: "general.buttonViewProfile",
  30. streamButton: "general.buttonWatchStream",
  31. insubreddit: "In a subreddit",
  32. },
  33. await presence.getSetting<string>("lang").catch(() => "en")
  34. );
  35. }
  36. const presences: { [key in PresenceClients]?: Presence } = {
  37. [PresenceClients.Reddit]: presence,
  38. },
  39. startTimestamp = Math.floor(Date.now() / 1000),
  40. oldReddit = !!(
  41. document.querySelector(".default-header") ??
  42. document.querySelector("#header")
  43. );
  44. function setClient(clientId: PresenceClients) {
  45. presence.clearActivity();
  46. if (presences[clientId]) {
  47. presence = presences[clientId];
  48. presence.setActivity();
  49. } else {
  50. presence = new Presence({ clientId });
  51. presences[clientId] = presence;
  52. }
  53. presence.info("Switched presence client!");
  54. }
  55. presence.on("UpdateData", async () => {
  56. const [newLang, buttons, privacy] = await Promise.all([
  57. presence.getSetting<string>("lang").catch(() => "en"),
  58. presence.getSetting<boolean>("buttons"),
  59. presence.getSetting<boolean>("privacy"),
  60. ]),
  61. { href, pathname } = document.location,
  62. presenceData: PresenceData = {
  63. largeImageKey: !pathname.includes("/r/netflix")
  64. ? Assets.Logo
  65. : Assets.NetflixLogo,
  66. smallImageKey: pathname.includes("/r/netflix") ? Assets.Logo : "",
  67. startTimestamp,
  68. };
  69. if (pathname.includes("/r/netflix") && !containsNetflix) {
  70. setClient(PresenceClients.RedditNetflix);
  71. containsNetflix = true;
  72. presenceData.largeImageKey = Assets.NetflixLogo;
  73. presenceData.smallImageKey = Assets.Logo;
  74. } else if (!pathname.includes("/r/netflix") && containsNetflix) {
  75. setClient(PresenceClients.Reddit);
  76. containsNetflix = false;
  77. presenceData.largeImageKey = Assets.Logo;
  78. }
  79. if (oldLang !== newLang || !strings) {
  80. oldLang = newLang;
  81. strings = await getStrings();
  82. }
  83. if (oldReddit) {
  84. subReddit = document.querySelector(".redditname")
  85. ? `${
  86. !privacy
  87. ? `r/${document.querySelector(".redditname").textContent}`
  88. : strings.insubreddit
  89. }`
  90. : "Home";
  91. if (pathname.includes("/comments/")) {
  92. if (!privacy) {
  93. postTitle = document.querySelector("p.title > a").textContent;
  94. presenceData.details = `${strings.reading} '${postTitle}'`;
  95. presenceData.state = subReddit;
  96. presenceData.buttons = [
  97. {
  98. url: href,
  99. label: strings.readButton,
  100. },
  101. ];
  102. } else {
  103. presenceData.details = strings.reading.slice(0, -1);
  104. presenceData.state = subReddit;
  105. }
  106. } else if (pathname.startsWith("/user/")) {
  107. if (!privacy) {
  108. presenceData.state =
  109. document.querySelector(".titlebox > h1").textContent;
  110. presenceData.details = strings.profile;
  111. presenceData.buttons = [
  112. {
  113. url: href,
  114. label: strings.viewProfileButton,
  115. },
  116. ];
  117. } else presenceData.details = strings.profile.slice(0, -4);
  118. } else if (pathname.startsWith("/search")) {
  119. presenceData.details = strings.searchSomething;
  120. presenceData.smallImageKey = Assets.Search;
  121. presenceData.smallImageText = strings.searching;
  122. } else {
  123. presenceData.details = strings.browsing;
  124. presenceData.state = subReddit;
  125. }
  126. } else if (pathname.includes("/comments/")) {
  127. if (!privacy) {
  128. postTitle =
  129. document.querySelector("shreddit-title")?.getAttribute("title") ?? "";
  130. subReddit = getSubreddit();
  131. presenceData.details = `${strings.reading} '${postTitle}'`;
  132. presenceData.state = subReddit;
  133. presenceData.buttons = [
  134. {
  135. url: href,
  136. label: strings.readButton,
  137. },
  138. ];
  139. } else presenceData.details = strings.reading.slice(0, -1);
  140. } else if (pathname.startsWith("/user/")) {
  141. if (!privacy) {
  142. username = document.querySelector("p")?.textContent;
  143. nickname = document.querySelector("h1")?.textContent;
  144. presenceData.details = strings.profile;
  145. presenceData.state = nickname ?? username;
  146. presenceData.buttons = [
  147. {
  148. url: href,
  149. label: strings.viewProfileButton,
  150. },
  151. ];
  152. } else presenceData.details = strings.profile.slice(0, -4);
  153. } else if (pathname.startsWith("/search")) {
  154. presenceData.details = strings.searchSomething;
  155. presenceData.smallImageKey = Assets.Search;
  156. presenceData.smallImageText = strings.searching;
  157. } else if (pathname.startsWith("/rpan")) {
  158. presenceData.details = `${strings.watching} (RPAN)`;
  159. if (!privacy) {
  160. rpanTitle = document.querySelector("h1")
  161. ? document.querySelector("h1").textContent
  162. : "Loading title...";
  163. presenceData.state = rpanTitle;
  164. presenceData.buttons = [
  165. {
  166. url: href,
  167. label: strings.streamButton,
  168. },
  169. ];
  170. }
  171. presenceData.smallImageKey = Assets.Live;
  172. presenceData.smallImageText = strings.live;
  173. } else if (!privacy) {
  174. presenceData.details = strings.browsing;
  175. presenceData.state = getSubreddit() ?? "Home";
  176. } else if (getSubreddit()) presenceData.details = strings.insubreddit;
  177. else {
  178. presenceData.details = strings.browsing;
  179. presenceData.state = "Home";
  180. }
  181. if (!buttons || privacy) delete presenceData.buttons;
  182. presence.setActivity(presenceData);
  183. });
  184. function getSubreddit(): string {
  185. return document
  186. .querySelector("shreddit-subreddit-header")
  187. ?.getAttribute("prefixed-name");
  188. }