Newer
Older
KeeperJerry_Launcher / LaunchServer / source / command / hash / DownloadAssetCommand.java
package launchserver.command.hash;

import java.io.IOException;
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;

import launcher.client.ClientProfile;
import launcher.helper.IOHelper;
import launcher.helper.LogHelper;
import launchserver.LaunchServer;
import launchserver.command.Command;

public final class DownloadAssetCommand extends Command {
	private static final String ASSET_URL_MASK = "http://launcher.sashok724.net/download/assets/%s.zip";

	public DownloadAssetCommand(LaunchServer server) {
		super(server);
	}

	@Override
	public String getArgsDescription() {
		return "<version> <dir>";
	}

	@Override
	public String getUsageDescription() {
		return "Download asset dir";
	}

	@Override
	public void invoke(String... args) throws Exception {
		verifyArgs(args, 2);
		ClientProfile.Version version = ClientProfile.Version.byName(args[0]);
		String dirName = IOHelper.verifyFileName(args[1]);
		Path assetDir = LaunchServer.UPDATES_DIR.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");
		unpack(new URL(String.format(ASSET_URL_MASK, IOHelper.urlEncode(version.name))), assetDir);

		// Finished
		server.syncUpdatesDir(Collections.singleton(dirName));
		LogHelper.subInfo("Asset successfully downloaded: '%s'", dirName);
	}

	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)));
			}
		}
	}
}