presence.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. const presence = new Presence({
  2. clientId: "978186598669758504",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/W/Wiki.gg/assets/logo.png",
  7. }
  8. let title: string;
  9. async function getStrings() {
  10. return presence.getStrings(
  11. {
  12. browse: "general.browsing",
  13. search: "general.searchFor",
  14. viewHome: "general.viewHome",
  15. buttonViewPage: "general.buttonViewPage",
  16. buttonViewProfile: "general.buttonViewProfile",
  17. },
  18. await presence.getSetting<string>("lang").catch(() => "en")
  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. let strings: Awaited<ReturnType<typeof getStrings>>,
  28. oldLang: string = null;
  29. presence.on("UpdateData", async () => {
  30. const presenceData: PresenceData = {
  31. largeImageKey: Assets.Logo,
  32. startTimestamp: browsingTimestamp,
  33. },
  34. { pathname, hostname, href } = document.location,
  35. [newLang, privacy, buttons] = await Promise.all([
  36. presence.getSetting<string>("lang").catch(() => "en"),
  37. presence.getSetting<boolean>("privacy"),
  38. presence.getSetting<boolean>("buttons"),
  39. ]),
  40. main =
  41. document
  42. .querySelector('[id="ca-nstab-main"]')
  43. ?.textContent?.toLowerCase() ?? "";
  44. if (oldLang !== newLang || !strings) {
  45. oldLang = newLang;
  46. strings = await getStrings();
  47. }
  48. if (privacy) {
  49. presenceData.details = strings.browse;
  50. presence.setActivity(presenceData);
  51. return;
  52. }
  53. if (hostname === "wiki.gg") {
  54. if (pathname === "/") presenceData.details = strings.viewHome;
  55. else {
  56. presenceData.details = document
  57. .querySelector("head > title")
  58. .textContent.slice(0, -10);
  59. }
  60. } else {
  61. title = capitalizeFirstLetter(
  62. document
  63. .querySelector('[property="og:site_name"]')
  64. ?.getAttribute("content")
  65. ?.toLowerCase() ??
  66. document
  67. .querySelector('[property="og:title"]')
  68. ?.getAttribute("content")
  69. ?.toLowerCase() ??
  70. document
  71. .querySelector('[id="footer-places-about"]')
  72. ?.textContent?.replace(/About /gm, "")
  73. ?.toLowerCase()
  74. );
  75. let search: HTMLInputElement | NodeListOf<HTMLInputElement> =
  76. document.querySelectorAll<HTMLInputElement>("input[id='searchInput']") ??
  77. document.querySelectorAll<HTMLInputElement>("input[name='search']");
  78. if (search.length === 1) search = search[0];
  79. else search = search[1];
  80. presenceData.largeImageKey = `https://${hostname}/images/e/e6/Site-logo.png`;
  81. if (search?.value) {
  82. presenceData.state = search.value;
  83. title = `${title} | ${strings.search?.toLowerCase()}`;
  84. presenceData.details = title;
  85. presenceData.smallImageKey = Assets.Search;
  86. } else if (pathname.includes("wiki") && main !== "main page") {
  87. presenceData.smallImageKey = Assets.Reading;
  88. const firstHeading = document
  89. .querySelector("#firstHeading")
  90. .textContent?.toLowerCase();
  91. presenceData.details = title;
  92. if (firstHeading?.includes(":")) {
  93. presenceData.state = `${capitalizeFirstLetter(
  94. document
  95. .querySelector("#firstHeading")
  96. .textContent?.toLowerCase()
  97. .split(":")[0]
  98. )} | ${
  99. document
  100. .querySelector("#firstHeading")
  101. .textContent?.toLowerCase()
  102. .split(":")[1]
  103. }`;
  104. } else presenceData.state = capitalizeFirstLetter(firstHeading);
  105. presenceData.buttons = [
  106. {
  107. label: strings.buttonViewPage,
  108. url: href,
  109. },
  110. ];
  111. } else if (pathname === "/" || main === "main" || main === "main page") {
  112. presenceData.state = strings.viewHome;
  113. presenceData.details = title;
  114. }
  115. }
  116. if (!buttons && presenceData.buttons) delete presenceData.buttons;
  117. if (presenceData.details) presence.setActivity(presenceData);
  118. else presence.setActivity();
  119. });