presence.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { ActivityType } from 'premid'
  2. const presence = new Presence({
  3. clientId: '1343107487477399592',
  4. })
  5. const romaLargeImageKey = 'https://cdn.rcd.gg/PreMiD/websites/E/e-typing/assets/logo.png'
  6. const englishLargeImageKey = 'https://cdn.rcd.gg/PreMiD/websites/E/e-typing/assets/0.png'
  7. const kanaLargeImageKey = 'https://cdn.rcd.gg/PreMiD/websites/E/e-typing/assets/1.png'
  8. const browsingTimestamp = Math.floor(Date.now() / 1000)
  9. presence.on('UpdateData', async () => {
  10. const presenceData = generatePresenceData()
  11. presence.setActivity(presenceData)
  12. })
  13. function getMode() {
  14. const { search } = location
  15. if (search.includes('.2')) {
  16. return 'english'
  17. }
  18. else if (search.includes('kana.1')) {
  19. return 'kana'
  20. }
  21. else if (search.includes('.0')) {
  22. return 'roma'
  23. }
  24. const headerImgSrc = document.querySelector<HTMLImageElement>('#etyping img')?.src ?? ''
  25. const paths = headerImgSrc.split('/').filter(i => i !== '')
  26. const mode = paths[3]
  27. if (mode === 'eng') {
  28. return 'english'
  29. }
  30. else if (mode === 'kana') {
  31. return 'kana'
  32. }
  33. else {
  34. return 'roma'
  35. }
  36. }
  37. function getTypingContentWindowInfo() {
  38. const typingContent = document.querySelector<HTMLIFrameElement>('#typing_content')
  39. const appElement = typingContent?.contentDocument?.querySelector<HTMLDivElement>('#start_view > .title') ?? document.getElementById('app')
  40. if (typingContent || appElement) {
  41. const windowTitleElement = document.querySelector<HTMLParagraphElement>('.pp_description') ?? window.parent.document.querySelector<HTMLParagraphElement>('.pp_description')
  42. const windowTitle = windowTitleElement?.textContent ?? ''
  43. const wordTitleElement = typingContent?.contentDocument?.querySelector<HTMLDivElement>('#start_view > .title') ?? document.querySelector<HTMLDivElement>('#start_view > .title')
  44. const wordTitle = wordTitleElement?.textContent ?? ''
  45. const sessionStorageWordTitle = sessionStorage.getItem('presence:wordTitle') ?? ''
  46. if (!sessionStorageWordTitle) {
  47. sessionStorage.setItem('presence:wordTitle', wordTitle)
  48. return { windowTitle, wordTitle: `お題: ${wordTitle}` }
  49. }
  50. else {
  51. const replacedWindowTitle = location.search.includes('trysc.trysc.trysc') ? '腕試しレベルチェック' : windowTitle.replace(sessionStorageWordTitle, '')
  52. return { windowTitle: replacedWindowTitle, wordTitle: `お題: ${sessionStorageWordTitle}` }
  53. }
  54. }
  55. sessionStorage.setItem('presence:wordTitle', '')
  56. return { windowTitle: '', wordTitle: '' }
  57. }
  58. function generatePresenceData() {
  59. const mode = getMode()
  60. const { windowTitle: categoryTitle, wordTitle } = getTypingContentWindowInfo()
  61. const presenceData: PresenceData = {
  62. state: wordTitle,
  63. startTimestamp: browsingTimestamp,
  64. type: ActivityType.Playing,
  65. }
  66. if (mode === 'english') {
  67. presenceData.largeImageKey = englishLargeImageKey
  68. if (categoryTitle) {
  69. presenceData.details = `${categoryTitle} (英語)`
  70. }
  71. }
  72. else if (mode === 'kana') {
  73. presenceData.largeImageKey = kanaLargeImageKey
  74. if (categoryTitle) {
  75. presenceData.details = `${categoryTitle} (かな)`
  76. }
  77. }
  78. else {
  79. presenceData.largeImageKey = romaLargeImageKey
  80. if (categoryTitle) {
  81. presenceData.details = `${categoryTitle} (ローマ字)`
  82. }
  83. }
  84. return presenceData
  85. }