diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index 318ebe04d0..6fc58c9e06 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -1,7 +1,6 @@ package mindustry.net; import arc.*; -import arc.Net.*; import arc.files.*; import arc.func.*; import arc.util.*; @@ -62,27 +61,25 @@ public class BeControl{ /** asynchronously checks for updates. */ public void checkUpdate(Boolc done){ - Core.net.httpGet("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest", res -> { - if(res.getStatus() == HttpStatus.OK){ - Jval val = Jval.read(res.getResultAsString()); - int newBuild = Strings.parseInt(val.getString("tag_name", "0")); - if(newBuild > Version.build){ - Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop")); - String url = asset.getString("browser_download_url", ""); - updateAvailable = true; - updateBuild = newBuild; - updateUrl = url; - Core.app.post(() -> { - showUpdateDialog(); - done.get(true); - }); - }else{ - Core.app.post(() -> done.get(false)); - } + Http.get("https://api.github.com/repos/Anuken/MindustryBuilds/releases/latest") + .error(e -> {}) //ignore errors + .submit(res -> { + Jval val = Jval.read(res.getResultAsString()); + int newBuild = Strings.parseInt(val.getString("tag_name", "0")); + if(newBuild > Version.build){ + Jval asset = val.get("assets").asArray().find(v -> v.getString("name", "").startsWith(headless ? "Mindustry-BE-Server" : "Mindustry-BE-Desktop")); + String url = asset.getString("browser_download_url", ""); + updateAvailable = true; + updateBuild = newBuild; + updateUrl = url; + Core.app.post(() -> { + showUpdateDialog(); + done.get(true); + }); }else{ Core.app.post(() -> done.get(false)); } - }, error -> {}); //ignore errors + }); } /** @return whether a new update is available */ diff --git a/core/src/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java index fb84190307..b1cbfdbf58 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -1,7 +1,6 @@ package mindustry.net; import arc.*; -import arc.Net.*; import arc.files.*; import arc.func.*; import arc.struct.*; @@ -150,12 +149,12 @@ public class CrashSender{ Log.info("Sending crash report."); //post to crash report URL, exit code indicates send success - new arc.Net().http(new HttpRequest().block(true).method(HttpMethod.POST).content(value.toJson(OutputType.json)).url(Vars.crashReportURL), r -> { - Log.info("Crash sent successfully."); - System.exit(1); - }, t -> { + Http.post(Vars.crashReportURL, value.toJson(OutputType.json)).error(t -> { Log.info("Crash report not sent."); System.exit(-1); + }).block(r -> { + Log.info("Crash sent successfully."); + System.exit(1); }); ret(); diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 0abd41a959..40ec81d077 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -1,7 +1,6 @@ package mindustry.ui.dialogs; import arc.*; -import arc.Net.*; import arc.graphics.*; import arc.input.*; import arc.math.*; @@ -533,38 +532,27 @@ public class JoinDialog extends BaseDialog{ Log.info("Fetching community servers at @", url); //get servers - Core.net.httpGet(url, result -> { - try{ - if(result.getStatus() != HttpStatus.OK){ - Log.warn("Failed to fetch community servers: @", result.getStatus()); - return; + Http.get(url) + .error(t -> Log.err("Failed to fetch community servers", t)) + .submit(result -> { + Jval val = Jval.read(result.getResultAsString()); + Seq servers = new Seq<>(); + val.asArray().each(child -> { + String name = child.getString("name", ""); + String[] addresses; + if(child.has("addresses") || (child.has("address") && child.get("address").isArray())){ + addresses = (child.has("addresses") ? child.get("addresses") : child.get("address")).asArray().map(Jval::asString).toArray(String.class); + }else{ + addresses = new String[]{child.getString("address", "")}; } - - Jval val = Jval.read(result.getResultAsString()); - Core.app.post(() -> { - try{ - defaultServers.clear(); - val.asArray().each(child -> { - String name = child.getString("name", ""); - String[] addresses; - if(child.has("addresses") || (child.has("address") && child.get("address").isArray())){ - addresses = (child.has("addresses") ? child.get("addresses") : child.get("address")).asArray().map(Jval::asString).toArray(String.class); - }else{ - addresses = new String[]{child.getString("address", "")}; - } - defaultServers.add(new ServerGroup(name, addresses)); - }); - Log.info("Fetched @ community servers.", defaultServers.size); - }catch(Throwable e){ - Log.err("Failed to parse community servers."); - Log.err(e); - } - }); - }catch(Throwable e){ - Log.err("Failed to fetch community servers."); - Log.err(e); - } - }, Log::err); + servers.add(new ServerGroup(name, addresses)); + }); + //modify default servers on main thread + Core.app.post(() -> { + defaultServers.addAll(servers); + Log.info("Fetched @ community servers.", defaultServers.size); + }); + }); } private void saveServers(){ diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 67e394052e..944995a20c 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -1,7 +1,7 @@ package mindustry.ui.dialogs; import arc.*; -import arc.Net.*; +import arc.util.Http.*; import arc.files.*; import arc.func.*; import arc.graphics.*; @@ -104,6 +104,8 @@ public class ModsDialog extends BaseDialog{ if(Strings.getCauses(error).contains(t -> t.getMessage() != null && (t.getMessage().contains("trust anchor") || t.getMessage().contains("SSL") || t.getMessage().contains("protocol")))){ ui.showErrorMessage("@feature.unsupported"); + }else if(error instanceof HttpStatusException st){ + ui.showErrorMessage(Core.bundle.format("connectfail", Strings.capitalize(st.status.toString().toLowerCase()))); }else{ ui.showException(error); } @@ -111,33 +113,27 @@ public class ModsDialog extends BaseDialog{ void getModList(Cons> listener){ if(modList == null){ - Core.net.httpGet("https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", response -> { + Http.get("https://raw.githubusercontent.com/Anuken/MindustryMods/master/mods.json", response -> { String strResult = response.getResultAsString(); - var status = response.getStatus(); Core.app.post(() -> { - if(status != HttpStatus.OK){ - ui.showErrorMessage(Core.bundle.format("connectfail", status)); - }else{ - try{ - modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult); + try{ + modList = JsonIO.json.fromJson(Seq.class, ModListing.class, strResult); - var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); - Func parser = text -> { - try{ - return d.parse(text); - }catch(Exception e){ - return new Date(); - } - }; - - modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse(); - listener.get(modList); - }catch(Exception e){ - e.printStackTrace(); - ui.showException(e); - } + var d = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + Func parser = text -> { + try{ + return d.parse(text); + }catch(Exception e){ + return new Date(); + } + }; + modList.sortComparing(m -> parser.get(m.lastUpdated)).reverse(); + listener.get(modList); + }catch(Exception e){ + e.printStackTrace(); + ui.showException(e); } }); }, error -> Core.app.post(() -> modError(error))); @@ -424,20 +420,18 @@ public class ModsDialog extends BaseDialog{ //textures are only requested when the rendering happens; this assists with culling if(!textureCache.containsKey(repo)){ textureCache.put(repo, last = Core.atlas.find("nomap")); - Core.net.httpGet("https://raw.githubusercontent.com/Anuken/MindustryMods/master/icons/" + repo.replace("/", "_"), res -> { - if(res.getStatus() == HttpStatus.OK){ - Pixmap pix = new Pixmap(res.getResult()); - Core.app.post(() -> { - try{ - var tex = new Texture(pix); - tex.setFilter(TextureFilter.linear); - textureCache.put(repo, new TextureRegion(tex)); - pix.dispose(); - }catch(Exception e){ - Log.err(e); - } - }); - } + Http.get("https://raw.githubusercontent.com/Anuken/MindustryMods/master/icons/" + repo.replace("/", "_"), res -> { + Pixmap pix = new Pixmap(res.getResult()); + Core.app.post(() -> { + try{ + var tex = new Texture(pix); + tex.setFilter(TextureFilter.linear); + textureCache.put(repo, new TextureRegion(tex)); + pix.dispose(); + }catch(Exception e){ + Log.err(e); + } + }); }, err -> {}); } @@ -522,19 +516,17 @@ public class ModsDialog extends BaseDialog{ githubImportJavaMod(repo); }else{ ui.loadfrag.show(); - Core.net.httpGet(ghApi + "/repos/" + repo, res -> { - if(checkError(res)){ - var json = Jval.read(res.getResultAsString()); - String mainBranch = json.getString("default_branch"); - String language = json.getString("language", ""); + Http.get(ghApi + "/repos/" + repo, res -> { + var json = Jval.read(res.getResultAsString()); + String mainBranch = json.getString("default_branch"); + String language = json.getString("language", ""); - //this is a crude heuristic for class mods; only required for direct github import - //TODO make a more reliable way to distinguish java mod repos - if(language.equals("Java") || language.equals("Kotlin")){ - githubImportJavaMod(repo); - }else{ - githubImportBranch(mainBranch, repo, this::showStatus); - } + //this is a crude heuristic for class mods; only required for direct github import + //TODO make a more reliable way to distinguish java mod repos + if(language.equals("Java") || language.equals("Kotlin")){ + githubImportJavaMod(repo); + }else{ + githubImportBranch(mainBranch, repo); } }, this::importFail); } @@ -542,62 +534,33 @@ public class ModsDialog extends BaseDialog{ private void githubImportJavaMod(String repo){ //grab latest release - Core.net.httpGet(ghApi + "/repos/" + repo + "/releases/latest", res -> { - if(checkError(res)){ - var json = Jval.read(res.getResultAsString()); - var assets = json.get("assets").asArray(); + Http.get(ghApi + "/repos/" + repo + "/releases/latest", res -> { + var json = Jval.read(res.getResultAsString()); + var assets = json.get("assets").asArray(); - //prioritize dexed jar, as that's what Sonnicon's mod template outputs - var dexedAsset = assets.find(j -> j.getString("name").startsWith("dexed") && j.getString("name").endsWith(".jar")); - var asset = dexedAsset == null ? assets.find(j -> j.getString("name").endsWith(".jar")) : dexedAsset; + //prioritize dexed jar, as that's what Sonnicon's mod template outputs + var dexedAsset = assets.find(j -> j.getString("name").startsWith("dexed") && j.getString("name").endsWith(".jar")); + var asset = dexedAsset == null ? assets.find(j -> j.getString("name").endsWith(".jar")) : dexedAsset; - if(asset != null){ - //grab actual file - var url = asset.getString("browser_download_url"); - Core.net.httpGet(url, result -> { - if(checkError(result)){ - handleMod(repo, result); - } - }, this::importFail); - }else{ - throw new ArcRuntimeException("No JAR file found in releases. Make sure you have a valid jar file in the mod's latest Github Release."); - } + if(asset != null){ + //grab actual file + var url = asset.getString("browser_download_url"); + + Http.get(url, result -> handleMod(repo, result), this::importFail); + }else{ + throw new ArcRuntimeException("No JAR file found in releases. Make sure you have a valid jar file in the mod's latest Github Release."); } }, this::importFail); } - private boolean checkError(HttpResponse res){ - if(res.getStatus() == HttpStatus.OK){ - return true; - }else{ - showStatus(res.getStatus()); - return false; - } - } - - private void showStatus(HttpStatus status){ - Core.app.post(() -> { - ui.showErrorMessage(Core.bundle.format("connectfail", Strings.capitalize(status.toString().toLowerCase()))); - ui.loadfrag.hide(); - }); - } - - private void githubImportBranch(String branch, String repo, Cons err){ - Core.net.httpGet(ghApi + "/repos/" + repo + "/zipball/" + branch, loc -> { - if(loc.getStatus() == HttpStatus.OK){ - if(loc.getHeader("Location") != null){ - Core.net.httpGet(loc.getHeader("Location"), result -> { - if(result.getStatus() != HttpStatus.OK){ - err.get(result.getStatus()); - }else{ - handleMod(repo, result); - } - }, this::importFail); - }else{ - handleMod(repo, loc); - } + private void githubImportBranch(String branch, String repo){ + Http.get(ghApi + "/repos/" + repo + "/zipball/" + branch, loc -> { + if(loc.getHeader("Location") != null){ + Http.get(loc.getHeader("Location"), result -> { + handleMod(repo, result); + }, this::importFail); }else{ - err.get(loc.getStatus()); + handleMod(repo, loc); } }, this::importFail); } diff --git a/gradle.properties b/gradle.properties index 95715623ae..c27e6fe6fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,4 +10,4 @@ kapt.include.compile.classpath=false kotlin.stdlib.default.dependency=false #needed for android compilation android.useAndroidX=true -archash=33c4976f8084fbb6fc26cfdcca2dda3442711d17 +archash=3db4ede06f14022cb9e709218271e8e3df33a587 diff --git a/tests/src/test/java/GenericModTest.java b/tests/src/test/java/GenericModTest.java index 621b4d2f0f..46843116f7 100644 --- a/tests/src/test/java/GenericModTest.java +++ b/tests/src/test/java/GenericModTest.java @@ -1,5 +1,4 @@ -import arc.*; -import arc.Net.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; import org.junit.jupiter.api.*; @@ -14,13 +13,13 @@ public class GenericModTest{ static void grabMod(String url){ //clear older mods ApplicationTests.testDataFolder.deleteDirectory(); - new Net().http(new HttpRequest().block(true).url(url).method(HttpMethod.GET), httpResponse -> { + Http.get(url).error(Assertions::fail).block(httpResponse -> { try{ ApplicationTests.testDataFolder.child("mods").child("test_mod." + (url.endsWith("jar") ? "jar" : "zip")).writeBytes(Streams.copyBytes(httpResponse.getResultAsStream())); }catch(IOException e){ Assertions.fail(e); } - }, Assertions::fail); + }); ApplicationTests.launchApplication(false); } diff --git a/tools/src/mindustry/tools/FontGenerator.java b/tools/src/mindustry/tools/FontGenerator.java index 6a3fb62476..bd9cd34235 100644 --- a/tools/src/mindustry/tools/FontGenerator.java +++ b/tools/src/mindustry/tools/FontGenerator.java @@ -1,13 +1,9 @@ package mindustry.tools; -import arc.*; -import arc.Net.*; import arc.files.*; import arc.util.*; import arc.util.io.*; -import java.io.*; - /* icon font pipeline: 1. take set of pre-defined icons and SVGs 2. use Fontello API to get a font with these @@ -18,7 +14,6 @@ public class FontGenerator{ //E000 to F8FF public static void main(String[] args){ - Net net = Core.net = new Net(); Fi folder = Fi.get("core/assets-raw/fontgen/out/"); folder.mkdirs(); @@ -29,13 +24,10 @@ public class FontGenerator{ Log.info("Zip..."); String session = folder.child("session").readString(); - net.http(new HttpRequest().method(HttpMethod.GET).url("https://fontello.com/" + session + "/get").block(true), result -> { - try{ - Streams.copy(result.getResultAsStream(), folder.child("font.zip").write()); - }catch(IOException e){ - throw new RuntimeException(e); - } - }, Log::err); + + Http.get("https://fontello.com/" + session + "/get").block(result -> { + Streams.copy(result.getResultAsStream(), folder.child("font.zip").write()); + }); Log.info("Icon font..."); @@ -49,9 +41,9 @@ public class FontGenerator{ //TODO this is broken Log.info(OS.exec("fontforge", "-script", - Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(), - Fi.get("core/assets/fonts/font.woff").absolutePath(), - Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath()) + Fi.get("core/assets-raw/fontgen/merge.pe").absolutePath(), + Fi.get("core/assets/fonts/font.woff").absolutePath(), + Fi.get("core/assets-raw/fontgen/out/font.woff").absolutePath()) ); Log.info("Done.");