presence.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. const presence = new Presence({
  2. clientId: "868465354014359672",
  3. }),
  4. browsingTimestamp = Math.floor(Date.now() / 1000),
  5. setCookie = (name: string, value: string, days: number) => {
  6. let expires: string;
  7. if (days) {
  8. const date = new Date();
  9. date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
  10. expires = `; expires=${date.toUTCString()}`;
  11. } else expires = "";
  12. document.cookie = `${name}=${value}${expires}; path=/`;
  13. },
  14. getCookie = (name: string) => {
  15. const nameEQ = `${name}=`,
  16. ca = document.cookie.split(";");
  17. for (let c of ca) {
  18. while (c.charAt(0) === " ") c = c.substring(1, c.length);
  19. if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
  20. }
  21. return null;
  22. };
  23. presence.on("UpdateData", async () => {
  24. const presenceData: PresenceData = {
  25. largeImageKey:
  26. "https://cdn.rcd.gg/PreMiD/websites/R/ReadComicsOnline/assets/logo.png",
  27. startTimestamp: browsingTimestamp,
  28. },
  29. { pathname, href } = location,
  30. input = document.querySelector<HTMLInputElement>("input#keyword"),
  31. buttons = await presence.getSetting<boolean>("buttons"),
  32. cookies = await presence.getSetting<boolean>("cookies");
  33. if (cookies && input && input.value)
  34. setCookie("PMD_searchQuery", input.value, 1);
  35. switch (pathname) {
  36. case "/":
  37. presenceData.details = "Looking for something to read";
  38. break;
  39. case "/ComicList":
  40. presenceData.details = "Browsing Comic List";
  41. presenceData.state = "Sorted By Alphabet";
  42. break;
  43. case "/ComicList/MostPopular":
  44. presenceData.details = "Browsing Comic List";
  45. presenceData.state = "Sorted By Popularity";
  46. break;
  47. case "/ComicList/LatestUpdate":
  48. presenceData.details = "Browsing Comic List";
  49. presenceData.state = "Sorted By Latest Update";
  50. break;
  51. case "/Profile":
  52. presenceData.details = "Changing Profile Settings";
  53. break;
  54. case "/BookmarkList":
  55. presenceData.details = "Viewing Bookmarks";
  56. break;
  57. case "/Message/ReportError":
  58. presenceData.details = "Reporting Error";
  59. break;
  60. case "/Search/Comic": {
  61. if (cookies)
  62. presenceData.details = `Searching for ${getCookie("PMD_searchQuery")}`;
  63. else presenceData.details = "Searching";
  64. break;
  65. }
  66. case "/AdvanceSearch": {
  67. const comicName =
  68. document.querySelector<HTMLInputElement>("input#comicName"),
  69. include =
  70. document.querySelectorAll<HTMLAnchorElement>("label > a.include"),
  71. exclude =
  72. document.querySelectorAll<HTMLAnchorElement>("label > a.exclude"),
  73. status = document.querySelector<HTMLSelectElement>("select#status");
  74. presenceData.details = "Advanced Search";
  75. if (cookies) {
  76. if (comicName && comicName.value) {
  77. setCookie(
  78. "PMD_searchQuery",
  79. `Looking for title: ${comicName.value}`,
  80. 1
  81. );
  82. } else if (include.length > 0) {
  83. setCookie(
  84. "PMD_searchQuery",
  85. `Searching for Genre: ${include[0].textContent} ${
  86. include.length > 1 ? `and ${include.length - 1} more` : ""
  87. }`,
  88. 1
  89. );
  90. } else if (exclude.length > 0) {
  91. setCookie(
  92. "PMD_searchQuery",
  93. `Searching for all Genres except: ${exclude[0].textContent} ${
  94. exclude.length > 1 ? `and ${exclude.length - 1} more` : ""
  95. }`,
  96. 1
  97. );
  98. } else if (status) {
  99. setCookie(
  100. "PMD_searchQuery",
  101. `Looking for: ${status.selectedOptions[0].textContent} comics`,
  102. 1
  103. );
  104. } else {
  105. [presenceData.details, presenceData.state] =
  106. getCookie("PMD_searchQuery").split(":");
  107. }
  108. }
  109. break;
  110. }
  111. default:
  112. if (pathname.startsWith("/Genre")) {
  113. const barTitle = document.querySelector<HTMLDivElement>(".barTitle");
  114. if (barTitle)
  115. presenceData.details = `Looking for ${barTitle.textContent}`;
  116. if (pathname.includes("MostPopular"))
  117. presenceData.state = "Sorted By Popularity";
  118. else if (pathname.includes("LatestUpdate"))
  119. presenceData.state = "Sorted By Latest Update";
  120. else presenceData.state = "Sorted by Alphabet";
  121. } else if (pathname.startsWith("/Comic")) {
  122. if (document.querySelector("div#divImage")) {
  123. const title =
  124. document.querySelector<HTMLAnchorElement>("#navsubbar > p > a"),
  125. episode =
  126. document.querySelector<HTMLSelectElement>(
  127. "select#selectEpisode"
  128. ) ||
  129. document.querySelector<HTMLSelectElement>("select.selectEpisode"),
  130. page =
  131. document.querySelector<HTMLSelectElement>("select#selectPage");
  132. if (title) {
  133. presenceData.details = title.textContent.substring(
  134. 6,
  135. title.textContent.indexOf("information")
  136. );
  137. presenceData.smallImageKey = Assets.Reading;
  138. if (episode) {
  139. presenceData.state =
  140. episode.selectedOptions[0].textContent.trim();
  141. }
  142. if (page)
  143. presenceData.state += `, Page: ${page.selectedOptions[0].textContent.trim()}`;
  144. if (buttons) {
  145. presenceData.buttons = [
  146. {
  147. label: "Read Comic",
  148. url: href,
  149. },
  150. {
  151. label: "Check Description",
  152. url: title.href,
  153. },
  154. ];
  155. }
  156. }
  157. } else {
  158. const title = document.querySelector<HTMLAnchorElement>("a.bigChar");
  159. if (title) presenceData.details = title.textContent;
  160. presenceData.state = "Looking for issue to read";
  161. if (buttons) {
  162. presenceData.buttons = [
  163. {
  164. label: "Check Description",
  165. url: href,
  166. },
  167. ];
  168. }
  169. }
  170. } else if (pathname.startsWith("/Special"))
  171. presenceData.details = document.title;
  172. else {
  173. const barTitle = document.querySelector<HTMLDivElement>(".barTitle");
  174. if (barTitle) presenceData.details = barTitle.textContent;
  175. }
  176. break;
  177. }
  178. if (presenceData.details) presence.setActivity(presenceData);
  179. else presence.setActivity();
  180. });