大版本更新 支持一键更新老版本插件...

Signed-off-by: 502647092 <jtb1@163.com>
dev 1.8.5
502647092 2015-11-25 15:34:35 +08:00
parent 857cda6fe5
commit 6e766313d6
18 changed files with 310 additions and 162 deletions

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>cn.citycraft</groupId>
<artifactId>Yum</artifactId>
<version>1.8.3</version>
<version>1.8.5</version>
<name>Yum</name>
<description>Minecraft 服务器插件管理系统</description>
<build>
@ -55,7 +55,7 @@
</build>
<properties>
<jenkins.url>http://ci.citycraft.cn:8080</jenkins.url>
<update.description>&amp;b默认使用国内源数据 添加仓库查看命令...</update.description>
<update.description>&amp;c重大更新 支持一键更新老版本插件...</update.description>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>

View File

@ -8,6 +8,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import cn.citycraft.PluginHelper.commands.HandlerSubCommand;
import cn.citycraft.PluginHelper.config.FileConfig;
import cn.citycraft.PluginHelper.utils.VersionChecker;
import cn.citycraft.Yum.api.YumAPI;
import cn.citycraft.Yum.commands.CommandDelete;
import cn.citycraft.Yum.commands.CommandInfo;
import cn.citycraft.Yum.commands.CommandInstall;
@ -19,7 +20,6 @@ import cn.citycraft.Yum.commands.CommandUnload;
import cn.citycraft.Yum.commands.CommandUpdate;
import cn.citycraft.Yum.commands.CommandUpdateAll;
import cn.citycraft.Yum.commands.CommandUpgrade;
import cn.citycraft.Yum.manager.YumManager;
/**
* MC
@ -28,7 +28,7 @@ import cn.citycraft.Yum.manager.YumManager;
*/
public class Yum extends JavaPlugin {
public FileConfig config;
public YumManager yumgr;
public YumAPI yumgr;
public void initCommands() {
final HandlerSubCommand cmdhandler = new HandlerSubCommand(this, "yum");
@ -47,16 +47,16 @@ public class Yum extends JavaPlugin {
@Override
public void onDisable() {
YumManager.repo.cacheToJson(config);
YumAPI.repo.cacheToJson(config);
config.save();
}
@Override
public void onEnable() {
this.initCommands();
yumgr = new YumManager(this);
YumManager.repo.jsonToCache(config);
YumManager.updaterepo();
yumgr = new YumAPI(this);
YumAPI.repo.jsonToCache(config);
YumAPI.updaterepo();
new VersionChecker(this);
}

View File

@ -0,0 +1,250 @@
package cn.citycraft.Yum.api;
import java.io.File;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
import cn.citycraft.CommonData.UpdatePlugin;
import cn.citycraft.Yum.manager.DownloadManager;
import cn.citycraft.Yum.manager.PluginInfo;
import cn.citycraft.Yum.manager.PluginsManager;
import cn.citycraft.Yum.manager.RepositoryManager;
/**
* Yum
*
* @author
* 20159110:59:47
*/
public class YumAPI {
public static DownloadManager download;
public static PluginsManager plugman;
public static RepositoryManager repo;
protected static Plugin main;
public YumAPI(final Plugin plugin) {
YumAPI.main = plugin;
plugman = new PluginsManager(main);
download = new DownloadManager(main);
repo = new RepositoryManager(main);
}
/**
*
*
* @param plugin
* -
*/
public static void delete(final Plugin plugin) {
plugman.deletePlugin(plugin);
}
/**
*
*
* @param sender
* -
* @param pluginname
* -
* @param version
* -
* @return
*/
public static boolean install(final CommandSender sender, final String pluginname, final String url) {
if (download.run(sender, url, new File(Bukkit.getUpdateFolderFile().getParentFile(), pluginname + ".jar"))) {
return plugman.load(sender, pluginname);
}
return false;
}
/**
*
*
* @param pluginname
* -
* @param version
* -
* @return
*/
public static boolean install(final String pluginname, final String url) {
return install(null, pluginname, url);
}
/**
*
*
* @param sender
* -
* @param pluginname
* -
* @return
*/
public static boolean installfromyum(final CommandSender sender, final String pluginname) {
return installfromyum(sender, pluginname, null);
}
/**
*
*
* @param sender
* -
* @param pluginname
* -
* @param version
* -
* @return
*/
public static boolean installfromyum(final CommandSender sender, final String pluginname, final String version) {
final PluginInfo pi = repo.getPlugin(pluginname);
if (pi != null) {
return install(sender, pi.name, pi.getMavenUrl(sender, version));
}
return false;
}
/**
*
*
* @param pluginname
* -
*/
public static void load(final String pluginname) {
plugman.load(pluginname);
}
/**
*
*
* @param plugin
* -
*/
public static void reload(final Plugin plugin) {
plugman.unload(plugin);
}
/**
*
*
* @param plugin
* -
*/
public static void unload(final Plugin plugin) {
plugman.reload(plugin);
}
/**
*
*
* @param sender
* -
* @param plugin
* -
* @param url
* -
* @return
*/
public static boolean update(final CommandSender sender, final Plugin plugin, final URL url) {
if (download.run(sender, url, new File(Bukkit.getUpdateFolderFile(), plugman.getPluginFile(plugin).getName()))) {
sender.sendMessage("§6更新: §a已下载插件 " + plugin.getName() + " 到update文件夹 重启后自动更新(或使用upgrade直接升级)!");
return true;
}
return false;
}
/**
*
*
* @param plugin
* -
* @param url
* -
* @return
*/
public static boolean update(final Plugin plugin, final URL url) {
return update(null, plugin, url);
}
/**
* Yum
*
* @param sender
* -
*/
public static void updateall(final CommandSender sender) {
final Map<Plugin, String> updatelist = UpdatePlugin.getList();
if (updatelist.size() > 0) {
for (final Entry<Plugin, String> updateplugin : UpdatePlugin.getList().entrySet()) {
updatefromyum(sender, updateplugin.getKey(), updateplugin.getValue());
}
UpdatePlugin.getList().clear();
sender.sendMessage("§6更新: §c已下载所有需要插件的插件到 到update文件夹 重启后自动更新(或使用/yum upgrade直接升级)!");
} else {
sender.sendMessage("§6更新: §e未找到需要更新且可以用Yum处理的插件!");
}
}
/**
*
*
* @param sender
* -
* @param plugin
* -
* @return
*/
public static boolean updatefromyum(final CommandSender sender, final Plugin plugin) {
return updatefromyum(sender, plugin, null);
}
/**
* Yum
*
* @param sender
* -
* @param plugin
* -
* @param version
* - (null)
* @return
*/
public static boolean updatefromyum(final CommandSender sender, final Plugin plugin, final String version) {
final PluginInfo pi = repo.getPlugin(plugin.getName());
if (pi != null) {
if (download.run(sender, pi.getMavenUrl(sender, version), new File(Bukkit.getUpdateFolderFile(), plugman.getPluginFile(plugin).getName()))) {
sender.sendMessage("§6更新: §a已下载插件 " + plugin.getName() + " 到update文件夹 重启后自动更新(或使用upgrade直接升级)!");
return true;
}
} else {
sender.sendMessage("§6更新: §c仓库缓存中未找到插件 " + plugin.getName());
}
return false;
}
/**
* Yum
*/
public static void updaterepo() {
main.getServer().getScheduler().runTaskAsynchronously(main, new Runnable() {
@Override
public void run() {
repo.updateRepositories(Bukkit.getConsoleSender());
}
});
}
/**
* @param sender
* -
* @param plugin
* -
*/
public static void upgrade(final CommandSender sender, final Plugin plugin) {
plugman.upgrade(sender, plugin);
}
}

View File

@ -1,23 +0,0 @@
/**
*
*/
package cn.citycraft.Yum.api;
import java.net.URL;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
import cn.citycraft.Yum.manager.YumManager;
/**
* YumAPI
*
* @author
* @since 20158224:43:41
*/
public class YumApi {
public static boolean update(final CommandSender sender, final Plugin plugin, final URL url, final String version) {
return YumManager.update(sender, plugin, url, version);
}
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -37,7 +37,7 @@ public class CommandDelete extends BaseCommand {
final String pluginname = args[0];
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
if (plugin != null) {
if (YumManager.plugman.deletePlugin(sender, plugin)) {
if (YumAPI.plugman.deletePlugin(sender, plugin)) {
sender.sendMessage("§c删除: §a插件 " + pluginname + " 已从服务器卸载并删除!");
} else {
sender.sendMessage("§c删除: §c插件 " + pluginname + " 卸载或删除时发生错误 删除失败!");

View File

@ -16,7 +16,7 @@ import org.bukkit.plugin.PluginDescriptionFile;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.PluginHelper.utils.StringUtil;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -51,7 +51,7 @@ public class CommandInfo extends BaseCommand {
StringUtil.sendStringArray(sender, desc.getDepend(), "§6 - §a");
sender.sendMessage("§6插件软依赖: §3" + (desc.getSoftDepend().size() == 0 ? "无" : ""));
StringUtil.sendStringArray(sender, desc.getSoftDepend(), "§6 - §a");
sender.sendMessage("§6插件物理路径: §3" + YumManager.plugman.getPluginFile(plugin).getAbsolutePath());
sender.sendMessage("§6插件物理路径: §3" + YumAPI.plugman.getPluginFile(plugin).getAbsolutePath());
} else {
sender.sendMessage("§4错误: §c插件 " + pluginname + " 不存在或已卸载!");
}
@ -60,7 +60,7 @@ public class CommandInfo extends BaseCommand {
@Override
public List<String> onTabComplete(final CommandSender sender, final Command command, final String label, final String[] args) {
if (!args[0].equalsIgnoreCase("install") && !args[0].equalsIgnoreCase("repo")) {
return StringUtil.copyPartialMatches(args[1], YumManager.plugman.getPluginNames(false), new ArrayList<String>());
return StringUtil.copyPartialMatches(args[1], YumAPI.plugman.getPluginNames(false), new ArrayList<String>());
}
return null;
}

View File

@ -15,7 +15,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.PluginHelper.utils.StringUtil;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -45,9 +45,9 @@ public class CommandInstall extends BaseCommand {
@Override
public void run() {
if (args.length < 2) {
YumManager.install(sender, pluginname);
YumAPI.installfromyum(sender, pluginname);
} else {
YumManager.install(sender, pluginname, args[1]);
YumAPI.installfromyum(sender, pluginname, args[1]);
}
}
});
@ -59,7 +59,7 @@ public class CommandInstall extends BaseCommand {
@Override
public List<String> onTabComplete(final CommandSender sender, final Command command, final String label, final String[] args) {
if (args[0].equalsIgnoreCase("install")) {
return StringUtil.copyPartialMatches(args[1], YumManager.repo.getAllPluginName(), new ArrayList<String>());
return StringUtil.copyPartialMatches(args[1], YumAPI.repo.getAllPluginName(), new ArrayList<String>());
}
return null;
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -34,7 +34,7 @@ public class CommandList extends BaseCommand {
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
sender.sendMessage("§6[Yum仓库]§3服务器已安装插件: ");
for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
sender.sendMessage("§6 - " + YumManager.plugman.getFormattedName(plugin, true));
sender.sendMessage("§6 - " + YumAPI.plugman.getFormattedName(plugin, true));
}
};
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -37,7 +37,7 @@ public class CommandLoad extends BaseCommand {
final String pluginname = args[0];
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
if (plugin == null) {
YumManager.plugman.load(sender, pluginname);
YumAPI.plugman.load(sender, pluginname);
} else {
sender.sendMessage("§c错误: 插件 " + pluginname + " 已加载到服务器!");
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -36,12 +36,12 @@ public class CommandReload extends BaseCommand {
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
final String pluginname = args[0];
if (pluginname.equalsIgnoreCase("all") || pluginname.equalsIgnoreCase("*")) {
YumManager.plugman.reloadAll(sender);
YumAPI.plugman.reloadAll(sender);
return;
}
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
if (plugin != null) {
YumManager.plugman.reload(sender, plugin);
YumAPI.plugman.reload(sender, plugin);
} else {
sender.sendMessage("§c插件 " + pluginname + " 不存在或已卸载!");
}

View File

@ -14,7 +14,7 @@ import org.bukkit.command.CommandSender;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.PluginHelper.utils.StringUtil;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -44,8 +44,8 @@ public class CommandRepo extends BaseCommand {
switch (cmd) {
case "add":
if (args.length == 2) {
if (YumManager.repo.addRepositories(sender, args[1])) {
final String reponame = YumManager.repo.getRepoCache(args[1]).name;
if (YumAPI.repo.addRepositories(sender, args[1])) {
final String reponame = YumAPI.repo.getRepoCache(args[1]).name;
sender.sendMessage("§6仓库: §a源仓库 §e" + reponame + " §a的插件信息已缓存!");
} else {
sender.sendMessage("§6仓库: §c源地址未找到仓库信息或当前地址已缓存!");
@ -56,8 +56,8 @@ public class CommandRepo extends BaseCommand {
break;
case "del":
if (args.length == 2) {
if (YumManager.repo.delRepositories(sender, args[1])) {
final String reponame = YumManager.repo.getRepoCache(args[1]).name;
if (YumAPI.repo.delRepositories(sender, args[1])) {
final String reponame = YumAPI.repo.getRepoCache(args[1]).name;
sender.sendMessage("§6仓库: §a源仓库 §e" + reponame + " §c已删除 §a请使用 §b/yum repo update §a更新缓存!");
} else {
sender.sendMessage("§6仓库: §c源地址未找到!");
@ -68,18 +68,18 @@ public class CommandRepo extends BaseCommand {
break;
case "list":
sender.sendMessage("§6仓库: §b缓存的插件信息如下 ");
StringUtil.sendStringArray(sender, YumManager.repo.getAllPluginsInfo());
StringUtil.sendStringArray(sender, YumAPI.repo.getAllPluginsInfo());
break;
case "all":
sender.sendMessage("§6仓库: §b缓存的仓库信息如下 ");
StringUtil.sendStringArray(sender, YumManager.repo.getRepoCache().getAllRepoInfo());
StringUtil.sendStringArray(sender, YumAPI.repo.getRepoCache().getAllRepoInfo());
break;
case "clean":
YumManager.repo.clean();
YumAPI.repo.clean();
sender.sendMessage("§6仓库: §a缓存的插件信息已清理!");
break;
case "update":
YumManager.repo.updateRepositories(sender);
YumAPI.repo.updateRepositories(sender);
sender.sendMessage("§6仓库: §a仓库缓存数据已更新!");
break;
}
@ -94,7 +94,7 @@ public class CommandRepo extends BaseCommand {
return StringUtil.copyPartialMatches(args[1], Arrays.asList(new String[] { "add", "all", "list", "clean", "update", "del" }), new ArrayList<String>());
}
if (args.length == 3 && (args[1] == "add" || args[1] == "del")) {
return StringUtil.copyPartialMatches(args[2], YumManager.repo.getRepos().keySet(), new ArrayList<String>());
return StringUtil.copyPartialMatches(args[2], YumAPI.repo.getRepos().keySet(), new ArrayList<String>());
}
}
return null;

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
*
@ -37,7 +37,7 @@ public class CommandUnload extends BaseCommand {
final String pluginname = args[0];
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
if (plugin != null) {
YumManager.plugman.unload(sender, plugin);
YumAPI.plugman.unload(sender, plugin);
} else {
sender.sendMessage("§c插件 " + pluginname + " 不存在或已卸载!");
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
* @author 20158122:04:05
@ -40,9 +40,9 @@ public class CommandUpdate extends BaseCommand {
@Override
public void run() {
if (args.length < 2) {
YumManager.update(sender, plugin);
YumAPI.updatefromyum(sender, plugin);
} else {
YumManager.update(sender, plugin, args[1]);
YumAPI.updatefromyum(sender, plugin, args[1]);
}
}
});

View File

@ -7,11 +7,10 @@ import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
* @author 20158122:04:05
@ -30,22 +29,12 @@ public class CommandUpdateAll extends BaseCommand {
@Override
public void execute(final CommandSender sender, final Command command, final String label, final String[] args) throws CommandException {
final String pluginname = args[0];
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
sender.sendMessage("§a开始更新服务器可更新插件");
if (plugin != null) {
Bukkit.getScheduler().runTaskAsynchronously(main, new Runnable() {
@Override
public void run() {
if (args.length < 2) {
YumManager.update(sender, plugin);
} else {
YumManager.update(sender, plugin, args[1]);
}
}
});
} else {
sender.sendMessage("§c插件" + pluginname + "未安装或已卸载 需要安装请使用/yum install " + pluginname + "!");
}
sender.sendMessage("§d开始更新服务器可更新插件");
Bukkit.getScheduler().runTaskAsynchronously(main, new Runnable() {
@Override
public void run() {
YumAPI.updateall(sender);
}
});
};
}

View File

@ -11,7 +11,7 @@ import org.bukkit.plugin.Plugin;
import cn.citycraft.PluginHelper.commands.BaseCommand;
import cn.citycraft.Yum.Yum;
import cn.citycraft.Yum.manager.YumManager;
import cn.citycraft.Yum.api.YumAPI;
/**
* @author 20158122:04:05
@ -35,13 +35,13 @@ public class CommandUpgrade extends BaseCommand {
@Override
public void run() {
if (args.length == 0) {
YumManager.plugman.upgrade(sender);
YumAPI.plugman.upgrade(sender);
} else {
final String pluginname = args[0];
final Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(pluginname);
sender.sendMessage("§a开始升级插件: " + pluginname);
if (plugin != null) {
YumManager.plugman.upgrade(sender, plugin);
YumAPI.upgrade(sender, plugin);
} else {
sender.sendMessage("§c插件未安装或已卸载 需要安装请使用yum install " + pluginname + "!");
}

View File

@ -25,6 +25,15 @@ public class PluginInfo {
return String.format("%1$s-%2$s.jar", plugin.artifactId, version);
}
/**
* Maven
*
* @param sender
* -
* @param version
* -
* @return
*/
public String getMavenUrl(final CommandSender sender, final String version) {
String ver = version;
if (ver == null) {

View File

@ -363,7 +363,7 @@ public class PluginsManager {
*
* @param sender
* -
* @param plugin
* @param main
* -
* @return
*/

View File

@ -1,77 +0,0 @@
package cn.citycraft.Yum.manager;
import java.io.File;
import java.net.URL;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
/**
*
*
* @author
* 20159110:59:47
*/
public class YumManager {
public static DownloadManager download;
public static PluginsManager plugman;
public static RepositoryManager repo;
protected static Plugin plugin;
public YumManager(final Plugin plugin) {
YumManager.plugin = plugin;
plugman = new PluginsManager(plugin);
download = new DownloadManager(plugin);
repo = new RepositoryManager(plugin);
}
public static boolean install(final CommandSender sender, final String pluginname) {
return install(sender, pluginname, null);
}
public static boolean install(final CommandSender sender, final String pluginname, final String version) {
final PluginInfo pi = repo.getPlugin(pluginname);
if (pi != null) {
if (download.run(sender, pi.getMavenUrl(sender, version), new File("plugins", pi.name + ".jar"))) {
return plugman.load(sender, pluginname);
}
}
return false;
}
public static boolean update(final CommandSender sender, final Plugin plugin) {
return update(sender, plugin, null);
}
public static boolean update(final CommandSender sender, final Plugin plugin, final String version) {
final PluginInfo pi = repo.getPlugin(plugin.getName());
if (pi != null) {
if (download.run(sender, pi.getMavenUrl(sender, version), new File(Bukkit.getUpdateFolderFile(), plugman.getPluginFile(plugin).getName()))) {
sender.sendMessage("§6更新: §a已下载插件 " + plugin.getName() + " 到update文件夹 重启后自动更新(或使用upgrade直接升级)!");
return true;
}
} else {
sender.sendMessage("§6更新: §c仓库缓存中未找到插件 " + plugin.getName());
}
return false;
}
public static boolean update(final CommandSender sender, final Plugin plugin, final URL url, final String version) {
if (download.run(sender, url, new File(Bukkit.getUpdateFolderFile(), plugman.getPluginFile(plugin).getName()))) {
sender.sendMessage("§6更新: §a已下载插件 " + plugin.getName() + " 到update文件夹 重启后自动更新(或使用upgrade直接升级)!");
return true;
}
return false;
}
public static void updaterepo() {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
repo.updateRepositories(Bukkit.getConsoleSender());
}
});
}
}