presence.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. const presence = new Presence({
  2. clientId: "640253556078673951",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. let title: string,
  6. iFrameVideo = false,
  7. currentTime = 0,
  8. duration = 0,
  9. paused = true;
  10. const enum Assets {
  11. Logo = "https://cdn.rcd.gg/PreMiD/websites/K/KimCartoon/assets/logo.png",
  12. }
  13. interface IFrameData {
  14. iframeVideo: {
  15. dur: number;
  16. iFrameVideo: boolean;
  17. paused: boolean;
  18. currTime: number;
  19. };
  20. }
  21. function capitalizeFirstLetter(string: string) {
  22. if (!string) return "Undefined";
  23. return (
  24. string.trim().charAt(0).toUpperCase() + string.trim().slice(1).toLowerCase()
  25. );
  26. }
  27. function fullURL(covers: string, hostname: string) {
  28. if (covers?.includes("https")) return covers;
  29. else if (covers?.includes("Uploads")) return `https://${hostname}${covers}`;
  30. else return Assets.Logo;
  31. }
  32. presence.on("iFrameData", (data: IFrameData) => {
  33. ({ iFrameVideo, paused } = data.iframeVideo);
  34. currentTime = data.iframeVideo.currTime;
  35. duration = data.iframeVideo.dur;
  36. });
  37. presence.on("UpdateData", async () => {
  38. const presenceData: PresenceData = {
  39. largeImageKey: Assets.Logo,
  40. startTimestamp: browsingTimestamp,
  41. },
  42. cover = await presence.getSetting<boolean>("cover"),
  43. { hostname, pathname, href } = document.location;
  44. switch (true) {
  45. case iFrameVideo: {
  46. const epsOrMovie =
  47. document.querySelector('option[selected="selected"]')?.textContent ??
  48. document.querySelector('[id="selectEpisode"] > [selected]')
  49. ?.textContent,
  50. titleSplit =
  51. document
  52. .querySelector('[class="watch_title a_center"]')
  53. ?.textContent.toLowerCase()
  54. ?.replace("watch", "")
  55. ?.replace(" online free", "")
  56. ?.replace(" information", "")
  57. ?.split(" season") ??
  58. document
  59. .querySelector('[id="navsubbar"]')
  60. ?.textContent.toLowerCase()
  61. ?.replace("watch", "")
  62. ?.replace(" online free", "")
  63. ?.replace(" information", "")
  64. ?.split(" season");
  65. title = capitalizeFirstLetter(titleSplit?.[0]);
  66. presenceData.details = title;
  67. presenceData.state =
  68. epsOrMovie?.includes("Episode") && titleSplit?.length > 1
  69. ? `Season ${titleSplit[1]} ${epsOrMovie}`
  70. : epsOrMovie?.includes("Movie")
  71. ? "Movie"
  72. : epsOrMovie?.includes("Episode") && titleSplit?.length === 1
  73. ? epsOrMovie
  74. : `Episode ${epsOrMovie}`;
  75. presenceData.largeImageKey = fullURL(
  76. document
  77. .querySelector('[property="og:image"]')
  78. ?.getAttribute("content"),
  79. hostname
  80. );
  81. if (iFrameVideo && !isNaN(duration)) {
  82. delete presenceData.startTimestamp;
  83. presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play;
  84. presenceData.smallImageText = paused ? "Paused" : "Playing";
  85. if (!paused) {
  86. [presenceData.startTimestamp, presenceData.endTimestamp] =
  87. presence.getTimestamps(currentTime, duration);
  88. }
  89. presenceData.buttons = [{ label: "Watch Cartoon", url: href }];
  90. } else presenceData.buttons = [{ label: "View Cartoon", url: href }];
  91. break;
  92. }
  93. case pathname === "/": {
  94. presenceData.details = "Viewing the homepage";
  95. break;
  96. }
  97. case pathname.includes("/Genre"): {
  98. presenceData.details = "Viewing all genres";
  99. break;
  100. }
  101. case pathname.includes("/CartoonList"): {
  102. presenceData.details = "Viewing the cartoonlist";
  103. presenceData.buttons = [{ label: "View The Cartoonlist", url: href }];
  104. break;
  105. }
  106. case pathname.includes("/Cartoon/"): {
  107. presenceData.details = "Viewing cartoon:";
  108. presenceData.state =
  109. document.querySelector('[class="bigChar"]')?.textContent ??
  110. pathname.split("/")[2].replace("-", " ");
  111. presenceData.largeImageKey =
  112. document
  113. .querySelector('[property="og:image"]')
  114. ?.getAttribute("content") ?? Assets.Logo;
  115. presenceData.buttons = [{ label: "View Cartoon", url: href }];
  116. break;
  117. }
  118. case pathname.includes("/kimcartoon.me"): {
  119. presenceData.details = "Viewing the old homepage";
  120. break;
  121. }
  122. }
  123. if (!cover && presenceData.largeImageKey !== Assets.Logo)
  124. presenceData.largeImageKey = Assets.Logo;
  125. if (presenceData.details) presence.setActivity(presenceData);
  126. else presence.setActivity();
  127. });