presence.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. const presence = new Presence({
  2. clientId: "813392002526871592",
  3. }),
  4. getStrings = async () =>
  5. presence.getStrings(
  6. {
  7. play: "general.playing",
  8. paused: "general.paused",
  9. browse: "general.browsing",
  10. viewSeries: "general.viewSeries",
  11. searchSomething: "general.searchSomething",
  12. buttonViewEpisode: "general.buttonViewEpisode",
  13. },
  14. await presence.getSetting<string>("lang").catch(() => "en")
  15. ),
  16. browsingTimestamp = Math.floor(Date.now() / 1000),
  17. shortenedURLs: Record<string, string> = {};
  18. async function shortenURL(url: string) {
  19. if (!url || url.length < 256) return url;
  20. if (shortenedURLs[url]) return shortenedURLs[url];
  21. try {
  22. const pdURL = await (
  23. await fetch(`https://pd.premid.app/create/${url}`)
  24. ).text();
  25. return (shortenedURLs[url] = pdURL);
  26. } catch (err) {
  27. presence.error(err);
  28. return url;
  29. }
  30. }
  31. let oldLang: string = null,
  32. strings: Awaited<ReturnType<typeof getStrings>>;
  33. presence.on("UpdateData", async () => {
  34. const { pathname } = document.location,
  35. [newLang, showButton, cover] = await Promise.all([
  36. presence.getSetting<string>("lang").catch(() => "en"),
  37. presence.getSetting<boolean>("buttons"),
  38. presence.getSetting<boolean>("cover"),
  39. ]);
  40. if (oldLang !== newLang || !strings) {
  41. oldLang = newLang;
  42. strings = await getStrings();
  43. }
  44. const presenceData: PresenceData = {
  45. largeImageKey:
  46. "https://cdn.rcd.gg/PreMiD/websites/L/Line%20TV/assets/logo.png",
  47. startTimestamp: browsingTimestamp,
  48. details: strings.browse,
  49. };
  50. if (pathname.includes("/drama/")) {
  51. const video = document.querySelector("video"),
  52. title = document
  53. .querySelector("h2.font-700.text-24.break-all")
  54. .textContent.split(":"),
  55. episodeTitle = title.pop(); // eslint-disable-line no-one-time-vars/no-one-time-vars
  56. if (video) {
  57. presenceData.details = title.join(":");
  58. presenceData.state = episodeTitle;
  59. [presenceData.startTimestamp, presenceData.endTimestamp] =
  60. presence.getTimestampsfromMedia(video);
  61. presenceData.largeImageKey = cover
  62. ? await shortenURL(
  63. document.querySelector<HTMLImageElement>(
  64. `img[alt='${title.join(":")}']`
  65. ).src
  66. )
  67. : "linetv_logo";
  68. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play;
  69. presenceData.smallImageText = video.paused
  70. ? strings.paused
  71. : strings.play;
  72. if (video.paused) {
  73. delete presenceData.startTimestamp;
  74. delete presenceData.endTimestamp;
  75. }
  76. if (showButton) {
  77. presenceData.buttons = [
  78. {
  79. label: strings.buttonViewEpisode,
  80. url: location.href,
  81. },
  82. ];
  83. } else delete presenceData.buttons;
  84. } else {
  85. presenceData.details = strings.viewSeries;
  86. presenceData.state = title.join(":");
  87. }
  88. } else if (pathname.includes("/search")) {
  89. presenceData.details = strings.searchSomething;
  90. presenceData.smallImageKey = Assets.Search;
  91. }
  92. presence.setActivity(presenceData);
  93. });