presence.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. const presence = new Presence({
  2. clientId: "863345026498428968",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. presence.on("UpdateData", async () => {
  6. const presenceData: PresenceData = {
  7. largeImageKey:
  8. "https://cdn.rcd.gg/PreMiD/websites/W/Watch2Gether/assets/logo.png",
  9. startTimestamp: browsingTimestamp,
  10. },
  11. { hostname, pathname } = document.location;
  12. if (hostname === "w2g.tv") {
  13. if (pathname === "/") presenceData.details = "At Homepage";
  14. else if (pathname.startsWith("/rooms/")) {
  15. const playerTime = document.querySelectorAll<HTMLSpanElement>(
  16. "#player-time > span"
  17. ),
  18. invite = document.querySelector<HTMLInputElement>(
  19. "#w2g-top-inviteurl > input"
  20. ),
  21. chatMessages = [
  22. ...document.querySelectorAll<HTMLDivElement>(
  23. "body > div.w2g-main-container.w2g-bind-layout > div.w2g-main-lower > div.w2g-main-right > div.w2g-content-right > div.w2g-menu-tab.w2g-chat.w2g-messages.w2g-panel-bottom > div.w2g-chat-messages.w2g-messages-container.w2g-scroll-vertical > div"
  24. ),
  25. ].reverse();
  26. let title: string;
  27. for (const msg of chatMessages) {
  28. if (msg.querySelector(".w2g-chat-item-actions")) {
  29. const chatBubble: HTMLDivElement =
  30. msg.querySelector(".w2g-chat-bubble");
  31. title = chatBubble.textContent.substring(
  32. 0,
  33. chatBubble.textContent.indexOf("\n")
  34. );
  35. break;
  36. }
  37. }
  38. presenceData.details = `Watching ${title}`;
  39. presenceData.state = `${
  40. document.querySelectorAll("div.w2g-user-name").length
  41. } users in the room`;
  42. if (
  43. playerTime.length === 2 &&
  44. !document.querySelector(
  45. "div.w2g-player-menu.w2g-player > div.ui.inverted.tiny.menu > a > i.play"
  46. )
  47. ) {
  48. [presenceData.startTimestamp, presenceData.endTimestamp] =
  49. presence.getTimestamps(
  50. presence.timestampFromFormat(playerTime[0].textContent),
  51. presence.timestampFromFormat(playerTime[1].textContent)
  52. );
  53. }
  54. if (invite) {
  55. presenceData.buttons = [
  56. {
  57. label: "Join Room",
  58. url: invite.value,
  59. },
  60. ];
  61. }
  62. } else if (pathname.startsWith("/users/")) {
  63. if (pathname.includes("edit"))
  64. presenceData.details = "Editing user profile";
  65. else presenceData.details = "Viewing user rooms";
  66. } else {
  67. switch (pathname) {
  68. case "/auth/sign_in": {
  69. presenceData.details = "Signing In";
  70. break;
  71. }
  72. case "/auth/sign_up": {
  73. presenceData.details = "Signing Up";
  74. break;
  75. }
  76. case "/pages/plus": {
  77. presenceData.details = "Checking w2g+ plans";
  78. break;
  79. }
  80. case "/pages/leave":
  81. {
  82. presenceData.details = "Left room";
  83. // No default
  84. }
  85. break;
  86. }
  87. }
  88. } else if (hostname === "community.w2g.tv") {
  89. if (pathname === "/") presenceData.details = "At Community homepage";
  90. else if (pathname.startsWith("/t/")) {
  91. const title: HTMLAnchorElement = document.querySelector("a.fancy-title");
  92. if (title) {
  93. presenceData.details = "Looking at thread";
  94. presenceData.state = title.textContent;
  95. }
  96. } else if (pathname.startsWith("/u/")) {
  97. const username: HTMLHeadingElement =
  98. document.querySelector("h1.full-name");
  99. if (username)
  100. presenceData.details = `Looking at user ${username.textContent}`;
  101. } else {
  102. presenceData.details = `Looking at ${document.title.substring(
  103. 0,
  104. document.title.indexOf("-")
  105. )}`;
  106. }
  107. }
  108. if (presenceData.details) presence.setActivity(presenceData);
  109. else presence.setActivity();
  110. });