diff --git a/LaunchServer/resources/launchserver/defaults/config.cfg b/LaunchServer/resources/launchserver/defaults/config.cfg index da4e2cb..ee2dd2d 100644 --- a/LaunchServer/resources/launchserver/defaults/config.cfg +++ b/LaunchServer/resources/launchserver/defaults/config.cfg @@ -5,13 +5,16 @@ # Проверять обновления с сайта разработчика? checkServerUpdate: true; -# Ссылка на зеркало -mirror: "https://mirror.keeperjerry.ru/launcher/v1/"; +# Ссылки на зеркала +mirrors: [ + "https://mirror.keeperjerry.ru/launcher/v1/", + "https://mirror.jocat.ru/keeperjerry/" +]; # Лимит на авторизацию / защита от брутфорса -authRateLimit: 2; -authRateLimitMilis: 5000; -authRejectString: "Вы превысили лимит авторизаций, подождите некоторое время!"; +authRateLimit: 5; +authRateLimitMilis: 8000; +authRejectString: "Превышен лимит авторизаций, подождите некоторое время!"; # Управление системой хранения и обработки UUID пользователей authHandler: "textFile"; diff --git a/LaunchServer/resources/launchserver/defaults/profile-fabric.cfg b/LaunchServer/resources/launchserver/defaults/profile-fabric.cfg index 25c7344..e561e7a 100644 --- a/LaunchServer/resources/launchserver/defaults/profile-fabric.cfg +++ b/LaunchServer/resources/launchserver/defaults/profile-fabric.cfg @@ -24,7 +24,7 @@ updateExclusions: []; # Client launcher params -mainClass: "net.minecraft.client.main.Main"; +mainClass: "net.fabricmc.loader.launch.knot.KnotClient"; classPath: [ "minecraft.jar", "libraries" ]; jvmArgs: [ # Some options from Mojang's launcher diff --git a/LaunchServer/source/LaunchServer.java b/LaunchServer/source/LaunchServer.java index 26eddb9..fd37b71 100644 --- a/LaunchServer/source/LaunchServer.java +++ b/LaunchServer/source/LaunchServer.java @@ -10,10 +10,7 @@ import launcher.serialize.config.ConfigObject; import launcher.serialize.config.TextConfigReader; import launcher.serialize.config.TextConfigWriter; -import launcher.serialize.config.entry.BlockConfigEntry; -import launcher.serialize.config.entry.BooleanConfigEntry; -import launcher.serialize.config.entry.IntegerConfigEntry; -import launcher.serialize.config.entry.StringConfigEntry; +import launcher.serialize.config.entry.*; import launcher.serialize.signed.SignedObjectHolder; import launchserver.auth.AuthException; import launchserver.auth.AuthLimiter; @@ -562,9 +559,9 @@ @LauncherAPI public final String authRejectString; - // Mirror + // Mirrors @LauncherAPI - public final String mirror; + public final ListConfigEntry mirrors; // Update @LauncherAPI @@ -597,7 +594,7 @@ authRateLimitMilis = VerifyHelper.verifyInt(block.getEntryValue("authRateLimitMilis", IntegerConfigEntry.class), VerifyHelper.range(10, 10000000), "Illegal authRateLimitMillis"); authRejectString = block.hasEntry("authRejectString") ? - block.getEntryValue("authRejectString", StringConfigEntry.class) : "Вы превысили лимит авторизаций. Подождите некоторое время перед повторной попыткой"; + block.getEntryValue("authRejectString", StringConfigEntry.class) : "Превышен лимит авторизаций. Подождите некоторое время перед повторной попыткой"; // Set handlers & providers authHandler = AuthHandler.newHandler(block.getEntryValue("authHandler", StringConfigEntry.class), @@ -610,8 +607,8 @@ // Check Update checkServerUpdate = block.getEntryValue("checkServerUpdate", BooleanConfigEntry.class); - // Mirror - mirror = block.getEntryValue("mirror", StringConfigEntry.class); + // Mirrors + mirrors = block.getEntry("mirrors", ListConfigEntry.class); // Set misc config launch4J = new ExeConf(block.getEntry("launch4J", BlockConfigEntry.class)); diff --git a/LaunchServer/source/command/hash/DownloadAssetCommand.java b/LaunchServer/source/command/hash/DownloadAssetCommand.java index 9cce3f8..f9526a3 100644 --- a/LaunchServer/source/command/hash/DownloadAssetCommand.java +++ b/LaunchServer/source/command/hash/DownloadAssetCommand.java @@ -1,12 +1,13 @@ package launchserver.command.hash; -import launcher.client.ClientProfile.Version; 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; @@ -42,6 +43,31 @@ } } + 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() { @@ -58,6 +84,7 @@ 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); @@ -66,9 +93,10 @@ Files.createDirectory(assetDir); // Download required asset - ASSET_URL_MASK = server.config.mirror + "assets/%s.zip"; LogHelper.subInfo("Downloading asset, it may take some time"); - unpack(new URL(String.format(ASSET_URL_MASK, IOHelper.urlEncode(args[0]))), assetDir); + 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)); diff --git a/LaunchServer/source/command/hash/DownloadClientCommand.java b/LaunchServer/source/command/hash/DownloadClientCommand.java index c279dce..f6886c9 100644 --- a/LaunchServer/source/command/hash/DownloadClientCommand.java +++ b/LaunchServer/source/command/hash/DownloadClientCommand.java @@ -53,9 +53,9 @@ // Download required client LogHelper.subInfo("Downloading client, it may take some time"); - CLIENT_URL_MASK = server.config.mirror + "clients/%s.zip"; - DownloadAssetCommand.unpack(new URL(String.format(CLIENT_URL_MASK, - IOHelper.urlEncode(args[0]))), clientDir); + 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); @@ -72,7 +72,7 @@ String modLoader = versionArgs[1]; if (Arrays.asList("forge", "fabric").contains(modLoader)) { - profilePath = String.format("launchserver/defaults/profile%s.cfg", modLoader); + profilePath = String.format("launchserver/defaults/profile-%s.cfg", modLoader); } else { profilePath = "launchserver/defaults/profile-default.cfg"; } diff --git a/Launcher/source/Launcher.java b/Launcher/source/Launcher.java index d782c2c..56bbb94 100644 --- a/Launcher/source/Launcher.java +++ b/Launcher/source/Launcher.java @@ -59,7 +59,7 @@ { // Version info @LauncherAPI - public static final String VERSION = "1.6.1.0"; + public static final String VERSION = "1.7.0.1"; @LauncherAPI public static final String BUILD = readBuildNumber(); @LauncherAPI diff --git a/buildnumber b/buildnumber index 1796522..96b0eda 100644 --- a/buildnumber +++ b/buildnumber @@ -1 +1 @@ -515, 09.02.2021 \ No newline at end of file +520, 14.02.2021 \ No newline at end of file