presence.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. const presence = new Presence({
  2. clientId: "640963335826833418",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. presence.on("UpdateData", async () => {
  6. const presenceData: PresenceData = {
  7. largeImageKey:
  8. "https://cdn.rcd.gg/PreMiD/websites/T/Tumblr/assets/logo.png",
  9. startTimestamp: browsingTimestamp,
  10. },
  11. { hostname, href, pathname } = document.location,
  12. search = document.querySelector<HTMLInputElement>(
  13. '[type="search"],#search_actions_search'
  14. );
  15. switch (hostname) {
  16. case "www.tumblr.com": {
  17. switch (true) {
  18. case !!search?.value: {
  19. presenceData.details = "Searching for";
  20. presenceData.state = search.value;
  21. presenceData.smallImageKey = Assets.Search;
  22. break;
  23. }
  24. case !!pathname.match(/[0-9]{18}/gm)?.[0]: {
  25. const author =
  26. document.querySelector<HTMLAnchorElement>('[rel="author"]'),
  27. video = document.querySelector<HTMLVideoElement>("video");
  28. if (!isNaN(video?.duration)) {
  29. delete presenceData.startTimestamp;
  30. presenceData.smallImageKey = video.paused
  31. ? Assets.Pause
  32. : Assets.Play;
  33. presenceData.smallImageText = video.paused ? "Paused" : "Playing";
  34. if (!video.paused) {
  35. [presenceData.startTimestamp, presenceData.endTimestamp] =
  36. presence.getTimestampsfromMedia(video);
  37. }
  38. presenceData.buttons = author
  39. ? [
  40. { label: "Watch Video", url: href },
  41. {
  42. label: "View Creator's Profile",
  43. url: author.href,
  44. },
  45. ]
  46. : [{ label: "Watch Video", url: href }];
  47. } else {
  48. presenceData.buttons = author
  49. ? [
  50. { label: "View Post", url: href },
  51. {
  52. label: "View Creator's Profile",
  53. url: author.href,
  54. },
  55. ]
  56. : [{ label: "View Post", url: href }];
  57. }
  58. presenceData.details = document.querySelector(".k31gt");
  59. presenceData.state = author?.textContent;
  60. break;
  61. }
  62. case pathname === "/": {
  63. presenceData.details = "Viewing the home page";
  64. break;
  65. }
  66. case document.querySelector<HTMLMetaElement>('[property="og:type"]')
  67. ?.content === "profile": {
  68. presenceData.details = `Viewing user: ${
  69. document.querySelector("header h1").textContent
  70. }`;
  71. presenceData.state = [
  72. ...document.querySelectorAll("header + div a"),
  73. ].find(e => e.classList.length > 1)?.textContent;
  74. presenceData.buttons = [{ label: "View Profile", url: href }];
  75. break;
  76. }
  77. case pathname.includes("/explore/answertime"): {
  78. presenceData.details = "Exploring answer time content";
  79. break;
  80. }
  81. case pathname.includes("/explore/staff-picks"): {
  82. presenceData.details = "Exploring staff picks";
  83. break;
  84. }
  85. case pathname.includes("/explore/trending"): {
  86. presenceData.details = "Exploring trending content";
  87. break;
  88. }
  89. case pathname.includes("/explore/today"): {
  90. presenceData.details = "Exploring daily content";
  91. break;
  92. }
  93. case pathname.includes("/dashboard"): {
  94. presenceData.details = "Viewing their dashboard";
  95. break;
  96. }
  97. case pathname.includes("/new"): {
  98. presenceData.details = "Making a new post...";
  99. presenceData.smallImageKey = Assets.Writing;
  100. break;
  101. }
  102. case pathname.includes("/photos"): {
  103. presenceData.details = "Viewing photos";
  104. break;
  105. }
  106. case pathname.includes("/gif"): {
  107. presenceData.details = "Viewing GIFs";
  108. break;
  109. }
  110. case pathname.includes("/audio"): {
  111. presenceData.details = "Viewing audio's";
  112. break;
  113. }
  114. case pathname.includes("/video"): {
  115. presenceData.details = "Viewing videos";
  116. break;
  117. }
  118. case pathname.includes("/inbox"): {
  119. presenceData.details = "Viewing their inbox";
  120. break;
  121. }
  122. case pathname.includes("/chats"):
  123. case pathname.includes("/text"): {
  124. presenceData.details = "Reading texts";
  125. presenceData.smallImageKey = Assets.Reading;
  126. break;
  127. }
  128. case pathname.includes("/recommended-for-you"): {
  129. presenceData.details = "Viewing recommendations";
  130. break;
  131. }
  132. case pathname.includes("/settings"): {
  133. presenceData.details = "Viewing their settings";
  134. break;
  135. }
  136. case pathname.includes("/asks"): {
  137. presenceData.details = "Reading questions";
  138. presenceData.smallImageKey = Assets.Reading;
  139. break;
  140. }
  141. case pathname.includes("/quotes"): {
  142. presenceData.details = "Reading quotes";
  143. presenceData.smallImageKey = Assets.Reading;
  144. break;
  145. }
  146. }
  147. break;
  148. }
  149. case "help.tumblr.com": {
  150. const article = document.querySelector(".article-title");
  151. if (search?.value) {
  152. presenceData.details = "Searching the help center for";
  153. presenceData.state = search.value;
  154. presenceData.smallImageKey = Assets.Search;
  155. } else if (
  156. pathname.endsWith(
  157. `/${document
  158. .querySelector("html")
  159. .getAttribute("lang")
  160. ?.toLowerCase()}`
  161. )
  162. ) {
  163. presenceData.details = "Help center";
  164. presenceData.state = "Viewing the homepage";
  165. } else if (article) {
  166. presenceData.details = "Help center - reading an article";
  167. presenceData.state = article.textContent;
  168. presenceData.smallImageKey = Assets.Reading;
  169. presenceData.buttons = [{ label: "Read Article", url: href }];
  170. } else presenceData.details = "Browsing through the help center";
  171. break;
  172. }
  173. default: {
  174. if (
  175. document.querySelector<HTMLMetaElement>('[property="og:type"]')
  176. ?.content !== "profile"
  177. )
  178. return;
  179. const username = document.querySelector("header h1")?.textContent;
  180. presenceData.details = `Viewing user${username ? `: ${username}` : ""}`;
  181. break;
  182. }
  183. }
  184. if (presenceData.details) presence.setActivity(presenceData);
  185. else presence.setActivity();
  186. });