presence.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. const presence = new Presence({
  2. clientId: "1023713697866199052",
  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/The%20Eternal%20Jukebox/assets/logo.png",
  9. startTimestamp: browsingTimestamp,
  10. },
  11. { pathname, href, search } = document.location;
  12. switch (pathname) {
  13. case "/jukebox_index.html": {
  14. presenceData.details = "Browsing";
  15. presenceData.state = "The Eternal Jukebox";
  16. break;
  17. }
  18. case "/jukebox_go.html": {
  19. const [, hours, mins, secs] = document
  20. .querySelector<HTMLSpanElement>("#time")
  21. .textContent.match(/(\d+):(\d+):(\d+)/)
  22. .map(x => +x),
  23. totalSeconds = hours * 3600 + mins * 60 + secs,
  24. title = document
  25. .querySelector<HTMLSpanElement>("#song-title")
  26. .textContent.trim();
  27. if (title) {
  28. presenceData.details = "Listening to a song";
  29. presenceData.state = title;
  30. if (totalSeconds > 0) {
  31. presenceData.startTimestamp =
  32. Math.floor(Date.now() / 1000) - totalSeconds;
  33. }
  34. presenceData.buttons = [
  35. {
  36. label: "Listen",
  37. url: href,
  38. },
  39. {
  40. label: "View source",
  41. url:
  42. (await presence.getPageletiable<string>(
  43. "jukeboxData.ogAudioURL"
  44. )) || document.querySelector<HTMLAnchorElement>("#song-url").href,
  45. },
  46. ];
  47. } else {
  48. presenceData.details = "Listening to a song";
  49. presenceData.state = "Loading...";
  50. }
  51. break;
  52. }
  53. case "/jukebox_search.html": {
  54. presenceData.details = "Searching for a song";
  55. presenceData.state =
  56. document.querySelector<HTMLInputElement>("#search").value;
  57. break;
  58. }
  59. case "/faq.html": {
  60. presenceData.details = "Browsing";
  61. presenceData.state = "FAQ";
  62. break;
  63. }
  64. case "/retro_index.html": {
  65. presenceData.details = "Browsing";
  66. presenceData.state = "The (Retro) Eternal Jukebox";
  67. break;
  68. }
  69. case "/canonizer_index.html": {
  70. presenceData.details = "Browsing";
  71. presenceData.state = "The Autocanonizer";
  72. break;
  73. }
  74. case "/canonizer_go.html": {
  75. const [, hours, mins, secs] = document
  76. .querySelector<HTMLSpanElement>("#mtime")
  77. .textContent.match(/(\d+):(\d+):(\d+)/)
  78. .map(x => +x),
  79. totalSeconds = hours * 3600 + mins * 60 + secs,
  80. audioSource = await presence.getPageletiable<string>(
  81. "canonizerData.ogAudioURL"
  82. );
  83. if (
  84. document.querySelector<SVGElement>("#tiles > svg")?.childElementCount >
  85. 5
  86. ) {
  87. presenceData.details = "Listening to an autocanonized song";
  88. presenceData.state = document
  89. .querySelector<HTMLSpanElement>("#info")
  90. .textContent.trim()
  91. .replace(/\(autocanonized\) /, "");
  92. if (totalSeconds > 0) {
  93. presenceData.startTimestamp =
  94. Math.floor(Date.now() / 1000) - totalSeconds;
  95. }
  96. presenceData.buttons = [
  97. {
  98. label: "Listen",
  99. url: href,
  100. },
  101. {
  102. label: "View source",
  103. url:
  104. audioSource ??
  105. `https://open.spotify.com/track/${new URLSearchParams(search).get(
  106. "id"
  107. )}`,
  108. },
  109. ];
  110. } else {
  111. presenceData.details = "Listening to an autocanonized song";
  112. presenceData.state = "Loading...";
  113. }
  114. break;
  115. }
  116. case "/canonizer_search.html": {
  117. presenceData.details = "Searching for a song";
  118. presenceData.state =
  119. document.querySelector<HTMLInputElement>("#search").value;
  120. break;
  121. }
  122. }
  123. if (presenceData.details) presence.setActivity(presenceData);
  124. else presence.setActivity();
  125. });