presence.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. const presence = new Presence({
  2. clientId: "1078446138966954085",
  3. });
  4. const enum Assets {
  5. Logo = "https://cdn.rcd.gg/PreMiD/websites/C/Chessly/assets/logo.png",
  6. }
  7. let browsingTimestamp = Math.floor(Date.now() / 1000),
  8. oldPath: string = null;
  9. presence.on("UpdateData", async () => {
  10. const { pathname, hostname, href } = document.location;
  11. if (oldPath !== pathname) {
  12. browsingTimestamp = Math.floor(Date.now() / 1000);
  13. oldPath = pathname;
  14. }
  15. const presenceData: PresenceData = {
  16. largeImageKey: Assets.Logo,
  17. startTimestamp: browsingTimestamp,
  18. },
  19. pathList = pathname.split("/").filter(path => path !== "");
  20. if (hostname === "chessly.com") {
  21. switch (true) {
  22. case /\/courses(\/|$)/.test(pathname): {
  23. const i = pathList.indexOf("courses");
  24. if (pathList[i + 1]) {
  25. const courseImage = document.querySelector<HTMLImageElement>(
  26. "[class*='_imageWrapper'] img"
  27. );
  28. switch (pathList[i + 2]) {
  29. case "gift-checkout":
  30. case "checkout": {
  31. presenceData.details = "Purchasing a course";
  32. presenceData.state = courseImage.alt;
  33. presenceData.largeImageKey = courseImage.src;
  34. break;
  35. }
  36. case "lessons": {
  37. presenceData.details = "Doing a lesson";
  38. presenceData.state = `${[
  39. ...document.querySelectorAll<HTMLAnchorElement>(
  40. "[class*='UserViewLessonHeader'] a[class*='UserViewLessonHeader_breadcrumbItem']"
  41. ),
  42. ]
  43. .map(e => e.textContent)
  44. .join(", ")} - ${
  45. document.querySelector<HTMLDivElement>(
  46. "header > [class*='UserViewLessonHeader'] > [class*='UserViewLessonHeader']"
  47. ).textContent
  48. }`;
  49. break;
  50. }
  51. default: {
  52. presenceData.details = "Viewing a course";
  53. presenceData.state = document.querySelector("h1").textContent;
  54. presenceData.largeImageKey = courseImage.src;
  55. }
  56. }
  57. } else presenceData.details = "Browsing courses";
  58. break;
  59. }
  60. case /\/games\//.test(pathname): {
  61. if (
  62. document.querySelector<HTMLButtonElement>(
  63. "[class*='PrimaryActionButton']"
  64. )?.textContent === "Play"
  65. ) {
  66. presenceData.details = "Preparing to play a game";
  67. presenceData.state = document.querySelector("h1").textContent;
  68. } else {
  69. presenceData.details = "Playing a game";
  70. presenceData.state = document.querySelector("h1").textContent;
  71. }
  72. break;
  73. }
  74. case pathList[0] === "dashboard": {
  75. switch (pathList[1]) {
  76. case "analysis": {
  77. presenceData.details = "Analyzing a game";
  78. break;
  79. }
  80. case "settings": {
  81. presenceData.details = "Managing account settings";
  82. break;
  83. }
  84. default: {
  85. presenceData.details = "Browsing the dashboard";
  86. }
  87. }
  88. break;
  89. }
  90. case pathList[0] === "faq": {
  91. presenceData.details = "Reading the FAQ";
  92. break;
  93. }
  94. case pathList[0] === "login": {
  95. presenceData.details = "Logging in";
  96. break;
  97. }
  98. default: {
  99. presenceData.details = "Browsing";
  100. }
  101. }
  102. } else if (hostname === "feedback.chessly.com") {
  103. switch (pathList[0] ?? "") {
  104. case "": {
  105. presenceData.details = "Browsing feedback and suggestions";
  106. break;
  107. }
  108. case "suggestions": {
  109. if (pathList[1] === "add") {
  110. presenceData.details = "Creating a suggestion";
  111. presenceData.state =
  112. document.querySelector<HTMLInputElement>("#suggestionTitle").value;
  113. } else {
  114. presenceData.details = "Viewing a suggestion";
  115. presenceData.state = document.querySelector("h1").textContent;
  116. presenceData.buttons = [{ label: "View Suggestion", url: href }];
  117. }
  118. }
  119. }
  120. }
  121. if (presenceData.details) presence.setActivity(presenceData);
  122. else presence.setActivity();
  123. });