presence.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. const presence = new Presence({
  2. clientId: "920135248006754394",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000),
  5. pathData = {
  6. user: [
  7. {
  8. name: "supports",
  9. state: "My subscriptions history",
  10. },
  11. {
  12. name: "edit",
  13. state: "Editing my details",
  14. },
  15. ],
  16. dashboard: [
  17. {
  18. name: "overview",
  19. state: "My overview",
  20. },
  21. {
  22. name: "onboarding",
  23. state: "Starting up",
  24. },
  25. {
  26. name: "goal",
  27. state: "My goal",
  28. },
  29. {
  30. name: "tiers",
  31. state: "My support tiers",
  32. paths: [
  33. {
  34. name: "setup",
  35. state: "Setting up supporter tiers...",
  36. },
  37. {
  38. name: "add",
  39. state: "Adding new supporter tier...",
  40. },
  41. {
  42. name: "*",
  43. state: "Editing supporter tier...",
  44. },
  45. ],
  46. },
  47. {
  48. name: "posts",
  49. state: "My posts",
  50. paths: [
  51. {
  52. name: "add",
  53. state: "Making new post...",
  54. },
  55. {
  56. name: "*",
  57. state: "Editing my post...",
  58. },
  59. ],
  60. },
  61. {
  62. name: "vouchers",
  63. state: "My vouchers",
  64. paths: [
  65. {
  66. name: "add",
  67. state: "Making new voucher...",
  68. },
  69. {
  70. name: "*",
  71. state: "Editing my voucher...",
  72. },
  73. ],
  74. },
  75. {
  76. name: "overlay",
  77. state: "Stream overlay",
  78. },
  79. {
  80. name: "supports",
  81. state: "Supports history",
  82. },
  83. {
  84. name: "bank",
  85. state: "Payment",
  86. },
  87. {
  88. name: "profile",
  89. state: "Editing profile",
  90. },
  91. {
  92. name: "settings",
  93. state: "Settings",
  94. },
  95. ],
  96. },
  97. getUserHeader = ".q-page-container.q-pb-xl.main",
  98. getUserHeaderHome =
  99. ".title.q-toolbar__title.ellipsis a.no-underline.text-primary.router-link-active",
  100. // This function act like switch function but for objects Array (yea its a lil bit complicated)
  101. stateSetter = (
  102. paths: string[],
  103. arrayPath: {
  104. name: string;
  105. state: string;
  106. paths?: {
  107. name?: string;
  108. state?: string;
  109. }[];
  110. }[]
  111. ): string => {
  112. const result = arrayPath.find(p => p.name === paths[1]);
  113. return (
  114. result.paths?.find(p => {
  115. const b: boolean = p.name === (paths[2] ?? "");
  116. if (!b && !!paths[2]) return p.name === "*";
  117. return b;
  118. })?.state ?? result.state
  119. );
  120. };
  121. presence.on("UpdateData", () => {
  122. const presenceData: PresenceData = {
  123. largeImageKey:
  124. "https://cdn.rcd.gg/PreMiD/websites/K/KaryaKarsa/assets/logo.png",
  125. startTimestamp: browsingTimestamp,
  126. },
  127. paths: string[] = window.location.pathname.split("/").splice(1);
  128. switch (paths[0].toLowerCase()) {
  129. case "":
  130. presenceData.details = "Looking at the home page";
  131. break;
  132. case "feed":
  133. presenceData.details = "Looking at the feeds";
  134. break;
  135. case "profile":
  136. presenceData.details = "Looking at their profile";
  137. break;
  138. case "about":
  139. case "terms":
  140. presenceData.details = "Reading Terms of Service";
  141. break;
  142. case "dashboard":
  143. presenceData.details = "Looking at the dashboard";
  144. presenceData.state = stateSetter(paths, pathData.dashboard);
  145. break;
  146. case "discover": {
  147. presenceData.details = "Looking at the discover / search";
  148. const searchBar = document.querySelector<HTMLInputElement>(
  149. ".q-field.q-input.q-field--filled.q-field--square.q-field--float.q-validation-component input.q-field__native.q-placeholder"
  150. );
  151. if (searchBar?.value)
  152. presenceData.state = `Searching for "${searchBar.value}"`;
  153. break;
  154. }
  155. case "user":
  156. presenceData.details = "Looking at My detail";
  157. presenceData.state = stateSetter(paths, pathData.user);
  158. break;
  159. default: {
  160. presenceData.details = "Browsing pages";
  161. if (!paths[0]) presenceData.details = "Looking at the home page";
  162. // if user Looking at user page
  163. {
  164. const titleUser = document.querySelector<HTMLElement>(
  165. `${getUserHeader} .q-px-md.q-py-md div`
  166. ),
  167. roleUser = document.querySelector<HTMLElement>(
  168. `${getUserHeader} .q-px-md.q-py-md .text-caption.text-grey-7`
  169. );
  170. if (titleUser && roleUser) {
  171. presenceData.details = titleUser.textContent;
  172. presenceData.state = roleUser.textContent;
  173. presenceData.buttons = [
  174. {
  175. label: "Visit Creator",
  176. url: window.location.href,
  177. },
  178. ];
  179. }
  180. }
  181. // if user Looking at user post
  182. {
  183. const titleUser =
  184. document.querySelector<HTMLElement>(getUserHeaderHome),
  185. tagUser = document.querySelector<HTMLElement>(
  186. "#q-app > div > div > div.q-page-container.main.q-pb-xl.bordered-desktop.post-page > div.post-date.text-body2.q-px-md.q-pt-md.q-pb-sm.post-content > a"
  187. ),
  188. postTitle = document.querySelector<HTMLElement>(
  189. "#q-app > div > div > div.q-page-container.main.q-pb-xl.bordered-desktop.post-page > h1"
  190. );
  191. if (titleUser && tagUser && postTitle) {
  192. presenceData.details = `${titleUser.textContent} (${tagUser.textContent})`;
  193. presenceData.state = postTitle.textContent;
  194. presenceData.buttons = [
  195. {
  196. label: "View post",
  197. url: window.location.href,
  198. },
  199. ];
  200. }
  201. }
  202. }
  203. }
  204. presence.setActivity(presenceData);
  205. });