125 lines
4.5 KiB
Java
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();
|
|
}
|
|
}
|