Initial BungeeCord edition

This commit is contained in:
Frank van der Heijden 2020-07-04 21:30:34 +02:00
parent 4416d55173
commit 23e8e80191
No known key found for this signature in database
GPG key ID: 26DA56488D314D11
75 changed files with 1931 additions and 396 deletions

View file

@ -3,23 +3,25 @@ package net.frankheijden.serverutils.bukkit;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.CommandCompletions;
import co.aikar.commands.PaperCommandManager;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import net.frankheijden.serverutils.bukkit.commands.CommandPlugins;
import net.frankheijden.serverutils.bukkit.commands.CommandServerUtils;
import net.frankheijden.serverutils.bukkit.config.Config;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import net.frankheijden.serverutils.bukkit.entities.BukkitPlugin;
import net.frankheijden.serverutils.bukkit.listeners.MainListener;
import net.frankheijden.serverutils.bukkit.managers.VersionManager;
import net.frankheijden.serverutils.bukkit.reflection.BukkitReflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import net.frankheijden.serverutils.bukkit.reflection.RCommandMap;
import net.frankheijden.serverutils.bukkit.reflection.RCraftServer;
import net.frankheijden.serverutils.bukkit.tasks.UpdateCheckerTask;
import net.frankheijden.serverutils.bukkit.utils.BukkitUtils;
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 org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
@ -30,31 +32,33 @@ import org.bukkit.plugin.java.JavaPlugin;
public class ServerUtils extends JavaPlugin implements CommandExecutor {
private static final int BSTATS_METRICS_ID = 7790;
private static ServerUtils instance;
private static final String CONFIG_RESOURCE = "bukkit-config.yml";
private static final String MESSAGES_RESOURCE = "bukkit-messages.yml";
private BukkitPlugin plugin;
private PaperCommandManager commandManager;
private CommandPlugins commandPlugins;
public static ServerUtils getInstance() {
return instance;
}
@Override
public void onEnable() {
super.onEnable();
instance = this;
new Metrics(this, BSTATS_METRICS_ID);
this.plugin = new BukkitPlugin(this);
ServerUtilsApp.init(plugin);
new Metrics(this, ServerUtilsApp.BSTATS_METRICS_ID);
new BukkitReflection();
this.commandManager = new PaperCommandManager(this);
commandManager.registerCommand(new CommandServerUtils());
this.commandPlugins = null;
PluginProvider<Plugin> provider = plugin.getPluginProvider();
CommandCompletions<BukkitCommandCompletionContext> completions = commandManager.getCommandCompletions();
completions.registerAsyncCompletion("plugins", context -> getPluginNames());
completions.registerAsyncCompletion("pluginJars", context -> getPluginFileNames());
completions.registerAsyncCompletion("plugins", context -> provider.getPluginNames());
completions.registerAsyncCompletion("pluginJars", context -> provider.getPluginFileNames());
completions.registerAsyncCompletion("supportedConfigs ", context -> CommandServerUtils.getSupportedConfigs());
completions.registerAsyncCompletion("commands", context -> {
try {
@ -72,24 +76,20 @@ public class ServerUtils extends JavaPlugin implements CommandExecutor {
checkForUpdates();
}
public static ServerUtils getInstance() {
return instance;
}
public BukkitPlugin getPlugin() {
return plugin;
}
@Override
public void onDisable() {
super.onDisable();
restoreBukkitPluginCommand();
}
private List<String> getPluginNames() {
return Arrays.stream(Bukkit.getPluginManager().getPlugins())
.map(Plugin::getName)
.collect(Collectors.toList());
}
private List<String> getPluginFileNames() {
return Arrays.stream(getJars())
.map(File::getName)
.collect(Collectors.toList());
}
private void removeCommands(String... commands) {
Map<String, Command> map;
try {
@ -118,10 +118,10 @@ public class ServerUtils extends JavaPlugin implements CommandExecutor {
restoreBukkitPluginCommand();
}
new Config(copyResourceIfNotExists("config.yml", "bukkit-config.yml"));
new Messenger(copyResourceIfNotExists("messages.yml", "bukkit-messages.yml"));
new Config("config.yml", CONFIG_RESOURCE);
new Messenger("messages.yml", MESSAGES_RESOURCE);
if (!Config.getInstance().getBoolean("settings.disable-plugins-command")) {
if (!Config.getInstance().getConfig().getBoolean("settings.disable-plugins-command")) {
this.removeCommands("pl", "plugins");
this.commandPlugins = new CommandPlugins();
commandManager.registerCommand(commandPlugins);
@ -132,38 +132,9 @@ public class ServerUtils extends JavaPlugin implements CommandExecutor {
return commandManager;
}
/**
* Retrieves all files with a jar extension in the plugins/ folder.
* @return An array of jar files.
*/
public File[] getJars() {
File parent = getDataFolder().getParentFile();
if (parent == null) return new File[0];
return parent.listFiles(f -> f.getName().endsWith(".jar"));
}
private void createDataFolderIfNotExists() {
if (!getDataFolder().exists()) {
getDataFolder().mkdirs();
}
}
private File copyResourceIfNotExists(String targetName, String resource) {
createDataFolderIfNotExists();
File file = new File(getDataFolder(), targetName);
if (!file.exists()) {
getLogger().info(String.format("'%s' not found, creating!", targetName));
saveResource(resource, false);
File copiedFile = new File(getDataFolder(), resource);
copiedFile.renameTo(file);
}
return file;
}
private void checkForUpdates() {
if (Config.getInstance().getBoolean("settings.check-updates")) {
UpdateCheckerTask.start(Bukkit.getConsoleSender(), true);
if (Config.getInstance().getConfig().getBoolean("settings.check-updates")) {
UpdateCheckerTask.start(BukkitUtils.wrap(Bukkit.getConsoleSender()), true);
}
}
}

View file

@ -6,19 +6,20 @@ 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 java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import net.frankheijden.serverutils.common.utils.ListBuilder;
import net.frankheijden.serverutils.common.utils.ListFormat;
import org.bukkit.Bukkit;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.bukkit.utils.BukkitUtils;
import net.frankheijden.serverutils.common.commands.Plugins;
import net.frankheijden.serverutils.common.config.Messenger;
import net.frankheijden.serverutils.common.providers.PluginProvider;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.Plugin;
@CommandAlias("plugins|pl")
public class CommandPlugins extends BaseCommand {
private static final PluginProvider<Plugin> provider = ServerUtils.getInstance().getPlugin().getPluginProvider();
/**
* Sends the plugin list to the sender, without plugin version.
* @param sender The sender of the command.
@ -27,7 +28,7 @@ public class CommandPlugins extends BaseCommand {
@CommandPermission("serverutils.plugins")
@Description("Shows the plugins of this server.")
public void onPlugins(CommandSender sender) {
sendPlugins(sender, pl -> {
Plugins.sendPlugins(BukkitUtils.wrap(sender), provider.getPluginsSorted(), pl -> {
String format = "serverutils.plugins.format" + (pl.isEnabled() ? "" : "_disabled");
return Messenger.getMessage(format, "%plugin%", pl.getName());
});
@ -41,30 +42,11 @@ public class CommandPlugins extends BaseCommand {
@CommandPermission("serverutils.plugins.version")
@Description("Shows the plugins of this server with version.")
public void onPluginsWithVersion(CommandSender sender) {
sendPlugins(sender, pl -> {
Plugins.sendPlugins(BukkitUtils.wrap(sender), provider.getPluginsSorted(), pl -> {
String format = "serverutils.plugins.format" + (pl.isEnabled() ? "" : "_disabled");
String version = Messenger.getMessage("serverutils.plugins.version",
"%version%", pl.getDescription().getVersion());
return Messenger.getMessage(format, "%plugin%", pl.getName()) + version;
});
}
private static void sendPlugins(CommandSender sender, ListFormat<Plugin> pluginFormat) {
Messenger.sendMessage(sender, "serverutils.plugins.header");
List<Plugin> plugins = getPluginsSorted();
String prefix = Messenger.getMessage("serverutils.plugins.prefix",
"%count%", String.valueOf(plugins.size()));
sender.sendMessage(Messenger.color(prefix + ListBuilder.create(plugins)
.seperator(Messenger.getMessage("serverutils.plugins.seperator"))
.lastSeperator(Messenger.getMessage("serverutils.plugins.last_seperator"))
.format(pluginFormat)
.toString()));
Messenger.sendMessage(sender, "serverutils.plugins.footer");
}
private static List<Plugin> getPluginsSorted() {
List<Plugin> plugins = Arrays.asList(Bukkit.getPluginManager().getPlugins());
plugins.sort(Comparator.comparing(Plugin::getName));
return plugins;
}
}

View file

@ -1,7 +1,7 @@
package net.frankheijden.serverutils.bukkit.commands;
import static net.frankheijden.serverutils.bukkit.config.Messenger.sendMessage;
import static net.frankheijden.serverutils.bukkit.reflection.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.bukkit.entities.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.common.config.Messenger.sendMessage;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.CommandAlias;
@ -18,15 +18,17 @@ import java.util.Map;
import java.util.Set;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import net.frankheijden.serverutils.bukkit.managers.CloseableResult;
import net.frankheijden.serverutils.bukkit.managers.LoadResult;
import net.frankheijden.serverutils.bukkit.entities.BukkitLoadResult;
import net.frankheijden.serverutils.bukkit.managers.PluginManager;
import net.frankheijden.serverutils.bukkit.managers.Result;
import net.frankheijden.serverutils.bukkit.reflection.RCraftServer;
import net.frankheijden.serverutils.bukkit.utils.FormatBuilder;
import net.frankheijden.serverutils.bukkit.utils.ForwardFilter;
import net.frankheijden.serverutils.bukkit.utils.BukkitUtils;
import net.frankheijden.serverutils.bukkit.utils.ReloadHandler;
import net.frankheijden.serverutils.common.config.Messenger;
import net.frankheijden.serverutils.common.entities.CloseableResult;
import net.frankheijden.serverutils.common.entities.Result;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import net.frankheijden.serverutils.common.utils.FormatBuilder;
import net.frankheijden.serverutils.common.utils.ForwardFilter;
import net.frankheijden.serverutils.common.utils.ListBuilder;
import net.frankheijden.serverutils.common.utils.ListFormat;
import org.bukkit.Bukkit;
@ -64,13 +66,14 @@ public class CommandServerUtils extends BaseCommand {
/**
* Shows the help page to the sender.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
*/
@Default
@Subcommand("help")
@CommandPermission("serverutils.help")
@Description("Shows a help page with a few commands.")
public void onHelp(CommandSender sender) {
public void onHelp(CommandSender commandSender) {
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
Messenger.sendMessage(sender, "serverutils.help.header");
FormatBuilder builder = FormatBuilder.create(Messenger.getMessage("serverutils.help.format"))
@ -97,26 +100,27 @@ public class CommandServerUtils extends BaseCommand {
@Description("Reloads the ServerUtils plugin.")
public void onReload(CommandSender sender) {
plugin.reload();
sendMessage(sender, "serverutils.success",
sendMessage(BukkitUtils.wrap(sender), "serverutils.success",
"%action%", "reload",
"%what%", "ServerUtils configurations");
}
/**
* Reloads a config from a set of configurations of the server.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
* @param config The configuration to reload.
*/
@Subcommand("reloadconfig")
@CommandCompletion("@supportedConfigs")
@CommandPermission("serverutils.reloadconfig")
@Description("Reloads individual Server configurations.")
public void onReloadCommands(CommandSender sender, String config) {
public void onReloadCommands(CommandSender commandSender, String config) {
ReloadHandler handler = supportedConfigs.get(config);
if (handler == null) {
this.doHelp(sender);
this.doHelp(commandSender);
return;
}
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
String[] replacements = new String[]{ "%action%", "reload", "%what%", config };
@ -138,34 +142,38 @@ public class CommandServerUtils extends BaseCommand {
/**
* Loads the specified plugin on the server.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
* @param jarFile The filename of the plugin in the plugins/ directory.
*/
@Subcommand("loadplugin")
@CommandCompletion("@pluginJars")
@CommandPermission("serverutils.loadplugin")
@Description("Loads the specified jar file as a plugin.")
public void onLoadPlugin(CommandSender sender, String jarFile) {
LoadResult loadResult = PluginManager.loadPlugin(jarFile);
public void onLoadPlugin(CommandSender commandSender, String jarFile) {
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
BukkitLoadResult loadResult = PluginManager.loadPlugin(jarFile);
if (!loadResult.isSuccess()) {
loadResult.getResult().sendTo(sender, "load", jarFile);
return;
}
Result result = PluginManager.enablePlugin(loadResult.getPlugin());
Result result = PluginManager.enablePlugin(loadResult.get());
result.sendTo(sender, "load", jarFile);
}
/**
* Unloads the specified plugin from the server.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
* @param pluginName The plugin name.
*/
@Subcommand("unloadplugin")
@CommandCompletion("@plugins")
@CommandPermission("serverutils.unloadplugin")
@Description("Disables and unloads the specified plugin.")
public void onUnloadPlugin(CommandSender sender, String pluginName) {
public void onUnloadPlugin(CommandSender commandSender, String pluginName) {
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
Result disableResult = PluginManager.disablePlugin(pluginName);
if (disableResult != Result.SUCCESS && disableResult != Result.ALREADY_DISABLED) {
disableResult.sendTo(sender, "disabl", pluginName);
@ -188,7 +196,7 @@ public class CommandServerUtils extends BaseCommand {
@Description("Reloads a specified plugin.")
public void onReloadPlugin(CommandSender sender, String pluginName) {
CloseableResult result = PluginManager.reloadPlugin(pluginName);
result.getResult().sendTo(sender, "reload", pluginName);
result.getResult().sendTo(BukkitUtils.wrap(sender), "reload", pluginName);
result.tryClose();
}
@ -203,7 +211,7 @@ public class CommandServerUtils extends BaseCommand {
@Description("Enables the loaded plugin.")
public void onEnablePlugin(CommandSender sender, String pluginName) {
Result result = PluginManager.enablePlugin(pluginName);
result.sendTo(sender, "enabl", pluginName);
result.sendTo(BukkitUtils.wrap(sender), "enabl", pluginName);
}
/**
@ -217,19 +225,21 @@ public class CommandServerUtils extends BaseCommand {
@Description("Disables the specified plugin.")
public void onDisablePlugin(CommandSender sender, String pluginName) {
Result result = PluginManager.disablePlugin(pluginName);
result.sendTo(sender, "disabl", pluginName);
result.sendTo(BukkitUtils.wrap(sender), "disabl", pluginName);
}
/**
* Shows information about the specified plugin.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
* @param pluginName The plugin name.
*/
@Subcommand("plugininfo")
@CommandCompletion("@plugins")
@CommandPermission("serverutils.plugininfo")
@Description("Shows information about the specified plugin.")
public void onPluginInfo(CommandSender sender, String pluginName) {
public void onPluginInfo(CommandSender commandSender, String pluginName) {
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
Plugin plugin = Bukkit.getPluginManager().getPlugin(pluginName);
if (plugin == null) {
Result.NOT_EXISTS.sendTo(sender, "fetch", pluginName);
@ -289,14 +299,16 @@ public class CommandServerUtils extends BaseCommand {
/**
* Shows information about a provided command.
* @param sender The sender of the command.
* @param commandSender The sender of the command.
* @param command The command to lookup.
*/
@Subcommand("commandinfo")
@CommandCompletion("@commands")
@CommandPermission("serverutils.commandinfo")
@Description("Shows information about the specified command.")
public void onCommandInfo(CommandSender sender, String command) {
public void onCommandInfo(CommandSender commandSender, String command) {
ServerCommandSender sender = BukkitUtils.wrap(commandSender);
Command cmd = PluginManager.getCommand(command);
if (cmd == null) {
Messenger.sendMessage(sender, "serverutils.commandinfo.not_exists");

View file

@ -1,21 +0,0 @@
package net.frankheijden.serverutils.bukkit.config;
import java.io.File;
public class Config extends YamlResource {
private static Config instance;
public Config(File file) {
super(file, "bukkit-config.yml");
instance = this;
}
public static Config getInstance() {
return instance;
}
public boolean getBoolean(String path) {
return getConfiguration().getBoolean(path);
}
}

View file

@ -1,80 +0,0 @@
package net.frankheijden.serverutils.bukkit.config;
import java.io.File;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
public class Messenger extends YamlResource {
private static final ServerUtils plugin = ServerUtils.getInstance();
private static Messenger instance;
public Messenger(File file) {
super(file, "bukkit-messages.yml");
instance = this;
}
/**
* Retrieves a message from the config.
* @param path The yml path to the message.
* @param replacements The replacements to be taken into account.
* @return The config message with translated placeholders.
*/
public static String getMessage(String path, String... replacements) {
String message = instance.getConfiguration().getString(path);
if (message != null) {
return apply(message, replacements);
} else {
plugin.getLogger().severe("Missing locale in bukkit-messages.yml at path '" + path + "'!");
}
return null;
}
/**
* Applies placeholders to a message.
* @param message The message.
* @param replacements The replacements of the message. Expects input to be even and in a key-value like format.
* Example: ["%player%", "Player"]
* @return The message with translated placeholders.
*/
public static String apply(String message, String... replacements) {
if (message == null || message.isEmpty()) return null;
message = message.replace("\\n", "\n");
for (int i = 0; i < replacements.length; i++, i++) {
message = message.replace(replacements[i], replacements[i + 1]);
}
return message;
}
/**
* Sends a message to a player with translated placeholders.
* @param sender The receiver.
* @param msg The message to be sent.
* @param replacements The replacements to be taken into account.
*/
public static void sendRawMessage(CommandSender sender, String msg, String... replacements) {
String message = apply(msg, replacements);
if (message != null) {
sender.sendMessage(color(message));
}
}
/**
* Sends a message from the specified config path to a player with translated placeholders.
* @param sender The receiver.
* @param path The yml path to the message.
* @param replacements The replacements to be taken into account.
*/
public static void sendMessage(CommandSender sender, String path, String... replacements) {
String message = getMessage(path, replacements);
if (message != null) {
sender.sendMessage(color(message));
}
}
public static String color(String str) {
return ChatColor.translateAlternateColorCodes('&', str);
}
}

View file

@ -1,32 +0,0 @@
package net.frankheijden.serverutils.bukkit.config;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.bukkit.utils.YamlUtils;
import org.bukkit.configuration.file.YamlConfiguration;
public abstract class YamlResource {
private static final ServerUtils plugin = ServerUtils.getInstance();
private final YamlConfiguration configuration;
/**
* Creates a new YamlResource instance.
* Loads the resource from the jar file.
* @param file The destination file.
* @param resource The resource from the jar file.
*/
public YamlResource(File file, String resource) {
InputStream is = plugin.getResource(resource);
YamlConfiguration def = YamlConfiguration.loadConfiguration(new InputStreamReader(is));
configuration = YamlUtils.init(file, def);
}
public YamlConfiguration getConfiguration() {
return configuration;
}
}

View file

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

View file

@ -0,0 +1,18 @@
package net.frankheijden.serverutils.bukkit.entities;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import org.bukkit.command.CommandSender;
public class BukkitCommandSender implements ServerCommandSender {
private final CommandSender sender;
public BukkitCommandSender(CommandSender sender) {
this.sender = sender;
}
@Override
public void sendMessage(String message) {
sender.sendMessage(message);
}
}

View file

@ -0,0 +1,20 @@
package net.frankheijden.serverutils.bukkit.entities;
import net.frankheijden.serverutils.common.entities.LoadResult;
import net.frankheijden.serverutils.common.entities.Result;
import org.bukkit.plugin.Plugin;
public class BukkitLoadResult extends LoadResult<Plugin> {
private BukkitLoadResult(Plugin obj, Result result) {
super(obj, result);
}
public BukkitLoadResult(Plugin obj) {
this(obj, Result.SUCCESS);
}
public BukkitLoadResult(Result result) {
this(null, result);
}
}

View file

@ -0,0 +1,56 @@
package net.frankheijden.serverutils.bukkit.entities;
import java.io.File;
import java.util.logging.Logger;
import net.frankheijden.serverutils.bukkit.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.common.entities.ServerUtilsPlugin;
import org.bukkit.plugin.Plugin;
public class BukkitPlugin extends ServerUtilsPlugin {
private final ServerUtils plugin;
private final PluginProvider<Plugin> pluginProvider;
private final ResourceProvider resourceProvider;
private final ColorProvider colorProvider;
/**
* Creates a new BukkitPlugin instance of ServerUtils.
* @param plugin The ServerUtils plugin.
*/
public BukkitPlugin(ServerUtils plugin) {
this.plugin = plugin;
this.pluginProvider = new BukkitPluginProvider(plugin);
this.resourceProvider = new BukkitResourceProvider(plugin);
this.colorProvider = new BukkitColorProvider();
}
@Override
@SuppressWarnings("unchecked")
public PluginProvider<Plugin> getPluginProvider() {
return pluginProvider;
}
@Override
public ResourceProvider getResourceProvider() {
return resourceProvider;
}
@Override
public ColorProvider getColorProvider() {
return colorProvider;
}
@Override
public Logger getLogger() {
return plugin.getLogger();
}
@Override
public File getDataFolder() {
return plugin.getDataFolder();
}
}

View file

@ -0,0 +1,34 @@
package net.frankheijden.serverutils.bukkit.entities;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.common.providers.PluginProvider;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import java.io.File;
import java.util.Arrays;
import java.util.List;
public class BukkitPluginProvider extends PluginProvider<Plugin> {
private final ServerUtils plugin;
public BukkitPluginProvider(ServerUtils plugin) {
this.plugin = plugin;
}
@Override
public File getPluginsFolder() {
return plugin.getDataFolder().getParentFile();
}
@Override
public List<Plugin> getPlugins() {
return Arrays.asList(Bukkit.getPluginManager().getPlugins());
}
@Override
public String getPluginName(Plugin plugin) {
return plugin.getName();
}
}

View file

@ -1,4 +1,4 @@
package net.frankheijden.serverutils.bukkit.reflection;
package net.frankheijden.serverutils.bukkit.entities;
import net.frankheijden.serverutils.common.reflection.ReflectionUtils;
import net.frankheijden.serverutils.common.reflection.VersionParam;

View file

@ -0,0 +1,32 @@
package net.frankheijden.serverutils.bukkit.entities;
import java.io.File;
import java.io.InputStream;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.common.providers.ResourceProvider;
import net.frankheijden.serverutils.common.config.YamlConfig;
public class BukkitResourceProvider implements ResourceProvider {
private final ServerUtils plugin;
public BukkitResourceProvider(ServerUtils plugin) {
this.plugin = plugin;
}
@Override
public InputStream getResource(String resource) {
return plugin.getResource(resource);
}
@Override
public YamlConfig load(InputStream is) {
return new BukkitYamlConfig(is);
}
@Override
public YamlConfig load(File file) {
return new BukkitYamlConfig(file);
}
}

View file

@ -0,0 +1,66 @@
package net.frankheijden.serverutils.bukkit.entities;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Collection;
import net.frankheijden.serverutils.common.config.YamlConfig;
import org.bukkit.configuration.MemorySection;
import org.bukkit.configuration.file.YamlConfiguration;
public class BukkitYamlConfig implements YamlConfig {
private final MemorySection config;
private File file = null;
public BukkitYamlConfig(File file) {
this.config = YamlConfiguration.loadConfiguration(file);
this.file = file;
}
public BukkitYamlConfig(InputStream in) {
this.config = YamlConfiguration.loadConfiguration(new InputStreamReader(in));
}
public BukkitYamlConfig(MemorySection section) {
this.config = section;
}
@Override
public Object get(String path) {
Object obj = config.get(path);
if (obj instanceof MemorySection) {
return new BukkitYamlConfig((MemorySection) obj);
}
return obj;
}
@Override
public void set(String path, Object value) {
config.set(path, value);
}
@Override
public String getString(String path) {
return config.getString(path);
}
@Override
public boolean getBoolean(String path) {
return config.getBoolean(path);
}
@Override
public Collection<? extends String> getKeys() {
return config.getKeys(false);
}
@Override
public void save() throws IOException {
if (!(config instanceof YamlConfiguration)) throw new IllegalArgumentException("Not a YamlConfiguration!");
YamlConfiguration yml = (YamlConfiguration) config;
yml.save(file);
}
}

View file

@ -1,7 +1,9 @@
package net.frankheijden.serverutils.bukkit.listeners;
import net.frankheijden.serverutils.bukkit.config.Config;
import net.frankheijden.serverutils.bukkit.tasks.UpdateCheckerTask;
import net.frankheijden.serverutils.bukkit.utils.BukkitUtils;
import net.frankheijden.serverutils.common.config.Config;
import net.frankheijden.serverutils.common.config.YamlConfig;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -10,7 +12,7 @@ import org.bukkit.event.player.PlayerJoinEvent;
public class MainListener implements Listener {
private static final Config config = Config.getInstance();
private static final YamlConfig config = Config.getInstance().getConfig();
/**
* Called when a player joins the server.
@ -23,7 +25,7 @@ public class MainListener implements Listener {
Player player = event.getPlayer();
if (player.hasPermission("serverutils.notification.update")) {
UpdateCheckerTask.start(player);
UpdateCheckerTask.start(BukkitUtils.wrap(player));
}
}
}

View file

@ -1,56 +0,0 @@
package net.frankheijden.serverutils.bukkit.managers;
import java.io.Closeable;
import java.io.IOException;
public class CloseableResult implements Closeable {
private Result result;
private final Closeable closeable;
/**
* Constructs a new closable result.
* Used for unloading / reloading a plugin.
* NB: The closable needs to be closed to fully ensure that the old plugin doesn't work anymore!
* @param result The result of the procedure
* @param closeable The closable of the procedure.
*/
public CloseableResult(Result result, Closeable closeable) {
this.result = result;
this.closeable = closeable;
}
public CloseableResult(Result result) {
this(result, null);
}
public CloseableResult(Closeable closeable) {
this(Result.SUCCESS, closeable);
}
public Result getResult() {
return result;
}
public CloseableResult set(Result result) {
this.result = result;
return this;
}
/**
* Attempts to close the closable, essentially wrapping it with try-catch.
*/
public void tryClose() {
if (closeable == null) return;
try {
close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public void close() throws IOException {
closeable.close();
}
}

View file

@ -1,33 +0,0 @@
package net.frankheijden.serverutils.bukkit.managers;
import org.bukkit.plugin.Plugin;
public class LoadResult {
private final Plugin plugin;
private final Result result;
private LoadResult(Plugin plugin, Result result) {
this.plugin = plugin;
this.result = result;
}
public LoadResult(Plugin plugin) {
this(plugin, Result.SUCCESS);
}
public LoadResult(Result result) {
this(null, result);
}
public Result getResult() {
return result;
}
public Plugin getPlugin() {
return plugin;
}
public boolean isSuccess() {
return plugin != null && result == Result.SUCCESS;
}
}

View file

@ -7,12 +7,15 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.bukkit.entities.BukkitLoadResult;
import net.frankheijden.serverutils.bukkit.reflection.RCommandMap;
import net.frankheijden.serverutils.bukkit.reflection.RCraftServer;
import net.frankheijden.serverutils.bukkit.reflection.RCraftingManager;
import net.frankheijden.serverutils.bukkit.reflection.RJavaPlugin;
import net.frankheijden.serverutils.bukkit.reflection.RPluginClassLoader;
import net.frankheijden.serverutils.bukkit.reflection.RSimplePluginManager;
import net.frankheijden.serverutils.common.entities.CloseableResult;
import net.frankheijden.serverutils.common.entities.Result;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.PluginCommand;
@ -30,7 +33,7 @@ public class PluginManager {
* @param jarFile The name of the file in the plugins/ folder.
* @return The result of the loading procedure.
*/
public static LoadResult loadPlugin(String jarFile) {
public static BukkitLoadResult loadPlugin(String jarFile) {
return loadPlugin(new File(ServerUtils.getInstance().getDataFolder().getParent(), jarFile));
}
@ -39,33 +42,33 @@ public class PluginManager {
* @param file The file to be loaded.
* @return The result of the loading procedure.
*/
public static LoadResult loadPlugin(File file) {
if (!file.exists()) return new LoadResult(Result.NOT_EXISTS);
public static BukkitLoadResult loadPlugin(File file) {
if (!file.exists()) return new BukkitLoadResult(Result.NOT_EXISTS);
Plugin loadedPlugin = getLoadedPlugin(file);
if (loadedPlugin != null) return new LoadResult(Result.ALREADY_LOADED);
if (loadedPlugin != null) return new BukkitLoadResult(Result.ALREADY_LOADED);
Plugin plugin;
try {
plugin = Bukkit.getPluginManager().loadPlugin(file);
} catch (InvalidDescriptionException ex) {
return new LoadResult(Result.INVALID_DESCRIPTION);
return new BukkitLoadResult(Result.INVALID_DESCRIPTION);
} catch (UnknownDependencyException ex) {
return new LoadResult(Result.UNKNOWN_DEPENDENCY.arg(ex.getMessage()));
return new BukkitLoadResult(Result.UNKNOWN_DEPENDENCY.arg(ex.getMessage()));
} catch (InvalidPluginException ex) {
if (ex.getCause() instanceof IllegalArgumentException) {
IllegalArgumentException e = (IllegalArgumentException) ex.getCause();
if (e.getMessage().equalsIgnoreCase("Plugin already initialized!")) {
return new LoadResult(Result.ALREADY_ENABLED);
return new BukkitLoadResult(Result.ALREADY_ENABLED);
}
}
ex.printStackTrace();
return new LoadResult(Result.ERROR);
return new BukkitLoadResult(Result.ERROR);
}
if (plugin == null) return new LoadResult(Result.INVALID_PLUGIN);
if (plugin == null) return new BukkitLoadResult(Result.INVALID_PLUGIN);
plugin.onLoad();
return new LoadResult(plugin);
return new BukkitLoadResult(plugin);
}
/**
@ -176,9 +179,9 @@ public class PluginManager {
File pluginFile = getPluginFile(plugin.getName());
if (pluginFile == null) return result.set(Result.FILE_DELETED);
LoadResult loadResult = loadPlugin(pluginFile);
BukkitLoadResult loadResult = loadPlugin(pluginFile);
if (!loadResult.isSuccess()) return result.set(loadResult.getResult());
return result.set(enablePlugin(loadResult.getPlugin()));
return result.set(enablePlugin(loadResult.get()));
}
/**
@ -291,7 +294,7 @@ public class PluginManager {
* @return The file, or null if invalid or not found.
*/
public static File getPluginFile(String pluginName) {
for (File file : ServerUtils.getInstance().getJars()) {
for (File file : ServerUtils.getInstance().getPlugin().getPluginProvider().getPluginJars()) {
PluginDescriptionFile descriptionFile;
try {
descriptionFile = getPluginDescription(file);

View file

@ -1,43 +0,0 @@
package net.frankheijden.serverutils.bukkit.managers;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import org.bukkit.command.CommandSender;
public enum Result {
NOT_EXISTS,
NOT_ENABLED,
ALREADY_LOADED,
ALREADY_ENABLED,
ALREADY_DISABLED,
FILE_DELETED,
INVALID_DESCRIPTION,
INVALID_PLUGIN,
UNKNOWN_DEPENDENCY,
ERROR,
SUCCESS;
private String arg;
Result() {
this.arg = "";
}
public Result arg(String arg) {
this.arg = arg;
return this;
}
/**
* Retrieves the associated message of the result
* and sends it to a CommandSender.
* @param sender The receiver.
* @param action The action which let to the result.
* @param what An associated variable.
*/
public void sendTo(CommandSender sender, String action, String what) {
Messenger.sendMessage(sender, "serverutils." + this.name().toLowerCase(),
"%action%", action,
"%what%", what,
"%arg%", arg);
}
}

View file

@ -20,6 +20,7 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import org.bukkit.Bukkit;
import org.bukkit.Warning;
import org.bukkit.command.Command;

View file

@ -1,6 +1,6 @@
package net.frankheijden.serverutils.bukkit.reflection;
import static net.frankheijden.serverutils.bukkit.reflection.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.bukkit.entities.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.common.reflection.FieldParam.fieldOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.get;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllFields;
@ -14,6 +14,7 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import net.frankheijden.serverutils.common.utils.MapUtils;
import org.bukkit.plugin.Plugin;

View file

@ -1,6 +1,8 @@
package net.frankheijden.serverutils.bukkit.reflection;
import static net.frankheijden.serverutils.bukkit.reflection.BukkitReflection.MINOR;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.bukkit.entities.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.common.reflection.FieldParam.fieldOf;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.get;

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.FieldParam.fieldOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllFields;
import static net.frankheijden.serverutils.common.reflection.VersionParam.ALL_VERSIONS;

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllMethods;
import static net.frankheijden.serverutils.common.reflection.VersionParam.ALL_VERSIONS;

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllMethods;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.invoke;

View file

@ -1,6 +1,6 @@
package net.frankheijden.serverutils.bukkit.reflection;
import static net.frankheijden.serverutils.bukkit.reflection.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.bukkit.entities.BukkitReflection.MINOR;
import static net.frankheijden.serverutils.common.reflection.FieldParam.fieldOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.get;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllFields;
@ -13,6 +13,7 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Predicate;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import org.bukkit.plugin.Plugin;
public class RMinecraftKey {

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllMethods;
import static net.frankheijden.serverutils.common.reflection.VersionParam.ALL_VERSIONS;

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllMethods;
import static net.frankheijden.serverutils.common.reflection.VersionParam.ALL_VERSIONS;

View file

@ -1,5 +1,7 @@
package net.frankheijden.serverutils.bukkit.reflection;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import static net.frankheijden.serverutils.common.reflection.MethodParam.methodOf;
import static net.frankheijden.serverutils.common.reflection.ReflectionUtils.getAllMethods;
import static net.frankheijden.serverutils.common.reflection.VersionParam.ALL_VERSIONS;

View file

@ -9,6 +9,7 @@ import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import net.frankheijden.serverutils.common.utils.MapUtils;
import org.bukkit.plugin.Plugin;

View file

@ -9,6 +9,7 @@ import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import net.frankheijden.serverutils.bukkit.entities.BukkitReflection;
import net.frankheijden.serverutils.common.utils.MapUtils;
import org.bukkit.plugin.Plugin;

View file

@ -14,22 +14,24 @@ import java.net.UnknownHostException;
import java.util.logging.Level;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import net.frankheijden.serverutils.bukkit.config.Config;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import net.frankheijden.serverutils.bukkit.managers.CloseableResult;
import net.frankheijden.serverutils.bukkit.managers.PluginManager;
import net.frankheijden.serverutils.bukkit.managers.VersionManager;
import net.frankheijden.serverutils.common.config.Config;
import net.frankheijden.serverutils.common.config.Messenger;
import net.frankheijden.serverutils.common.config.YamlConfig;
import net.frankheijden.serverutils.common.entities.CloseableResult;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import net.frankheijden.serverutils.common.utils.FileUtils;
import net.frankheijden.serverutils.common.utils.VersionUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;
public class UpdateCheckerTask implements Runnable {
private static final ServerUtils plugin = ServerUtils.getInstance();
private static final YamlConfig config = Config.getInstance().getConfig();
private static final VersionManager versionManager = VersionManager.getInstance();
private final CommandSender sender;
private final ServerCommandSender sender;
private final String currentVersion;
private final boolean startup;
@ -47,17 +49,17 @@ public class UpdateCheckerTask implements Runnable {
private static final String DOWNLOADED_RESTART = "Downloaded ServerUtils version v%s. Restarting plugin now...";
private static final String UP_TO_DATE = "We are up-to-date!";
private UpdateCheckerTask(CommandSender sender, boolean startup) {
private UpdateCheckerTask(ServerCommandSender sender, boolean startup) {
this.sender = sender;
this.currentVersion = plugin.getDescription().getVersion();
this.startup = startup;
}
public static void start(CommandSender sender) {
public static void start(ServerCommandSender sender) {
start(sender, false);
}
public static void start(CommandSender sender, boolean startup) {
public static void start(ServerCommandSender sender, boolean startup) {
UpdateCheckerTask task = new UpdateCheckerTask(sender, startup);
Bukkit.getScheduler().runTaskAsynchronously(plugin, task);
}
@ -143,8 +145,8 @@ public class UpdateCheckerTask implements Runnable {
}
private boolean canDownloadPlugin() {
if (isStartupCheck()) return Config.getInstance().getBoolean("settings.download-at-startup-and-update");
return Config.getInstance().getBoolean("settings.download-updates");
if (isStartupCheck()) return config.getBoolean("settings.download-at-startup-and-update");
return config.getBoolean("settings.download-updates");
}
private void downloadPlugin(String githubVersion, String downloadLink) {

View file

@ -0,0 +1,12 @@
package net.frankheijden.serverutils.bukkit.utils;
import net.frankheijden.serverutils.bukkit.entities.BukkitCommandSender;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import org.bukkit.command.CommandSender;
public class BukkitUtils {
public static ServerCommandSender wrap(CommandSender sender) {
return new BukkitCommandSender(sender);
}
}

View file

@ -1,58 +0,0 @@
package net.frankheijden.serverutils.bukkit.utils;
import java.util.ArrayList;
import java.util.List;
import net.frankheijden.serverutils.bukkit.config.Messenger;
import org.bukkit.command.CommandSender;
public class FormatBuilder {
private final String format;
private final List<String[]> valueList;
private String[] orderedKeys;
private boolean alwaysSend;
private FormatBuilder(String format) {
this.format = format;
this.valueList = new ArrayList<>();
this.orderedKeys = new String[0];
this.alwaysSend = false;
}
public static FormatBuilder create(String format) {
return new FormatBuilder(format);
}
public FormatBuilder orderedKeys(String... orderedKeys) {
this.orderedKeys = orderedKeys;
return this;
}
public FormatBuilder add(String... values) {
this.valueList.add(values);
return this;
}
public FormatBuilder alwaysSend(boolean alwaysSend) {
this.alwaysSend = alwaysSend;
return this;
}
/**
* Builds the format and sends it to the CommandSender.
* @param sender The receiver of the list.
*/
public void sendTo(CommandSender sender) {
valueList.forEach(values -> {
int length = Math.min(values.length, orderedKeys.length);
String message = format;
for (int i = 0; i < length; i++) {
String value = values[i];
if ((value == null || value.isEmpty()) && !alwaysSend) return;
message = message.replace(orderedKeys[i], String.valueOf(value));
}
Messenger.sendRawMessage(sender, message);
});
}
}

View file

@ -1,52 +0,0 @@
package net.frankheijden.serverutils.bukkit.utils;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import net.frankheijden.serverutils.common.utils.PredicateFilter;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
public class ForwardFilter extends PredicateFilter {
private boolean warnings;
/**
* Creates a filter which forwards all output to the sender.
* @param sender The sender to forward logs to.
*/
public ForwardFilter(CommandSender sender) {
this.warnings = false;
setPredicate(rec -> {
ChatColor color = getColor(rec.getLevel());
if (color != ChatColor.GREEN) warnings = true;
sender.sendMessage(color + format(rec));
return true;
});
}
public boolean hasWarnings() {
return warnings;
}
private static ChatColor getColor(Level level) {
if (Level.SEVERE.equals(level)) {
return ChatColor.RED;
} else if (Level.WARNING.equals(level)) {
return ChatColor.GOLD;
}
return ChatColor.GREEN;
}
private static String format(LogRecord record) {
String msg = record.getMessage();
Object[] params = record.getParameters();
if (params == null) return msg;
for (int i = 0; i < params.length; i++) {
msg = msg.replace("{" + i + "}", String.valueOf(params[i]));
}
return msg;
}
}

View file

@ -1,50 +0,0 @@
package net.frankheijden.serverutils.bukkit.utils;
import java.io.File;
import java.io.IOException;
import org.bukkit.configuration.MemorySection;
import org.bukkit.configuration.file.YamlConfiguration;
public class YamlUtils {
public static void addDefaults(MemorySection defaults, YamlConfiguration yml) {
addDefaults(defaults, yml, "");
}
private static void addDefaults(MemorySection defaults, YamlConfiguration yml, String root) {
if (defaults == null) return;
for (String key : defaults.getKeys(false)) {
String newKey = (root.isEmpty() ? "" : root + ".") + key;
Object value = defaults.get(key);
if (value instanceof MemorySection) {
addDefaults((MemorySection) value, yml, newKey);
} else if (yml.get(newKey) == null) {
yml.set(newKey, value);
}
}
}
/**
* Initiates a YamlConfiguration from a file with associated defaults.
* @param file The yml file.
* @param def The default YamlConfiguration to be applied.
* @return The loaded YamlConfiguration of the file with defaults.
*/
public static YamlConfiguration init(File file, YamlConfiguration def) {
YamlConfiguration yml = YamlConfiguration.loadConfiguration(file);
YamlUtils.addDefaults(def, yml);
try {
// Idk somehow the order messes up
// of the messages if we don't do this
file.delete();
file.createNewFile();
yml.save(file);
} catch (IOException ex) {
ex.printStackTrace();
}
return yml;
}
}