presence.ts 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. import { Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '748698437720997888',
  4. })
  5. const browsingTimestamp = Math.floor(Date.now() / 1000)
  6. presence.on('UpdateData', async () => {
  7. const presenceData: PresenceData = {
  8. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/R/Reach%20Radio/assets/logo.png',
  9. }
  10. const [info, elapsed, format1, format2] = await Promise.all([
  11. presence.getSetting<boolean>('sInfo'),
  12. presence.getSetting<boolean>('tElapsed'),
  13. presence.getSetting<string>('sFormat1'),
  14. presence.getSetting<string>('sFormat2'),
  15. ])
  16. const paused = document.querySelector<HTMLImageElement>(
  17. '#react-listen-content > div > div > div.pt-4.startpause.col > button > img',
  18. )?.src
  19. === 'https://radiopanel.s3.nl-ams.scw.cloud/c9a65443-eed1-41ed-b9d2-743223b5ee75/a01dadcd-df3d-484b-8d20-4923156ce77a.svg'
  20. if (info && paused) {
  21. if (elapsed)
  22. presenceData.startTimestamp = browsingTimestamp
  23. if (document.querySelector('#message > div')) {
  24. presenceData.details = 'Requesting a song'
  25. presenceData.smallImageKey = Assets.Writing
  26. }
  27. else if (document.location.pathname.includes('/about')) {
  28. presenceData.details = 'Reading about Reach Radio'
  29. presenceData.smallImageKey = Assets.Reading
  30. }
  31. else if (document.location.pathname.includes('/timetable')) {
  32. presenceData.details = 'Viewing the timetable'
  33. presenceData.smallImageKey = Assets.Reading
  34. }
  35. else if (document.location.pathname.includes('/team')) {
  36. presenceData.details = 'Viewing the team'
  37. presenceData.smallImageKey = Assets.Reading
  38. }
  39. else if (document.location.pathname.includes('/privacy')) {
  40. presenceData.details = 'Reading Privacy Policy'
  41. presenceData.smallImageKey = Assets.Reading
  42. }
  43. else if (document.location.pathname.includes('/alexa-terms')) {
  44. presenceData.details = 'Reading Alexa Policy'
  45. presenceData.smallImageKey = Assets.Reading
  46. }
  47. else if (document.location.pathname.includes('/contact')) {
  48. presenceData.details = 'Writing to Reach Radio'
  49. presenceData.smallImageKey = Assets.Writing
  50. }
  51. else if (document.location.pathname.includes('/all-news')) {
  52. presenceData.details = 'Viewing the news'
  53. presenceData.smallImageKey = Assets.Reading
  54. }
  55. else if (document.location.pathname.includes('/news/')) {
  56. presenceData.details = 'Reading article:'
  57. presenceData.state = document.querySelector(
  58. '#news3 > section > div > div > div > h4',
  59. )?.textContent
  60. presenceData.smallImageKey = Assets.Reading
  61. }
  62. else if (document.location.pathname.includes('/podcasts')) {
  63. presenceData.details = 'Viewing podcasts'
  64. presenceData.smallImageKey = Assets.Reading
  65. }
  66. else if (document.location.pathname.includes('/podcast/')) {
  67. presenceData.details = 'Viewing podcast:'
  68. presenceData.state = document.querySelector('.pod-name')?.textContent
  69. presenceData.smallImageKey = Assets.Reading
  70. }
  71. else if (document.location.pathname.includes('/listen-to-podcast/')) {
  72. presenceData.details = 'Listening to podcast:'
  73. presenceData.state = document.querySelector('.pod-name')?.textContent
  74. if (
  75. document.querySelector(
  76. '#__layout > div > div.page > section > div > div.pod-player > div > div > div > button:nth-child(1)',
  77. )?.className === 'plyr__controls__item plyr__control'
  78. ) {
  79. presenceData.smallImageKey = Assets.Pause
  80. delete presenceData.startTimestamp
  81. delete presenceData.endTimestamp
  82. }
  83. else {
  84. presenceData.smallImageKey = Assets.Play
  85. let podcastDuration = 0
  86. const timeArray = document
  87. .querySelector('.plyr__time')
  88. ?.textContent
  89. ?.split(':') ?? []
  90. switch (timeArray.length) {
  91. case 3: {
  92. podcastDuration = Number.parseInt(timeArray[2]!)
  93. + Number.parseInt(timeArray[1]!.replace('-', '')) * 60
  94. + Number.parseInt(timeArray[0]!.replace('-', '')) * 60 * 60
  95. break
  96. }
  97. case 2: {
  98. podcastDuration = Number.parseInt(timeArray[1]!)
  99. + Number.parseInt(timeArray[0]!.replace('-', '')) * 60
  100. break
  101. }
  102. case 1: {
  103. podcastDuration = Number.parseInt(timeArray[1]!)
  104. break
  105. }
  106. }
  107. presenceData.startTimestamp = Math.floor(Date.now() / 1000)
  108. presenceData.endTimestamp = Math.floor(Date.now() / 1000) + podcastDuration
  109. }
  110. }
  111. else if (document.location.pathname === '/') {
  112. presenceData.details = 'Browsing...'
  113. presenceData.smallImageKey = Assets.Reading
  114. presenceData.smallImageText = document.querySelector('#current_song')?.textContent
  115. }
  116. }
  117. else {
  118. if (paused) {
  119. presenceData.smallImageKey = Assets.Pause
  120. delete presenceData.startTimestamp
  121. delete presenceData.endTimestamp
  122. }
  123. else {
  124. presenceData.smallImageKey = Assets.Play
  125. if (elapsed)
  126. presenceData.startTimestamp = browsingTimestamp
  127. }
  128. const [artist, title] = document
  129. .querySelector('#current_song')
  130. ?.textContent
  131. ?.split(' - ') ?? []
  132. const presenter = document.querySelector('.show_time')?.textContent
  133. presenceData.details = format1
  134. .replace('%title%', title ?? '')
  135. .replace('%artist%', artist ?? '')
  136. .replace('%presenter%', presenter ?? '')
  137. presenceData.state = format2
  138. .replace('%title%', title ?? '')
  139. .replace('%artist%', artist ?? '')
  140. .replace('%presenter%', presenter ?? '')
  141. if (document.querySelector('#message > div')) {
  142. presenceData.smallImageText = 'Requesting a song'
  143. }
  144. else if (document.location.pathname.includes('/about')) {
  145. presenceData.smallImageText = 'Reading about Reach Radio'
  146. }
  147. else if (document.location.pathname.includes('/timetable')) {
  148. presenceData.smallImageText = 'Viewing the timetable'
  149. }
  150. else if (document.location.pathname.includes('/team')) {
  151. presenceData.smallImageText = 'Viewing the team'
  152. }
  153. else if (document.location.pathname.includes('/privacy')) {
  154. presenceData.smallImageText = 'Reading Privacy Policy'
  155. }
  156. else if (document.location.pathname.includes('/alexa-terms')) {
  157. presenceData.smallImageText = 'Reading Alexa Policy'
  158. }
  159. else if (document.location.pathname.includes('/contact')) {
  160. presenceData.smallImageText = 'Writing to Reach Radio'
  161. }
  162. else if (document.location.pathname.includes('/all-news')) {
  163. presenceData.smallImageText = 'Viewing the news'
  164. }
  165. else if (document.location.pathname.includes('/news/')) {
  166. presenceData.smallImageText = `Reading article: ${
  167. document.querySelector('#news3 > section > div > div > div > h4')
  168. ?.textContent
  169. }`
  170. }
  171. else if (document.location.pathname.includes('/podcasts')) {
  172. presenceData.smallImageText = 'Viewing podcasts'
  173. }
  174. else if (document.location.pathname.includes('/podcast/')) {
  175. presenceData.smallImageText = `Viewing podcast: ${
  176. document.querySelector('.pod-name')?.textContent
  177. }`
  178. }
  179. else if (document.location.pathname.includes('/listen-to-podcast/')) {
  180. presenceData.smallImageText = `Listening to podcast: ${
  181. document.querySelector('.pod-name')?.textContent
  182. }`
  183. }
  184. else if (document.location.pathname === '/') {
  185. presenceData.smallImageText = 'Browsing...'
  186. }
  187. }
  188. if (presenceData.details)
  189. presence.setActivity(presenceData)
  190. else presence.setActivity()
  191. })