presence.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. const presence = new Presence({
  2. clientId: "934826046824542279",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. let video = {
  6. duration: "",
  7. currentTime: "",
  8. live: false,
  9. paused: true,
  10. };
  11. presence.on(
  12. "iFrameData",
  13. (data: {
  14. duration: string;
  15. currentTime: string;
  16. live: boolean;
  17. paused: boolean;
  18. }) => {
  19. video = data;
  20. }
  21. );
  22. const enum Assets {
  23. Logo = "https://cdn.rcd.gg/PreMiD/websites/B/Behance/assets/logo.png",
  24. }
  25. presence.on("UpdateData", async () => {
  26. const presenceData: PresenceData = {
  27. largeImageKey: Assets.Logo,
  28. details: "Browsing",
  29. startTimestamp: browsingTimestamp,
  30. },
  31. { pathname } = document.location,
  32. [image, buttons] = await Promise.all([
  33. presence.getSetting<boolean>("image"),
  34. presence.getSetting<boolean>("buttons"),
  35. ]);
  36. if (pathname.startsWith("/gallery")) {
  37. presenceData.details =
  38. document.querySelector<HTMLSpanElement>("figcaption > span").textContent;
  39. presenceData.smallImageKey = Assets.Reading;
  40. if (
  41. document.querySelector<HTMLSpanElement>(
  42. "figcaption > div > a > div > div.Popover-activator-14J.Miniprofile-activator-1QJ > span"
  43. )
  44. ) {
  45. presenceData.state = document.querySelector<HTMLSpanElement>(
  46. "figcaption > div > a > div > div.Popover-activator-14J.Miniprofile-activator-1QJ > span"
  47. )?.textContent;
  48. presenceData.largeImageKey =
  49. document.querySelector<HTMLImageElement>(
  50. "div.Popover-activator-14J.Miniprofile-activator-1QJ > span > a > div > img"
  51. )?.src ?? Assets.Logo;
  52. presenceData.buttons = [
  53. {
  54. label: "View Work",
  55. url: document.URL,
  56. },
  57. {
  58. label: "View Artist",
  59. url: document.querySelector<HTMLAnchorElement>("figcaption > div > a")
  60. .href,
  61. },
  62. ];
  63. } else {
  64. presenceData.state = "Multiple Owners";
  65. presenceData.buttons = [
  66. {
  67. label: "View Work",
  68. url: document.URL,
  69. },
  70. ];
  71. }
  72. } else if (pathname.startsWith("/galleries")) {
  73. presenceData.details = "Discovering Galleries";
  74. presenceData.state = document.querySelector<HTMLHeadingElement>(
  75. "#site-content div > div > h1"
  76. ).textContent;
  77. presenceData.smallImageKey = Assets.Search;
  78. } else if (
  79. document.querySelector<HTMLHeadingElement>(
  80. "#site-content div.ProfileCard-header-2wU > h1"
  81. )
  82. ) {
  83. presenceData.details = "Viewing Profile";
  84. presenceData.state = document.querySelector<HTMLHeadingElement>(
  85. "#site-content div.ProfileCard-header-2wU > h1"
  86. ).textContent;
  87. presenceData.largeImageKey =
  88. document.querySelector<HTMLImageElement>(
  89. "#site-content div > div > div > img"
  90. )?.src ?? Assets.Logo;
  91. presenceData.buttons = [{ label: "View Profile", url: document.URL }];
  92. } else if (pathname.startsWith("/search")) {
  93. const searchContent = document.querySelector<HTMLSpanElement>(
  94. "#site-content ul > li:nth-child(1) > a > span"
  95. );
  96. if (!searchContent) presenceData.details = "Searching...";
  97. else {
  98. presenceData.details = "Searching for:";
  99. presenceData.state = searchContent.textContent;
  100. }
  101. presenceData.smallImageKey = Assets.Search;
  102. } else if (pathname.startsWith("/videos")) {
  103. presenceData.details = document.querySelector<HTMLHeadingElement>(
  104. "div.Stream-titleContainer-1D_ > h1"
  105. ).textContent;
  106. presenceData.state = document.querySelector<HTMLAnchorElement>(
  107. "div.UserInfo-main-gTU > div:nth-child(2) > a"
  108. ).textContent;
  109. presenceData.largeImageKey =
  110. document
  111. .querySelector('meta[name="twitter:image"]')
  112. ?.getAttribute("content") ?? Assets.Logo;
  113. if (video.live) {
  114. presenceData.smallImageKey = Assets.Live;
  115. presenceData.smallImageText = "Live";
  116. presenceData.buttons = [
  117. {
  118. label: "Watch Stream",
  119. url: document.URL,
  120. },
  121. {
  122. label: "View Profile",
  123. url: document.querySelector<HTMLAnchorElement>(
  124. "div.UserInfo-main-gTU > div:nth-child(2) > a"
  125. ).href,
  126. },
  127. ];
  128. } else if (video.duration && video.currentTime) {
  129. // Intentional `delete` for pause boolean
  130. delete presenceData.startTimestamp;
  131. if (!video.paused) {
  132. [presenceData.startTimestamp, presenceData.endTimestamp] =
  133. presence.getTimestamps(
  134. presence.timestampFromFormat(video.currentTime),
  135. presence.timestampFromFormat(video.duration)
  136. );
  137. }
  138. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play;
  139. presenceData.smallImageText = video.paused ? "Paused" : "Playing";
  140. presenceData.buttons = [
  141. {
  142. label: "Watch Video",
  143. url: document.URL,
  144. },
  145. {
  146. label: "View Profile",
  147. url: document.querySelector<HTMLAnchorElement>(
  148. "div.UserInfo-main-gTU > div:nth-child(2) > a"
  149. ).href,
  150. },
  151. ];
  152. }
  153. } else if (pathname.startsWith("/live")) {
  154. presenceData.details = "Browsing Videos";
  155. presenceData.smallImageKey = Assets.Search;
  156. } else if (pathname.startsWith("/joblist")) {
  157. const jobLocation = document.querySelector<HTMLParagraphElement>(
  158. "div.JobDetailContent-jobHeader-2Pv > p"
  159. );
  160. if (!jobLocation) {
  161. presenceData.details = "Searching for a Job";
  162. presenceData.smallImageKey = Assets.Search;
  163. } else {
  164. presenceData.details = "Viewing a Job:";
  165. presenceData.state = jobLocation.textContent;
  166. presenceData.largeImageKey =
  167. document.querySelector<HTMLImageElement>(
  168. "div.JobDetailContent-teamAvatar-3qv > div > a > img"
  169. )?.src ?? Assets.Logo;
  170. presenceData.smallImageKey = Assets.Reading;
  171. }
  172. }
  173. if (!image) {
  174. presenceData.largeImageKey =
  175. "https://cdn.rcd.gg/PreMiD/websites/B/Behance/assets/logo.png";
  176. }
  177. if (!buttons) delete presenceData.buttons;
  178. presence.setActivity(presenceData);
  179. });