presence.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. const presence = new Presence({
  2. clientId: "1020099638470127627",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. enum Asset {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/L/ListenBrainz/assets/logo.png",
  7. }
  8. presence.on("UpdateData", () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: Asset.Logo,
  11. startTimestamp: browsingTimestamp,
  12. },
  13. { pathname, href } = window.location,
  14. pathSplit = pathname.split("/").slice(1),
  15. pageTitle =
  16. document.querySelector<HTMLHeadingElement>(".page-title")?.textContent;
  17. switch (pathSplit[0]) {
  18. case "": {
  19. presenceData.details = "Browsing homepage";
  20. break;
  21. }
  22. case "about": {
  23. presenceData.details = "Browsing";
  24. presenceData.state = "About";
  25. break;
  26. }
  27. case "explore": {
  28. presenceData.details = "Browsing";
  29. switch (pathSplit[1]) {
  30. case "huesound": {
  31. presenceData.state = "Huesound";
  32. break;
  33. }
  34. case "similar-users": {
  35. presenceData.state = "Top Similar Users";
  36. break;
  37. }
  38. }
  39. break;
  40. }
  41. case "feed": {
  42. presenceData.details = "Browsing";
  43. presenceData.state = "Latest activity feed";
  44. break;
  45. }
  46. case "profile": {
  47. presenceData.details = "Managing profile settings";
  48. break;
  49. }
  50. case "recommended": {
  51. presenceData.details = "Viewing recommendations";
  52. let type = "tracks";
  53. switch (pathSplit[3]) {
  54. case "top_artist": {
  55. type = "Top artist";
  56. break;
  57. }
  58. case "similar_artist": {
  59. type = "Similar artist";
  60. break;
  61. }
  62. case "raw": {
  63. type = "Raw track";
  64. break;
  65. }
  66. }
  67. presenceData.state = `${type} recommendations for ${pageTitle}`;
  68. break;
  69. }
  70. case "recent": {
  71. presenceData.details = "Browsing";
  72. presenceData.state = "Recent listens";
  73. break;
  74. }
  75. case "user": {
  76. presenceData.details = "Viewing a user's profile";
  77. switch (pathSplit[2] ?? "") {
  78. case "": {
  79. presenceData.state = pageTitle;
  80. break;
  81. }
  82. case "reports": {
  83. presenceData.state = `${pageTitle}'s reports`;
  84. break;
  85. }
  86. case "charts": {
  87. presenceData.state = `${pageTitle}'s charts`;
  88. break;
  89. }
  90. case "feedback": {
  91. presenceData.state = `${pageTitle}'s loved/hated tracks`;
  92. break;
  93. }
  94. case "pins": {
  95. presenceData.state = `${pageTitle}'s pinned recordings`;
  96. break;
  97. }
  98. case "playlists": {
  99. presenceData.state = `${pageTitle}'s playlists`;
  100. break;
  101. }
  102. case "recommendations": {
  103. presenceData.state = `${pageTitle}'s recommended playlists`;
  104. break;
  105. }
  106. case "collaborations": {
  107. presenceData.state = `${pageTitle}'s collaborative playlists`;
  108. break;
  109. }
  110. }
  111. break;
  112. }
  113. case "playlist": {
  114. presenceData.details = "Viewing a playlist";
  115. presenceData.state =
  116. document.querySelector<HTMLDivElement>(
  117. ".title > div"
  118. ).firstChild.textContent;
  119. if (
  120. document
  121. .querySelector(".title > small")
  122. .firstChild.textContent.trim() !== "Private"
  123. ) {
  124. presenceData.buttons = [
  125. {
  126. label: "View playlist",
  127. url: href,
  128. },
  129. ];
  130. }
  131. break;
  132. }
  133. default: {
  134. presenceData.details = "Browsing";
  135. presenceData.state =
  136. pageTitle ?? document.title.match(/^(.*?)(?: - ListenBrainz)?$/)[1];
  137. break;
  138. }
  139. }
  140. if (document.querySelector("#brainz-player")) {
  141. const currentlyPlayingElement =
  142. document.querySelector<HTMLDivElement>(".currently-playing");
  143. if (currentlyPlayingElement) {
  144. presenceData.smallImageText = currentlyPlayingElement.textContent;
  145. presenceData.smallImageKey =
  146. document
  147. .querySelector<HTMLDivElement>(".play")
  148. .getAttribute("title") === "Play"
  149. ? Assets.Pause
  150. : Assets.Play;
  151. }
  152. }
  153. presence.setActivity(presenceData);
  154. });