presence.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /* Global variables */
  2. const presence = new Presence({
  3. clientId: "772597423188082729",
  4. });
  5. let profile: string;
  6. function getUserName(): void {
  7. // Get your own username
  8. const tempusername = document.querySelector(".user-info > h6");
  9. if (tempusername) profile = tempusername.textContent;
  10. }
  11. async function getProfileDetails() {
  12. // Gets profile from the user you're viewing.
  13. const presenceData: PresenceData = {
  14. largeImageKey:
  15. "https://cdn.rcd.gg/PreMiD/websites/V/VRChat/assets/logo.png",
  16. },
  17. privacymode = await presence.getSetting<boolean>("privacy"),
  18. viewingprofilename =
  19. document.querySelector("div.col-md-12 > h2").textContent;
  20. if (privacymode === false) {
  21. if (
  22. document
  23. .querySelector(
  24. "div.w-100.btn-group-lg.btn-group-vertical > button.btn.btn-primary"
  25. )
  26. .textContent.includes("Unfriend")
  27. ) {
  28. presenceData.details = "Viewing Friend:";
  29. presenceData.state = viewingprofilename;
  30. presence.setActivity(presenceData);
  31. } else {
  32. presenceData.details = "Viewing User:";
  33. presenceData.state = viewingprofilename;
  34. presence.setActivity(presenceData);
  35. }
  36. } else {
  37. presenceData.details = "Viewing User";
  38. presence.setActivity(presenceData);
  39. }
  40. }
  41. /* Main eventHandler */
  42. presence.on("UpdateData", async () => {
  43. const presenceData: PresenceData = {
  44. largeImageKey:
  45. "https://cdn.rcd.gg/PreMiD/websites/V/VRChat/assets/logo.png",
  46. },
  47. privacymode = await presence.getSetting<boolean>("privacy");
  48. switch (document.location.hostname) {
  49. case "hello.vrchat.com": {
  50. presenceData.details = "Landing Page:";
  51. /* Home Page */
  52. switch (document.location.pathname) {
  53. case "/":
  54. presenceData.state = "Main Page";
  55. presence.setActivity(presenceData);
  56. break;
  57. case "/community-guidelines":
  58. presenceData.state = "Community Guidelines";
  59. presence.setActivity(presenceData);
  60. break;
  61. case "/events":
  62. presenceData.state = "Events Calendar";
  63. presence.setActivity(presenceData);
  64. break;
  65. case "/legal":
  66. /* Viewing ToU*/
  67. presenceData.state = "EULA";
  68. presence.setActivity(presenceData);
  69. break;
  70. case "/privacy":
  71. /* Viewing Privacy*/
  72. presenceData.state = "Privacy Policy";
  73. presence.setActivity(presenceData);
  74. break;
  75. case "/community-faq":
  76. presenceData.state = "Community FAQ";
  77. presence.setActivity(presenceData);
  78. break;
  79. case "/developer-faq":
  80. presenceData.state = "Developer FAQ";
  81. presence.setActivity(presenceData);
  82. break;
  83. case "/careers":
  84. presenceData.state = "Careers";
  85. presence.setActivity(presenceData);
  86. break;
  87. case "/press":
  88. presenceData.state = "Press";
  89. presence.setActivity(presenceData);
  90. break;
  91. case "/contact":
  92. presenceData.state = "Contact";
  93. presence.setActivity(presenceData);
  94. break;
  95. case "/vrchatplus":
  96. presenceData.state = "VRChat Plus";
  97. presence.setActivity(presenceData);
  98. break;
  99. }
  100. break;
  101. }
  102. case "vrchat.com": {
  103. if (document.location.pathname.includes("/home")) {
  104. if (document.location.pathname.includes("/launch")) {
  105. presenceData.details = "Launching world instance";
  106. presence.setActivity(presenceData);
  107. } else {
  108. /* Portal */
  109. if (privacymode === false) {
  110. getUserName();
  111. presenceData.state = `User: ${profile}`;
  112. }
  113. if (document.location.pathname.includes("/worlds")) {
  114. presenceData.details = "Browsing Worlds";
  115. presence.setActivity(presenceData);
  116. } else if (document.location.pathname.includes("/world")) {
  117. /* Viewing a specific world*/
  118. presenceData.details = "Viewing World:";
  119. if (privacymode === false) {
  120. presenceData.state =
  121. document.querySelector(".col-md-12 > h3").textContent;
  122. } else presenceData.details = "Viewing a world";
  123. presence.setActivity(presenceData);
  124. } else if (document.location.pathname.includes("/avatars")) {
  125. /* Viewing Avatars*/
  126. presenceData.details = "Browsing Avatars";
  127. presence.setActivity(presenceData);
  128. } else if (document.location.pathname.includes("/messages")) {
  129. /* Viewing Messages*/
  130. presenceData.details = "Viewing Messages";
  131. presence.setActivity(presenceData);
  132. } else if (document.location.pathname.includes("/user")) {
  133. /* Viewing a specific user*/
  134. getProfileDetails();
  135. } else if (document.location.pathname.includes("/profile")) {
  136. /* Viewing Profile*/
  137. presenceData.details = "Viewing Profile";
  138. presence.setActivity(presenceData);
  139. } else if (document.location.pathname.includes("/search")) {
  140. /* Searching */
  141. if (!privacymode) {
  142. presenceData.details = "Searching:";
  143. presenceData.state = window.location
  144. .toString()
  145. .substr(window.location.toString().lastIndexOf("/") + 1);
  146. presence.setActivity(presenceData);
  147. } else {
  148. presenceData.details = "Searching";
  149. presence.setActivity(presenceData);
  150. }
  151. } else if (document.location.pathname.includes("/avatar")) {
  152. presenceData.details = "Viewing Avatar:";
  153. if (privacymode === false) {
  154. presenceData.state = `${
  155. document.querySelector("div.col-12 > h3").textContent
  156. } ${
  157. document.querySelector(
  158. "div.col-12.col-md-8 > h4 > span > small"
  159. ).textContent
  160. }`;
  161. } else presenceData.details = "Viewing an avatar";
  162. presence.setActivity(presenceData);
  163. } else if (
  164. document.location.pathname.includes("/playermoderations")
  165. ) {
  166. /* Viewing blocks & mutes*/
  167. presenceData.details = "Viewing Blocks & Mutes";
  168. presence.setActivity(presenceData);
  169. } else if (document.location.pathname.includes("/accountlink")) {
  170. /* Viewing the account link page*/
  171. presenceData.details = "Merging Account";
  172. presence.setActivity(presenceData);
  173. } else if (document.location.pathname.includes("/download")) {
  174. /* Viewing Download Page*/
  175. presenceData.details = "Download Page";
  176. presence.setActivity(presenceData);
  177. } else if (
  178. document.location.pathname.includes("/login") /* Login Page*/
  179. ) {
  180. presenceData.state = "Logging in";
  181. presence.setActivity(presenceData);
  182. } else if (document.location.pathname.includes("/register")) {
  183. /* Register Page*/
  184. presenceData.state = "Creating an account";
  185. presence.setActivity(presenceData);
  186. } else if (document.location.pathname.includes("/password")) {
  187. /* Password Page*/
  188. presenceData.state = "Resetting Password";
  189. presence.setActivity(presenceData);
  190. } else if (document.location.pathname.includes("/twofactorauth")) {
  191. /* 2FA Page*/
  192. presenceData.state = "Awaiting Authentication";
  193. presence.setActivity(presenceData);
  194. } else {
  195. presenceData.details = "Home Page";
  196. presence.setActivity(presenceData);
  197. }
  198. }
  199. }
  200. break;
  201. }
  202. case "feedback.vrchat.com": {
  203. if (!privacymode) {
  204. if (document.location.pathname.includes("/p/")) {
  205. /* Viewing a post */
  206. presenceData.details = "Viewing feedback post:";
  207. presenceData.state =
  208. document.querySelector("div.postTitle").textContent;
  209. presence.setActivity(presenceData);
  210. } else if (document.location.pathname === "/") {
  211. presenceData.details = "Browsing feedback...";
  212. presence.setActivity(presenceData);
  213. } else {
  214. /* Not viewing a post, display category */
  215. presenceData.details = "Browsing feedback...";
  216. presenceData.state = document.querySelector(
  217. "div.optionContent > div"
  218. ).textContent;
  219. presence.setActivity(presenceData);
  220. }
  221. } else {
  222. presenceData.details = "Browsing feedback...";
  223. presence.setActivity(presenceData);
  224. }
  225. break;
  226. }
  227. // No default
  228. }
  229. });