package launchserver.command.hash;
import launcher.helper.IOHelper;
import launcher.helper.LogHelper;
import launcher.serialize.config.entry.StringConfigEntry;
import launchserver.LaunchServer;
import launchserver.command.Command;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public final class DownloadAssetCommand extends Command
{
private static String ASSET_URL_MASK;
public DownloadAssetCommand(LaunchServer server)
{
super(server);
}
public static void unpack(URL url, Path dir) throws IOException
{
try (ZipInputStream input = IOHelper.newZipInput(url))
{
for (ZipEntry entry = input.getNextEntry(); entry != null; entry = input.getNextEntry())
{
if (entry.isDirectory())
{
continue; // Skip directories
}
// Unpack entry
String name = entry.getName();
LogHelper.subInfo("Downloading file: '%s'", name);
IOHelper.transfer(input, dir.resolve(IOHelper.toPath(name)));
}
}
}
public static void downloadZip(String[] mirrors, String mask, Path dir) {
for (String mirror : mirrors) {
if (downloadZip(mirror + mask, dir)) return;
}
LogHelper.error("Error download %s. All mirrors return error", dir.getFileName().toString());
}
public static boolean downloadZip(String link, Path dir) {
URL url = null;
// Нам тут IDEA мозг ебет
try {
url = new URL(link);
} catch (MalformedURLException e) {
e.printStackTrace();
}
LogHelper.debug("Try download %s", url.toString());
try {
unpack(url, dir);
} catch (IOException e) {
LogHelper.error("Download %s failed (%s: %s)", url.toString(), e.getClass().getName(), e.getMessage());
return false;
}
return true;
}
@Override
public String getArgsDescription()
{
return "<version> <dir>";
}
@Override
public String getUsageDescription()
{
return "Download asset dir";
}
@Override
public void invoke(String... args) throws Throwable
{
verifyArgs(args, 2);
String version = args[0];
String dirName = IOHelper.verifyFileName(args[1]);
Path assetDir = server.updatesDir.resolve(dirName);
// Create asset dir
LogHelper.subInfo("Creating asset dir: '%s'", dirName);
Files.createDirectory(assetDir);
// Download required asset
LogHelper.subInfo("Downloading asset, it may take some time");
ASSET_URL_MASK = String.format("assets/%s.zip", version);
String[] mirrors = server.config.mirrors.stream(StringConfigEntry.class).toArray(String[]::new);
downloadZip(mirrors, ASSET_URL_MASK, assetDir);
// Finished
server.syncUpdatesDir(Collections.singleton(dirName));
LogHelper.subInfo("Asset successfully downloaded: '%s'", dirName);
}
}