BSkyBlock/src/main/java/us/tastybento/bskyblock/api/addons/Addon.java

298 lines
8.2 KiB
Java

package us.tastybento.bskyblock.api.addons;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.Listener;
import us.tastybento.bskyblock.BSkyBlock;
import us.tastybento.bskyblock.managers.IslandsManager;
import us.tastybento.bskyblock.managers.PlayersManager;
/**
* Add-on class for BSkyBlock. Extend this to create an add-on. The operation
* and methods are very similar to Bukkit's JavaPlugin.
*
* @author tastybento, ComminQ_Q
*/
public abstract class Addon implements AddonInterface {
private static final String ADDON_CONFIG_FILENAME = "config.yml";
private boolean enabled;
private AddonDescription description;
private FileConfiguration config;
private File dataFolder;
private File file;
public Addon() {
enabled = false;
}
public BSkyBlock getBSkyBlock() {
return BSkyBlock.getInstance();
}
/**
* @return the addon's default config file
*/
public FileConfiguration getConfig() {
if (config == null) {
config = loadYamlFile();
}
return config;
}
/**
* @return Addon's data folder
*/
public File getDataFolder() {
return dataFolder;
}
/**
* @return Addon's description
*/
public AddonDescription getDescription() {
return description;
}
/**
* @return the file
*/
public File getFile() {
return file;
}
/**
* @return Logger
*/
public Logger getLogger() {
return getBSkyBlock().getLogger();
}
/**
* Convenience method to obtain the server
*
* @return the server object
*/
public Server getServer() {
return getBSkyBlock().getServer();
}
public boolean isEnabled() {
return enabled;
}
/**
* Load YAML config file
*
* @return Yaml File configuration
*/
private FileConfiguration loadYamlFile() {
File yamlFile = new File(dataFolder, ADDON_CONFIG_FILENAME);
YamlConfiguration yamlConfig = null;
if (yamlFile.exists()) {
try {
yamlConfig = new YamlConfiguration();
yamlConfig.load(yamlFile);
} catch (Exception e) {
Bukkit.getLogger().severe(() -> "Could not load config.yml: " + e.getMessage());
}
}
return yamlConfig;
}
/**
* Register a listener for this addon
*
* @param listener - listener
*/
public void registerListener(Listener listener) {
Bukkit.getPluginManager().registerEvents(listener, BSkyBlock.getInstance());
}
/**
* Saves the FileConfiguration retrievable by getConfig().
*/
public void saveConfig() {
try {
getConfig().save(new File(dataFolder, ADDON_CONFIG_FILENAME));
} catch (IOException e) {
Bukkit.getLogger().severe("Could not save config!");
}
}
/**
* Saves the addon's config.yml file to the addon's data folder and loads it. If
* the file exists already, it will not be replaced.
*/
public void saveDefaultConfig() {
saveResource(ADDON_CONFIG_FILENAME, false);
config = loadYamlFile();
}
/**
* Saves a resource contained in this add-on's jar file to the addon's data
* folder.
*
* @param resourcePath
* in jar file
* @param replace
* - if true, will overwrite previous file
*/
public void saveResource(String resourcePath, boolean replace) {
saveResource(resourcePath, dataFolder, replace, false);
}
/**
* Saves a resource contained in this add-on's jar file to the destination
* folder.
*
* @param jarResource
* in jar file
* @param destinationFolder
* on file system
* @param replace
* - if true, will overwrite previous file
* @param noPath
* - if true, the resource's path will be ignored when saving
*/
public void saveResource(String jarResource, File destinationFolder, boolean replace, boolean noPath) {
if (jarResource == null || jarResource.equals("")) {
throw new IllegalArgumentException("ResourcePath cannot be null or empty");
}
jarResource = jarResource.replace('\\', '/');
try (JarFile jar = new JarFile(file)) {
JarEntry jarConfig = jar.getJarEntry(jarResource);
if (jarConfig != null) {
try (InputStream in = jar.getInputStream(jarConfig)) {
if (in == null) {
throw new IllegalArgumentException(
"The embedded resource '" + jarResource + "' cannot be found in " + jar.getName());
}
// There are two options, use the path of the resource or not
File outFile = new File(destinationFolder, jarResource);
if (noPath) {
outFile = new File(destinationFolder, outFile.getName());
}
// Make any dirs that need to be made
outFile.getParentFile().mkdirs();
if (!outFile.exists() || replace) {
java.nio.file.Files.copy(in, outFile.toPath());
}
}
}
} catch (IOException e) {
Bukkit.getLogger().severe(
"Could not save from jar file. From " + jarResource + " to " + destinationFolder.getAbsolutePath());
}
}
/**
* Get the resource from Jar file
* @param jarResource - jar resource filename
* @return resource or null if there is a problem
*/
public InputStream getResource(String jarResource) {
if (jarResource == null || jarResource.equals("")) {
throw new IllegalArgumentException("ResourcePath cannot be null or empty");
}
jarResource = jarResource.replace('\\', '/');
try (JarFile jar = new JarFile(file)) {
JarEntry jarConfig = jar.getJarEntry(jarResource);
if (jarConfig != null) {
try (InputStream in = jar.getInputStream(jarConfig)) {
return in;
}
}
} catch (IOException e) {
Bukkit.getLogger().severe("Could not open from jar file. " + jarResource);
}
return null;
}
/**
* Set the file that contains this addon
*
* @param f
* the file to set
*/
public void setAddonFile(File f) {
file = f;
}
/**
* Set this addon's data folder
*
* @param file - data folder
*/
public void setDataFolder(File file) {
dataFolder = file;
}
/**
* Set this addons description
*
* @param desc - description
*/
public void setDescription(AddonDescription desc) {
description = desc;
}
/**
* Set whether this addon is enabled or not
*
* @param enabled - true if enabled
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Get Players Manager
* @return Players manager
*/
public PlayersManager getPlayers() {
return getBSkyBlock().getPlayers();
}
/**
* Get Islands Manager
* @return Islands manager
*/
public IslandsManager getIslands() {
return getBSkyBlock().getIslands();
}
/**
* Get the Addon By Name
* @return Optional Addon
*/
public Optional<Addon> getAddonByName(String name) {
return getBSkyBlock().getAddonsManager().getAddonByName(name);
}
public void log(String string) {
getBSkyBlock().log(string);
}
public void logWarning(String string) {
getBSkyBlock().logWarning(string);
}
public void logError(String string) {
getBSkyBlock().logError(string);
}
}