actionbinder.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. const path = require('path')
  2. const {AssetGuard} = require(path.join(__dirname, 'assets', 'js', 'assetguard.js'))
  3. const ProcessBuilder = require(path.join(__dirname, 'assets', 'js', 'processbuilder.js'))
  4. const ConfigManager = require(path.join(__dirname, 'assets', 'js', 'configmanager.js'))
  5. const DiscordWrapper = require(path.join(__dirname, 'assets', 'js', 'discordwrapper.js'))
  6. const Mojang = require(path.join(__dirname, 'assets', 'js', 'mojang.js'))
  7. const AuthManager = require(path.join(__dirname, 'assets', 'js', 'authmanager.js'))
  8. let mojangStatusListener
  9. // Synchronous Listener
  10. document.addEventListener('readystatechange', function(){
  11. if (document.readyState === 'interactive'){
  12. // Bind launch button
  13. document.getElementById('launch_button').addEventListener('click', function(e){
  14. console.log('Launching game..')
  15. testdownloads()
  16. })
  17. // TODO convert this to dropdown menu.
  18. // Bind selected server
  19. document.getElementById('server_selection').innerHTML = '\u2022 ' + AssetGuard.getServerById(ConfigManager.getGameDirectory(), ConfigManager.getSelectedServer()).name
  20. // Update Mojang Status Color
  21. const refreshMojangStatuses = async function(){
  22. console.log('Refreshing Mojang Statuses..')
  23. try {
  24. let status = 'grey'
  25. const statuses = await Mojang.status()
  26. greenCount = 0
  27. for(let i=0; i<statuses.length; i++){
  28. if(statuses[i].status === 'yellow' && status !== 'red'){
  29. status = 'yellow'
  30. continue
  31. } else if(statuses[i].status === 'red'){
  32. status = 'red'
  33. break
  34. }
  35. ++greenCount
  36. }
  37. if(greenCount == statuses.length){
  38. status = 'green'
  39. }
  40. document.getElementById('mojang_status_icon').style.color = Mojang.statusToHex(status)
  41. } catch (err) {
  42. console.error('Unable to refresh Mojang service status..', err)
  43. }
  44. }
  45. refreshMojangStatuses()
  46. // Set refresh rate to once every 5 minutes.
  47. mojangStatusListener = setInterval(refreshMojangStatuses, 300000)
  48. }
  49. }, false)
  50. // Keep reference to AssetGuard object temporarily
  51. let tracker;
  52. testdownloads = async function(){
  53. if(ConfigManager.getSelectedAccount() == null){
  54. console.error('login first.')
  55. //in devtools AuthManager.addAccount(username, pass)
  56. return
  57. }
  58. const content = document.getElementById('launch_content')
  59. const details = document.getElementById('launch_details')
  60. const progress = document.getElementById('launch_progress')
  61. const progress_text = document.getElementById('launch_progress_label')
  62. const det_text = document.getElementById('launch_details_text')
  63. det_text.innerHTML = 'Please wait..'
  64. progress.setAttribute('max', '100')
  65. details.style.display = 'flex'
  66. content.style.display = 'none'
  67. tracker = new AssetGuard(ConfigManager.getGameDirectory(), ConfigManager.getJavaExecutable())
  68. det_text.innerHTML = 'Loading server information..'
  69. const serv = await tracker.validateDistribution(ConfigManager.getSelectedServer())
  70. progress.setAttribute('value', 20)
  71. progress_text.innerHTML = '20%'
  72. console.log('forge stuff done')
  73. det_text.innerHTML = 'Loading version information..'
  74. const versionData = await tracker.loadVersionData(serv.mc_version)
  75. progress.setAttribute('value', 40)
  76. progress_text.innerHTML = '40%'
  77. det_text.innerHTML = 'Validating asset integrity..'
  78. await tracker.validateAssets(versionData)
  79. progress.setAttribute('value', 60)
  80. progress_text.innerHTML = '60%'
  81. console.log('assets done')
  82. det_text.innerHTML = 'Validating library integrity..'
  83. await tracker.validateLibraries(versionData)
  84. progress.setAttribute('value', 80)
  85. progress_text.innerHTML = '80%'
  86. console.log('libs done')
  87. det_text.innerHTML = 'Validating miscellaneous file integrity..'
  88. await tracker.validateMiscellaneous(versionData)
  89. progress.setAttribute('value', 100)
  90. progress_text.innerHTML = '100%'
  91. console.log('files done')
  92. det_text.innerHTML = 'Downloading files..'
  93. tracker.on('totaldlprogress', function(data){
  94. progress.setAttribute('max', data.total)
  95. progress.setAttribute('value', data.acc)
  96. progress_text.innerHTML = parseInt((data.acc/data.total)*100) + '%'
  97. })
  98. tracker.on('dlcomplete', async function(){
  99. det_text.innerHTML = 'Preparing to launch..'
  100. const forgeData = await tracker.loadForgeData(serv.id)
  101. const authUser = await AuthManager.validateSelected()
  102. let pb = new ProcessBuilder(ConfigManager.getGameDirectory(), serv, versionData, forgeData, authUser)
  103. det_text.innerHTML = 'Launching game..'
  104. let proc;
  105. try{
  106. proc = pb.build()
  107. det_text.innerHTML = 'Done. Enjoy the server!'
  108. const tempListener = function(data){
  109. if(data.indexOf('[Client thread/INFO]: -- System Details --') > -1){
  110. details.style.display = 'none'
  111. content.style.display = 'inline-flex'
  112. proc.stdout.removeListener('data', tempListener)
  113. }
  114. }
  115. proc.stdout.on('data', tempListener)
  116. // Init Discord Hook (Untested)
  117. const distro = AssetGuard.retrieveDistributionDataSync(ConfigManager.getGameDirectory)
  118. if(distro.discord != null && serv.discord != null){
  119. DiscordWrapper.initRPC(distro.discord, serv.discord)
  120. proc.on('close', (code, signal) => {
  121. DiscordWrapper.shutdownRPC()
  122. })
  123. }
  124. } catch(err) {
  125. //det_text.innerHTML = 'Error: ' + err.message;
  126. det_text.innerHTML = 'Error: See log for details..';
  127. console.log(err)
  128. setTimeout(function(){
  129. details.style.display = 'none'
  130. content.style.display = 'inline-flex'
  131. }, 5000)
  132. }
  133. // Remove reference to tracker.
  134. tracker = null
  135. })
  136. tracker.processDlQueues()
  137. }