diff --git a/build.gradle b/build.gradle index e838020014..14ff10a9dd 100644 --- a/build.gradle +++ b/build.gradle @@ -232,6 +232,10 @@ project(":kryonet") { } } +project(":reporter"){ + apply plugin: "java" +} + tasks.eclipse.doLast { delete ".project" } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 255fb51585..7527a06987 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -40,6 +40,7 @@ public class Vars{ //discord group URL public static final String discordURL = "https://discord.gg/BKADYds"; public static final String releasesURL = "https://api.github.com/repos/Anuken/Mindustry/releases"; + public static final String crashReportURL = "http://localhost:8080/report"; public static final int maxTextLength = 150; public static final int maxNameLength = 40; public static final float itemSize = 5f; diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index fac84a7ef6..9b4b53766c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -51,6 +51,7 @@ public class Control extends Module{ private Throwable error; public Control(){ + if(true) throw new RuntimeException("This should crash."); saves = new Saves(); db = new ContentDatabase(); diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index a2201c2365..720e57eaf5 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -309,8 +309,12 @@ public class Net{ } public static void http(String url, String method, Consumer listener, Consumer failure){ + http(url, method, null, listener, failure); + } + + public static void http(String url, String method, String body, Consumer listener, Consumer failure){ HttpRequest req = new HttpRequestBuilder().newRequest() - .method(method).url(url).build(); + .method(method).url(url).content(body).build(); Gdx.net.sendHttpRequest(req, new HttpResponseListener(){ @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java index cfa1fba347..4009796426 100644 --- a/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java +++ b/desktop/src/io/anuke/mindustry/desktop/CrashHandler.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.desktop; +import io.anuke.mindustry.Vars; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.net.Net; import io.anuke.ucore.core.Settings; @@ -13,7 +14,6 @@ import java.util.Date; public class CrashHandler{ public static void handle(Throwable e){ - //TODO send full error report to server via HTTP e.printStackTrace(); boolean netActive = false, netServer = false; @@ -28,7 +28,7 @@ public class CrashHandler{ } //don't create crash logs for me (anuke), as it's expected - if(System.getProperty("user.name").equals("anuke")) return; + //if(System.getProperty("user.name").equals("anuke")) return; String header = "--CRASH REPORT--\n"; @@ -50,6 +50,8 @@ public class CrashHandler{ String filename = ""; + Net.http(Vars.crashReportURL, "POST", result, r -> {}, Throwable::printStackTrace); + //try to write it try{ filename = "crash-report-" + new SimpleDateFormat("dd-MM-yy h.mm.ss").format(new Date()) + ".txt"; diff --git a/reporter/build.gradle b/reporter/build.gradle new file mode 100644 index 0000000000..ed7a1bc999 --- /dev/null +++ b/reporter/build.gradle @@ -0,0 +1,26 @@ +apply plugin: "java" + +sourceCompatibility = 1.8 +sourceSets.main.java.srcDirs = [ "src/" ] + +project.ext.mainClassName = "io.anuke.mindustry.reporter.Launcher" + +task run(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + ignoreExitValue = true +} + +task dist(type: Jar) { + dependsOn classes + from files(sourceSets.main.output.classesDirs) + from files(sourceSets.main.output.resourcesDir) + from {configurations.compile.collect {zipTree(it)}} + + writeVersion() + + manifest { + attributes 'Main-Class': project.mainClassName + } +} diff --git a/reporter/src/io/anuke/mindustry/reporter/Launcher.java b/reporter/src/io/anuke/mindustry/reporter/Launcher.java new file mode 100644 index 0000000000..058f4bffce --- /dev/null +++ b/reporter/src/io/anuke/mindustry/reporter/Launcher.java @@ -0,0 +1,41 @@ +package io.anuke.mindustry.reporter; + +import com.sun.net.httpserver.HttpServer; + +import java.io.DataInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.HashMap; + +import static java.lang.System.currentTimeMillis; +import static java.lang.System.out; + +public class Launcher{ + private static final long REQUEST_TIME = 1000 * 6; + + public static void main(String[] args) throws IOException{ + ReportHandler handler = new ReportHandler(); + HashMap rateLimit = new HashMap<>(); + + HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); + server.createContext("/report", t -> { + String key = t.getRemoteAddress().getAddress().getHostName(); + if(rateLimit.get(key) != null && (currentTimeMillis() - rateLimit.get(key)) < REQUEST_TIME){ + rateLimit.put(key, currentTimeMillis()); + out.println("connection " + key + " is being rate limited"); + return; + } + + rateLimit.put(key, currentTimeMillis()); + byte[] bytes = new byte[t.getRequestBody().available()]; + new DataInputStream(t.getRequestBody()).readFully(bytes); + handler.handle(new String(bytes)); + + t.sendResponseHeaders(200, 0); + }); + server.setExecutor(null); + server.start(); + out.println("server up"); + } + +} diff --git a/reporter/src/io/anuke/mindustry/reporter/ReportHandler.java b/reporter/src/io/anuke/mindustry/reporter/ReportHandler.java new file mode 100644 index 0000000000..164073514d --- /dev/null +++ b/reporter/src/io/anuke/mindustry/reporter/ReportHandler.java @@ -0,0 +1,10 @@ +package io.anuke.mindustry.reporter; + +import static java.lang.System.out; + +public class ReportHandler{ + + public void handle(String text){ + out.println("recieved text: " + text); + } +} diff --git a/run-reporter b/run-reporter new file mode 100755 index 0000000000..e95e9eaf7e --- /dev/null +++ b/run-reporter @@ -0,0 +1,2 @@ +./gradlew reporter:dist +java -jar reporter/build/libs/reporter-release.jar diff --git a/settings.gradle b/settings.gradle index 802a36e0dd..f0ebb1b115 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include 'desktop', 'html', 'core', 'android', 'kryonet', 'server', 'ios', 'annotations', 'packer' +include 'desktop', 'html', 'core', 'android', 'kryonet', 'server', 'ios', 'annotations', 'packer', 'reporter' if(System.properties["release"] == null || System.properties["release"].equals("false")){ if (new File(settingsDir, '../uCore').exists()) {