mirror of
https://e.coding.net/circlecloud/YumCore.git
synced 2024-11-24 02:08:48 +00:00
feat: 添加订阅更新系统
Signed-off-by: 502647092 <admin@yumc.pw>
This commit is contained in:
parent
8f0f22971d
commit
7b7eb9a3c6
119
src/main/java/pw/yumc/YumCore/update/SubscribeTask.java
Normal file
119
src/main/java/pw/yumc/YumCore/update/SubscribeTask.java
Normal 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 2016年8月3日 上午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) {
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user