presence.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. const presence = new Presence({
  2. clientId: "1014999001801691246",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. presence.on("UpdateData", async () => {
  6. const presenceData: PresenceData = {
  7. startTimestamp: browsingTimestamp,
  8. largeImageKey:
  9. "https://cdn.rcd.gg/PreMiD/websites/H/Heroku/assets/logo.png",
  10. },
  11. { hostname, pathname, search } = window.location,
  12. showNames = await presence.getSetting<boolean>("showNames");
  13. switch (hostname) {
  14. case "www.heroku.com": {
  15. presenceData.details = "Browsing";
  16. if (pathname === "/home") presenceData.state = "Home page";
  17. else {
  18. presenceData.state = document.title.match(
  19. /(.*?)(?=(?: \| Heroku|$))/
  20. )[1];
  21. }
  22. break;
  23. }
  24. case "blog.heroku.com": {
  25. presenceData.details = "Browsing blog posts";
  26. if (pathname !== "/") {
  27. presenceData.state = document.title.match(
  28. /(.*?)(?=(?: \| Heroku|$))/
  29. )[1];
  30. }
  31. break;
  32. }
  33. case "brand.heroku.com": {
  34. presenceData.details = "Browsing";
  35. presenceData.state = "Brand";
  36. break;
  37. }
  38. case "dashboard.heroku.com": {
  39. presenceData.details = "Viewing Dashboard";
  40. if (pathname === "/apps") presenceData.state = "Apps";
  41. else if (pathname === "/new-app")
  42. presenceData.details = "Creating new app";
  43. else if (pathname.startsWith("/account")) {
  44. presenceData.details = "Managing account";
  45. switch (pathname) {
  46. case "/acount": {
  47. presenceData.state = "Account settings";
  48. break;
  49. }
  50. case "/account/applications": {
  51. presenceData.state = "Application settings";
  52. break;
  53. }
  54. case "/account/billing": {
  55. presenceData.state = "Billing settings";
  56. break;
  57. }
  58. }
  59. } else if (pathname.startsWith("/apps/")) {
  60. if (showNames) {
  61. presenceData.details = `Managing app: '${
  62. document.title.match(/(.*?)(?=(?: \| Heroku|$))/)[1]
  63. }'`;
  64. } else presenceData.details = "Managing app";
  65. const [subpath, subpath2] = pathname.split("/").slice(3);
  66. if (subpath) {
  67. if (subpath === "activity") {
  68. presenceData.state = "Activity";
  69. if (subpath2 === "builds") presenceData.state = "Viewing build log";
  70. } else {
  71. presenceData.state = `${subpath[0].toUpperCase()}${subpath.slice(
  72. 1
  73. )}`;
  74. }
  75. } else presenceData.state = "Overview";
  76. } else if (pathname === "/provision-addon") {
  77. presenceData.details = "Provisioning an addon";
  78. presenceData.state = document.querySelector(
  79. ".new-app-view > div > div > div:nth-of-type(2) > div:nth-of-type(2)"
  80. ).textContent;
  81. }
  82. break;
  83. }
  84. case "data.heroku.com": {
  85. presenceData.details = "Browsing Data";
  86. if (pathname === "/") presenceData.state = "Looking at datastores";
  87. else if (pathname === "/dataclips")
  88. presenceData.state = "Looking at dataclips";
  89. else if (pathname.startsWith("/datastores/")) {
  90. if (showNames) {
  91. presenceData.state = `Viewing datastore '${document.title.match(
  92. /(.*?)(?=(?: \| Heroku Data|$))/
  93. )}'`;
  94. } else presenceData.state = "Viewing a datastore";
  95. } else if (pathname.startsWith("/dataclips/")) {
  96. if (showNames) {
  97. presenceData.state = `Viewing dataclip '${document.title.match(
  98. /(.*?)(?=(?: \| Heroku Data|$))/
  99. )}'`;
  100. } else presenceData.state = "Viewing a dataclip";
  101. }
  102. break;
  103. }
  104. case "devcenter.heroku.com": {
  105. presenceData.details = "Browsing Dev Center";
  106. if (pathname === "/") presenceData.state = "Home page";
  107. else {
  108. presenceData.state = document.title.match(
  109. /(.*?)(?=(?: \| Heroku Dev Center|$))/
  110. )[1];
  111. }
  112. break;
  113. }
  114. case "elements.heroku.com": {
  115. presenceData.details = "Browsing Elements";
  116. presenceData.state = document.title.match(
  117. /(.*?)(?=(?: - Heroku Elements|$))/
  118. )[1];
  119. break;
  120. }
  121. case "help.heroku.com": {
  122. presenceData.details = "Browsing Heroku Support";
  123. if (/^\/\d+$/.test(pathname)) {
  124. presenceData.details = "Viewing Support Ticket";
  125. presenceData.state = document.querySelector("h2").textContent;
  126. } else if (
  127. pathname === "/tickets/new" ||
  128. (pathname === "/" && new URLSearchParams(search).get("t") === "true")
  129. )
  130. presenceData.state = "Creating a new ticket";
  131. else if (pathname === "/tickets") presenceData.state = "Viewing tickets";
  132. else {
  133. presenceData.state =
  134. document.querySelector("h2")?.textContent ||
  135. document.querySelector("h1")?.textContent ||
  136. document.title;
  137. }
  138. break;
  139. }
  140. case "status.heroku.com": {
  141. presenceData.details = "Viewing Heroku Status";
  142. if (pathname === "/incidents") presenceData.state = "Past incidents";
  143. else if (pathname.startsWith("/incidents/")) {
  144. presenceData.state = document.title.match(
  145. /(.*?)(?=(?: \| Heroku Status|$))/
  146. )[1];
  147. } else {
  148. const [appStatus, dataStatus, toolsStatus] = document.querySelectorAll(
  149. ".container.body-container > div a > .status-summary__description"
  150. );
  151. presenceData.state = `Apps: ${appStatus.textContent.replace(/\s/g, "")}
  152. Data: ${dataStatus.textContent.replace(/\s/g, "")}
  153. Tools: ${toolsStatus.textContent.replace(/\s/g, "")}`;
  154. }
  155. break;
  156. }
  157. }
  158. if (presenceData.details) presence.setActivity(presenceData);
  159. });