mirror of
https://github.com/Anuken/Mindustry.git
synced 2025-07-31 23:19:43 +07:00
arc.util.Http migration
This commit is contained in:
@ -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 */
|
||||
|
@ -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();
|
||||
|
@ -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<ServerGroup> 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", "<invalid>")};
|
||||
}
|
||||
|
||||
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", "<invalid>")};
|
||||
}
|
||||
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(){
|
||||
|
@ -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<Seq<ModListing>> 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<String, Date> 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<String, Date> 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", "<none>");
|
||||
Http.get(ghApi + "/repos/" + repo, res -> {
|
||||
var json = Jval.read(res.getResultAsString());
|
||||
String mainBranch = json.getString("default_branch");
|
||||
String language = json.getString("language", "<none>");
|
||||
|
||||
//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<HttpStatus> 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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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.");
|
||||
|
Reference in New Issue
Block a user