presence.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. const presence = new Presence({
  2. clientId: "1035433850593095740",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000),
  5. homepageInput =
  6. document.querySelector<HTMLInputElement>('input[name="text"]'),
  7. { host, pathname } = document.location;
  8. const enum Assets {
  9. Logo = "https://cdn.rcd.gg/PreMiD/websites/Y/Yandex/assets/logo.png",
  10. }
  11. async function getStrings() {
  12. return presence.getStrings(
  13. {
  14. search: "general.search",
  15. view: "general.viewing",
  16. viewHome: "general.viewHome",
  17. searchFor: "general.searchFor",
  18. searchSomething: "general.searchSomething",
  19. watching: "general.watching",
  20. },
  21. await presence.getSetting<string>("lang").catch(() => "ru")
  22. );
  23. }
  24. let strings: Awaited<ReturnType<typeof getStrings>>,
  25. oldLang: string = null;
  26. function textContent(tags: string) {
  27. return document.querySelector(tags)?.textContent;
  28. }
  29. presence.on("UpdateData", async () => {
  30. const presenceData: PresenceData = {
  31. largeImageKey: Assets.Logo,
  32. startTimestamp: browsingTimestamp,
  33. },
  34. [newLang, privacy, logo, time] = await Promise.all([
  35. presence.getSetting<string>("lang").catch(() => "ru"),
  36. presence.getSetting<boolean>("privacy"),
  37. presence.getSetting<boolean>("logo"),
  38. presence.getSetting<boolean>("time"),
  39. ]);
  40. if (oldLang !== newLang || !strings) {
  41. oldLang = newLang;
  42. strings = await getStrings();
  43. }
  44. switch (host) {
  45. case "ya.ru":
  46. presenceData.details = strings.viewHome;
  47. if (homepageInput?.value) {
  48. presenceData.state = `${strings.searchFor} ${homepageInput?.value}`;
  49. presenceData.smallImageKey = Assets.Search;
  50. presenceData.smallImageText = strings.search;
  51. }
  52. break;
  53. case "yandex.ru":
  54. presenceData.smallImageKey = Assets.Search;
  55. presenceData.smallImageText = strings.search;
  56. switch (pathname.split("/")[1]) {
  57. case "search":
  58. presenceData.details = !privacy
  59. ? `${strings.searchFor} ${homepageInput?.value}`
  60. : strings.searchSomething;
  61. presenceData.state = textContent(".serp-adv__found");
  62. break;
  63. case "images":
  64. presenceData.details = "Yandex Images";
  65. presenceData.state = `${strings.searchFor} ${homepageInput?.value}`;
  66. if (document.querySelector(".CbirPreview-Preview")) {
  67. presenceData.state = `${strings.search} ${
  68. oldLang === "ru" ? "по картинке" : "by images"
  69. }`;
  70. if (logo && !privacy) {
  71. presenceData.largeImageKey =
  72. document.querySelector<HTMLImageElement>(
  73. "img.CbirPreview-Image"
  74. )?.src;
  75. }
  76. }
  77. break;
  78. case "video":
  79. presenceData.details = "Yandex Video";
  80. presenceData.state = `${strings.searchFor} ${homepageInput?.value}`;
  81. break;
  82. case "maps":
  83. presenceData.details = "Yandex Maps";
  84. presenceData.state = `${strings.searchFor} ${
  85. document.querySelector<HTMLInputElement>("input")?.value
  86. }`;
  87. break;
  88. case "products":
  89. presenceData.details = "Yandex Market";
  90. presenceData.state = `${strings.searchFor} ${homepageInput?.value}`;
  91. break;
  92. case "blogs":
  93. presenceData.details = "Yandex Blogs";
  94. presenceData.state = `${strings.searchFor} ${homepageInput?.value}`;
  95. break;
  96. case "pogoda":
  97. presenceData.details = `${strings.watching} ${
  98. oldLang === "ru" ? "погоду" : "weather"
  99. }`;
  100. presenceData.state = document
  101. .querySelector<HTMLTitleElement>("title")
  102. .textContent.replace(" — Яндекс.Погода", "");
  103. presenceData.smallImageKey = Assets.Viewing;
  104. presenceData.smallImageText = strings.view;
  105. break;
  106. case "collections":
  107. presenceData.details = `${strings.watching} ${
  108. oldLang === "ru" ? "избранное" : "favourites"
  109. }`;
  110. presenceData.state = document.querySelector(
  111. ".cl-cards-type-filter__button_active"
  112. )?.firstChild?.textContent;
  113. if (document.querySelector(".cl-board-header-title__name")) {
  114. presenceData.details = `${strings.watching} ${
  115. oldLang === "ru" ? "папку в избранном" : "folder in favourites"
  116. }`;
  117. presenceData.state = document.querySelector(
  118. ".cl-board-header-title__name"
  119. )?.textContent;
  120. }
  121. break;
  122. }
  123. break;
  124. }
  125. if (!time) delete presenceData.startTimestamp;
  126. if (privacy) delete presenceData.state;
  127. presence.setActivity(presenceData);
  128. });