presence.ts 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. const presence = new Presence({
  2. clientId: "1034799018980679680",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. async function getStrings() {
  6. return presence.getStrings(
  7. {
  8. play: "general.watchingVid",
  9. pause: "general.paused",
  10. view: "general.view",
  11. },
  12. await presence.getSetting<string>("lang").catch(() => "en")
  13. );
  14. }
  15. let strings: Awaited<ReturnType<typeof getStrings>>,
  16. contentTitle: string = null,
  17. contentSerieTitle: string = null;
  18. function textContent(tags: string) {
  19. return document.querySelector(tags)?.textContent?.trim();
  20. }
  21. function pageTitle(string: string) {
  22. return document
  23. .querySelector<HTMLTitleElement>("title")
  24. .textContent.split(string);
  25. }
  26. const enum Assets {
  27. Library = "https://cdn.rcd.gg/PreMiD/websites/K/Kinopoisk/assets/logo.png",
  28. Movies = "https://cdn.rcd.gg/PreMiD/websites/K/Kinopoisk/assets/0.png",
  29. }
  30. presence.on("UpdateData", async () => {
  31. const presenceData: PresenceData = {
  32. details: "Где-то на сайте",
  33. smallImageText: "Kinopoisk",
  34. },
  35. [privacy, time] = await Promise.all([
  36. presence.getSetting<boolean>("privacy"),
  37. presence.getSetting<boolean>("time"),
  38. ]),
  39. { hostname, pathname } = document.location;
  40. let isPaused, contentTimestamps: number[];
  41. if (!strings) strings = await getStrings();
  42. switch (hostname) {
  43. case "www.kinopoisk.ru":
  44. presenceData.largeImageKey = Assets.Library;
  45. switch (pathname.split("/")[1]) {
  46. case "":
  47. presenceData.details = "На главной странице";
  48. break;
  49. case "lists":
  50. switch (pathname.split("/")[2]) {
  51. case "categories":
  52. presenceData.details = "Смотрит списки";
  53. presenceData.state = textContent(".styles_activeCategory__mDu7i");
  54. break;
  55. case "movies":
  56. presenceData.details = "Смотрит список";
  57. presenceData.state = textContent(".styles_title__jB8AZ");
  58. break;
  59. }
  60. break;
  61. case "film":
  62. presenceData.details = "Смотрит страницу фильма";
  63. if (!pathname.split("/")[3])
  64. presenceData.state = textContent(".styles_title__65Zwx");
  65. else {
  66. presenceData.state = `${textContent(
  67. ".breadcrumbs li:last-child a"
  68. )} – ${textContent(".breadcrumbs li:first-child")}`;
  69. }
  70. break;
  71. case "series":
  72. presenceData.details = "Смотрит страницу сериала";
  73. if (!pathname.split("/")[3])
  74. presenceData.state = textContent(".styles_title___itJ6 span");
  75. else {
  76. presenceData.state = `${textContent(
  77. ".breadcrumbs li:last-child a"
  78. )} – ${textContent(".breadcrumbs li:first-child")}`;
  79. }
  80. break;
  81. case "name":
  82. presenceData.details = "Смотрит страницу человека";
  83. if (!pathname.split("/")[3]) presenceData.state = pageTitle(" — ")[0];
  84. else {
  85. presenceData.state = `${pageTitle(" — ")[0]} – ${
  86. pageTitle(" — ")[1]
  87. }`;
  88. }
  89. break;
  90. case "media":
  91. if (!pathname.split("/")[3]) {
  92. presenceData.details = `Смотрит ${textContent(
  93. ".media-list-page-title"
  94. )?.toLowerCase()}`;
  95. presenceData.state = textContent(
  96. ".media-main-page-navigation-menu__item.active"
  97. );
  98. } else {
  99. presenceData.state = textContent(
  100. ".media-post-title span:last-child"
  101. );
  102. switch (pathname.split("/")[2]) {
  103. case "article":
  104. presenceData.details = "Смотрит статьи";
  105. break;
  106. case "game":
  107. presenceData.details = "Смотрит тесты";
  108. break;
  109. case "news":
  110. presenceData.details = "Смотрит новости";
  111. break;
  112. case "podcast":
  113. presenceData.details = "Смотрит подкасты";
  114. break;
  115. case "rubric":
  116. presenceData.details = "Смотрит рубрики";
  117. presenceData.state = textContent(".media-list-page-title");
  118. break;
  119. case "special":
  120. presenceData.details = "Смотрит спецпроекты";
  121. break;
  122. case "video":
  123. presenceData.details = "Смотрит видео";
  124. break;
  125. }
  126. }
  127. break;
  128. case "afisha":
  129. if (!privacy) {
  130. presenceData.details = "Ищет билеты в кино";
  131. presenceData.smallImageKey = Assets.Search;
  132. }
  133. break;
  134. case "chance":
  135. presenceData.details = "Ищет случайный фильм";
  136. presenceData.state = textContent(".filmName a");
  137. break;
  138. case "premiere":
  139. presenceData.details = `Смотрит график премьер ${textContent(
  140. ".act"
  141. )}`;
  142. presenceData.state = textContent(".main_title_prem");
  143. break;
  144. case "s":
  145. presenceData.details = "Ищет фильмы";
  146. presenceData.smallImageKey = Assets.Search;
  147. break;
  148. case "special":
  149. presenceData.details = "Смотрит спецпроект";
  150. presenceData.state = textContent(".festival-welcome__text-title");
  151. break;
  152. case "top":
  153. presenceData.details = "Ищет фильм через навигатор";
  154. presenceData.smallImageKey = Assets.Search;
  155. break;
  156. case "user":
  157. presenceData.details = "Смотрит профиль";
  158. presenceData.state = pageTitle(":")[1];
  159. break;
  160. case "mykp":
  161. presenceData.details = "Смотрит свой профиль";
  162. presenceData.state = pageTitle(":")[1];
  163. break;
  164. }
  165. break;
  166. case "hd.kinopoisk.ru":
  167. presenceData.details = "В онлайн-кинотеатре";
  168. presenceData.largeImageKey = Assets.Movies;
  169. if (document.querySelector(".FilmContent_wrapper__EicQU")) {
  170. presenceData.details = `Смотрит информацию ${textContent(
  171. ".FilmContent_wrapper__EicQU .TabList_root__Kwcez button"
  172. )?.toLowerCase()}`;
  173. presenceData.state = document
  174. .querySelector<HTMLImageElement>(".FilmContent_wrapper__EicQU img")
  175. ?.alt.replace("Смотреть", "")
  176. .replace("фильм", "");
  177. presenceData.smallImageKey = Assets.Viewing;
  178. }
  179. if (document.querySelector(".CrispySlideDown_fade_active__StELV")) {
  180. presenceData.details = `Смотрит информацию ${textContent(
  181. ".CrispySlideDown_fade_active__StELV .TabList_root__Kwcez button"
  182. )?.toLowerCase()}`;
  183. presenceData.state = document
  184. .querySelector<HTMLImageElement>(
  185. ".CrispySlideDown_fade_active__StELV img"
  186. )
  187. ?.alt.replace("Смотреть", "")
  188. .replace("фильм", "");
  189. presenceData.smallImageKey = Assets.Viewing;
  190. }
  191. if (document.querySelector(".PlayerManager_body__rOEVd")) {
  192. if (document.querySelector(".Meta_image__CXoKi")) {
  193. contentTitle =
  194. document.querySelector<HTMLImageElement>(".Meta_image__CXoKi")?.alt;
  195. }
  196. if (document.querySelector(".Meta_subtitle__jnooi"))
  197. contentSerieTitle = textContent(".Meta_subtitle__jnooi");
  198. if (contentTitle || contentSerieTitle) {
  199. presenceData.details = `Смотрит ${
  200. !privacy ? contentTitle : contentSerieTitle ? "сериал" : "фильм"
  201. }`;
  202. contentTimestamps = presence.getTimestampsfromMedia(
  203. document.querySelector("video")
  204. );
  205. [presenceData.startTimestamp, presenceData.endTimestamp] =
  206. presence.getTimestamps(contentTimestamps[0], contentTimestamps[1]);
  207. } else {
  208. presenceData.details = "Смотрит телеканал";
  209. presenceData.startTimestamp = browsingTimestamp;
  210. }
  211. isPaused = document.querySelector(".styles_play__lWZwM");
  212. presenceData.state = contentSerieTitle;
  213. presenceData.smallImageKey = isPaused ? Assets.Pause : Assets.Play;
  214. presenceData.smallImageText = isPaused ? strings.pause : strings.play;
  215. if (isPaused || !time) {
  216. delete presenceData.startTimestamp;
  217. delete presenceData.endTimestamp;
  218. }
  219. } else {
  220. contentTitle = null;
  221. contentSerieTitle = null;
  222. }
  223. break;
  224. }
  225. if (privacy) delete presenceData.state;
  226. presence.setActivity(presenceData);
  227. });