ChestShop-3/src/main/java/com/Acrobot/ChestShop/Updater/JenkinsBuildsNotifier.java
Phoenix616 d52c329618
Make compatible with Folia by using own ExecutorService
Our async tasks were already pretty world-independent (update checker as
 well as some logging so this should work pretty well)

For the rest the ORMLite library should already be able to handle access from
 different threads and whether economy plugins are compatible with Folia is
 up to them, not us...
2023-03-23 23:50:43 +01:00

125 lines
4.5 KiB
Java

package com.Acrobot.ChestShop.Updater;
import com.Acrobot.ChestShop.ChestShop;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
public class JenkinsBuildsNotifier implements Runnable {
private final Plugin plugin;
private final File configFile;
private final FileConfiguration config;
private int build;
private URL apiUrl;
public JenkinsBuildsNotifier(Plugin plugin, String jenkinsJobUrl) {
this.plugin = plugin;
configFile = new File(plugin.getDataFolder(), "jenkinsBuildsNotifier.yml");
if (configFile.exists()) {
config = YamlConfiguration.loadConfiguration(configFile);
} else {
config = new YamlConfiguration();
config.addDefault("disabled", false);
config.addDefault("jenkins-job-url-override", "");
config.options().copyDefaults(true);
saveConfig();
}
if (config.getBoolean("disabled")) {
return;
}
build = getBuildNumber();
if (build < 1) {
plugin.getLogger().log(Level.WARNING, "Unable to parse plugin build from version string! (" + plugin.getDescription().getVersion() + ")");
return;
}
String jenkinsJobUrlOverride = config.getString("jenkins-job-url-override");
if (jenkinsJobUrlOverride != null && !jenkinsJobUrlOverride.isEmpty()) {
jenkinsJobUrl = jenkinsJobUrlOverride;
}
try {
apiUrl = new URL(jenkinsJobUrl + "api/json");
ChestShop.runInAsyncThread(this);
} catch (MalformedURLException e) {
plugin.getLogger().log(Level.WARNING, "Can not check for new dev builds as " + jenkinsJobUrl + "api/json is not a valid url!", e);
}
}
private void saveConfig() {
try {
config.save(configFile);
} catch (IOException e) {
plugin.getLogger().log(Level.WARNING, "Error while saving " + configFile.getName() + "! " + e.getMessage());
}
}
private int getBuildNumber() {
String tag = "(build ";
String versionStr = plugin.getDescription().getVersion();
int start = versionStr.indexOf(tag);
int end = versionStr.indexOf(')', start);
if (start > 0 && end > start) {
try {
return Integer.parseInt(versionStr.substring(start + tag.length(), end));
} catch (NumberFormatException ignored) {}
}
return -1;
}
@Override
public void run() {
try {
JsonObject responseJson = queryJson();
if (responseJson.has("lastStableBuild") && responseJson.get("lastStableBuild").isJsonObject()) {
JsonObject lastStable = responseJson.getAsJsonObject("lastStableBuild");
int lastStableBuild = lastStable.get("number").getAsInt();
if (lastStableBuild > build && config.getInt("last-announced-build", 0) < lastStableBuild) {
String url = lastStable.get("url").getAsString();
plugin.getLogger().log(Level.INFO, "A new development build is available for testing: " + url);
config.set("last-announced-build", lastStableBuild);
saveConfig();
}
}
} catch (Exception e) {
plugin.getLogger().log(Level.WARNING, "Error while trying to query Jenkins API", e);
}
}
private JsonObject queryJson() throws IOException {
HttpURLConnection con = (HttpURLConnection) apiUrl.openConnection();
con.setRequestProperty("User-Agent", plugin.getName() + " " + plugin.getDescription().getVersion() + " Jenkins Builds Notifier");
con.setRequestMethod("GET");
StringBuilder msg = new StringBuilder();
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while((line = in.readLine()) != null) {
if(msg.length() != 0) {
msg.append("\n");
}
msg.append(line);
}
in.close();
return new JsonParser().parse(msg.toString()).getAsJsonObject();
}
}