presence.ts 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { Assets } from 'premid'
  2. const presence = new Presence({
  3. clientId: '917417055458852865',
  4. })
  5. const browsingTimestamp = Math.floor(Date.now() / 1000)
  6. enum ActivityAssets {
  7. Logo = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/logo.png',
  8. Inbox = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/0.png',
  9. User = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/1.png',
  10. Artwork = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/2.png',
  11. Searchjob = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/3.png',
  12. Editprofile = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/4.png',
  13. Portfolio = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/5.png',
  14. }
  15. presence.on('UpdateData', async () => {
  16. const presenceData: PresenceData = {
  17. largeImageKey: ActivityAssets.Logo,
  18. startTimestamp: browsingTimestamp,
  19. }
  20. const shortTitle = document.title.split(/-(.+)/)[1]
  21. const [image, artwork, button, time] = await Promise.all([
  22. presence.getSetting<boolean>('image'),
  23. presence.getSetting<number>('artwork'),
  24. presence.getSetting<boolean>('button'),
  25. presence.getSetting<boolean>('time'),
  26. ])
  27. if (document.location.pathname.startsWith('/messages')) {
  28. presenceData.details = 'Checking inbox'
  29. presenceData.smallImageKey = ActivityAssets.Inbox
  30. presenceData.smallImageText = 'Checking inbox'
  31. }
  32. else if (
  33. document.querySelector<HTMLDivElement>(
  34. 'body > div.wrapper > div.wrapper-main > div > div > div.user-profile',
  35. )
  36. ) {
  37. presenceData.details = 'Viewing an artist\'s profile'
  38. presenceData.state = shortTitle
  39. presenceData.largeImageKey = document.querySelector<HTMLImageElement>(
  40. 'div.user-profile > user-header > div > div > div.avatar > img',
  41. )?.src
  42. presenceData.smallImageKey = ActivityAssets.User
  43. presenceData.smallImageText = 'Viewing profile'
  44. presenceData.buttons = [{ label: 'View Artist', url: document.URL }]
  45. }
  46. else if (document.location.pathname.startsWith('/artwork')) {
  47. presenceData.details = 'Viewing an artwork'
  48. presenceData.state = shortTitle
  49. if (artwork === 1) {
  50. presenceData.largeImageKey = document
  51. .querySelector<HTMLImageElement>(
  52. 'div.d-none.d-md-flex.align-items-start > a > img',
  53. )
  54. ?.src
  55. .replace('medium', 'large')
  56. }
  57. else if (artwork === 2) {
  58. // Meta tags can't be used due to how the page is loaded
  59. presenceData.largeImageKey = document.querySelector<HTMLImageElement>(
  60. 'div.asset-image > picture > img',
  61. )?.src
  62. }
  63. else {
  64. presenceData.smallImageKey = ActivityAssets.Artwork
  65. presenceData.smallImageText = 'Viewing artwork'
  66. }
  67. presenceData.buttons = [
  68. { label: 'View Artwork', url: document.location.href },
  69. {
  70. label: 'View Artist',
  71. url: document.querySelector<HTMLAnchorElement>(
  72. 'div.d-none.d-md-flex.align-items-start > a',
  73. )!.href,
  74. },
  75. ]
  76. }
  77. else if (document.location.pathname.startsWith('/marketplace')) {
  78. presenceData.details = 'Surfing the marketplace'
  79. }
  80. else if (document.location.pathname.startsWith('/studios')) {
  81. presenceData.details = 'Visiting studios'
  82. }
  83. else if (document.location.href.includes('/jobs')) {
  84. presenceData.details = 'Viewing jobs'
  85. presenceData.state = document
  86. .querySelector('meta[property="og:title"]')
  87. ?.getAttribute('content')
  88. presenceData.smallImageKey = ActivityAssets.Searchjob
  89. presenceData.smallImageText = 'Viewing jobs'
  90. }
  91. else if (document.location.pathname.startsWith('/blogs')) {
  92. if (document.location.pathname === '/blogs') {
  93. presenceData.details = 'Reading blogs'
  94. }
  95. else {
  96. presenceData.details = 'Reading a blog'
  97. presenceData.state = shortTitle
  98. }
  99. }
  100. else if (document.location.pathname.startsWith('/contests')) {
  101. if (document.location.pathname === '/contests') {
  102. presenceData.details = 'Looking for challenges'
  103. }
  104. else {
  105. presenceData.details = 'Viewing a challenge'
  106. presenceData.state = shortTitle
  107. }
  108. }
  109. else if (document.location.pathname === '/podcast') {
  110. presenceData.details = 'Finding a podcast'
  111. }
  112. else if (document.location.pathname === '/guides') {
  113. presenceData.details = 'Looking for guides'
  114. }
  115. else if (document.location.pathname.startsWith('/learning')) {
  116. presenceData.details = 'Learning'
  117. presenceData.smallImageKey = Assets.Reading
  118. presenceData.smallImageText = 'Learning'
  119. if (
  120. document.location.href.includes('/courses')
  121. || document.location.href.includes('/playlists')
  122. ) {
  123. presenceData.details = 'Viewing a course:'
  124. presenceData.state = document.querySelector('h1[class=\'h3 mb0\']')?.textContent
  125. const playlist = document.querySelector<HTMLImageElement>(
  126. 'li > a[class~="is-active"] > img',
  127. )
  128. if (playlist)
  129. presenceData.largeImageKey = playlist.src
  130. delete presenceData.startTimestamp
  131. const paused = document.querySelector(
  132. 'button.vjs-play-control.vjs-control.vjs-button.vjs-paused',
  133. )
  134. if (!paused) {
  135. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestamps(
  136. presence.timestampFromFormat(
  137. document
  138. .querySelector('div.vjs-duration-display')
  139. ?.textContent
  140. ?.slice(14) ?? '',
  141. ),
  142. presence.timestampFromFormat(
  143. document
  144. .querySelector('div.vjs-current-time-display')
  145. ?.textContent
  146. ?.slice(13) ?? '',
  147. ),
  148. )
  149. }
  150. presenceData.smallImageKey = paused ? Assets.Pause : Assets.Play
  151. presenceData.smallImageText = paused ? 'Paused' : 'Playing'
  152. presenceData.buttons = [{ label: 'View Course', url: document.URL }]
  153. }
  154. else if (document.location.href.includes('/series')) {
  155. presenceData.details = 'Viewing a series'
  156. presenceData.largeImageKey = document
  157. .querySelector<HTMLDivElement>('div.series-page-header')
  158. ?.style
  159. ?.backgroundImage
  160. ?.split('url')[1]
  161. ?.replace('("', '')
  162. ?.replace('")', '')
  163. presenceData.state = shortTitle
  164. presenceData.buttons = [{ label: 'View Series', url: document.URL }]
  165. }
  166. else if (document.location.href.includes('/instructors')) {
  167. presenceData.details = 'Viewing an instructor'
  168. presenceData.largeImageKey = document.querySelector<HTMLImageElement>(
  169. 'div.instructor-page.ng-star-inserted > div.container > div > div > img',
  170. )?.src
  171. presenceData.state = shortTitle
  172. presenceData.buttons = [{ label: 'View Instructor', url: document.URL }]
  173. }
  174. }
  175. else if (document.location.href.includes('settings')) {
  176. presenceData.details = 'Changing settings'
  177. }
  178. else if (document.location.href.includes('profile/edit')) {
  179. presenceData.details = 'Editing profile'
  180. presenceData.smallImageKey = ActivityAssets.Editprofile
  181. presenceData.smallImageText = 'Editing profile'
  182. }
  183. else if (document.location.href.includes('project/new')) {
  184. presenceData.details = 'Uploading an artwork'
  185. presenceData.smallImageKey = Assets.Uploading
  186. presenceData.smallImageText = 'Uploading artwork'
  187. }
  188. else if (document.location.hostname === 'magazine.artstation.com') {
  189. presenceData.details = 'Reading magazines'
  190. presenceData.state = shortTitle
  191. }
  192. else if (document.location.hostname === 'www.artstation.com') {
  193. presenceData.details = 'Exploring artworks'
  194. presenceData.smallImageKey = ActivityAssets.Artwork
  195. presenceData.smallImageText = 'Exploring artworks'
  196. }
  197. else {
  198. presenceData.details = 'Viewing a portfolio'
  199. presenceData.state = document
  200. .querySelector('meta[property="og:title"]')
  201. ?.getAttribute('content')
  202. presenceData.largeImageKey = document
  203. .querySelector('head > meta[name=image]')
  204. ?.getAttribute('content')
  205. presenceData.smallImageKey = ActivityAssets.Portfolio
  206. presenceData.smallImageText = 'Viewing portfolio'
  207. }
  208. if (!image) {
  209. presenceData.largeImageKey = 'https://cdn.rcd.gg/PreMiD/websites/A/ArtStation/assets/logo.png'
  210. }
  211. if (!button)
  212. delete presenceData.buttons
  213. if (!time) {
  214. delete presenceData.startTimestamp
  215. delete presenceData.endTimestamp
  216. }
  217. presence.setActivity(presenceData)
  218. })