More abstractions

- Abstracted UpdateCheckerTask
- Merged PluginProvider into the PluginManagers
This commit is contained in:
Frank van der Heijden 2020-07-05 16:07:36 +02:00
parent 23e8e80191
commit e67b20dee0
No known key found for this signature in database
GPG key ID: 26DA56488D314D11
40 changed files with 546 additions and 347 deletions

View file

@ -7,10 +7,11 @@ import net.frankheijden.serverutils.bungee.commands.CommandPlugins;
import net.frankheijden.serverutils.bungee.commands.CommandServerUtils;
import net.frankheijden.serverutils.bungee.entities.BungeePlugin;
import net.frankheijden.serverutils.bungee.entities.BungeeReflection;
import net.frankheijden.serverutils.bungee.listeners.BungeeListener;
import net.frankheijden.serverutils.bungee.managers.BungeePluginManager;
import net.frankheijden.serverutils.common.ServerUtilsApp;
import net.frankheijden.serverutils.common.config.Config;
import net.frankheijden.serverutils.common.config.Messenger;
import net.frankheijden.serverutils.common.providers.PluginProvider;
import net.md_5.bungee.api.plugin.Plugin;
import org.bstats.bungeecord.Metrics;
@ -29,7 +30,7 @@ public class ServerUtils extends Plugin {
instance = this;
this.plugin = new BungeePlugin(this);
ServerUtilsApp.init(plugin);
ServerUtilsApp.init(this, plugin);
new Metrics(this, ServerUtilsApp.BSTATS_METRICS_ID);
new BungeeReflection();
@ -38,12 +39,15 @@ public class ServerUtils extends Plugin {
commandManager.registerCommand(new CommandPlugins());
commandManager.registerCommand(new CommandServerUtils());
PluginProvider<Plugin> provider = plugin.getPluginProvider();
BungeePluginManager manager = plugin.getPluginManager();
CommandCompletions<BungeeCommandCompletionContext> commandCompletions = commandManager.getCommandCompletions();
commandCompletions.registerAsyncCompletion("plugins", context -> provider.getPluginNames());
commandCompletions.registerAsyncCompletion("pluginJars", context -> provider.getPluginFileNames());
commandCompletions.registerAsyncCompletion("plugins", context -> manager.getPluginNames());
commandCompletions.registerAsyncCompletion("pluginJars", context -> manager.getPluginFileNames());
reload();
getProxy().getPluginManager().registerListener(this, new BungeeListener());
ServerUtilsApp.checkForUpdates();
}
public static ServerUtils getInstance() {

View file

@ -6,9 +6,7 @@ import co.aikar.commands.annotation.CommandCompletion;
import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Default;
import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Subcommand;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.bungee.entities.BungeePluginProvider;
import net.frankheijden.serverutils.bungee.managers.BungeePluginManager;
import net.frankheijden.serverutils.bungee.utils.BungeeUtils;
import net.frankheijden.serverutils.common.commands.Plugins;
import net.frankheijden.serverutils.common.config.Messenger;
@ -17,8 +15,7 @@ import net.md_5.bungee.api.CommandSender;
@CommandAlias("bpl|bplugins|bungeepl")
public class CommandPlugins extends BaseCommand {
private static final ServerUtils plugin = ServerUtils.getInstance();
private static final BungeePluginProvider provider = (BungeePluginProvider) plugin.getPlugin().getPluginProvider();
private static final BungeePluginManager manager = BungeePluginManager.get();
/**
* Sends the plugin list to the sender.
@ -33,7 +30,7 @@ public class CommandPlugins extends BaseCommand {
public void onPlugins(CommandSender sender, String... args) {
boolean version = contains(args, "-v");
boolean modules = contains(args, "-m");
Plugins.sendPlugins(BungeeUtils.wrap(sender), provider.getPluginsSorted(modules), pl -> {
Plugins.sendPlugins(BungeeUtils.wrap(sender), manager.getPluginsSorted(modules), pl -> {
String ver = version ? Messenger.getMessage("serverutils.plugins.version",
"%version%", pl.getDescription().getVersion()) : "";
return Messenger.getMessage("serverutils.plugins.format",

View file

@ -1,17 +1,15 @@
package net.frankheijden.serverutils.bungee.commands;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.RegisteredCommand;
import co.aikar.commands.annotation.CommandAlias;
import co.aikar.commands.annotation.CommandCompletion;
import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Default;
import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Subcommand;
import com.google.common.collect.SetMultimap;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.bungee.entities.BungeeLoadResult;
import net.frankheijden.serverutils.bungee.managers.PluginManager;
import net.frankheijden.serverutils.bungee.managers.BungeePluginManager;
import net.frankheijden.serverutils.bungee.reflection.RPluginManager;
import net.frankheijden.serverutils.bungee.utils.BungeeUtils;
import net.frankheijden.serverutils.common.config.Messenger;
@ -101,14 +99,14 @@ public class CommandServerUtils extends BaseCommand {
public void onLoadPlugin(CommandSender commandSender, String jarFile) {
ServerCommandSender sender = BungeeUtils.wrap(commandSender);
BungeeLoadResult loadResult = PluginManager.loadPlugin(jarFile);
BungeeLoadResult loadResult = BungeePluginManager.get().loadPlugin(jarFile);
if (!loadResult.isSuccess()) {
loadResult.getResult().sendTo(sender, "load", jarFile);
return;
}
Plugin plugin = loadResult.get();
Result result = PluginManager.enablePlugin(plugin);
Result result = BungeePluginManager.get().enablePlugin(plugin);
result.sendTo(sender, "load", plugin.getDescription().getName());
}
@ -122,7 +120,7 @@ public class CommandServerUtils extends BaseCommand {
@CommandPermission("serverutils.unloadplugin")
@Description("Disables and unloads the specified plugin.")
public void onUnloadPlugin(CommandSender commandSender, String pluginName) {
CloseableResult result = PluginManager.unloadPlugin(pluginName);
CloseableResult result = BungeePluginManager.get().unloadPlugin(pluginName);
result.getResult().sendTo(BungeeUtils.wrap(commandSender), "unload", pluginName);
result.tryClose();
}
@ -137,7 +135,7 @@ public class CommandServerUtils extends BaseCommand {
@CommandPermission("serverutils.reloadplugin")
@Description("Reloads a specified plugin.")
public void onReloadPlugin(CommandSender sender, String pluginName) {
CloseableResult result = PluginManager.reloadPlugin(pluginName);
CloseableResult result = BungeePluginManager.get().reloadPlugin(pluginName);
result.getResult().sendTo(BungeeUtils.wrap(sender), "reload", pluginName);
result.tryClose();
}

View file

@ -0,0 +1,27 @@
package net.frankheijden.serverutils.bungee.entities;
import net.frankheijden.serverutils.bungee.utils.BungeeUtils;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import net.frankheijden.serverutils.common.providers.ChatProvider;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ProxyServer;
public class BungeeChatProvider extends ChatProvider {
@Override
public ServerCommandSender getConsoleSender() {
return BungeeUtils.wrap(ProxyServer.getInstance().getConsole());
}
@Override
public String color(String str) {
return ChatColor.translateAlternateColorCodes('&', str);
}
@Override
public void broadcast(String permission, String message) {
ProxyServer.getInstance().getPlayers().stream()
.filter(p -> p.hasPermission(permission))
.forEach(p -> p.sendMessage(message));
}
}

View file

@ -1,12 +0,0 @@
package net.frankheijden.serverutils.bungee.entities;
import net.frankheijden.serverutils.common.providers.ColorProvider;
import net.md_5.bungee.api.ChatColor;
public class BungeeColorProvider implements ColorProvider {
@Override
public String apply(String str) {
return ChatColor.translateAlternateColorCodes('&', str);
}
}

View file

@ -15,4 +15,9 @@ public class BungeeCommandSender implements ServerCommandSender {
public void sendMessage(String message) {
sender.sendMessage(message);
}
@Override
public boolean hasPermission(String permission) {
return sender.hasPermission(permission);
}
}

View file

@ -4,18 +4,19 @@ import java.io.File;
import java.util.logging.Logger;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.common.providers.ColorProvider;
import net.frankheijden.serverutils.common.providers.PluginProvider;
import net.frankheijden.serverutils.common.providers.ResourceProvider;
import net.frankheijden.serverutils.bungee.managers.BungeePluginManager;
import net.frankheijden.serverutils.bungee.managers.BungeeTaskManager;
import net.frankheijden.serverutils.bungee.managers.BungeeVersionManager;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
import net.md_5.bungee.api.plugin.Plugin;
public class BungeePlugin extends ServerUtilsPlugin {
private final ServerUtils plugin;
private final PluginProvider<Plugin> pluginProvider;
private final ResourceProvider resourceProvider;
private final ColorProvider colorProvider;
private final BungeePluginManager pluginManager;
private final BungeeTaskManager taskManager;
private final BungeeResourceProvider resourceProvider;
private final BungeeChatProvider chatProvider;
private final BungeeVersionManager versionManager;
/**
* Creates a new BungeePlugin instance of ServerUtils.
@ -23,25 +24,37 @@ public class BungeePlugin extends ServerUtilsPlugin {
*/
public BungeePlugin(ServerUtils plugin) {
this.plugin = plugin;
this.pluginProvider = new BungeePluginProvider(plugin);
this.pluginManager = new BungeePluginManager();
this.taskManager = new BungeeTaskManager();
this.resourceProvider = new BungeeResourceProvider(plugin);
this.colorProvider = new BungeeColorProvider();
this.chatProvider = new BungeeChatProvider();
this.versionManager = new BungeeVersionManager(plugin);
}
@Override
@SuppressWarnings("unchecked")
public PluginProvider<Plugin> getPluginProvider() {
return pluginProvider;
public BungeePluginManager getPluginManager() {
return pluginManager;
}
@Override
public ResourceProvider getResourceProvider() {
public BungeeTaskManager getTaskManager() {
return taskManager;
}
@Override
public BungeeResourceProvider getResourceProvider() {
return resourceProvider;
}
@Override
public ColorProvider getColorProvider() {
return colorProvider;
public BungeeChatProvider getChatProvider() {
return chatProvider;
}
@Override
public BungeeVersionManager getVersionManager() {
return versionManager;
}
@Override

View file

@ -1,51 +0,0 @@
package net.frankheijden.serverutils.bungee.entities;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.bungee.managers.PluginManager;
import net.frankheijden.serverutils.common.providers.PluginProvider;
import net.md_5.bungee.api.plugin.Plugin;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class BungeePluginProvider extends PluginProvider<Plugin> {
private final ServerUtils plugin;
public BungeePluginProvider(ServerUtils plugin) {
this.plugin = plugin;
}
@Override
public File getPluginsFolder() {
return plugin.getProxy().getPluginsFolder();
}
@Override
public List<Plugin> getPlugins() {
return getPlugins(false);
}
public List<Plugin> getPlugins(boolean modules) {
Collection<Plugin> plugins = plugin.getProxy().getPluginManager().getPlugins();
if (modules) return new ArrayList<>(plugins);
return plugins.stream()
.filter(PluginManager::isPlugin)
.collect(Collectors.toList());
}
@Override
public String getPluginName(Plugin plugin) {
return plugin.getDataFolder().getName();
}
public List<Plugin> getPluginsSorted(boolean modules) {
List<Plugin> plugins = getPlugins(modules);
plugins.sort(Comparator.comparing(this::getPluginName));
return plugins;
}
}

View file

@ -0,0 +1,16 @@
package net.frankheijden.serverutils.bungee.listeners;
import net.frankheijden.serverutils.bungee.utils.BungeeUtils;
import net.frankheijden.serverutils.common.listeners.ServerListener;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class BungeeListener implements Listener {
@EventHandler
public void onServerConnect(ServerConnectEvent event) {
if (event.getReason() != ServerConnectEvent.Reason.JOIN_PROXY) return;
ServerListener.handleUpdate(BungeeUtils.wrap(event.getPlayer()));
}
}

View file

@ -3,9 +3,9 @@ package net.frankheijden.serverutils.bungee.managers;
import com.google.common.base.Preconditions;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.bungee.entities.BungeeLoadResult;
import net.frankheijden.serverutils.bungee.entities.BungeePluginProvider;
import net.frankheijden.serverutils.bungee.reflection.RPluginClassLoader;
import net.frankheijden.serverutils.bungee.reflection.RPluginManager;
import net.frankheijden.serverutils.common.managers.AbstractPluginManager;
import net.frankheijden.serverutils.common.entities.CloseableResult;
import net.frankheijden.serverutils.common.entities.Result;
import net.md_5.bungee.api.ProxyServer;
@ -18,15 +18,29 @@ import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.stream.Collectors;
public class PluginManager {
public class BungeePluginManager extends AbstractPluginManager<Plugin> {
private static final ProxyServer proxy = ProxyServer.getInstance();
private static final ServerUtils plugin = ServerUtils.getInstance();
private static final BungeePluginProvider provider = (BungeePluginProvider) plugin.getPlugin().getPluginProvider();
private static BungeePluginManager instance;
public BungeePluginManager() {
instance = this;
}
public static BungeePluginManager get() {
return instance;
}
/**
* Checks whether a loaded plugin is a module.
@ -46,13 +60,15 @@ public class PluginManager {
return !isModule(plugin);
}
public static BungeeLoadResult loadPlugin(String fileName) {
File file = getPluginFileExact(fileName);
@Override
public BungeeLoadResult loadPlugin(String pluginFile) {
File file = getPluginFileExact(pluginFile);
if (!file.exists()) return new BungeeLoadResult(Result.NOT_EXISTS);
return loadPlugin(file);
}
public static BungeeLoadResult loadPlugin(File file) {
@Override
public BungeeLoadResult loadPlugin(File file) {
PluginDescription desc;
try {
desc = getPluginDescription(file);
@ -80,7 +96,8 @@ public class PluginManager {
}
}
public static Result enablePlugin(Plugin plugin) {
@Override
public Result enablePlugin(Plugin plugin) {
PluginDescription desc = plugin.getDescription();
String name = desc.getName();
try {
@ -95,13 +112,15 @@ public class PluginManager {
}
}
public static CloseableResult reloadPlugin(String pluginName) {
@Override
public CloseableResult reloadPlugin(String pluginName) {
Plugin plugin = proxy.getPluginManager().getPlugin(pluginName);
if (plugin == null) return new CloseableResult(Result.NOT_ENABLED);
return reloadPlugin(plugin);
}
public static CloseableResult reloadPlugin(Plugin plugin) {
@Override
public CloseableResult reloadPlugin(Plugin plugin) {
CloseableResult result = unloadPlugin(plugin);
if (result.getResult() != Result.SUCCESS) return result;
@ -114,13 +133,15 @@ public class PluginManager {
return result.set(enablePlugin(loadResult.get()));
}
public static CloseableResult unloadPlugin(String pluginName) {
@Override
public CloseableResult unloadPlugin(String pluginName) {
Plugin plugin = proxy.getPluginManager().getPlugin(pluginName);
if (plugin == null) return new CloseableResult(Result.NOT_ENABLED);
return unloadPlugin(plugin);
}
public static CloseableResult unloadPlugin(Plugin plugin) {
@Override
public CloseableResult unloadPlugin(Plugin plugin) {
plugin.onDisable();
proxy.getPluginManager().unregisterCommands(plugin);
proxy.getPluginManager().unregisterListeners(plugin);
@ -137,8 +158,8 @@ public class PluginManager {
return new File(proxy.getPluginsFolder(), fileName);
}
public static File getPluginFile(String pluginName) {
for (File file : provider.getPluginJars()) {
public File getPluginFile(String pluginName) {
for (File file : getPluginJars()) {
PluginDescription desc;
try {
desc = getPluginDescription(file);
@ -179,4 +200,38 @@ public class PluginManager {
if (loader instanceof Closeable) return (Closeable) loader;
return null;
}
@Override
public File getPluginsFolder() {
return plugin.getProxy().getPluginsFolder();
}
@Override
public List<Plugin> getPlugins() {
return getPlugins(false);
}
public List<Plugin> getPlugins(boolean modules) {
Collection<Plugin> plugins = plugin.getProxy().getPluginManager().getPlugins();
if (modules) return new ArrayList<>(plugins);
return plugins.stream()
.filter(BungeePluginManager::isPlugin)
.collect(Collectors.toList());
}
@Override
public String getPluginName(Plugin plugin) {
return plugin.getDataFolder().getName();
}
@Override
public File getPluginFile(Plugin plugin) {
return plugin.getFile();
}
public List<Plugin> getPluginsSorted(boolean modules) {
List<Plugin> plugins = getPlugins(modules);
plugins.sort(Comparator.comparing(this::getPluginName));
return plugins;
}
}

View file

@ -0,0 +1,13 @@
package net.frankheijden.serverutils.bungee.managers;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.common.managers.AbstractTaskManager;
import net.md_5.bungee.api.ProxyServer;
public class BungeeTaskManager extends AbstractTaskManager {
@Override
public void runTaskAsynchronously(Runnable runnable) {
ProxyServer.getInstance().getScheduler().runAsync(ServerUtils.getInstance(), runnable);
}
}

View file

@ -0,0 +1,15 @@
package net.frankheijden.serverutils.bungee.managers;
import net.frankheijden.serverutils.bungee.ServerUtils;
import net.frankheijden.serverutils.common.managers.AbstractVersionManager;
public class BungeeVersionManager extends AbstractVersionManager {
/**
* Creates a new VersionManager instance.
* Used for automatic updating.
*/
public BungeeVersionManager(ServerUtils plugin) {
super(plugin.getDescription().getVersion());
}
}