presence.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const presence = new Presence({ clientId: "1006201873985961984" }),
  2. browsingTimestamp = Math.floor(Date.now() / 1000);
  3. async function getStrings() {
  4. return presence.getStrings(
  5. {
  6. viewHome: "general.viewHome",
  7. paused: "general.paused",
  8. playing: "general.playing",
  9. episode: "general.episode",
  10. viewPage: "general.viewPage",
  11. buttonViewSeries: "general.buttonViewSeries",
  12. listeningTo: "general.listeningTo",
  13. },
  14. await presence.getSetting<string>("lang").catch(() => "en")
  15. );
  16. }
  17. let strings: Awaited<ReturnType<typeof getStrings>>,
  18. oldLang: string = null;
  19. presence.on("UpdateData", async () => {
  20. const presenceData: PresenceData = {
  21. largeImageKey:
  22. "https://cdn.rcd.gg/PreMiD/websites/T/Tellingtone/assets/logo.png",
  23. startTimestamp: browsingTimestamp,
  24. },
  25. { pathname, href } = document.location,
  26. pathSplit = pathname.split("/"),
  27. [newLang, time, showCover] = await Promise.all([
  28. presence.getSetting<string>("lang").catch(() => "en"),
  29. presence.getSetting<boolean>("time"),
  30. presence.getSetting<boolean>("cover"),
  31. ]);
  32. if (oldLang !== newLang || !strings) {
  33. oldLang = newLang;
  34. strings = await getStrings();
  35. }
  36. switch (pathSplit[1]) {
  37. case "":
  38. presenceData.details = strings.viewHome;
  39. break;
  40. case "shop":
  41. case "blog":
  42. presenceData.details = `Viewing ${pathSplit[1]}`;
  43. break;
  44. case "series":
  45. presenceData.details = strings.viewPage;
  46. presenceData.state =
  47. document.querySelector<HTMLHeadingElement>("div.head > h1").textContent;
  48. presenceData.largeImageKey =
  49. document.querySelector<HTMLImageElement>("div.head > img").src;
  50. presenceData.buttons = [{ label: strings.buttonViewSeries, url: href }];
  51. }
  52. if (document.querySelector("div#Player")) {
  53. presenceData.details = strings.listeningTo
  54. .replace("{0}", " ")
  55. .replace(
  56. "{1}",
  57. document.querySelector<HTMLDivElement>(
  58. ".reading-media > .media-infos > .media-title"
  59. ).textContent
  60. );
  61. presenceData.state =
  62. document.querySelector<HTMLDivElement>("div.media-episode").textContent;
  63. presenceData.largeImageKey = document
  64. .querySelector<HTMLImageElement>("div.media-image > svg > image")
  65. .getAttribute("xlink:href");
  66. const timers: string[] = [];
  67. for (const element of document.querySelectorAll("div.desktop > div.timer"))
  68. timers.push(element.textContent);
  69. [presenceData.startTimestamp, presenceData.endTimestamp] =
  70. presence.getTimestamps(
  71. presence.timestampFromFormat(timers[0]),
  72. presence.timestampFromFormat(timers[1])
  73. );
  74. delete presenceData.buttons;
  75. if (document.querySelector(".icon-pause")) {
  76. presenceData.smallImageKey = Assets.Play;
  77. presenceData.smallImageText = strings.playing;
  78. } else {
  79. presenceData.smallImageKey = Assets.Pause;
  80. presenceData.smallImageText = strings.paused;
  81. delete presenceData.endTimestamp;
  82. delete presenceData.startTimestamp;
  83. }
  84. }
  85. if (!time) {
  86. delete presenceData.startTimestamp;
  87. delete presenceData.endTimestamp;
  88. }
  89. if (!showCover) {
  90. presenceData.largeImageKey =
  91. "https://cdn.rcd.gg/PreMiD/websites/T/Tellingtone/assets/logo.png";
  92. }
  93. if (presenceData.details) presence.setActivity(presenceData);
  94. else presence.setActivity();
  95. });