presence.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. const presence = new Presence({ clientId: '858292108195921920' })
  2. const startedAt = Date.now()
  3. const supportedLanguages: string[] = [
  4. 'js',
  5. 'md',
  6. 'json',
  7. 'gitignore',
  8. 'txt',
  9. 'html',
  10. 'css',
  11. ]
  12. enum ActivityAssets {
  13. Logo = 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/logo.jpg',
  14. Snippet = 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/0.png',
  15. Apps = 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/1.png',
  16. Lib = 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/2.png',
  17. Autocode = 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/3.png',
  18. }
  19. const assets = {
  20. 'lang-html': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/4.png',
  21. 'lang-css': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/5.png',
  22. 'lang-js': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/6.png',
  23. 'lang-json': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/7.png',
  24. 'lang-txt': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/8.png',
  25. 'lang-md': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/9.png',
  26. 'lang-gitignore': 'https://cdn.rcd.gg/PreMiD/websites/A/Autocode/assets/10.png',
  27. }
  28. presence.on('UpdateData', async () => {
  29. const presenceData: PresenceData = {
  30. largeImageKey: ActivityAssets.Logo,
  31. startTimestamp: startedAt,
  32. }
  33. const { pathname, hostname } = window.location
  34. const path = pathname.split('/').slice(1)
  35. const [details, state, timestamp] = await Promise.all([
  36. presence.getSetting<string>('editingDetails'),
  37. presence.getSetting<string>('editingState'),
  38. presence.getSetting<boolean>('timestamp'),
  39. ])
  40. if (pathname.includes('/snippet')) {
  41. if (path.length >= 3) {
  42. presenceData.details = document
  43. .querySelector('h1.snippet-title.h3')
  44. ?.textContent
  45. ?.trim()
  46. }
  47. else {
  48. presenceData.details = 'Looking for Snippets'
  49. }
  50. presenceData.state = `${hostname}/${path[0]}`
  51. presenceData.smallImageKey = ActivityAssets.Snippet
  52. }
  53. else if (pathname.includes('/app')) {
  54. if (path.length >= 3) {
  55. presenceData.details = document
  56. .querySelector('h1.jumbo')
  57. ?.textContent
  58. ?.trim()
  59. }
  60. else {
  61. presenceData.details = 'Looking for Apps'
  62. }
  63. presenceData.state = `${hostname}/${path[0]}`
  64. presenceData.smallImageKey = ActivityAssets.Apps
  65. }
  66. else if (pathname.includes('/lib')) {
  67. if (path.length >= 3)
  68. presenceData.details = `Reading ${path[1]} docs`
  69. else presenceData.details = 'Looking for Docs'
  70. presenceData.state = `${hostname}/${path[0]}`
  71. presenceData.smallImageKey = ActivityAssets.Lib
  72. }
  73. else if (pathname.includes('/mp/')) {
  74. const filename = document
  75. .querySelector('div.filename > [data-filename]')
  76. ?.textContent
  77. ?.split('/')
  78. ?.pop()
  79. if (filename) {
  80. const extension = filename.match(/\.\w+/g)?.[0]?.replace('.', '')
  81. const [line, column] = document
  82. .querySelector('div.filename > [data-cursor]')
  83. ?.textContent
  84. ?.split(':') ?? []
  85. const replaceTemplate = (str: string) => {
  86. if (str !== '{0}') {
  87. return str
  88. .replace('%project%', path[2] ?? '')
  89. .replace('%file%', filename)
  90. .replace('%line%', line ?? '')
  91. .replace('%column%', column ?? '')
  92. }
  93. }
  94. presenceData.details = replaceTemplate(details)
  95. presenceData.state = replaceTemplate(state)
  96. presenceData.smallImageKey = ActivityAssets.Autocode
  97. if (extension && supportedLanguages.includes(extension)) {
  98. presenceData.largeImageKey = assets[`lang-${extension}` as keyof typeof assets]
  99. }
  100. else {
  101. presenceData.largeImageKey = ActivityAssets.Autocode
  102. }
  103. }
  104. }
  105. if (!timestamp)
  106. delete presenceData.startTimestamp
  107. if (presenceData.details || presenceData.state)
  108. presence.setActivity(presenceData)
  109. else presence.setActivity()
  110. })