presence.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. import { Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '1213784073458421841',
  4. })
  5. const browsingTimestamp = Math.floor(Date.now() / 1000)
  6. async function getStrings() {
  7. return presence.getStrings(
  8. {
  9. play: 'general.playing',
  10. anime: 'general.anime',
  11. pause: 'general.paused',
  12. search: 'general.search',
  13. episode: 'general.episode',
  14. viewPage: 'general.viewPage',
  15. browsing: 'general.browsing',
  16. watching: 'general.watching',
  17. viewHome: 'general.viewHome',
  18. viewList: 'general.viewList',
  19. searchFor: 'general.searchFor',
  20. viewGenre: 'general.viewGenre',
  21. viewMovie: 'general.viewMovie',
  22. viewAnime: 'general.viewAnime',
  23. viewEpisode: 'general.viewEpisode',
  24. viewCategory: 'general.viewCategory',
  25. watchingMovie: 'general.watchingMovie',
  26. searchSomething: 'general.searchSomething',
  27. buttonWatchMovie: 'general.buttonWatchMovie',
  28. buttonViewEpisode: 'general.buttonViewEpisode',
  29. },
  30. await presence.getSetting<string>('lang').catch(() => 'en'),
  31. )
  32. }
  33. let video = {
  34. current: 0,
  35. duration: 0,
  36. paused: true,
  37. }
  38. let movie
  39. let episode
  40. let Sub: string
  41. presence.on(
  42. 'iFrameData',
  43. (data: unknown) => {
  44. video = data as typeof video
  45. },
  46. )
  47. let strings: Awaited<ReturnType<typeof getStrings>>
  48. let oldLang: string | null = null
  49. presence.on('UpdateData', async () => {
  50. const [newLang, privacy, showepisode, time, subtitle, buttons] = await Promise.all([
  51. presence.getSetting<string>('lang').catch(() => 'en'),
  52. presence.getSetting<boolean>('privacy'),
  53. presence.getSetting<boolean>('showepisode'),
  54. presence.getSetting<boolean>('timestamps'),
  55. presence.getSetting<boolean>('subtitle'),
  56. presence.getSetting<boolean>('buttons'),
  57. ])
  58. const title = document.querySelector(
  59. '#contenedor > div.module > div.content > header > h1',
  60. )?.textContent ?? '?'
  61. const titlemovies = document.querySelector(
  62. '#single > div.content > div.sheader > div.data > h1',
  63. )?.textContent ?? '?'
  64. const playvdo = document.querySelector('#info > h1')?.textContent ?? '?'
  65. const pathArray = document.location.toString().split('/')
  66. const presenceData: PresenceData = {
  67. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/A/AnimeYuzu/assets/logo.png',
  68. startTimestamp: browsingTimestamp,
  69. }
  70. if (oldLang !== newLang || !strings) {
  71. oldLang = newLang
  72. strings = await getStrings()
  73. }
  74. if (pathArray[3]?.includes('?s=')) {
  75. presenceData.details = `${
  76. privacy ? strings.searchSomething : strings.searchFor
  77. }`
  78. presenceData.state = (
  79. document.querySelector('.content.rigth.csearch > header > h1')
  80. ?.textContent ?? strings.searchSomething
  81. )
  82. .split('ผลการค้นหา:')
  83. .pop()
  84. presenceData.smallImageKey = Assets.Search
  85. }
  86. else if (!privacy && (pathArray[4] === 'page' || pathArray[5] === 'page')) {
  87. presenceData.details = `${strings.viewPage} ${
  88. pathArray[pathArray.indexOf('page') + 1]
  89. }`
  90. presenceData.state = title
  91. }
  92. else {
  93. switch (pathArray[3]) {
  94. case 'genre':
  95. presenceData.details = privacy
  96. ? strings.viewGenre.replace(':', '')
  97. : strings.viewGenre
  98. presenceData.state = title
  99. presenceData.smallImageKey = Assets.Reading
  100. break
  101. case 'catalog':
  102. presenceData.details = privacy
  103. ? strings.viewCategory.replace(':', '')
  104. : strings.viewList
  105. presenceData.state = title
  106. presenceData.smallImageKey = Assets.Reading
  107. break
  108. case 'category':
  109. presenceData.details = privacy
  110. ? strings.viewCategory.replace(':', '')
  111. : strings.viewCategory
  112. presenceData.state = title
  113. presenceData.smallImageKey = Assets.Reading
  114. break
  115. case 'tag':
  116. presenceData.details = privacy
  117. ? strings.viewCategory.replace(':', '')
  118. : strings.viewList
  119. presenceData.state = title.split('รวมอนิเมะ').pop()
  120. presenceData.smallImageKey = Assets.Reading
  121. break
  122. case 'release':
  123. presenceData.details = privacy
  124. ? strings.viewCategory.replace(':', '')
  125. : strings.viewList
  126. presenceData.state = title
  127. presenceData.smallImageKey = Assets.Reading
  128. break
  129. case 'movies':
  130. if (!['เดอะมูฟวี่', 'เดอะ', 'มูฟวี่'].includes(titlemovies)) {
  131. const movieinfo = titlemovies.split(/(เดอะ)?(มูฟวี่)/)
  132. movie = movieinfo.pop()
  133. if (movie === 'ซับไทย')
  134. movie = movie.replace((Sub = 'ซับไทย'), '').trim()
  135. else if (movie === 'พากย์ไทย')
  136. movie = movie.replace((Sub = 'พากย์ไทย'), '').trim()
  137. movie = `${strings.watchingMovie} ${movie} ${subtitle ? Sub : ''}`
  138. privacy
  139. ? (presenceData.details = strings.watchingMovie)
  140. : (presenceData.state = `${movieinfo[0]}`)
  141. presenceData.details = strings.watchingMovie
  142. }
  143. else {
  144. presenceData.details = privacy
  145. ? strings.viewMovie.replace(':', '')
  146. : strings.viewMovie
  147. presenceData.state = titlemovies
  148. presenceData.smallImageKey = Assets.Reading
  149. }
  150. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play
  151. presenceData.smallImageText = video.paused
  152. ? strings.pause
  153. : strings.play
  154. if (!video.paused) {
  155. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestamps(
  156. Math.floor(video.current),
  157. Math.floor(video.duration),
  158. )
  159. }
  160. if (buttons) {
  161. presenceData.buttons = [
  162. {
  163. label: strings.buttonWatchMovie,
  164. url: document.location.href.replace(/#\d+/, ''),
  165. },
  166. ]
  167. }
  168. delete presenceData.startTimestamp
  169. delete presenceData.endTimestamp
  170. break
  171. case 'anime':
  172. if (pathArray[4] !== 'page') {
  173. const ep = document.querySelector(
  174. '#single > div.content > div.sheader > div.data > h1',
  175. )?.textContent ?? strings.anime
  176. presenceData.startTimestamp = browsingTimestamp
  177. presenceData.details = privacy
  178. ? strings.viewAnime.replace(':', '')
  179. : strings.viewAnime
  180. presenceData.state = `${ep.split('ตอนที่')[0]}`
  181. }
  182. else {
  183. presenceData.details = strings.browsing
  184. }
  185. presenceData.smallImageKey = Assets.Reading
  186. break
  187. case 'ep':
  188. if (playvdo.includes('ตอนที่')) {
  189. const info = playvdo.split('ตอนที่')
  190. episode = info.pop()
  191. if (episode === 'ซับไทย')
  192. episode = episode.replace((Sub = 'ซับไทย'), '').trim()
  193. else if (episode === 'พากย์ไทย')
  194. episode = episode.replace((Sub = 'พากย์ไทย'), '').trim()
  195. episode = `${strings.episode} ${
  196. subtitle ? episode : episode?.match(/\d+/g)?.[0]
  197. }`
  198. privacy
  199. ? (presenceData.details = showepisode
  200. ? episode
  201. : `${strings.watching.replace(':', '')} ${strings.anime}`)
  202. : ([presenceData.details] = info)
  203. presenceData.state = episode
  204. }
  205. else {
  206. let info
  207. if (playvdo === 'ซับไทย')
  208. info = playvdo.replace('ซับไทย', '').trim()
  209. else if (playvdo === 'พากย์ไทย')
  210. info = playvdo.replace('พากย์ไทย', '').trim()
  211. presenceData.details = strings.watching
  212. presenceData.state = info
  213. }
  214. presenceData.smallImageKey = video.paused ? Assets.Pause : Assets.Play
  215. presenceData.smallImageText = video.paused
  216. ? strings.pause
  217. : strings.play
  218. if (!video.paused) {
  219. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestamps(
  220. Math.floor(video.current),
  221. Math.floor(video.duration),
  222. )
  223. }
  224. if (buttons) {
  225. presenceData.buttons = [
  226. {
  227. label: strings.buttonViewEpisode,
  228. url: document.location.href.replace(/#\d+/, ''),
  229. },
  230. ]
  231. }
  232. break
  233. default:
  234. presenceData.details = strings.viewHome
  235. presenceData.smallImageKey = Assets.Reading
  236. break
  237. }
  238. }
  239. if (!time) {
  240. delete presenceData.startTimestamp
  241. delete presenceData.endTimestamp
  242. }
  243. if (privacy) {
  244. delete presenceData.state
  245. delete presenceData.buttons
  246. }
  247. if (presenceData.details)
  248. presence.setActivity(presenceData)
  249. else presence.setActivity()
  250. })