presence.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. const presence = new Presence({
  2. clientId: "939893082546114611",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/C/Character.AI/assets/logo.png",
  7. }
  8. presence.on("UpdateData", async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: Assets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. },
  13. [time, buttons] = await Promise.all([
  14. presence.getSetting<boolean>("time"),
  15. presence.getSetting<boolean>("buttons"),
  16. ]),
  17. { pathname, href, origin } = document.location,
  18. button = {
  19. label: "View Page",
  20. url: href,
  21. };
  22. switch (pathname.split("/")[1]) {
  23. case "": {
  24. presenceData.details = "Browsing Homepage";
  25. break;
  26. }
  27. case "chat2": {
  28. presenceData.details = "Chatting with";
  29. presenceData.state = document
  30. .querySelector(".swiper-no-swiping")
  31. .parentElement.firstChild.textContent.replace("c.ai", "");
  32. presenceData.buttons = [button];
  33. break;
  34. }
  35. case "chat": {
  36. presenceData.details = "Chatting with";
  37. presenceData.state =
  38. document.querySelector(".chattitle")?.childNodes[1]?.textContent ||
  39. document.title.split("|")[0].replace("Chat with", "").trim();
  40. presenceData.buttons = [button];
  41. break;
  42. }
  43. case "feed": {
  44. presenceData.details = "Browsing feed";
  45. break;
  46. }
  47. case "post": {
  48. presenceData.details = "Viewing post";
  49. presenceData.state = document.querySelector(
  50. `a[href^='${href.replace(origin, "")}']`
  51. ).textContent;
  52. presenceData.buttons = [button];
  53. break;
  54. }
  55. case "public-profile": {
  56. presenceData.details = "Viewing profile";
  57. presenceData.state =
  58. document.querySelector("span").childNodes[1].textContent;
  59. presenceData.buttons = [button];
  60. break;
  61. }
  62. case "chats": {
  63. presenceData.details = "Browsing chats";
  64. break;
  65. }
  66. case "profile": {
  67. const { pathname } = document.location;
  68. presenceData.details = "Viewing profile";
  69. presenceData.state = `for ${pathname.split("/")[2]}`;
  70. break;
  71. }
  72. case "character": {
  73. presenceData.details = "Creating character";
  74. break;
  75. }
  76. case "editing": {
  77. presenceData.details = "Editing character";
  78. break;
  79. }
  80. }
  81. if (!time) {
  82. delete presenceData.startTimestamp;
  83. delete presenceData.endTimestamp;
  84. }
  85. if (!buttons && presenceData.buttons) delete presenceData.buttons;
  86. presence.setActivity(presenceData);
  87. });