presence.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. const presence = new Presence({
  2. clientId: "1253713118803263568",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000);
  5. const enum Assets {
  6. Logo = "https://cdn.rcd.gg/PreMiD/websites/0-9/7tv/assets/logo.png",
  7. }
  8. async function getStrings() {
  9. return presence.getStrings(
  10. {
  11. viewHome: "general.viewHome",
  12. viewing: "general.viewing",
  13. search: "general.search",
  14. searchFor: "general.searchFor",
  15. store: "general.store",
  16. searchSomething: "general.searchSomething",
  17. viewPage: "general.viewPage",
  18. viewProfile: "general.viewProfile",
  19. viewAnUser: "general.viewAnUser",
  20. viewList: "general.viewList",
  21. readingADM: "general.readingADM",
  22. cookie: "general.cookie",
  23. upload: "youtube.upload",
  24. },
  25. await presence.getSetting<string>("lang").catch(() => "en")
  26. );
  27. }
  28. let strings: Awaited<ReturnType<typeof getStrings>>,
  29. oldLang: string = null;
  30. function textContent(tags: string) {
  31. return document.querySelector(tags)?.textContent?.trim();
  32. }
  33. function getImage(tags: string) {
  34. return document.querySelector<HTMLImageElement>(tags)?.src;
  35. }
  36. presence.on("UpdateData", async () => {
  37. const presenceData: PresenceData = {
  38. largeImageKey: Assets.Logo,
  39. startTimestamp: browsingTimestamp,
  40. },
  41. [newLang, privacy, showEmotes] = await Promise.all([
  42. presence.getSetting<string>("lang").catch(() => "en"),
  43. presence.getSetting<boolean>("privacy"),
  44. presence.getSetting<boolean>("showEmotes"),
  45. ]),
  46. { pathname, href } = document.location,
  47. path = pathname.split("/");
  48. if (oldLang !== newLang || !strings) {
  49. oldLang = newLang;
  50. strings = await getStrings();
  51. }
  52. function getQuery() {
  53. return new URL(href).searchParams.get("query");
  54. }
  55. switch (path[1]) {
  56. case "":
  57. presenceData.details = strings.viewHome;
  58. break;
  59. case "emotes":
  60. presenceData.details = privacy ? strings.searchSomething : strings.search;
  61. presenceData.smallImageKey = Assets.Search;
  62. presenceData.smallImageText = strings.search;
  63. if (!privacy && getQuery()) {
  64. presenceData.details = strings.searchFor;
  65. presenceData.state = getQuery();
  66. }
  67. if (path[2]) {
  68. switch (path[2]) {
  69. case "create":
  70. presenceData.details = strings.upload;
  71. presenceData.smallImageKey = Assets.Uploading;
  72. presenceData.smallImageText = strings.upload;
  73. break;
  74. default:
  75. if (!privacy) {
  76. presenceData.details = strings.viewPage;
  77. presenceData.state = textContent(".emote-name p");
  78. presenceData.smallImageKey = Assets.Viewing;
  79. presenceData.smallImageText = strings.viewing;
  80. if (showEmotes) {
  81. presenceData.largeImageKey = getImage(
  82. ".preview-size.is-large > img"
  83. );
  84. presenceData.smallImageKey = Assets.Logo;
  85. }
  86. }
  87. break;
  88. }
  89. }
  90. break;
  91. case "users":
  92. presenceData.details = privacy ? strings.viewAnUser : strings.viewProfile;
  93. presenceData.state = textContent(".user-card .username");
  94. presenceData.smallImageKey = Assets.Viewing;
  95. presenceData.smallImageText = strings.viewing;
  96. if (!privacy) {
  97. presenceData.largeImageKey =
  98. getImage(".user-card .user-picture-wrapper img") ?? Assets.Logo;
  99. presenceData.smallImageKey = Assets.Logo;
  100. }
  101. break;
  102. case "emote-sets":
  103. presenceData.details = strings.viewList;
  104. presenceData.state = textContent(".emote-set-wrapper > div > div > h3");
  105. presenceData.smallImageKey = Assets.Viewing;
  106. presenceData.smallImageText = strings.viewing;
  107. break;
  108. case "inbox":
  109. presenceData.details = strings.readingADM;
  110. presenceData.smallImageKey = Assets.Reading;
  111. presenceData.smallImageText = strings.readingADM;
  112. break;
  113. case "store":
  114. presenceData.details = strings.viewPage;
  115. presenceData.state = strings.store;
  116. presenceData.smallImageKey = Assets.Viewing;
  117. presenceData.smallImageText = strings.viewing;
  118. break;
  119. case "legal":
  120. presenceData.details = strings.viewPage;
  121. presenceData.state = strings.cookie;
  122. presenceData.smallImageKey = Assets.Reading;
  123. presenceData.smallImageText = strings.readingADM;
  124. break;
  125. }
  126. if (privacy) delete presenceData.state;
  127. presence.setActivity(presenceData);
  128. });