ViaVersion/common/src/main/java/com/viaversion/viaversion/update/UpdateUtil.java

118 lines
4.8 KiB
Java

/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.viaversion.viaversion.update;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.util.GsonUtil;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Locale;
import java.util.UUID;
import java.util.logging.Level;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class UpdateUtil {
private static final String PREFIX = "§a§l[ViaVersion] §a";
private static final String URL = "https://update.viaversion.com";
private static final String PLUGIN = "/ViaVersion/";
public static void sendUpdateMessage(final UUID uuid) {
Via.getPlatform().runAsync(() -> {
final String message = getUpdateMessage(false);
if (message != null) {
Via.getPlatform().runSync(() -> Via.getPlatform().sendMessage(uuid, PREFIX + message));
}
});
}
public static void sendUpdateMessage() {
Via.getPlatform().runAsync(() -> {
final String message = getUpdateMessage(true);
if (message != null) {
Via.getPlatform().runSync(() -> Via.getPlatform().getLogger().warning(message));
}
});
}
private static @Nullable String getUpdateMessage(boolean console) {
if (Via.getPlatform().getPluginVersion().equals("${version}")) {
return "You are using a debug/custom version, consider updating.";
}
String newestString = getNewestVersion();
if (newestString == null) {
if (console) {
return "Could not check for updates, check your connection.";
} else {
return null;
}
}
Version current;
try {
current = new Version(Via.getPlatform().getPluginVersion());
} catch (IllegalArgumentException e) {
return "You are using a custom version, consider updating.";
}
Version newest = new Version(newestString);
if (current.compareTo(newest) < 0) {
return "There is a newer plugin version available: " + newest + ", you're on: " + current;
} else if (console && current.compareTo(newest) != 0) {
String tag = current.getTag().toLowerCase(Locale.ROOT);
if (tag.startsWith("dev") || tag.startsWith("snapshot")) {
return "You are running a development version of the plugin, please report any bugs to GitHub.";
} else {
return "You are running a newer version of the plugin than is released!";
}
}
return null;
}
private static @Nullable String getNewestVersion() {
try {
URL url = new URL(URL + PLUGIN);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setUseCaches(false);
connection.addRequestProperty("User-Agent", "ViaVersion " + Via.getPlatform().getPluginVersion() + " " + Via.getPlatform().getPlatformName());
connection.addRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String input;
StringBuilder builder = new StringBuilder();
while ((input = br.readLine()) != null) {
builder.append(input);
}
br.close();
JsonObject statistics;
try {
statistics = GsonUtil.getGson().fromJson(builder.toString(), JsonObject.class);
} catch (JsonParseException e) {
Via.getPlatform().getLogger().log(Level.WARNING, "Failed to parse update response", e);
return null;
}
return statistics.get("name").getAsString();
} catch (IOException e) {
return null;
}
}
}