presence.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import {
  2. batch,
  3. browsingTimestamp,
  4. getIconImage,
  5. presence,
  6. registerSlideshowKey,
  7. slideshow,
  8. } from "./util";
  9. presence.on("UpdateData", async () => {
  10. const presenceData: PresenceData = {
  11. largeImageKey:
  12. "https://cdn.rcd.gg/PreMiD/websites/F/Font%20Awesome/assets/logo.png",
  13. startTimestamp: browsingTimestamp,
  14. type: ActivityType.Playing,
  15. name: "Font Awesome",
  16. },
  17. { pathname, href, search } = document.location,
  18. pathList = pathname.split("/").filter(Boolean);
  19. let usesSlideshow = false;
  20. switch (pathList[0] ?? "/") {
  21. case "/": {
  22. presenceData.details = "Browsing Home Page";
  23. break;
  24. }
  25. case "docs": {
  26. presenceData.details = "Reading Documentation";
  27. if (pathList[1]) {
  28. presenceData.state = document.querySelector(".section+h1");
  29. presenceData.buttons = [{ label: "Read Docs", url: href }];
  30. }
  31. break;
  32. }
  33. case "icons": {
  34. if (pathList[1] === "categories") {
  35. if (pathList[2]) {
  36. const header = document.querySelector("h2");
  37. presenceData.details = "Viewing Icon Category";
  38. presenceData.state = header;
  39. presenceData.smallImageKey = await getIconImage(
  40. header.querySelector("i")
  41. );
  42. presenceData.smallImageText = header;
  43. presenceData.buttons = [{ label: "View Category", url: href }];
  44. } else presenceData.details = "Browsing Categories";
  45. } else if (pathList[1]) {
  46. presenceData.details = "Viewing Icon";
  47. presenceData.state = document.querySelector(
  48. ".icon-detail h1+button,#icon-landing h1+button"
  49. ).childNodes[1];
  50. presenceData.smallImageKey = await getIconImage(
  51. document.querySelector(".icon-details-preview-rendering i"),
  52. getComputedStyle(document.querySelector(".icon-details-preview.card"))
  53. .backgroundColor
  54. );
  55. const family =
  56. document.querySelector<HTMLSelectElement>("#icon_family");
  57. if (family) presenceData.smallImageText = family.value;
  58. presenceData.buttons = [{ label: "View Icon", url: href }];
  59. } else presenceData.details = "Browsing Icons";
  60. break;
  61. }
  62. case "search": {
  63. const searchQuery = new URLSearchParams(search).get("q");
  64. presenceData.details = "Searching Icons";
  65. if (searchQuery) {
  66. presenceData.state = searchQuery;
  67. const iconCards = [
  68. ...document.querySelectorAll("#icons-results > article"),
  69. ];
  70. if (iconCards.length) {
  71. const key = `search-${searchQuery}-${iconCards[0].id}`;
  72. registerSlideshowKey(key);
  73. usesSlideshow = true;
  74. const batchData = await batch(key, iconCards, async card => {
  75. const tempData: PresenceData = {
  76. ...presenceData,
  77. smallImageKey: await getIconImage(card.querySelector("i")),
  78. smallImageText: card.id,
  79. };
  80. return tempData;
  81. });
  82. for (const data of batchData)
  83. slideshow.addSlide(data.smallImageText as string, data, 5000);
  84. }
  85. }
  86. break;
  87. }
  88. case "start": {
  89. presenceData.details = "Getting Started";
  90. break;
  91. }
  92. case "support": {
  93. presenceData.details = "Browsing Support";
  94. break;
  95. }
  96. case "plans": {
  97. if (pathList[1]) {
  98. presenceData.details = "Viewing Plan";
  99. presenceData.state = document.querySelector("h3");
  100. } else presenceData.details = "Browsing Plans";
  101. break;
  102. }
  103. case "sessions": {
  104. presenceData.details = "Signing In";
  105. break;
  106. }
  107. }
  108. if (usesSlideshow) presence.setActivity(slideshow);
  109. else if (!presenceData.details) presence.clearActivity();
  110. else presence.setActivity(presenceData);
  111. });