presence.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. const presence = new Presence({
  2. clientId: '971483473024004157',
  3. })
  4. const browsingTimestamp = Math.floor(Date.now() / 1000)
  5. enum ActivityAssets {
  6. Logo = 'https://cdn.rcd.gg/PreMiD/websites/Z/ZenMarket/assets/logo.png',
  7. }
  8. presence.on('UpdateData', async () => {
  9. const presenceData: PresenceData = {
  10. largeImageKey: ActivityAssets.Logo,
  11. startTimestamp: browsingTimestamp,
  12. details: 'Browsing ZenMarket',
  13. }
  14. const { pathname, search, href } = document.location
  15. const path = pathname.replace(
  16. `/${document.querySelector('html')?.getAttribute('lang')}`,
  17. '',
  18. )
  19. const item = {
  20. title: document.querySelector('#itemTitle')?.textContent ?? '',
  21. seller: document.querySelector('#seller')?.textContent
  22. ?? document.querySelector('#aSeller')?.textContent
  23. ?? '',
  24. productPage: document.querySelector<HTMLAnchorElement>('#productPage')?.href ?? '',
  25. url: document.querySelector<HTMLAnchorElement>('#itemUrl')?.href ?? '',
  26. price: document.querySelector('#lblPrice')?.textContent
  27. ?? document.querySelector('#lblPriceY')?.textContent
  28. ?? 'unknown price',
  29. condition: document.querySelector('#lblConditionName')?.textContent
  30. ?? document.querySelector('#lblItemCondition')?.textContent
  31. ?? document.querySelector('#lblItemStatus')?.textContent
  32. ?? '',
  33. }
  34. // Profile
  35. switch (path) {
  36. case '/profile/':
  37. case '/profile/default.aspx': {
  38. const warehouseTable = document.querySelector<HTMLTableElement>(
  39. '#productsBought > div:nth-child(1) > table',
  40. )
  41. const cartTable = document.querySelector<HTMLTableElement>('.shop-stripped')
  42. const warehouseItems = warehouseTable ? warehouseTable.rows.length : 0
  43. const cartItems = cartTable ? cartTable.rows.length - 1 : 0
  44. presenceData.details = 'Viewing Account'
  45. presenceData.state = `${
  46. warehouseItems > 1 || warehouseItems === 0
  47. ? `${warehouseItems} items`
  48. : `${warehouseItems} item`
  49. } in warehouse || ${
  50. cartItems > 1 || cartItems === 0
  51. ? `${cartItems} items`
  52. : `${cartItems} item`
  53. } in cart`
  54. break
  55. }
  56. case '/profile/messages.aspx':
  57. case '/profile/support.aspx': {
  58. presenceData.details = 'Viewing Messages'
  59. break
  60. }
  61. case '/profile/actions.aspx': {
  62. presenceData.details = 'Looking at Events'
  63. break
  64. }
  65. case '/profile/watchlist.aspx': {
  66. switch (true) {
  67. case search.includes('tab=auctions') && !search.includes('history'):
  68. case !search: {
  69. const products = document.querySelector(
  70. '#auctions > div:nth-child(2) > .col-md-12',
  71. )
  72. const watchCount = products ? products.children.length - 1 : 0
  73. presenceData.details = 'Looking at watched auction items'
  74. presenceData.state = `${
  75. watchCount > 1 || watchCount === 0
  76. ? `${watchCount} items`
  77. : `${watchCount} item`
  78. } on the watchlist`
  79. break
  80. }
  81. case search.includes('tab=auctions') && search.includes('history'): {
  82. presenceData.details = 'Viewing history of watched auction items'
  83. break
  84. }
  85. case search.includes('tab=products'): {
  86. const products = document.querySelector(
  87. '#products > div:nth-child(2) > .col-md-12',
  88. )
  89. const watchCount = products ? products.children.length : 0
  90. presenceData.details = 'Looking at watched items'
  91. presenceData.state = `${
  92. watchCount > 1 || watchCount === 0
  93. ? `${watchCount} items`
  94. : `${watchCount} item`
  95. } on the watchlist`
  96. break
  97. }
  98. case search.includes('tab=sellers'): {
  99. presenceData.details = 'Viewing watched sellers'
  100. break
  101. }
  102. case search.includes('tab=recent'): {
  103. presenceData.details = 'Looking at recently viewed items'
  104. break
  105. }
  106. }
  107. break
  108. }
  109. case '/profile/parcel.aspx': {
  110. presenceData.details = 'Viewing parcels'
  111. break
  112. }
  113. case '/profile/payments.aspx': {
  114. presenceData.details = 'Viewing transactions'
  115. break
  116. }
  117. case '/profile/levels.aspx': {
  118. presenceData.details = 'Checking current level'
  119. presenceData.state = `Current Level: ${
  120. document.querySelector('#lblCurrentTier')?.textContent
  121. }`
  122. break
  123. }
  124. default: {
  125. if (item?.title) {
  126. presenceData.details = `Looking at ${item?.title}`
  127. let text = `${item?.price ? `Price: ${item?.price} ||` : ''} ${
  128. item?.condition ? `Condition: ${item?.condition} ||` : ''
  129. } ${item?.seller ? `Seller: ${item?.seller} ||` : ''}`
  130. if (text.endsWith(' || '))
  131. text = text.slice(0, text.length - 4)
  132. presenceData.state = text
  133. if (!item?.productPage && !item?.url) {
  134. presenceData.buttons = [
  135. {
  136. label: 'View On ZenMarket',
  137. url: href,
  138. },
  139. ]
  140. return presence.setActivity(presenceData)
  141. }
  142. else {
  143. presenceData.buttons = [
  144. {
  145. label: 'View On ZenMarket',
  146. url: href,
  147. },
  148. {
  149. label: `View On ${document
  150. .querySelector('.active-tab')
  151. ?.textContent
  152. ?.toLowerCase()}`,
  153. url: item?.productPage,
  154. },
  155. ]
  156. }
  157. }
  158. else if (path === '/auction.aspx' && search.includes('itemCode')) {
  159. presenceData.details = `Looking at ${item?.title}`
  160. presenceData.state = `Price: ${item?.price} || Bids: ${
  161. document.querySelector('#bidNum')?.textContent
  162. } || Condition: ${item?.condition} || Seller: ${item?.seller}`
  163. presenceData.buttons = [
  164. {
  165. label: 'View On ZenMarket',
  166. url: href,
  167. },
  168. {
  169. label: 'View On Yahoo Auctions',
  170. url: item?.productPage,
  171. },
  172. ]
  173. if (!item?.productPage)
  174. delete presenceData.buttons[1]
  175. }
  176. else {
  177. presenceData.details = 'Browsing...'
  178. }
  179. break
  180. }
  181. }
  182. if (presenceData.details)
  183. presence.setActivity(presenceData)
  184. else presence.setActivity()
  185. })