feat: 添加订阅更新系统

Signed-off-by: 502647092 <admin@yumc.pw>
merge/1/MERGE
502647092 2016-08-03 16:32:35 +08:00
parent 8f0f22971d
commit 7b7eb9a3c6
1 changed files with 119 additions and 0 deletions

View File

@ -0,0 +1,119 @@
package pw.yumc.YumCore.update;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLDecoder;
import java.nio.file.Files;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import pw.yumc.YumCore.bukkit.P;
/**
*
*
* @since 201683 11:20:21
* @author
*/
public class SubscribeTask implements Runnable {
private final static String url = "https://coding.net/u/502647092/p/%s/git/raw/%s/pom.xml";
private final static String download = "http://ci.yumc.pw/job/%1$s/lastSuccessfulBuild/artifact/target/%1$s.jar";
private final String branch;
/**
*
*/
public SubscribeTask() {
this("master");
}
/**
*
*
* @param branch
*
*/
public SubscribeTask(final String branch) {
this.branch = branch;
Bukkit.getScheduler().runTaskTimerAsynchronously(P.instance, this, 0, 20 * 60 * 5);
}
/**
*
*
* @param plugin
* -
* @return
*/
public File getPluginFile(final Plugin plugin) {
File file = null;
final ClassLoader cl = plugin.getClass().getClassLoader();
if ((cl instanceof URLClassLoader)) {
@SuppressWarnings("resource")
final URLClassLoader ucl = (URLClassLoader) cl;
final URL url = ucl.getURLs()[0];
try {
file = new File(URLDecoder.decode(url.getFile(), "UTF-8"));
} catch (final UnsupportedEncodingException e) {
}
}
return file;
}
/**
*
*
* @param
* @param
* @return
*/
public boolean needUpdate(final String v1, final String v2) {
final String[] va1 = v1.split("\\.");// 注意此处为正则匹配,不能用"."
final String[] va2 = v2.split("\\.");
int idx = 0;
final int minLength = Math.min(va1.length, va2.length);// 取最小长度值
int diff = 0;
while (idx < minLength
&& (diff = va1[idx].length() - va2[idx].length()) == 0// 先比较长度
&& (diff = va1[idx].compareTo(va2[idx])) == 0) {// 再比较字符
++idx;
}
// 如果已经分出大小,则直接返回,如果未分出大小,则再比较位数,有子版本的为大;
diff = (diff != 0) ? diff : va1.length - va2.length;
return diff > 0;
}
@Override
public void run() {
try {
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
final DocumentBuilder builder = factory.newDocumentBuilder();
final String result = builder.parse(String.format(url, P.getName(), branch)).getElementsByTagName("version").item(0).getTextContent().split("-")[0];
if (needUpdate(result, P.getDescription().getVersion().split("-")[0])) {
final File target = new File("plugins/update/" + getPluginFile(P.instance).getName());
final File temp = new File("plugins/update/" + getPluginFile(P.instance).getName() + ".downloading");
if (target.exists()) {
try {
final PluginDescriptionFile desc = P.instance.getPluginLoader().getPluginDescription(target);
if (!needUpdate(result, desc.getVersion().split("-")[0])) {
return;
}
target.delete();
} catch (final Exception e) {
}
}
Files.copy(new URL(String.format(download, P.getName())).openStream(), temp.toPath());
temp.renameTo(target);
}
} catch (final Exception e) {
}
}
}