presence.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. const presence = new Presence({
  2. clientId: "651412198727352331",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/0-9/5Mods/assets/logo.jpg",
  7. }
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: Assets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. },
  13. [privacy, buttons, covers] = await Promise.all([
  14. presence.getSetting<boolean>("privacy"),
  15. presence.getSetting<boolean>("buttons"),
  16. presence.getSetting<boolean>("covers"),
  17. ]),
  18. { href, hostname, pathname } = document.location,
  19. splitPath = pathname.split("/");
  20. if (privacy) {
  21. presenceData.details = "Browsing";
  22. return presence.setActivity(presenceData);
  23. }
  24. switch (hostname.replace("www.", "")) {
  25. case "forums.gta5-mods.com": {
  26. switch (splitPath[1]) {
  27. case "": {
  28. presenceData.details = "Viewing the forum home page";
  29. break;
  30. }
  31. case "category": {
  32. presenceData.details = "Viewing forum category";
  33. presenceData.state =
  34. document.querySelectorAll('[itemprop="title"]')[1]?.textContent;
  35. presenceData.buttons = [
  36. {
  37. label: "View Forum Category",
  38. url: href,
  39. },
  40. ];
  41. break;
  42. }
  43. case "topic": {
  44. presenceData.details = "Viewing forum post about";
  45. presenceData.state = document
  46. .querySelector('[class="topic-title"]')
  47. ?.textContent?.slice(0, 120);
  48. presenceData.buttons = [
  49. {
  50. label: "View Forum Post",
  51. url: href,
  52. },
  53. ];
  54. break;
  55. }
  56. case "user": {
  57. presenceData.details = "Viewing forum user";
  58. presenceData.state =
  59. document.querySelector('[class="fullname"]')?.textContent;
  60. presenceData.largeImageKey =
  61. document
  62. .querySelector('[class="avatar-wrapper"]')
  63. ?.firstElementChild.getAttribute("src") ?? Assets.Logo;
  64. presenceData.buttons = [
  65. {
  66. label: "View Forum User",
  67. url: href,
  68. },
  69. ];
  70. break;
  71. }
  72. case "groups": {
  73. presenceData.details = "Viewing forum groups";
  74. presenceData.buttons = [
  75. {
  76. label: "View Forum Group",
  77. url: href,
  78. },
  79. ];
  80. break;
  81. }
  82. case "recent":
  83. case "popular": {
  84. presenceData.details = `Viewing ${splitPath[2]} ${document
  85. .querySelectorAll('[itemprop="title"]')[1]
  86. ?.textContent?.toLowerCase()} posts`;
  87. presenceData.buttons = [
  88. {
  89. label: "View Forum Posts",
  90. url: href,
  91. },
  92. ];
  93. break;
  94. }
  95. }
  96. break;
  97. }
  98. case "gta5-mods.com": {
  99. switch (splitPath[1]) {
  100. case "": {
  101. presenceData.details = "Viewing the home page";
  102. break;
  103. }
  104. case "users": {
  105. presenceData.details = "Viewing user";
  106. presenceData.state =
  107. document.querySelector('[class="username"]')?.textContent;
  108. presenceData.largeImageKey =
  109. document
  110. .querySelector('[class="img-responsive"]')
  111. ?.getAttribute("src") ?? Assets.Logo;
  112. presenceData.buttons = [
  113. {
  114. label: "View User",
  115. url: href,
  116. },
  117. ];
  118. break;
  119. }
  120. case "login": {
  121. presenceData.details = "Logging in";
  122. break;
  123. }
  124. default: {
  125. if (document.querySelector('li[class*="active"]')) {
  126. if (
  127. document.querySelector('[class="btn btn-primary btn-download"]')
  128. ) {
  129. presenceData.details = "Browsing mod";
  130. presenceData.state =
  131. document.querySelector(
  132. '[class="version"]'
  133. )?.parentNode?.textContent;
  134. presenceData.buttons = [
  135. {
  136. label: "Browse Mod",
  137. url: href,
  138. },
  139. ];
  140. } else {
  141. presenceData.details = "Browsing category";
  142. presenceData.state = document.querySelector(
  143. 'li[class*="active"]'
  144. )?.textContent;
  145. presenceData.buttons = [
  146. {
  147. label: "Browse Category",
  148. url: href,
  149. },
  150. ];
  151. }
  152. }
  153. break;
  154. }
  155. }
  156. break;
  157. }
  158. }
  159. if (!covers) presenceData.largeImageKey = Assets.Logo;
  160. if (!buttons) delete presenceData.buttons;
  161. if (presenceData.details) presence.setActivity(presenceData);
  162. else presence.setActivity();
  163. });