Newer
Older
KeeperJerry_Launcher / LaunchServer / source / command / hash / DownloadClientCommand.java
@KeeperJerry KeeperJerry on 15 Feb 2021 3 KB clients и assets готовы
package launchserver.command.hash;

import launcher.client.ClientProfile;
import launcher.client.ClientProfile.Version;
import launcher.helper.IOHelper;
import launcher.helper.LogHelper;
import launcher.serialize.config.TextConfigReader;
import launcher.serialize.config.TextConfigWriter;
import launcher.serialize.config.entry.StringConfigEntry;
import launchserver.LaunchServer;
import launchserver.command.Command;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;

public final class DownloadClientCommand extends Command
{
    private static String CLIENT_URL_MASK;

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

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

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

    @Override
    public void invoke(String... args) throws Throwable
    {
        verifyArgs(args, 2);
        String version = args[0];
        String dirName = IOHelper.verifyFileName(args[1]);
        Path clientDir = server.updatesDir.resolve(args[1]);

        // Create client dir
        LogHelper.subInfo("Creating client dir: '%s'", dirName);
        Files.createDirectory(clientDir);

        // Download required client
        LogHelper.subInfo("Downloading client, it may take some time");
        CLIENT_URL_MASK = String.format("clients/%s.zip", version);
        String[] mirrors = server.config.mirrors.stream(StringConfigEntry.class).toArray(String[]::new);
        DownloadAssetCommand.downloadZip(mirrors, CLIENT_URL_MASK, clientDir);

        // Create profile file
        LogHelper.subInfo("Creaing profile file: '%s'", dirName);
        ClientProfile client;
        String profilePath;

        // Я бы выпилил это вообще нахуй, но дефолтные конфиги нужны! (Товарищи, партия требует дефолтые конфиги!!!)
        if (Version.compare(version, "1.6.4") <= 0) {
            profilePath = "launchserver/defaults/profile-legacy.cfg";
        } else {
            if (version.contains("-")) {
                String[] versionArgs = version.split("-");
                version = versionArgs[0];
                String modLoader = versionArgs[1];

                if (Arrays.asList("forge", "fabric").contains(modLoader)) {
                    profilePath = String.format("launchserver/defaults/profile-%s.cfg", modLoader);
                } else {
                    profilePath = "launchserver/defaults/profile-default.cfg";
                }
            } else {
                profilePath = "launchserver/defaults/profile-default.cfg";
            }
        }

        try (BufferedReader reader = IOHelper.newReader(IOHelper.getResourceURL(profilePath)))
        {
            client = new ClientProfile(TextConfigReader.read(reader, false));
        }
        client.setTitle(dirName);
        client.setVersion(version);
        client.setAssetIndex(version);
        client.block.getEntry("dir", StringConfigEntry.class).setValue(dirName);
        try (BufferedWriter writer = IOHelper.newWriter(IOHelper.resolveIncremental(server.profilesDir,
                dirName, "cfg")))
        {
            TextConfigWriter.write(client.block, writer, true);
        }

        // Finished
        server.syncProfilesDir();
        server.syncUpdatesDir(Collections.singleton(dirName));
        LogHelper.subInfo("Client successfully downloaded: '%s'", dirName);
        LogHelper.subInfo("DON'T FORGET! Set up the assets directory!");
    }
}