presence.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. const presence = new Presence({
  2. clientId: "762522704128901131",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. let menu: Element, file: string;
  6. presence.on("UpdateData", async () => {
  7. const presenceData: PresenceData = {
  8. largeImageKey:
  9. "https://cdn.rcd.gg/PreMiD/websites/M/MEGA/assets/logo.png",
  10. startTimestamp: browsingTimestamp,
  11. },
  12. [privacy, buttons] = await Promise.all([
  13. presence.getSetting<boolean>("privacy"),
  14. presence.getSetting<boolean>("buttons"),
  15. ]),
  16. { pathname, hostname, href } = document.location;
  17. if (privacy) presenceData.details = "Browsing";
  18. else if (hostname.includes("mega.io")) {
  19. menu = document.querySelector("[class='pages-menu submenu-link clickurl']");
  20. if (pathname === "/" || pathname.includes("/startpage"))
  21. presenceData.details = "Home page";
  22. else if (menu) {
  23. presenceData.details = menu.getAttribute("href");
  24. presenceData.buttons = [
  25. {
  26. label: "View Features",
  27. url: href,
  28. },
  29. ];
  30. }
  31. } else if (hostname.includes("mega.nz")) {
  32. menu =
  33. document.querySelector(".top-menu-item.active") ??
  34. document.querySelector(".btn-myfiles.js-lpbtn.active");
  35. if (pathname === "/" || pathname.includes("/startpage"))
  36. presenceData.details = "Home page";
  37. else if (pathname.includes("/file/")) {
  38. const extension = document.querySelector(
  39. "[class='extension']"
  40. ).textContent;
  41. presenceData.details = `Viewing a ${extension} file`;
  42. presenceData.state = ` (${document
  43. .querySelector("[class='file-size-block']")
  44. .textContent.trim()}) ${
  45. document.querySelector("[class='filename']").textContent
  46. }${extension}`;
  47. presenceData.buttons = [
  48. {
  49. label: "View File",
  50. url: href,
  51. },
  52. ];
  53. } else if (pathname.includes("/account")) {
  54. presenceData.details = `Viewing ${document
  55. .querySelector("[class='content-panel account active']")
  56. .querySelector("[class*='active']")
  57. .firstElementChild.textContent.trim()} Settings`;
  58. } else if (pathname.includes("/fm/") && !pathname.includes("/fm/chat")) {
  59. const selected =
  60. document
  61. .querySelector('[class*="ui-selected"]')
  62. ?.getAttribute("title") ??
  63. document
  64. .querySelector('[class*="data-block-view ui-selected"]')
  65. ?.getAttribute("title");
  66. if (selected) {
  67. const title = selected.replace(/[0-9]* .B/gm, "");
  68. file = selected.replace(title, "");
  69. if (file) file = `(${file})`;
  70. presenceData.details = "Viewing file";
  71. presenceData.state = `${file} ${title}`;
  72. } else if (
  73. !document
  74. .querySelector(
  75. "#bodyel > section.media-viewer-container.theme-dark-forced"
  76. )
  77. ?.className.includes("hidden")
  78. ) {
  79. presenceData.details = "Viewing file";
  80. presenceData.state = document.querySelector(
  81. "[class='file-name']"
  82. ).textContent;
  83. } else {
  84. presenceData.details = `Viewing ${
  85. document.querySelector(".btn-galleries.js-lpbtn.active")
  86. ?.textContent ??
  87. document.querySelector(".btn-myfiles.js-lpbtn.active")?.textContent ??
  88. "Dashboard"
  89. }`;
  90. }
  91. } else if (pathname.includes("/fm/chat")) {
  92. const chats = document.querySelector(
  93. "#fmholder > div.main-blur-block > div.fm-main.default > div.section.conversations > div > div.fm-right-files-block.in-chat > div.conversation-panels > div > div > div.chat-topic-block.chat-topic-block > div.chat-topic-info > div.chat-topic-text > span:nth-child(1) > span"
  94. ),
  95. contacts =
  96. document
  97. ?.querySelector('[class*="contacts-navigation"]')
  98. ?.querySelector('[class*="active"]') ??
  99. document?.querySelector('[class*=" active groupchat public"]');
  100. if (chats) {
  101. presenceData.details = "Viewing chat";
  102. presenceData.state = chats.textContent;
  103. } else if (contacts) presenceData.details = contacts.textContent;
  104. else presenceData.details = "Viewing All chats";
  105. } else if (document.querySelector("[class*=' ui-selected']")) {
  106. const titleNode = document.querySelector("[class*=' ui-selected']")
  107. .childNodes[1];
  108. if (
  109. document
  110. .querySelector("[class*=' ui-selected']")
  111. .innerHTML.includes("folder")
  112. ) {
  113. presenceData.details = "Viewing folder";
  114. presenceData.state = titleNode.textContent;
  115. } else {
  116. presenceData.details = "Viewing file";
  117. presenceData.state = `${titleNode.textContent} (Size: ${document
  118. .querySelector("[class*=' ui-selected']")
  119. .getAttribute("title")
  120. .replace(titleNode.textContent, "")
  121. .trim()})`;
  122. }
  123. } else if (
  124. document.querySelector("[class='fm-breadcrumbs-block']") &&
  125. document.querySelector(
  126. '[class="next-arrow sprite-fm-mono icon-arrow-right icon16"]'
  127. )
  128. ) {
  129. presenceData.details = "Viewing contents of folder";
  130. presenceData.state = document
  131. .querySelector("[class='fm-breadcrumbs-block']")
  132. .lastChild.textContent.trim();
  133. } else if (menu) presenceData.details = `Viewing ${menu.textContent}`;
  134. else if (pathname === "/business")
  135. presenceData.details = "Viewing Business";
  136. }
  137. if (!buttons) delete presenceData.buttons;
  138. if (presenceData.details) presence.setActivity(presenceData);
  139. else presence.setActivity();
  140. });