presence.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const presence = new Presence({
  2. clientId: "730897382937591848",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/F/FiveM/assets/logo.png",
  7. }
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: Assets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. },
  13. { href, hostname, pathname } = document.location,
  14. [privacy, buttons, covers] = await Promise.all([
  15. presence.getSetting<boolean>("privacy"),
  16. presence.getSetting<boolean>("buttons"),
  17. presence.getSetting<boolean>("covers"),
  18. ]);
  19. let search: HTMLInputElement;
  20. if (privacy) {
  21. presenceData.details = "Browsing";
  22. presence.setActivity(presenceData);
  23. return;
  24. }
  25. switch (hostname.replace("www.", "")) {
  26. case "fivem.net": {
  27. if (pathname === "/") presenceData.details = "Viewing home Page";
  28. else if (pathname.includes("terms")) {
  29. presenceData.details = "Reading terms";
  30. presenceData.smallImageKey = Assets.Reading;
  31. }
  32. break;
  33. }
  34. case "docs.fivem.net": {
  35. search = document.querySelector('[name="search"]');
  36. if (search?.value) {
  37. presenceData.details = "Searchin for";
  38. presenceData.state = search.value;
  39. presenceData.smallImageKey = Assets.Search;
  40. } else if (pathname.startsWith("/docs/")) {
  41. presenceData.details = "Reading documentation about";
  42. presenceData.state = document.querySelector(
  43. '[class="docContent"]'
  44. )?.firstChild?.textContent;
  45. presenceData.smallImageKey = Assets.Reading;
  46. presenceData.buttons = [
  47. {
  48. label: "Read Docs",
  49. url: href,
  50. },
  51. ];
  52. }
  53. break;
  54. }
  55. case "forum.cfx.re": {
  56. search = document.querySelector('[id="search-term"]');
  57. if (search?.value) {
  58. presenceData.details = "Searchin for";
  59. presenceData.state = search.value;
  60. presenceData.smallImageKey = Assets.Search;
  61. presence.setActivity(presenceData);
  62. return;
  63. }
  64. switch (pathname.split("/")[1]) {
  65. case "": {
  66. presenceData.details = "Viewing the forum home Page";
  67. break;
  68. }
  69. case "categories":
  70. case "c": {
  71. // categories
  72. presenceData.details = "Viewing forum category";
  73. presenceData.state = document.querySelector(
  74. '[class="category-name"]'
  75. )?.textContent;
  76. presenceData.buttons = [
  77. {
  78. label: "View Forum Category",
  79. url: href,
  80. },
  81. ];
  82. break;
  83. }
  84. case "tag": {
  85. presenceData.details = "Viewing posts with tag";
  86. presenceData.state =
  87. document.querySelector('[class="name"]')?.textContent;
  88. presenceData.buttons = [
  89. {
  90. label: "View Posts",
  91. url: href,
  92. },
  93. ];
  94. break;
  95. }
  96. case "t": {
  97. // post
  98. presenceData.details = "Reading post";
  99. presenceData.state = document.querySelector(
  100. '[class="fancy-title"]'
  101. )?.textContent;
  102. presenceData.smallImageKey = Assets.Reading;
  103. presenceData.buttons = [
  104. {
  105. label: "Reading Post",
  106. url: href,
  107. },
  108. ];
  109. break;
  110. }
  111. case "u": {
  112. // user
  113. presenceData.details = "Viewing user";
  114. presenceData.largeImageKey = `https://${hostname}/${document
  115. .querySelector('[class="user-profile-avatar"]')
  116. ?.firstElementChild.getAttribute("src")}`;
  117. presenceData.state = document
  118. .querySelector('[class="username"]')
  119. .textContent.split("\n")[1]
  120. .trim();
  121. presenceData.buttons = [
  122. {
  123. label: "View Profile",
  124. url: href,
  125. },
  126. ];
  127. break;
  128. }
  129. case "latest": {
  130. presenceData.details = "Exploring the latest posts";
  131. break;
  132. }
  133. case "top": {
  134. presenceData.details = "Exploring the top posts";
  135. break;
  136. }
  137. case "badges": {
  138. presenceData.details = "Exploring all badges";
  139. break;
  140. }
  141. case "g": {
  142. presenceData.details = "Exploring all groups";
  143. break;
  144. }
  145. }
  146. break;
  147. }
  148. case "servers.fivem.net": {
  149. search = document.querySelector('[id="searchBox"]');
  150. if (search?.value) {
  151. presenceData.details = "Searchin for";
  152. presenceData.state = search.value;
  153. presenceData.smallImageKey = Assets.Search;
  154. } else if (pathname.startsWith("/servers/detail/")) {
  155. presenceData.largeImageKey = document
  156. .querySelector('[class="icon"]')
  157. .firstElementChild.getAttribute("src");
  158. presenceData.details = "Viewing server";
  159. presenceData.state =
  160. document.querySelector('[class="title"]').textContent;
  161. presenceData.buttons = [
  162. {
  163. label: "View Server",
  164. url: href,
  165. },
  166. ];
  167. } else {
  168. presenceData.details = `Exploring ${
  169. document.querySelector('[class="nav-item subnav-item active"]')
  170. ?.textContent ?? "all servers"
  171. }`;
  172. presenceData.state = `Sorted by ${
  173. document.querySelector('[class="sort-by active"]')?.textContent
  174. }`;
  175. presenceData.buttons = [
  176. {
  177. label: "View All Server",
  178. url: href,
  179. },
  180. ];
  181. }
  182. break;
  183. }
  184. }
  185. if (!covers) presenceData.largeImageKey = Assets.Logo;
  186. if (!buttons) delete presenceData.buttons;
  187. if (presenceData.details) presence.setActivity(presenceData);
  188. else presence.setActivity();
  189. });