actionbinder.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. const mojang = require('mojang')
  2. const path = require('path')
  3. const {AssetGuard} = require(path.join(__dirname, 'assets', 'js', 'assetguard.js'))
  4. const ProcessBuilder = require(path.join(__dirname, 'assets', 'js', 'processbuilder.js'))
  5. const ConfigManager = require(path.join(__dirname, 'assets', 'js', 'configmanager.js'))
  6. const DiscordWrapper = require(path.join(__dirname, 'assets', 'js', 'discordwrapper.js'))
  7. const mojang2 = require(path.join(__dirname, 'assets', 'js', 'mojang.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 mojang2.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 = mojang2.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. const content = document.getElementById('launch_content')
  54. const details = document.getElementById('launch_details')
  55. const progress = document.getElementById('launch_progress')
  56. const progress_text = document.getElementById('launch_progress_label')
  57. const det_text = document.getElementById('launch_details_text')
  58. det_text.innerHTML = 'Please wait..'
  59. progress.setAttribute('max', '100')
  60. details.style.display = 'flex'
  61. content.style.display = 'none'
  62. tracker = new AssetGuard(ConfigManager.getGameDirectory(), ConfigManager.getJavaExecutable())
  63. det_text.innerHTML = 'Loading server information..'
  64. const serv = await tracker.validateDistribution(ConfigManager.getSelectedServer())
  65. progress.setAttribute('value', 20)
  66. progress_text.innerHTML = '20%'
  67. console.log('forge stuff done')
  68. det_text.innerHTML = 'Loading version information..'
  69. const versionData = await tracker.loadVersionData(serv.mc_version)
  70. progress.setAttribute('value', 40)
  71. progress_text.innerHTML = '40%'
  72. det_text.innerHTML = 'Validating asset integrity..'
  73. await tracker.validateAssets(versionData)
  74. progress.setAttribute('value', 60)
  75. progress_text.innerHTML = '60%'
  76. console.log('assets done')
  77. det_text.innerHTML = 'Validating library integrity..'
  78. await tracker.validateLibraries(versionData)
  79. progress.setAttribute('value', 80)
  80. progress_text.innerHTML = '80%'
  81. console.log('libs done')
  82. det_text.innerHTML = 'Validating miscellaneous file integrity..'
  83. await tracker.validateMiscellaneous(versionData)
  84. progress.setAttribute('value', 100)
  85. progress_text.innerHTML = '100%'
  86. console.log('files done')
  87. det_text.innerHTML = 'Downloading files..'
  88. tracker.on('totaldlprogress', function(data){
  89. progress.setAttribute('max', data.total)
  90. progress.setAttribute('value', data.acc)
  91. progress_text.innerHTML = parseInt((data.acc/data.total)*100) + '%'
  92. })
  93. tracker.on('dlcomplete', async function(){
  94. det_text.innerHTML = 'Preparing to launch..'
  95. const forgeData = await tracker.loadForgeData(serv.id)
  96. const authUser = await mojang.auth('EMAIL', 'PASS', ConfigManager.getClientToken(), {
  97. name: 'Minecraft',
  98. version: 1
  99. })
  100. let pb = new ProcessBuilder(ConfigManager.getGameDirectory(), serv, versionData, forgeData, authUser)
  101. det_text.innerHTML = 'Launching game..'
  102. let proc;
  103. try{
  104. proc = pb.build()
  105. det_text.innerHTML = 'Done. Enjoy the server!'
  106. const tempListener = function(data){
  107. if(data.indexOf('[Client thread/INFO]: -- System Details --') > -1){
  108. details.style.display = 'none'
  109. content.style.display = 'inline-flex'
  110. proc.stdout.removeListener('data', tempListener)
  111. }
  112. }
  113. proc.stdout.on('data', tempListener)
  114. // Init Discord Hook (Untested)
  115. const distro = AssetGuard.retrieveDistributionDataSync(ConfigManager.getGameDirectory)
  116. if(distro.discord != null && serv.discord != null){
  117. DiscordWrapper.initRPC(distro.discord, serv.discord)
  118. proc.on('close', (code, signal) => {
  119. DiscordWrapper.shutdownRPC()
  120. })
  121. }
  122. } catch(err) {
  123. //det_text.innerHTML = 'Error: ' + err.message;
  124. det_text.innerHTML = 'Error: See log for details..';
  125. console.log(err)
  126. setTimeout(function(){
  127. details.style.display = 'none'
  128. content.style.display = 'inline-flex'
  129. }, 5000)
  130. }
  131. // Remove reference to tracker.
  132. tracker = null
  133. })
  134. tracker.processDlQueues()
  135. }