presence.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. const presence = new Presence({
  2. clientId: "626536244670889985",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. let user: HTMLElement | string | Element,
  6. search: HTMLElement,
  7. title: string | Element | HTMLElement;
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey:
  11. "https://cdn.rcd.gg/PreMiD/websites/C/CurseForge/assets/logo.png",
  12. startTimestamp: browsingTimestamp,
  13. };
  14. function setStateGame(
  15. game: string,
  16. categoryURL: string,
  17. categoryText: string,
  18. categoryTextSingle: string
  19. ): void {
  20. if (document.location.pathname.includes(`/${categoryURL}/`)) {
  21. title = document.querySelector(
  22. "body > div.flex.flex-col.min-h-full.min-h-screen > main > div.z-0 > header > div.container.mx-auto.mt-auto.flex.justify-between > div:nth-child(1) > div > div:nth-child(1) > h2"
  23. );
  24. if (!title) {
  25. title = document.querySelector(
  26. "body > div.flex.flex-col.min-h-full.min-h-screen > main > div.z-0 > div > section > div.px-2.flex-1 > div > div.flex.flex-col.mb-4 > h2"
  27. );
  28. presenceData.details = `${game}, Viewing category:`;
  29. presenceData.state = `${categoryText} - ${(
  30. title as HTMLElement
  31. ).textContent.replace("All ", "")}`;
  32. delete presenceData.smallImageKey;
  33. } else {
  34. presenceData.details = `${game}, Viewing ${categoryTextSingle}:`;
  35. if ((title as HTMLElement).textContent.length > 128) {
  36. presenceData.state = `${(title as HTMLElement).textContent.substring(
  37. 0,
  38. 125
  39. )}...`;
  40. } else presenceData.state = (title as HTMLElement).textContent;
  41. delete presenceData.smallImageKey;
  42. }
  43. } else if (document.location.pathname.includes(`/${categoryURL}`)) {
  44. presenceData.details = `${game}, Viewing category:`;
  45. presenceData.state = categoryText;
  46. delete presenceData.smallImageKey;
  47. } else {
  48. presenceData.details = `CurseForge - ${game}`;
  49. delete presenceData.state;
  50. delete presenceData.smallImageKey;
  51. }
  52. }
  53. if (document.location.hostname === "www.curseforge.com") {
  54. if (document.location.pathname.includes("/minecraft/")) {
  55. if (document.location.pathname.includes("/modpacks"))
  56. setStateGame("MC", "modpacks", "Modpacks", "modpack");
  57. else if (document.location.pathname.includes("/bukkit-plugins"))
  58. setStateGame("MC", "bukkit-plugins", "Bukkit plugins", "Bukkit plugin");
  59. else if (document.location.pathname.includes("/customization"))
  60. setStateGame("MC", "customization", "Customizations", "customization");
  61. else if (document.location.pathname.includes("/mc-addons"))
  62. setStateGame("MC", "mc-addons", "Addons", "addon");
  63. else if (document.location.pathname.includes("/mc-mods"))
  64. setStateGame("MC", "mc-mods", "Mods", "mod");
  65. else if (document.location.pathname.includes("/texture-packs"))
  66. setStateGame("MC", "texture-packs", "Texture Packs", "texturepack");
  67. else if (document.location.pathname.includes("/worlds"))
  68. setStateGame("MC", "worlds", "Worlds", "world");
  69. else {
  70. presenceData.details = "CurseForge - MC";
  71. delete presenceData.state;
  72. delete presenceData.smallImageKey;
  73. }
  74. } else if (document.location.pathname.includes("/wow/"))
  75. setStateGame("WoW", "addons", "Addons", "addon");
  76. else if (document.location.pathname.includes("/sc2/"))
  77. setStateGame("SC2", "assets", "Assets", "asset");
  78. else if (document.location.pathname.includes("/kerbal/"))
  79. setStateGame("Kerbal", "ksp-mods", "Mods", "mod");
  80. else if (document.location.pathname.includes("/wildstar/"))
  81. setStateGame("WildStar", "ws-addons", "Addons", "addon");
  82. else if (document.location.pathname.includes("/terraria/")) {
  83. if (document.location.pathname.includes("/maps"))
  84. setStateGame("Terraria", "maps", "Maps", "map");
  85. else if (document.location.pathname.includes("/mods"))
  86. setStateGame("Terraria", "mods", "Mods", "mod");
  87. else {
  88. presenceData.details = "CurseForge - Terraria";
  89. delete presenceData.state;
  90. delete presenceData.smallImageKey;
  91. }
  92. } else if (document.location.pathname.includes("/worldoftanks/")) {
  93. if (document.location.pathname.includes("/wot-mods"))
  94. setStateGame("WoT", "wot-mods", "Mods", "mod");
  95. else if (document.location.pathname.includes("/wot-skins"))
  96. setStateGame("WoT", "wot-skins", "Skins", "skin");
  97. else {
  98. presenceData.details = "CurseForge - WoT";
  99. delete presenceData.state;
  100. delete presenceData.smallImageKey;
  101. }
  102. } else if (document.location.pathname.includes("/rift/"))
  103. setStateGame("Rift", "addons", "Addons", "addon");
  104. else if (document.location.pathname.includes("/rom/"))
  105. setStateGame("RoM", "addons", "Addons", "addon");
  106. else if (document.location.pathname.includes("/skyrim/"))
  107. setStateGame("Skyrim", "mods", "Mods", "mod");
  108. else if (document.location.pathname.includes("/tsw/"))
  109. setStateGame("TSW", "tsw-mods", "Mods", "mod");
  110. else if (document.location.pathname.includes("/teso/"))
  111. setStateGame("TESO", "teso-addons", "Addons", "addon");
  112. else if (document.location.pathname.includes("/stardewvalley/"))
  113. setStateGame("Stardew Valley", "mods", "Mods", "mod");
  114. else if (document.location.pathname.includes("/swlegends/"))
  115. setStateGame("SWLegends", "tswl-mods", "Mods", "mod");
  116. else if (document.location.pathname.includes("/chronicles-of-arcadia/"))
  117. setStateGame("Chronicles of Arcadia", "addons", "Addons", "addon");
  118. else if (document.location.pathname.includes("/surviving-mars/"))
  119. setStateGame("Surviving Mars", "mods", "Mods", "mod");
  120. else if (document.location.pathname.includes("/darkestdungeon/"))
  121. setStateGame("Darkest Dungeon", "dd-mods", "Mods", "mod");
  122. else if (document.location.pathname.includes("/gta5/")) {
  123. if (document.location.pathname.includes("/gta-v-mods"))
  124. setStateGame("GTA5", "gta-v-mods", "Mods", "mod");
  125. else if (document.location.pathname.includes("/gta-v-tools"))
  126. setStateGame("GTA5", "gta-v-tools", "Tools", "tool");
  127. else {
  128. presenceData.details = "CurseForge - GTA5";
  129. delete presenceData.state;
  130. delete presenceData.smallImageKey;
  131. }
  132. } else if (document.location.pathname.includes("/staxel/"))
  133. setStateGame("Staxel", "staxel-mods", "Mods", "mod");
  134. else if (document.location.pathname.includes("/members/")) {
  135. user = document.querySelector(
  136. "body > div.flex.flex-col.min-h-full.min-h-screen > main > section > div > div.text-base > div.username.text-xl"
  137. );
  138. presenceData.details = "Viewing user:";
  139. presenceData.state = (user as HTMLElement).textContent;
  140. delete presenceData.smallImageKey;
  141. } else if (document.location.pathname.includes("/private-messages")) {
  142. presenceData.details = "Reading DMs";
  143. delete presenceData.state;
  144. presenceData.smallImageKey = Assets.Reading;
  145. } else if (document.location.pathname.includes("/account")) {
  146. presenceData.details = "Viewing account settings";
  147. delete presenceData.state;
  148. delete presenceData.smallImageKey;
  149. } else if (document.location.pathname.includes("/all-games")) {
  150. presenceData.details = "Viewing all games";
  151. delete presenceData.state;
  152. delete presenceData.smallImageKey;
  153. } else if (document.location.pathname.includes("/project/")) {
  154. presenceData.details = "CurseForge - Projects";
  155. delete presenceData.state;
  156. delete presenceData.smallImageKey;
  157. }
  158. } else if (
  159. document.location.hostname === "minecraft.curseforge.com" ||
  160. document.location.hostname === "authors.curseforge.com"
  161. ) {
  162. if (document.location.pathname.includes("/forums/")) {
  163. title = document.querySelector("#content > section > div > header > h2");
  164. if (title) {
  165. presenceData.details = "Forums, viewing category:";
  166. presenceData.state = (title as HTMLElement).textContent;
  167. delete presenceData.smallImageKey;
  168. } else if (
  169. document.querySelector("#content > section > div > div > header > h2")
  170. ) {
  171. title = document.querySelector(
  172. "#content > section > div > div > header > h2"
  173. );
  174. presenceData.details = "Forums, reading thread:";
  175. if ((title as HTMLElement).textContent.length > 128) {
  176. presenceData.state = `${(title as HTMLElement).textContent.substring(
  177. 0,
  178. 125
  179. )}...`;
  180. } else presenceData.state = (title as HTMLElement).textContent;
  181. presenceData.smallImageKey = Assets.Reading;
  182. } else {
  183. presenceData.details = "Forums, Browsing...";
  184. delete presenceData.state;
  185. delete presenceData.smallImageKey;
  186. }
  187. } else if (document.location.pathname.includes("/search")) {
  188. search = document.querySelector("#field-search");
  189. if ((search as HTMLInputElement).value.length > 1) {
  190. presenceData.details = "Forums, Searching for:";
  191. presenceData.state = (search as HTMLInputElement).value;
  192. presenceData.smallImageKey = Assets.Search;
  193. } else {
  194. presenceData.details = "Forums, Going to search";
  195. presenceData.state = "something up";
  196. presenceData.smallImageKey = Assets.Search;
  197. }
  198. } else if (document.location.pathname.includes("/account")) {
  199. presenceData.details = "Forums, viewing:";
  200. presenceData.state = "Account Settings";
  201. delete presenceData.smallImageKey;
  202. } else if (document.location.pathname.includes("/knowledge-base")) {
  203. presenceData.details = "Forums, viewing:";
  204. presenceData.state = "Knowledge Base";
  205. delete presenceData.smallImageKey;
  206. } else if (document.location.pathname.includes("/store")) {
  207. presenceData.details = "Forums, viewing:";
  208. presenceData.state = "Reward Store";
  209. delete presenceData.smallImageKey;
  210. } else if (document.location.pathname.includes("/dashboard")) {
  211. presenceData.details = "Forums, viewing:";
  212. presenceData.state = "Dashboard";
  213. delete presenceData.smallImageKey;
  214. } else if (document.location.pathname.includes("/paste")) {
  215. presenceData.details = "Forums, viewing:";
  216. presenceData.state = "Paste";
  217. delete presenceData.smallImageKey;
  218. } else if (document.location.pathname.includes("/members")) {
  219. if (document.URL.includes("filter-user-sort=")) {
  220. [title] = document.URL.split("filter-user-sort=")[1].split("&");
  221. switch (title) {
  222. case "1":
  223. presenceData.details = "Forums, Viewing list of";
  224. presenceData.state = "members in alphabetical order";
  225. delete presenceData.smallImageKey;
  226. break;
  227. case "2":
  228. presenceData.details = "Forums, Viewing list of";
  229. presenceData.state = "members with most messages";
  230. delete presenceData.smallImageKey;
  231. break;
  232. case "3":
  233. presenceData.details = "Forums, Viewing list of";
  234. presenceData.state = "members which are online";
  235. delete presenceData.smallImageKey;
  236. break;
  237. case "4":
  238. presenceData.details = "Forums, Viewing the list";
  239. presenceData.state = "members sorted by newest";
  240. delete presenceData.smallImageKey;
  241. break;
  242. case "5":
  243. presenceData.details = "Forums, Viewing the list";
  244. presenceData.state = "members sorted by oldest";
  245. delete presenceData.smallImageKey;
  246. break;
  247. }
  248. } else if (
  249. document.querySelector(
  250. "#content > section > section > div.p-user-info > ul.p-user-details > li.username"
  251. ) !== null
  252. ) {
  253. user = document.querySelector(
  254. "#content > section > section > div.p-user-info > ul.p-user-details > li.username"
  255. );
  256. presenceData.details = "Forums, Viewing user:";
  257. presenceData.state = (user as HTMLElement).textContent;
  258. delete presenceData.smallImageKey;
  259. } else {
  260. presenceData.details = "Forums, Viewing list of";
  261. presenceData.state = "members which are online";
  262. delete presenceData.smallImageKey;
  263. }
  264. } else {
  265. presenceData.details = "Forums, Browsing...";
  266. delete presenceData.state;
  267. delete presenceData.smallImageKey;
  268. }
  269. } else if (
  270. document.querySelector(
  271. "#content > section > div.featured-site-info-container > div > h2"
  272. ) !== null
  273. ) {
  274. title = document.querySelector(
  275. "#content > section > div.featured-site-info-container > div > h2"
  276. );
  277. presenceData.details = "Viewing game:";
  278. presenceData.state = (title as HTMLElement).textContent;
  279. delete presenceData.smallImageKey;
  280. } else presence.setActivity();
  281. });