presence.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { ActivityType } from 'premid'
  2. const presence = new Presence({
  3. clientId: '1325035374430519392',
  4. })
  5. async function getStrings() {
  6. return presence.getStrings(
  7. {
  8. play: 'general.playing',
  9. pause: 'general.paused',
  10. live: 'general.live',
  11. browse: 'general.browsing',
  12. watchStream: 'general.buttonWatchStream',
  13. watchVideo: 'general.buttonWatchVideo',
  14. },
  15. )
  16. }
  17. const browsingTimestamp = Math.floor(Date.now() / 1000)
  18. enum ActivityAssets {
  19. Logo = 'https://cdn.rcd.gg/PreMiD/websites/S/SOOP/assets/logo.png',
  20. }
  21. enum SoopAssets {
  22. Browse = 'https://cdn.rcd.gg/PreMiD/websites/S/SOOP/assets/0.png',
  23. Live = 'https://cdn.rcd.gg/PreMiD/websites/S/SOOP/assets/1.png',
  24. Play = 'https://cdn.rcd.gg/PreMiD/websites/S/SOOP/assets/2.png',
  25. Pause = 'https://cdn.rcd.gg/PreMiD/websites/S/SOOP/assets/3.png',
  26. }
  27. let oldLang: string, strings: Awaited<ReturnType<typeof getStrings>>
  28. presence.on('UpdateData', async () => {
  29. const [newLang, showStreamerLogo, showElapsedTime] = await Promise.all([
  30. presence.getSetting<string>('lang'),
  31. presence.getSetting<boolean>('logo'),
  32. presence.getSetting<boolean>('time'),
  33. ])
  34. if (oldLang !== newLang || !strings) {
  35. oldLang = newLang
  36. strings = await getStrings()
  37. }
  38. const presenceData: PresenceData = {
  39. details: strings.browse,
  40. largeImageKey: ActivityAssets.Logo,
  41. smallImageKey: SoopAssets.Browse,
  42. startTimestamp: browsingTimestamp,
  43. type: ActivityType.Watching,
  44. }
  45. const { hostname, pathname, href } = document.location
  46. switch (hostname.split('.')[0]) {
  47. case 'play': {
  48. presenceData.details = document.querySelector('span#infoTitle')?.textContent
  49. presenceData.state = document.querySelector('a#infoNickName')?.textContent
  50. presenceData.largeImageKey = showStreamerLogo
  51. ? document.querySelector<HTMLImageElement>('#bjThumbnail img')?.src
  52. : ActivityAssets.Logo
  53. presenceData.smallImageKey = SoopAssets.Live
  54. presenceData.smallImageText = strings.live
  55. if (showElapsedTime) {
  56. presenceData.startTimestamp = Math.floor(Date.now() / 1000)
  57. - presence.timestampFromFormat(
  58. document.querySelector('span#time')?.textContent ?? '',
  59. )
  60. }
  61. presenceData.buttons = [{ url: href, label: strings.watchStream }]
  62. break
  63. }
  64. case 'vod': {
  65. const isCatch = pathname.includes('/catch')
  66. const video = document.querySelector('video')
  67. if (video) {
  68. presenceData.details = document.querySelector(
  69. isCatch ? 'h3.title' : 'div.broadcast_title',
  70. )?.textContent
  71. presenceData.state = document.querySelector(
  72. isCatch ? 'button.nick.ictFunc' : 'a.ictFunc',
  73. )?.textContent
  74. presenceData.largeImageKey = showStreamerLogo
  75. ? document.querySelector<HTMLImageElement>(
  76. isCatch ? 'div.author_inner img' : 'div.thumbnail_box img',
  77. )?.src
  78. : ActivityAssets.Logo
  79. presenceData.smallImageKey = video.paused
  80. ? SoopAssets.Pause
  81. : SoopAssets.Play
  82. presenceData.smallImageText = video.paused
  83. ? strings.pause
  84. : strings.play
  85. presenceData.buttons = [{ url: href, label: strings.watchVideo }];
  86. [presenceData.startTimestamp, presenceData.endTimestamp] = presence.getTimestampsfromMedia(video)
  87. if (video.paused) {
  88. delete presenceData.startTimestamp
  89. delete presenceData.endTimestamp
  90. }
  91. }
  92. }
  93. }
  94. presence.setActivity(presenceData)
  95. })