presence.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. import { Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '643593006821408778',
  4. })
  5. const strings = presence.getStrings({
  6. play: 'general.playing',
  7. pause: 'general.paused',
  8. })
  9. const pages: { [k: string]: string } = {
  10. '/': 'Ana Sayfa',
  11. '/vip': 'Ana Sayfa',
  12. '/kesfet': 'Keşfet',
  13. '/kesfet/eyJjb250ZW50IjoiMSJ9': 'Keşfet (Film)',
  14. '/trend': 'Trendler',
  15. '/takvim': 'Dizi Takvimi',
  16. '/dizi-izle': 'TV Dizileri',
  17. '/forum': 'Forum',
  18. '/koleksiyon': 'Koleksiyon',
  19. '/birlikte-izle': 'Birlikte İzle',
  20. '/profil/ayarlar': 'Hesap Ayarları',
  21. }
  22. let video: {
  23. dataAvailable?: boolean
  24. currentTime?: number
  25. duration?: number
  26. paused?: boolean
  27. } = {}
  28. presence.on(
  29. 'iFrameData',
  30. (inc: unknown) => {
  31. const data = inc as {
  32. error?: boolean
  33. currentTime: number
  34. duration: number
  35. paused: boolean
  36. }
  37. if (!data.error)
  38. video = { ...data, dataAvailable: true }
  39. },
  40. )
  41. presence.on('UpdateData', async () => {
  42. const page = document.location.pathname
  43. const _video = document.querySelector('video') as HTMLVideoElement
  44. const isVideoData = Object.keys(video).length > 0
  45. const categoryTitle = document.querySelector(
  46. '#router-view > div.ui.grid.mb-0 > div.left.floated.sixteen.wide.tablet.twelve.wide.computer.column.pb-0 > h1',
  47. )
  48. const categoryTitle2 = document.querySelector(
  49. '#router-view > div.ui.grid.mb-0 > div.left.floated.sixteen.wide.tablet.ten.wide.computer.column.pb-0 > h1',
  50. )
  51. const showName = document.querySelector(
  52. '#router-view > div.bg-cover-faker > div.ui.grid > div.left.floated.sixteen.wide.tablet.nine.wide.computer.column > a > h1',
  53. )
  54. const movieTitle = document.querySelector(
  55. '#router-view > div.bg-cover-faker > div:nth-child(3) > div.left.floated.sixteen.wide.tablet.eight.wide.computer.column > a > h1',
  56. )
  57. const userName = document.querySelector(
  58. '#router-view > section > div.ui.grid > div.left.floated.sixteen.wide.tablet.four.wide.computer.column > div > section:nth-child(1) > h2 > a',
  59. )
  60. if (!isVideoData && !_video) {
  61. if (page.includes('/kesfet')) {
  62. presence.setActivity({
  63. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  64. details: 'Bir sayfaya göz atıyor:',
  65. state: 'Keşfet',
  66. startTimestamp: Math.floor(Date.now() / 1000),
  67. })
  68. }
  69. else if (page.includes('/oyuncu/')) {
  70. const actorName = document.querySelector(
  71. '#router-view > div > div.profile-header > div.heading-user-title > h1',
  72. )
  73. presence.setActivity({
  74. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  75. details: 'Bir aktöre göz atıyor:',
  76. state: actorName ? actorName.textContent?.trim() : 'Belirsiz',
  77. startTimestamp: Math.floor(Date.now() / 1000),
  78. })
  79. }
  80. else if (
  81. page.includes('/film/tur/')
  82. && categoryTitle
  83. && categoryTitle.textContent !== ''
  84. ) {
  85. presence.setActivity({
  86. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  87. details: 'Bir kategoriye göz atıyor:',
  88. state: categoryTitle.textContent,
  89. startTimestamp: Math.floor(Date.now() / 1000),
  90. })
  91. }
  92. else if (
  93. page.includes('/dizi/tur')
  94. && categoryTitle
  95. && categoryTitle.textContent !== ''
  96. ) {
  97. presence.setActivity({
  98. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  99. details: 'Bir kategoriye göz atıyor:',
  100. state: categoryTitle.textContent,
  101. startTimestamp: Math.floor(Date.now() / 1000),
  102. })
  103. }
  104. else if (
  105. page.includes('/film-izle')
  106. && categoryTitle2
  107. && categoryTitle2.textContent !== ''
  108. ) {
  109. presence.setActivity({
  110. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  111. details: 'Bir kategoriye göz atıyor:',
  112. state: categoryTitle2.textContent,
  113. startTimestamp: Math.floor(Date.now() / 1000),
  114. })
  115. }
  116. else if (
  117. page.includes('/dizi/')
  118. && showName
  119. && showName.textContent !== ''
  120. ) {
  121. presence.setActivity({
  122. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  123. details: 'Bir diziye göz atıyor:',
  124. state: showName.textContent,
  125. startTimestamp: Math.floor(Date.now() / 1000),
  126. })
  127. }
  128. else if (
  129. page.includes('/profil/')
  130. && userName
  131. && userName.textContent !== ''
  132. ) {
  133. presence.setActivity({
  134. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  135. details: 'Bir profile göz atıyor:',
  136. state: userName.textContent,
  137. startTimestamp: Math.floor(Date.now() / 1000),
  138. })
  139. }
  140. else if (pages[page] || pages[page.slice(0, -1)]) {
  141. presence.setActivity({
  142. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  143. details: 'Bir sayfaya göz atıyor:',
  144. state: pages[page] || pages[page.slice(0, -1)],
  145. startTimestamp: Math.floor(Date.now() / 1000),
  146. })
  147. }
  148. }
  149. else if (_video && !Number.isNaN(_video.currentTime)) {
  150. const title = document.querySelector(
  151. '#router-view > div.bg-cover-faker > div.ui.grid.mt-0 > div > h1 > a',
  152. )
  153. const episode = document.querySelector(
  154. '#router-view > div.bg-cover-faker > div.ui.grid.mt-0 > div > h1 > span',
  155. )
  156. if (page.includes('/film') && movieTitle && movieTitle.textContent !== '') {
  157. const [startTimestamp, endTimestamp] = presence.getTimestamps(
  158. Math.floor(_video.currentTime),
  159. Math.floor(_video.duration),
  160. )
  161. const presenceData: PresenceData = {
  162. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  163. details: 'Bir film izliyor:',
  164. state: movieTitle.textContent,
  165. smallImageKey: _video.paused ? Assets.Pause : Assets.Play,
  166. smallImageText: _video.paused
  167. ? (await strings).pause
  168. : (await strings).play,
  169. }
  170. if (!Number.isNaN(startTimestamp) && !Number.isNaN(endTimestamp)) {
  171. [presenceData.startTimestamp, presenceData.endTimestamp] = [
  172. startTimestamp,
  173. endTimestamp,
  174. ]
  175. }
  176. if (video.paused) {
  177. delete presenceData.startTimestamp
  178. delete presenceData.endTimestamp
  179. }
  180. presence.setActivity(presenceData)
  181. }
  182. else if (
  183. page.includes('/dizi/')
  184. && title
  185. && episode
  186. && title.textContent !== ''
  187. && episode.textContent !== ''
  188. ) {
  189. const [startTimestamp, endTimestamp] = presence.getTimestamps(
  190. Math.floor(video.currentTime ?? 0),
  191. Math.floor(video.duration ?? 0),
  192. )
  193. const presenceData: PresenceData = {
  194. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  195. details: 'Bir film izliyor:',
  196. state: title.textContent,
  197. smallImageKey: video.paused ? Assets.Pause : Assets.Play,
  198. smallImageText: video.paused
  199. ? (await strings).pause
  200. : (await strings).play,
  201. };
  202. [presenceData.startTimestamp, presenceData.endTimestamp] = [
  203. startTimestamp,
  204. endTimestamp,
  205. ]
  206. if (video.paused) {
  207. delete presenceData.startTimestamp
  208. delete presenceData.endTimestamp
  209. }
  210. presence.setActivity(presenceData)
  211. }
  212. }
  213. else if (isVideoData && video && !Number.isNaN(video.duration)) {
  214. const showName2 = document.querySelector(
  215. '#router-view > div.bg-cover-faker > div.ui.grid.mt-0 > div > h1 > a',
  216. )
  217. const episode = document.querySelector(
  218. '#router-view > div.bg-cover-faker > div.ui.grid.mt-0 > div > h1 > span',
  219. )
  220. if (
  221. page.includes('/film/')
  222. && movieTitle
  223. && movieTitle.textContent !== ''
  224. ) {
  225. const [startTimestamp, endTimestamp] = presence.getTimestamps(
  226. Math.floor(video.currentTime ?? 0),
  227. Math.floor(video.duration ?? 0),
  228. )
  229. const presenceData: PresenceData = {
  230. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  231. details: 'Bir film izliyor:',
  232. state: movieTitle.textContent,
  233. smallImageKey: video.paused ? Assets.Pause : Assets.Play,
  234. smallImageText: video.paused
  235. ? (await strings).pause
  236. : (await strings).play,
  237. }
  238. if (!Number.isNaN(startTimestamp) && !Number.isNaN(endTimestamp)) {
  239. [presenceData.startTimestamp, presenceData.endTimestamp] = [
  240. startTimestamp,
  241. endTimestamp,
  242. ]
  243. }
  244. if (video.paused) {
  245. delete presenceData.startTimestamp
  246. delete presenceData.endTimestamp
  247. }
  248. presence.setActivity(presenceData)
  249. }
  250. else if (
  251. page.includes('/dizi/')
  252. && showName2
  253. && showName2.textContent !== ''
  254. && episode
  255. && episode.textContent !== ''
  256. ) {
  257. const [startTimestamp, endTimestamp] = presence.getTimestamps(
  258. Math.floor(video.currentTime ?? 0),
  259. Math.floor(video.duration ?? 0),
  260. )
  261. const presenceData: PresenceData = {
  262. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  263. details: showName2.textContent,
  264. state: episode.textContent,
  265. smallImageKey: video.paused ? Assets.Pause : Assets.Play,
  266. smallImageText: video.paused
  267. ? (await strings).pause
  268. : (await strings).play,
  269. }
  270. if (!Number.isNaN(startTimestamp) && !Number.isNaN(endTimestamp)) {
  271. [presenceData.startTimestamp, presenceData.endTimestamp] = [
  272. startTimestamp,
  273. endTimestamp,
  274. ]
  275. }
  276. if (video.paused) {
  277. delete presenceData.startTimestamp
  278. delete presenceData.endTimestamp
  279. }
  280. presence.setActivity(presenceData)
  281. }
  282. }
  283. else {
  284. presence.setActivity({
  285. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/Y/yabanc%C4%B1dizi/assets/logo.png',
  286. details: 'Bir sayfaya göz atıyor:',
  287. state: 'Bilinmeyen Sayfa',
  288. startTimestamp: Math.floor(Date.now() / 1000),
  289. })
  290. }
  291. })