presence.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. const presence = new Presence({
  2. clientId: "684570342085099546",
  3. }),
  4. strings = presence.getStrings({
  5. browse: "general.browsing",
  6. }),
  7. getElement = (query: string): string => {
  8. const element = document.querySelector(query);
  9. if (element) return element.textContent.replace(/^\s+|\s+$/g, "");
  10. else return;
  11. };
  12. const enum Assets {
  13. Logo = "https://cdn.rcd.gg/PreMiD/websites/B/Board%20Game%20Online/assets/logo.png",
  14. }
  15. function setObject(path: string) {
  16. switch (path) {
  17. case "/": {
  18. return {
  19. details: "Browsing",
  20. };
  21. }
  22. case "forgot_login": {
  23. return {
  24. details: "Forgot Login",
  25. };
  26. }
  27. case "register": {
  28. return {
  29. details: "Registering...",
  30. };
  31. }
  32. case "newgame": {
  33. return {
  34. details: "Creating",
  35. state: "New Game",
  36. };
  37. }
  38. case "joingame": {
  39. return {
  40. details: "Joining",
  41. state: "New Game",
  42. };
  43. }
  44. case "shop": {
  45. return {
  46. details: "Viewing",
  47. state: "Shop",
  48. };
  49. }
  50. case "donations": {
  51. return {
  52. details: "Viewing",
  53. state: "Donations",
  54. };
  55. }
  56. case "info": {
  57. return {
  58. details: "Viewing",
  59. state: "Game Info",
  60. };
  61. }
  62. case "recruit": {
  63. return {
  64. details: "Viewing",
  65. state: "Recruit a Friend",
  66. };
  67. }
  68. case "terms": {
  69. return {
  70. details: "Viewing",
  71. state: "Terms of Service",
  72. };
  73. }
  74. case "privacy": {
  75. return {
  76. details: "Viewing",
  77. state: "Privacy Policy",
  78. };
  79. }
  80. case "contact": {
  81. return {
  82. details: "Viewing",
  83. state: "Contact",
  84. };
  85. }
  86. case "/forum": {
  87. return {
  88. details: "Viewing Page",
  89. state: "Forums",
  90. };
  91. }
  92. }
  93. }
  94. presence.on("UpdateData", async () => {
  95. const presenceData: PresenceData = {
  96. largeImageKey: Assets.Logo,
  97. },
  98. path = location.pathname,
  99. query = location.search,
  100. detailsObj = setObject(path);
  101. if (location.host === "www.boardgame-online.com") {
  102. if (path || (query && query.split("page=")[1].split("&")[0])) {
  103. (presenceData.details = detailsObj.details),
  104. (presenceData.state = detailsObj.state);
  105. }
  106. const header = getElement(".page_wrapper.show > .page_content > h2");
  107. if (header) {
  108. presenceData.details = "Viewing";
  109. presenceData.state = header;
  110. }
  111. const profile = getElement(
  112. ".page_wrapper.show > .page_content > #profile_name_title > .userName"
  113. );
  114. if (profile) {
  115. presenceData.details = "Viewing Profile";
  116. presenceData.state = profile;
  117. }
  118. } else {
  119. const playerCount =
  120. document.querySelector(".rankingTable").childElementCount;
  121. presenceData.details = "Playing Game";
  122. presenceData.state = document.title;
  123. if (playerCount)
  124. presenceData.state = `${document.title} (${playerCount - 1} Players)`;
  125. }
  126. if (presenceData.details) {
  127. if ((presenceData.details as string).match("(Browsing|Viewing)")) {
  128. presenceData.smallImageKey = Assets.Reading;
  129. presenceData.smallImageText = (await strings).browse;
  130. }
  131. presence.setActivity(presenceData);
  132. } else presence.setActivity();
  133. });