presence.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. const presence = new Presence({
  2. clientId: '1079522783974920212',
  3. })
  4. const browsingTimestamp = Math.floor(Date.now() / 1000)
  5. presence.on('UpdateData', async () => {
  6. const presenceData: PresenceData = {
  7. details: 'Other',
  8. largeImageKey: 'https://cdn.rcd.gg/PreMiD/websites/V/Video%20Game%20Mods/assets/logo.png',
  9. startTimestamp: browsingTimestamp,
  10. buttons: [
  11. {
  12. label: 'View Page',
  13. url: document.location.href,
  14. },
  15. ],
  16. }
  17. const urlpath = document.location.pathname.split('/')
  18. switch (true) {
  19. case !urlpath[1]:
  20. presenceData.details = 'Home'
  21. break
  22. case urlpath[1]!.startsWith('members'):
  23. presenceData.details = `In ${
  24. document.querySelector('[class="data"]')?.textContent
  25. }`
  26. presenceData.state = urlpath[2]
  27. break
  28. case urlpath[1]!.startsWith('forums'):
  29. if (urlpath[2]) {
  30. if (urlpath[2].startsWith('search')) {
  31. presenceData.details = 'Searching for:'
  32. presenceData.state = decodeURI(urlpath[3]!).replace('+', ' ')
  33. break
  34. }
  35. else {
  36. presenceData.details = `In a discussion of ${
  37. document.querySelector<HTMLHeadingElement>('a.bbp-breadcrumb-forum')
  38. ?.textContent
  39. }:`
  40. presenceData.state = document.querySelector<HTMLHeadingElement>(
  41. 'h1.entry-title',
  42. )?.textContent
  43. break
  44. }
  45. }
  46. if (urlpath[3]) {
  47. presenceData.details = 'In forum:'
  48. presenceData.state = urlpath[4]
  49. ? `${
  50. document.querySelector<HTMLHeadingElement>(
  51. 'a.bbp-breadcrumb-forum',
  52. )?.textContent
  53. } - ${
  54. document.querySelector<HTMLHeadingElement>('h1.entry-title')
  55. ?.textContent
  56. }`
  57. : document.querySelector<HTMLHeadingElement>('h1.entry-title')
  58. ?.textContent
  59. break
  60. }
  61. presenceData.details = 'In Forums'
  62. break
  63. default:
  64. if (urlpath[1] && !urlpath[2]) {
  65. switch (urlpath[1]) {
  66. case 'register':
  67. presenceData.details = 'Register a new account'
  68. break
  69. case 'wp-login.php':
  70. presenceData.details = 'Login'
  71. break
  72. case 'privacy-policy':
  73. presenceData.details = 'Privacy Policy'
  74. break
  75. default:
  76. presenceData.details = 'Viewing Page of'
  77. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  78. break
  79. }
  80. }
  81. if (urlpath[1] && urlpath[2]) {
  82. switch (urlpath[2]) {
  83. case 'mods': {
  84. if (urlpath[3] !== 'categories') {
  85. presenceData.details = `Viewing mod of ${
  86. document.querySelector<HTMLHeadingElement>('h1')?.textContent
  87. }`
  88. presenceData.state = document.querySelector<HTMLHeadingElement>(
  89. 'div.site-content h1',
  90. )?.textContent
  91. presenceData.largeImageKey = document
  92. .querySelector<HTMLImageElement>('div.modsmedia img')
  93. ?.getAttribute('src')
  94. break
  95. }
  96. else {
  97. presenceData.details = 'Viewing mods of'
  98. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  99. break
  100. }
  101. }
  102. case 'upload-mod':
  103. presenceData.details = 'Uploading mod of'
  104. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  105. break
  106. case 'manage-mods':
  107. presenceData.details = 'Managing mods of'
  108. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  109. break
  110. case 'modder':
  111. presenceData.details = `Viewing ${
  112. document.querySelector<HTMLHeadingElement>('h1')?.textContent
  113. } mods by Modder`
  114. presenceData.state = document.querySelector<HTMLHeadingElement>(
  115. 'div.modderprofilebox h2',
  116. )?.textContent
  117. break
  118. case 'category':
  119. switch (urlpath[3]) {
  120. case 'guides':
  121. presenceData.details = 'Viewing Guides of'
  122. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  123. break
  124. case 'updates':
  125. presenceData.details = 'Viewing Updates of'
  126. presenceData.state = document.querySelector<HTMLHeadingElement>('h1')?.textContent
  127. break
  128. }
  129. break
  130. default:
  131. presenceData.details = `Viewing ${
  132. document.querySelector<HTMLHeadingElement>('h1')?.textContent
  133. }`
  134. presenceData.largeImageKey = document
  135. .querySelector<HTMLImageElement>('div.post-thumbnail img')
  136. ?.getAttribute('src')
  137. ?? 'https://cdn.rcd.gg/PreMiD/websites/V/Video%20Game%20Mods/assets/logo.png'
  138. presenceData.state = document.querySelector<HTMLHeadingElement>(
  139. 'h1.entry-title',
  140. )?.textContent
  141. }
  142. break
  143. }
  144. }
  145. if (presenceData.details)
  146. presence.setActivity(presenceData)
  147. else presence.setActivity()
  148. })