refactor: use HttpClient for update check (#2331)

Dieser Commit ist enthalten in:
Hannes Greule 2023-07-08 19:41:20 +02:00 committet von GitHub
Ursprung 90587e56fc
Commit 68eb4e214a
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23

Datei anzeigen

@ -14,7 +14,13 @@ import org.w3c.dom.Document;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
import java.net.URL; import java.io.InputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
public class UpdateNotification { public class UpdateNotification {
@ -28,38 +34,54 @@ public class UpdateNotification {
*/ */
public static void doUpdateCheck() { public static void doUpdateCheck() {
if (Settings.settings().ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) { if (Settings.settings().ENABLED_COMPONENTS.UPDATE_NOTIFICATIONS) {
try { final HttpRequest request = HttpRequest
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); .newBuilder()
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); .uri(URI.create("https://ci.athion.net/job/FastAsyncWorldEdit/api/xml/"))
DocumentBuilder db = dbf.newDocumentBuilder(); .timeout(Duration.of(10L, ChronoUnit.SECONDS))
Document doc = db.parse(new URL("https://ci.athion.net/job/FastAsyncWorldEdit/api/xml/").openStream()); .build();
faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent(); HttpClient.newHttpClient()
FaweVersion faweVersion = Fawe.instance().getVersion(); .sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
if (faweVersion.build == 0) { .whenComplete((response, thrown) -> {
LOGGER.warn("You are using a snapshot or a custom version of FAWE. This is not an official build distributed " + if (thrown != null) {
"via https://www.spigotmc.org/resources/13932/"); LOGGER.error("Update check failed: {} ", thrown.getMessage());
return; }
} processResponseBody(response.body());
if (faweVersion.build < Integer.parseInt(UpdateNotification.faweVersion)) { });
hasUpdate = true;
int versionDifference = Integer.parseInt(UpdateNotification.faweVersion) - faweVersion.build;
LOGGER.warn(
"""
An update for FastAsyncWorldEdit is available. You are {} build(s) out of date.
You are running build {}, the latest version is build {}.
Update at https://www.spigotmc.org/resources/13932/""",
versionDifference,
faweVersion.build,
UpdateNotification.faweVersion
);
}
} catch (Exception e) {
LOGGER.error("Unable to check for updates. Skipping.");
}
} }
} }
private static void processResponseBody(InputStream body) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(body);
faweVersion = doc.getElementsByTagName("lastSuccessfulBuild").item(0).getFirstChild().getTextContent();
FaweVersion faweVersion = Fawe.instance().getVersion();
if (faweVersion.build == 0) {
LOGGER.warn("You are using a snapshot or a custom version of FAWE. This is not an official build distributed " +
"via https://www.spigotmc.org/resources/13932/");
return;
}
if (faweVersion.build < Integer.parseInt(UpdateNotification.faweVersion)) {
hasUpdate = true;
int versionDifference = Integer.parseInt(UpdateNotification.faweVersion) - faweVersion.build;
LOGGER.warn(
"""
An update for FastAsyncWorldEdit is available. You are {} build(s) out of date.
You are running build {}, the latest version is build {}.
Update at https://www.spigotmc.org/resources/13932/""",
versionDifference,
faweVersion.build,
UpdateNotification.faweVersion
);
}
} catch (Exception ignored) {
LOGGER.error("Unable to check for updates. Skipping.");
}
}
/** /**
* Trigger an update notification based on captions. Useful to notify server administrators ingame. * Trigger an update notification based on captions. Useful to notify server administrators ingame.
* *