presence.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import { Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '840169707297832970',
  4. })
  5. const data: {
  6. startedSince?: number
  7. settings?: {
  8. id?: string
  9. delete?: boolean
  10. uses?: (keyof PresenceData)[]
  11. }[]
  12. presence: {
  13. [key: string]: {
  14. disabled?: boolean
  15. setPresenceData?: () => void
  16. }
  17. }
  18. } = {
  19. presence: {},
  20. startedSince: ~~(Date.now() / 1000),
  21. }
  22. presence.on('UpdateData', async () => {
  23. const presenceData: PresenceData = {
  24. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/E/Everskies/assets/logo.png',
  25. smallImageKey: Assets.Search,
  26. startTimestamp: data.startedSince,
  27. }
  28. data.presence = {
  29. '/community': {
  30. setPresenceData() {
  31. presenceData.details = 'Browsing forums...'
  32. },
  33. },
  34. '/community/forums/': {
  35. setPresenceData() {
  36. presenceData.details = 'Browsing forums:'
  37. presenceData.state = document.querySelector(
  38. 'span.ng-star-inserted',
  39. )?.textContent
  40. },
  41. },
  42. '/community/forums/([a-z]+)/([a-z0-9]+)': {
  43. setPresenceData() {
  44. presenceData.details = 'Viewing forum:'
  45. presenceData.state = document
  46. .querySelector('body > app-root > div > x-discussion-view > div > h2')
  47. ?.textContent
  48. ?.trim()
  49. presenceData.buttons = [
  50. {
  51. label: 'View Forum',
  52. url: document.URL,
  53. },
  54. ]
  55. },
  56. },
  57. '/chatroom': {
  58. setPresenceData() {
  59. const roomTitle = document.querySelector(
  60. 'div > div.current.pad-4.ng-tns-c221-371.ng-star-inserted > div.room-name.ng-tns-c221-371',
  61. )?.textContent
  62. presenceData.details = 'Browsing chat rooms...'
  63. if (roomTitle) {
  64. presenceData.details = 'In chat room:'
  65. presenceData.state = roomTitle
  66. }
  67. },
  68. },
  69. '/club': {
  70. setPresenceData() {
  71. presenceData.details = 'Browsing clubs...'
  72. },
  73. },
  74. '/club/([a-z0-9-])': {
  75. setPresenceData() {
  76. presenceData.details = 'Viewing club:'
  77. presenceData.state = document.querySelector(
  78. 'span.ng-tns-c123-778',
  79. )?.textContent
  80. presenceData.buttons = [
  81. {
  82. label: 'View Club',
  83. url: document.URL,
  84. },
  85. ]
  86. },
  87. },
  88. '/users': {
  89. setPresenceData() {
  90. const searchParams = new URLSearchParams(document.location.search)
  91. presenceData.details = 'Browsing users...'
  92. if (document.location.search.startsWith('?')) {
  93. presenceData.details = searchParams.get('friends')
  94. ? 'Viewing their friends'
  95. : 'Searching for user:'
  96. if (searchParams.get('q'))
  97. presenceData.state = searchParams.get('q')
  98. }
  99. },
  100. },
  101. '/user/([a-zA-Z0-9-]+)': {
  102. setPresenceData() {
  103. presenceData.details = 'Viewing user:'
  104. presenceData.state = document.querySelector('x-user-name > div')?.textContent
  105. presenceData.buttons = [
  106. {
  107. label: 'View User',
  108. url: document.URL,
  109. },
  110. ]
  111. },
  112. },
  113. '/competitions': {
  114. setPresenceData() {
  115. presenceData.details = 'Browsing competitions...'
  116. },
  117. },
  118. '/shop/([a-z-]+)': {
  119. setPresenceData() {
  120. presenceData.details = 'Looking at:'
  121. presenceData.state = `Shop • ${document
  122. .querySelector(
  123. 'div.box-title-tab.bt.br.bl.nowrap.b5.bg5.color5.ng-star-inserted',
  124. )
  125. ?.textContent
  126. ?.trim()}`
  127. presenceData.buttons = [
  128. {
  129. label: 'View Shop',
  130. url: document.URL,
  131. },
  132. ]
  133. },
  134. },
  135. '/games': {
  136. setPresenceData() {
  137. presenceData.details = 'Browsing games...'
  138. },
  139. },
  140. '/games/': {
  141. setPresenceData() {
  142. presenceData.details = 'Playing a game:'
  143. presenceData.state = document.querySelector('div.box-title')?.textContent
  144. presenceData.buttons = [
  145. {
  146. label: 'Play Game',
  147. url: document.URL,
  148. },
  149. ]
  150. },
  151. },
  152. '/wardrobe': {
  153. setPresenceData() {
  154. presenceData.details = 'Looking at:'
  155. presenceData.state = document.querySelector('div.box-title')?.textContent
  156. },
  157. },
  158. '/magazine': {
  159. setPresenceData() {
  160. presenceData.details = 'Viewing their magazines'
  161. },
  162. },
  163. '/profile/': {
  164. setPresenceData() {
  165. presenceData.details = 'Viewing their'
  166. presenceData.state = `Prfile • ${
  167. document.querySelector('div.box-title')?.textContent
  168. }`
  169. },
  170. },
  171. '/page/([a-z-])': {
  172. setPresenceData() {
  173. presenceData.details = 'Viewing page:'
  174. presenceData.state = document.querySelector('div.box-title')?.textContent
  175. },
  176. },
  177. }
  178. data.settings = [
  179. {
  180. id: 'timestamp',
  181. delete: true,
  182. uses: ['startTimestamp', 'endTimestamp'],
  183. },
  184. {
  185. id: 'buttons',
  186. delete: true,
  187. uses: ['buttons'],
  188. },
  189. ]
  190. for (const [k, v] of Object.entries(data.presence)) {
  191. if (document.location.pathname.match(k) && !v.disabled)
  192. v.setPresenceData?.()
  193. }
  194. for (const setting of data.settings) {
  195. const settingValue = await presence
  196. .getSetting<boolean>(setting.id ?? '')
  197. .catch(() => null)
  198. if (!settingValue && setting.delete) {
  199. for (const PData of setting.uses ?? [])
  200. delete presenceData[PData as keyof PresenceData]
  201. }
  202. }
  203. if (!presenceData.details)
  204. presence.setActivity()
  205. else presence.setActivity(presenceData)
  206. })