0

Reformatted code.

This commit is contained in:
Logan Fick
2019-02-08 18:49:51 -05:00
parent 6dfe3195cd
commit 7ca3bc7379
34 changed files with 1214 additions and 1522 deletions

View File

@@ -5,11 +5,12 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** The auto register annotation, to be put onto Classes that implement listener when you are too lazy to register the events yourself. /**
* * The auto register annotation, to be put onto Classes that implement listener when you are too lazy to register the events yourself.
* @author Pepich */ *
@Target(ElementType.TYPE) * @author Pepich
@Retention(RetentionPolicy.RUNTIME) */
@Version(major = 1, minor = 0, revision = 1, compatible = 1) @Target (ElementType.TYPE)
public @interface AutoRegisterListener @Retention (RetentionPolicy.RUNTIME)
{} @Version (major = 1, minor = 0, revision = 1, compatible = 1)
public @interface AutoRegisterListener {}

View File

@@ -1,15 +1,14 @@
package com.redstoner.annotations; package com.redstoner.annotations;
import com.redstoner.misc.CommandHolderType;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import com.redstoner.misc.CommandHolderType; @Target (ElementType.TYPE)
@Retention (RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) public @interface Commands {
@Retention(RetentionPolicy.RUNTIME)
public @interface Commands
{
CommandHolderType value(); CommandHolderType value();
} }

View File

@@ -1,32 +1,33 @@
package com.redstoner.annotations; package com.redstoner.annotations;
import java.lang.annotation.Documented; import java.lang.annotation.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/** The Version annotation, to be applied to all Classes that are part of the project. /**
* * The Version annotation, to be applied to all Classes that are part of the project.
* @author Pepich */ *
@Target(ElementType.TYPE) * @author Pepich
*/
@Target (ElementType.TYPE)
@Documented @Documented
@Retention(RetentionPolicy.RUNTIME) @Retention (RetentionPolicy.RUNTIME)
public @interface Version public @interface Version {
{ /**
/** The major indicator of the version. Will be used for compatibility detection. * The major indicator of the version. Will be used for compatibility detection.
* *
* @return the major version as an int */ * @return the major version as an int
*/
int major(); int major();
int minor(); int minor();
int revision(); int revision();
/** The compatibility part of the version number. Will be used for compatibility detection.</br> /**
* The compatibility part of the version number. Will be used for compatibility detection.</br>
* Set to -1 if it is supposed to be always compatible.</br> * Set to -1 if it is supposed to be always compatible.</br>
* Defaults to 1. * Defaults to 1.
* *
* @return the smallest compatible version as an int. */ * @return the smallest compatible version as an int.
*/
int compatible() default 1; int compatible() default 1;
} }

View File

@@ -2,21 +2,20 @@ package com.redstoner.exceptions;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
/** To be thrown when a module is not annotated with its version. If this gets thrown, then oh boy, you're in trouble now. /**
* * To be thrown when a module is not annotated with its version. If this gets thrown, then oh boy, you're in trouble now.
* @author Pepich */ *
@Version(major = 1, minor = 0, revision = 0, compatible = -1) * @author Pepich
public class MissingVersionException extends Exception */
{ @Version (major = 1, minor = 0, revision = 0, compatible = -1)
public class MissingVersionException extends Exception {
private static final long serialVersionUID = 4940161335512222539L; private static final long serialVersionUID = 4940161335512222539L;
public MissingVersionException() public MissingVersionException() {
{
super(); super();
} }
public MissingVersionException(String message) public MissingVersionException(String message) {
{
super(message); super(message);
} }
} }

View File

@@ -1,9 +1,9 @@
package com.redstoner.exceptions; package com.redstoner.exceptions;
public class NonSaveableConfigException extends Exception { public class NonSaveableConfigException extends Exception {
private static final long serialVersionUID = -7271481973389455510L; private static final long serialVersionUID = -7271481973389455510L;
public NonSaveableConfigException() { public NonSaveableConfigException() {
super("This config does not support saving!"); super("This config does not support saving!");
} }
} }

View File

@@ -1,5 +1,5 @@
package com.redstoner.logging; package com.redstoner.logging;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.LogEvent;
@@ -9,46 +9,46 @@ import org.apache.logging.log4j.message.Message;
public class Log4JFilter extends AbstractFilter { public class Log4JFilter extends AbstractFilter {
private static final long serialVersionUID = -5594073755007974254L; private static final long serialVersionUID = -5594073755007974254L;
private static Result validateMessage(Message message) { @Override
if (message == null) { public Result filter(LogEvent event) {
return Result.NEUTRAL; Message candidate = null;
} if (event != null) {
return validateMessage(message.getFormattedMessage()); candidate = event.getMessage();
} }
return validateMessage(candidate);
}
private static Result validateMessage(String message) { private static Result validateMessage(Message message) {
return PrivateLogManager.isHidden(message) if (message == null) {
? Result.DENY return Result.NEUTRAL;
: Result.NEUTRAL; }
} return validateMessage(message.getFormattedMessage());
}
@Override private static Result validateMessage(String message) {
public Result filter(LogEvent event) { return PrivateLogManager.isHidden(message)
Message candidate = null; ? Result.DENY
if (event != null) { : Result.NEUTRAL;
candidate = event.getMessage(); }
}
return validateMessage(candidate);
}
@Override @Override
public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) { public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) {
return validateMessage(msg); return validateMessage(msg);
} }
@Override @Override
public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) {
return validateMessage(msg); return validateMessage(msg);
} }
@Override @Override
public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) { public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) {
String candidate = null; String candidate = null;
if (msg != null) { if (msg != null) {
candidate = msg.toString(); candidate = msg.toString();
} }
return validateMessage(candidate); return validateMessage(candidate);
} }
} }

View File

@@ -1,44 +1,41 @@
package com.redstoner.logging; package com.redstoner.logging;
import com.redstoner.misc.Utils;
import com.redstoner.modules.Module;
import com.redstoner.modules.ModuleLogger;
import org.apache.logging.log4j.LogManager;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import org.apache.logging.log4j.LogManager;
import com.redstoner.misc.Utils;
import com.redstoner.modules.Module;
import com.redstoner.modules.ModuleLogger;
public class PrivateLogManager { public class PrivateLogManager {
private static final String ISSUED_COMMAND_TEXT = "issued server command: /";
private static final int ISSUED_COMMAND_TEXT_LENGTH = ISSUED_COMMAND_TEXT.length();
private static Map<String, Module> registrar = new HashMap<>(); private static Map<String, Module> registrar = new HashMap<>();
private static Map<String, String> commands = new HashMap<>(); private static Map<String, String> commands = new HashMap<>();
private static final String ISSUED_COMMAND_TEXT = "issued server command: /";
private static final int ISSUED_COMMAND_TEXT_LENGTH = ISSUED_COMMAND_TEXT.length();
private static ModuleLogger logger; private static ModuleLogger logger;
public static void initialize() { public static void initialize() {
org.apache.logging.log4j.core.Logger logger; org.apache.logging.log4j.core.Logger logger;
logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger(); logger = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
logger.addFilter(new Log4JFilter()); logger.addFilter(new Log4JFilter());
PrivateLogManager.logger = new ModuleLogger("PrivateLogManager"); PrivateLogManager.logger = new ModuleLogger("PrivateLogManager");
} }
public static void register(Module module, String command, String replacement) { public static void register(Module module, String command, String replacement) {
command = command.toLowerCase(); command = command.toLowerCase();
registrar.put(command, module); registrar.put(command, module);
commands.put(command, replacement); commands.put(command, replacement);
logger.info(module.getClass().getSimpleName() + " registered &e/" + command logger.info(module.getClass().getSimpleName() + " registered &e/" + command
+ (replacement.equals("")? "&7. Command will not be logged!" + (replacement.equals("") ? "&7. Command will not be logged!"
: "&7, using replacement, &e" + replacement + "&7.")); : "&7, using replacement, &e" + replacement + "&7."));
} }
public static void unregister(Module module) { public static void unregister(Module module) {
String unregestered = ""; String unregestered = "";
Iterator<Map.Entry<String, Module>> i = registrar.entrySet().iterator(); Iterator<Map.Entry<String, Module>> i = registrar.entrySet().iterator();
while (i.hasNext()) { while (i.hasNext()) {
Map.Entry<String, Module> entry = i.next(); Map.Entry<String, Module> entry = i.next();
if (entry.getValue() == module) { if (entry.getValue() == module) {
@@ -50,7 +47,7 @@ public class PrivateLogManager {
if (!unregestered.equals("")) if (!unregestered.equals(""))
logger.info("Unregistered " + unregestered.substring(0, unregestered.length() - 2) + "&7 for module, " + module.getClass().getSimpleName() + "."); logger.info("Unregistered " + unregestered.substring(0, unregestered.length() - 2) + "&7 for module, " + module.getClass().getSimpleName() + ".");
} }
public static void unregister(Module module, String... toRemove) { public static void unregister(Module module, String... toRemove) {
String unregestered = ""; String unregestered = "";
for (int i = 0; i < toRemove.length; i++) { for (int i = 0; i < toRemove.length; i++) {
@@ -62,27 +59,27 @@ public class PrivateLogManager {
if (!unregestered.equals("")) if (!unregestered.equals(""))
logger.info(module.getClass().getSimpleName() + " unregistered " + unregestered.substring(0, unregestered.length() - 2) + "&7."); logger.info(module.getClass().getSimpleName() + " unregistered " + unregestered.substring(0, unregestered.length() - 2) + "&7.");
} }
public static boolean isHidden(String message) { public static boolean isHidden(String message) {
if (message == null) if (message == null)
return false; return false;
int index = message.indexOf(ISSUED_COMMAND_TEXT); int index = message.indexOf(ISSUED_COMMAND_TEXT);
if (index == -1) if (index == -1)
return false; return false;
String command = message.substring(index + ISSUED_COMMAND_TEXT_LENGTH); String command = message.substring(index + ISSUED_COMMAND_TEXT_LENGTH);
int spaceIndex = command.indexOf(" "); int spaceIndex = command.indexOf(" ");
command = spaceIndex == -1? command.toLowerCase() : command.substring(0, spaceIndex).toLowerCase(); command = spaceIndex == -1 ? command.toLowerCase() : command.substring(0, spaceIndex).toLowerCase();
String replacement = commands.get(command); String replacement = commands.get(command);
if (replacement == null) if (replacement == null)
return false; return false;
if (replacement.equals("")) if (replacement.equals(""))
return true; return true;
String player = message.substring(0, message.indexOf(" ")); String player = message.substring(0, message.indexOf(" "));
Utils.run(() -> System.out.println(replacement.replace("$s", player))); Utils.run(() -> System.out.println(replacement.replace("$s", player)));
return true; return true;
} }

View File

@@ -1,14 +1,14 @@
package com.redstoner.misc; package com.redstoner.misc;
import com.redstoner.annotations.Version;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import com.redstoner.annotations.Version; /**
* Classes implementing this interface can be used to define a filter for the Utils.broadcast method for sending a message to more than one, but less than all users.
/** Classes implementing this interface can be used to define a filter for the Utils.broadcast method for sending a message to more than one, but less than all users. *
* * @author Pepich
* @author Pepich */ */
@Version(major = 1, minor = 0, revision = 0, compatible = 1) @Version (major = 1, minor = 0, revision = 0, compatible = 1)
public interface BroadcastFilter public interface BroadcastFilter {
{
public boolean sendTo(CommandSender recipient); public boolean sendTo(CommandSender recipient);
} }

View File

@@ -3,9 +3,8 @@ package com.redstoner.misc;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
/** @author Pepich */ /** @author Pepich */
@Version(major = 4, minor = 0, revision = 0, compatible = -1) @Version (major = 4, minor = 0, revision = 0, compatible = -1)
public enum CommandHolderType public enum CommandHolderType {
{
Stream, Stream,
File, File,
String, String,

View File

@@ -1,149 +1,144 @@
package com.redstoner.misc; package com.redstoner.misc;
import com.redstoner.annotations.Version;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import org.json.simple.JSONArray; /**
import org.json.simple.JSONObject; * This class provides simple JSON handling, like storing and loading from and to files.
import org.json.simple.parser.JSONParser; *
import org.json.simple.parser.ParseException; * @author Pepich
*/
@Version (major = 1, minor = 0, revision = 2, compatible = -1)
public class JsonManager {
private JsonManager() {}
import com.redstoner.annotations.Version; /**
* Loads a JSONObject from a file.
/** This class provides simple JSON handling, like storing and loading from and to files. *
*
* @author Pepich */
@Version(major = 1, minor = 0, revision = 2, compatible = -1)
public class JsonManager
{
private JsonManager()
{}
/** Loads a JSONObject from a file.
*
* @param source the file to load from. * @param source the file to load from.
* @return the JSONObject or null if the source does not contain a valid JSONObject. */ *
public static JSONObject getObject(File source) * @return the JSONObject or null if the source does not contain a valid JSONObject.
{ */
public static JSONObject getObject(File source) {
if (!source.exists()) if (!source.exists())
return null; return null;
JSONParser parser = new JSONParser(); JSONParser parser = new JSONParser();
try try {
{ FileReader reader = new FileReader(source);
FileReader reader = new FileReader(source); Object rawObject = parser.parse(reader);
Object rawObject = parser.parse(reader);
reader.close(); reader.close();
JSONObject jsonObject = (JSONObject) rawObject; JSONObject jsonObject = (JSONObject) rawObject;
return jsonObject; return jsonObject;
} catch (IOException | ParseException e) {
} }
catch (IOException | ParseException e)
{}
return null; return null;
} }
/** Saves a JSONObject to a file. Will create the necessary FileStructure like folders and the file itself.</br> /**
* Saves a JSONObject to a file. Will create the necessary FileStructure like folders and the file itself.</br>
* Note that this operation will be run on a different thread and you do not need to take care of that yourself. * Note that this operation will be run on a different thread and you do not need to take care of that yourself.
* *
* @param object the JSONObject to save. * @param object the JSONObject to save.
* @param destination the file to write to. */ * @param destination the file to write to.
public static void save(JSONObject object, File destination) */
{ public static void save(JSONObject object, File destination) {
Thread t = new Thread(new Runnable() Thread t = new Thread(new Runnable() {
{
@Override @Override
public void run() public void run() {
{
saveSync(object, destination); saveSync(object, destination);
} }
}); });
t.start(); t.start();
} }
/** Saves a JSONObject to a file. Will create the necessary FileStructure like folders and the file itself.</br> /**
* Saves a JSONObject to a file. Will create the necessary FileStructure like folders and the file itself.</br>
* Note that this operation will be run on the same thread that you are calling it from! * Note that this operation will be run on the same thread that you are calling it from!
* *
* @param object the JSONObject to save. * @param object the JSONObject to save.
* @param destination the file to write to. */ * @param destination the file to write to.
public static void saveSync(JSONObject object, File destination) */
{ public static void saveSync(JSONObject object, File destination) {
if (destination.exists()) if (destination.exists())
destination.delete(); destination.delete();
else if (!destination.getParentFile().exists()) else if (!destination.getParentFile().exists())
destination.getParentFile().mkdirs(); destination.getParentFile().mkdirs();
try try {
{
destination.createNewFile(); destination.createNewFile();
FileWriter writer = new FileWriter(destination); FileWriter writer = new FileWriter(destination);
String json_string = object.toJSONString(); String json_string = object.toJSONString();
writer.write(json_string); writer.write(json_string);
writer.flush(); writer.flush();
writer.close(); writer.close();
} catch (IOException e) {
} }
catch (IOException e)
{}
} }
/** Loads a JSONArray from a file. /**
* * Loads a JSONArray from a file.
*
* @param source the file to load from. * @param source the file to load from.
* @return the JSONArray or null if the source does not contain a valid JSONArray. */ *
public static JSONArray getArray(File source) * @return the JSONArray or null if the source does not contain a valid JSONArray.
{ */
public static JSONArray getArray(File source) {
if (!source.exists()) if (!source.exists())
return null; return null;
JSONParser parser = new JSONParser(); JSONParser parser = new JSONParser();
try try {
{ Object rawObject = parser.parse(new FileReader(source));
Object rawObject = parser.parse(new FileReader(source));
JSONArray jsonArray = (JSONArray) rawObject; JSONArray jsonArray = (JSONArray) rawObject;
return jsonArray; return jsonArray;
} catch (IOException | ParseException e) {
} }
catch (IOException | ParseException e)
{}
return null; return null;
} }
/** Saves a JSONArray to a file. Will create the necessary FileStructure like folders and the file itself.</br> /**
* Saves a JSONArray to a file. Will create the necessary FileStructure like folders and the file itself.</br>
* Note that this operation will be run on a different thread and you do not need to take care of that yourself. * Note that this operation will be run on a different thread and you do not need to take care of that yourself.
* *
* @param object the JSONArray to save. * @param object the JSONArray to save.
* @param destination the file to write to. */ * @param destination the file to write to.
public static void save(JSONArray array, File destination) */
{ public static void save(JSONArray array, File destination) {
Thread t = new Thread(new Runnable() Thread t = new Thread(new Runnable() {
{
@Override @Override
public void run() public void run() {
{
saveSync(array, destination); saveSync(array, destination);
} }
}); });
t.start(); t.start();
} }
/** Saves a JSONArray to a file. Will create the necessary FileStructure like folders and the file itself.</br> /**
* Saves a JSONArray to a file. Will create the necessary FileStructure like folders and the file itself.</br>
* Note that this operation will be run on the same thread that you are calling it from! * Note that this operation will be run on the same thread that you are calling it from!
* *
* @param object the JSONArray to save. * @param object the JSONArray to save.
* @param destination the file to write to. */ * @param destination the file to write to.
public static void saveSync(JSONArray array, File destination) */
{ public static void saveSync(JSONArray array, File destination) {
if (destination.exists()) if (destination.exists())
destination.delete(); destination.delete();
else if (!destination.getParentFile().exists()) else if (!destination.getParentFile().exists())
destination.getParentFile().mkdirs(); destination.getParentFile().mkdirs();
try try {
{
destination.createNewFile(); destination.createNewFile();
FileWriter writer = new FileWriter(destination); FileWriter writer = new FileWriter(destination);
String json_string = array.toJSONString(); String json_string = array.toJSONString();
writer.write(json_string); writer.write(json_string);
writer.flush(); writer.flush();
writer.close(); writer.close();
} catch (IOException e) {
} }
catch (IOException e)
{}
} }
} }

View File

@@ -1,29 +1,27 @@
package com.redstoner.misc; package com.redstoner.misc;
import org.bukkit.plugin.java.JavaPlugin;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.coremods.moduleLoader.ModuleLoader;
import com.redstoner.logging.PrivateLogManager; import com.redstoner.logging.PrivateLogManager;
import com.redstoner.misc.mysql.MysqlHandler; import com.redstoner.misc.mysql.MysqlHandler;
import net.nemez.chatapi.ChatAPI; import net.nemez.chatapi.ChatAPI;
import org.bukkit.plugin.java.JavaPlugin;
/** Main class. Duh. /**
* * Main class. Duh.
* @author Pepich */ *
@Version(major = 5, minor = 1, revision = 0, compatible = -1) * @author Pepich
public class Main extends JavaPlugin */
{ @Version (major = 5, minor = 1, revision = 0, compatible = -1)
public class Main extends JavaPlugin {
public static JavaPlugin plugin; public static JavaPlugin plugin;
@Override @Override
public void onEnable() public void onEnable() {
{
plugin = this; plugin = this;
PrivateLogManager.initialize(); PrivateLogManager.initialize();
ChatAPI.initialize(this); ChatAPI.initialize(this);
// Configger.init(); // Configger.init();
MysqlHandler.init(); MysqlHandler.init();
@@ -31,10 +29,9 @@ public class Main extends JavaPlugin
// Load modules from config // Load modules from config
ModuleLoader.loadFromConfig(); ModuleLoader.loadFromConfig();
} }
@Override @Override
public void onDisable() public void onDisable() {
{
ModuleLoader.disableModules(); ModuleLoader.disableModules();
} }
} }

View File

@@ -1,14 +1,13 @@
package com.redstoner.misc; package com.redstoner.misc;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.coremods.moduleLoader.ModuleLoader;
import com.redstoner.exceptions.MissingVersionException; import com.redstoner.exceptions.MissingVersionException;
import com.redstoner.modules.Module; import com.redstoner.modules.Module;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.InputStream;
import java.io.InputStreamReader;
public class ModuleInfo { public class ModuleInfo {
@@ -17,41 +16,55 @@ public class ModuleInfo {
private String category; private String category;
private String description; private String description;
private String version; private String version;
private String warning; private String warning;
public ModuleInfo(InputStream descriptor, Module module) { public ModuleInfo(InputStream descriptor, Module module) {
try { try {
InputStreamReader reader = new InputStreamReader(descriptor); InputStreamReader reader = new InputStreamReader(descriptor);
FileConfiguration config = YamlConfiguration.loadConfiguration(reader); FileConfiguration config = YamlConfiguration.loadConfiguration(reader);
displayName = config.getString("displayName"); displayName = config.getString("displayName");
category = config.getString("category"); category = config.getString("category");
description = config.getString("description"); description = config.getString("description");
} } catch (Exception e) {
catch (Exception e) {
warning = "Descriptor file could not be loaded, using the class's name."; warning = "Descriptor file could not be loaded, using the class's name.";
} }
simpleName = module.getClass().getSimpleName(); simpleName = module.getClass().getSimpleName();
if (displayName == null) if (displayName == null)
displayName = simpleName; displayName = simpleName;
if (category == null) if (category == null)
category = "Other"; category = "Other";
try { try {
version = VersionHelper.getVersion(module.getClass()); version = VersionHelper.getVersion(module.getClass());
} catch (MissingVersionException e) {} } catch (MissingVersionException e) {}
} }
public String getDisplayName() {
return displayName;
}
public String getWarning() {
return warning;
}
public String getModuleInfoHover() {
return "&8&o" + getSimpleName() + "\n"
+ "&r&e" + (getVersion() == null ? "&cVersion Missing" : getVersion())
+ "&r&9" + (ModuleLoader.hasCategories() ? "\n" + getCategory() : "")
+ "&r&7" + (getDescription() == null ? "" : "\n\n" + getDescription());
}
public String getSimpleName() { public String getSimpleName() {
return simpleName; return simpleName;
} }
public String getDisplayName() { public String getVersion() {
return displayName; return version;
} }
public String getCategory() { public String getCategory() {
@@ -62,20 +75,5 @@ public class ModuleInfo {
return description; return description;
} }
public String getWarning() {
return warning;
}
public String getVersion() {
return version;
}
public String getModuleInfoHover() {
return "&8&o" + getSimpleName() + "\n"
+ "&r&e" + (getVersion() == null? "&cVersion Missing" : getVersion())
+ "&r&9" + (ModuleLoader.hasCategories()? "\n" + getCategory() : "")
+ "&r&7" + (getDescription() == null? "" : "\n\n" + getDescription());
}
} }

View File

@@ -1,177 +1,172 @@
package com.redstoner.misc; package com.redstoner.misc;
import com.redstoner.annotations.Version;
import com.redstoner.coremods.moduleLoader.ModuleLoader;
import net.nemez.chatapi.ChatAPI;
import net.nemez.chatapi.click.Message;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.bukkit.Bukkit; /**
import org.bukkit.command.CommandSender; * The utils class containing utility functions. Those include but are not limited to sending formatted messages, broadcasts and more.
import org.bukkit.entity.Player; *
* @author Pepich
import com.redstoner.annotations.Version; */
import com.redstoner.coremods.moduleLoader.ModuleLoader; @Version (major = 4, minor = 0, revision = 2, compatible = 1)
public final class Utils {
import net.nemez.chatapi.ChatAPI; /** The Pattern for a UUID */
import net.nemez.chatapi.click.Message; private static final Pattern UUID_pattern = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}");
private static final Pattern Class_pattern = Pattern.compile(".*\\.");
/** The utils class containing utility functions. Those include but are not limited to sending formatted messages, broadcasts and more. private static final Pattern NoDolarSign_pattern = Pattern.compile("\\$\\d*");
*
* @author Pepich */
@Version(major = 4, minor = 0, revision = 2, compatible = 1)
public final class Utils
{
/** The @SimpleDateFormat used for getting the current date. */ /** The @SimpleDateFormat used for getting the current date. */
public static SimpleDateFormat dateFormat = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]"); public static SimpleDateFormat dateFormat = new SimpleDateFormat("[yyyy-MM-dd HH:mm:ss]");
/** The Pattern for a UUID*/
private static final Pattern UUID_pattern = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}");
private static final Pattern Class_pattern = Pattern.compile(".*\\.");
private static final Pattern NoDolarSign_pattern = Pattern.compile("\\$\\d*");
/** Hidden constructor. Do not instantiate UTILS classes! :) */ /** Hidden constructor. Do not instantiate UTILS classes! :) */
private Utils() private Utils() {}
{}
/**
/** This method broadcasts a message to all players and console that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br> * This method broadcasts a message to all players and console that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br>
* If you want to, you can set a message that will be logged to console. Set to null to not log anything.</br> * If you want to, you can set a message that will be logged to console. Set to null to not log anything.</br>
* You can still allow console in the filter to log the original message. * You can still allow console in the filter to log the original message.
* *
* @param prefix The prefix for the message. Set to NULL to let it auto generate. * @param prefix The prefix for the message. Set to NULL to let it auto generate.
* @param message the message to be sent around * @param message the message to be sent around
* @param filter the BroadcastFilter to be applied.</br> * @param filter the BroadcastFilter to be applied.</br>
* Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient. * Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient.
* @param logmessage the log message to appear in console. Set to null to not log this (you can still log the original message by returning true in the filter). * @param logmessage the log message to appear in console. Set to null to not log this (you can still log the original message by returning true in the filter).
* @return the amount of people that received the message. */ *
public static int broadcast(String prefix, String message, BroadcastFilter filter) * @return the amount of people that received the message.
{ */
public static int broadcast(String prefix, String message, BroadcastFilter filter) {
if (prefix == null) if (prefix == null)
prefix = "§8[§2" + getCaller() + "§8]: "; prefix = "§8[§2" + getCaller() + "§8]: ";
if (filter == null) if (filter == null) {
{ for (Player p : Bukkit.getOnlinePlayers()) { p.sendMessage(prefix + message); }
for (Player p : Bukkit.getOnlinePlayers())
p.sendMessage(prefix + message);
Bukkit.getConsoleSender().sendMessage(prefix + message); Bukkit.getConsoleSender().sendMessage(prefix + message);
return Bukkit.getOnlinePlayers().size() + 1; return Bukkit.getOnlinePlayers().size() + 1;
} } else {
else
{
int count = 0; int count = 0;
for (Player p : Bukkit.getOnlinePlayers()) for (Player p : Bukkit.getOnlinePlayers()) {
if (filter.sendTo(p)) if (filter.sendTo(p)) {
{
p.sendMessage(prefix + message); p.sendMessage(prefix + message);
count++; count++;
} }
if (filter.sendTo(Bukkit.getConsoleSender())) }
{ if (filter.sendTo(Bukkit.getConsoleSender())) {
Bukkit.getConsoleSender().sendMessage(prefix + message); Bukkit.getConsoleSender().sendMessage(prefix + message);
count++; count++;
} }
return count; return count;
} }
} }
/** This method broadcasts a message to all players and console that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br> /**
* This method will find the next parent caller and return their class name, omitting package names.
*
* @return the Name of the calling class.
*/
private static final String getCaller() {
StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
String classname = "Utils";
for (int i = 0; classname.equals("Utils"); i++) {
classname = Class_pattern.matcher(stackTrace[i].getClassName()).replaceAll("");
}
return classname;
}
/**
* This method broadcasts a message to all players and console that are allowed by the filter. Set the filter to NULL to broadcast to everyone.</br>
* If you want to, you can set a message that will be logged to console. Set to null to not log anything.</br> * If you want to, you can set a message that will be logged to console. Set to null to not log anything.</br>
* You can still allow console in the filter to log the original message. * You can still allow console in the filter to log the original message.
* *
* @param prefix The prefix for the message. Set to NULL to let it auto generate. * @param prefix The prefix for the message. Set to NULL to let it auto generate.
* @param message the message to be sent around * @param message the message to be sent around
* @param filter the BroadcastFilter to be applied.</br> * @param filter the BroadcastFilter to be applied.</br>
* Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient. * Write a class implementing the interface and pass it to this method, the "sendTo()" method will be called for each recipient.
* @param logmessage the log message to appear in console. Set to null to not log this (you can still log the original message by returning true in the filter). * @param logmessage the log message to appear in console. Set to null to not log this (you can still log the original message by returning true in the filter).
*/ */
public static int broadcast(String prefix, Message message, BroadcastFilter filter) public static int broadcast(String prefix, Message message, BroadcastFilter filter) {
{
if (prefix == null) if (prefix == null)
prefix = "§8[§2" + getCaller() + "§8]: "; prefix = "§8[§2" + getCaller() + "§8]: ";
if (filter == null) if (filter == null) {
{ for (Player p : Bukkit.getOnlinePlayers()) { ChatAPI.createMessage(p).appendText(prefix).appendMessage(message).send(); }
for (Player p : Bukkit.getOnlinePlayers())
ChatAPI.createMessage(p).appendText(prefix).appendMessage(message).send();
Bukkit.getConsoleSender().sendMessage(prefix + message.getRawMessage()); Bukkit.getConsoleSender().sendMessage(prefix + message.getRawMessage());
return Bukkit.getOnlinePlayers().size() + 1; return Bukkit.getOnlinePlayers().size() + 1;
} } else {
else
{
int count = 0; int count = 0;
for (Player p : Bukkit.getOnlinePlayers()) for (Player p : Bukkit.getOnlinePlayers()) {
if (filter.sendTo(p)) if (filter.sendTo(p)) {
{
ChatAPI.createMessage(p).appendText(prefix).appendMessage(message).send(); ChatAPI.createMessage(p).appendText(prefix).appendMessage(message).send();
count++; count++;
} }
if (filter.sendTo(Bukkit.getConsoleSender())) }
{ if (filter.sendTo(Bukkit.getConsoleSender())) {
Bukkit.getConsoleSender().sendMessage(prefix + message.getRawMessage()); Bukkit.getConsoleSender().sendMessage(prefix + message.getRawMessage());
count++; count++;
} }
return count; return count;
} }
} }
/** This method will find the next parent caller and return their class name, omitting package names. /**
* * This method will find the next parent caller and return their class name, omitting package names.
* @return the Name of the calling class. */ *
private static final String getCaller()
{
StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
String classname = "Utils";
for (int i = 0; classname.equals("Utils"); i++)
{
classname = Class_pattern.matcher(stackTrace[i].getClassName()).replaceAll("");
}
return classname;
}
/** This method will find the next parent caller and return their class name, omitting package names.
*
* @param directCaller used to prevent this method from returning the caller itself. Null if supposed to be ignored. * @param directCaller used to prevent this method from returning the caller itself. Null if supposed to be ignored.
* @return the name of the calling class. */ *
public static final String getCaller(String... directCaller) * @return the name of the calling class.
{ */
public static final String getCaller(String... directCaller) {
if (directCaller == null || directCaller.length == 0) if (directCaller == null || directCaller.length == 0)
return getCaller(); return getCaller();
StackTraceElement[] stackTrace = (new Exception()).getStackTrace(); StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
String classname = "Utils"; String classname = "Utils";
List<String> callers = Arrays.asList(directCaller); List<String> callers = Arrays.asList(directCaller);
for (int i = 0; callers.contains(classname) || classname.equals("Utils"); i++) for (int i = 0; callers.contains(classname) || classname.equals("Utils"); i++) {
{
classname = Class_pattern.matcher(stackTrace[i].getClassName()).replaceAll(""); classname = Class_pattern.matcher(stackTrace[i].getClassName()).replaceAll("");
} }
classname = NoDolarSign_pattern.matcher(classname).replaceAll(""); classname = NoDolarSign_pattern.matcher(classname).replaceAll("");
return classname; return classname;
} }
/** Provides a uniform way of getting the date for all modules. /**
* * Provides a uniform way of getting the date for all modules.
* @return The current date in the format "[dd-mm-yyyy hh:mm:ss]" */ *
public static String getDate() * @return The current date in the format "[dd-mm-yyyy hh:mm:ss]"
{ */
public static String getDate() {
Date date = new Date(System.currentTimeMillis()); Date date = new Date(System.currentTimeMillis());
return dateFormat.format(date); return dateFormat.format(date);
} }
/** Provides a uniform way of getting the (display)name of a @CommandSender. /**
* * Provides a uniform way of getting the (display)name of a @CommandSender.
*
* @param sender The @CommandSender to get the name of. * @param sender The @CommandSender to get the name of.
* @return The DisplayName of the @CommandSender or if not a @Player, the name in blue. */ *
public static String getName(CommandSender sender) * @return The DisplayName of the @CommandSender or if not a @Player, the name in blue.
{ */
public static String getName(CommandSender sender) {
if (sender instanceof Player) if (sender instanceof Player)
return ((Player) sender).getDisplayName(); return ((Player) sender).getDisplayName();
else else
return "§9" + sender.getName(); return "§9" + sender.getName();
} }
/** Provides a uniform way of getting the UUID of a @CommandSender. /**
* * Provides a uniform way of getting the UUID of a @CommandSender.
*
* @param sender The @CommandSender to get the UUID of. * @param sender The @CommandSender to get the UUID of.
* @return The UUID of the @CommandSender or if not a player, "CONSOLE" in blue. */ *
public static String getID(CommandSender sender) * @return The UUID of the @CommandSender or if not a player, "CONSOLE" in blue.
{ */
public static String getID(CommandSender sender) {
String id; String id;
if (sender instanceof Player) if (sender instanceof Player)
id = ((Player) sender).getUniqueId().toString(); id = ((Player) sender).getUniqueId().toString();
@@ -179,25 +174,25 @@ public final class Utils
id = "CONSOLE"; id = "CONSOLE";
return id; return id;
} }
/** Checks if the string is a UUID. /**
* * Checks if the string is a UUID.
*
* @param toCheck String to check. * @param toCheck String to check.
*
* @return if the string is a UUID. * @return if the string is a UUID.
*/ */
public static boolean isUUID(String toCheck) public static boolean isUUID(String toCheck) {
{ return UUID_pattern.matcher(toCheck).matches();
return UUID_pattern.matcher(toCheck).matches();
} }
public static void run(Runnable r) { public static void run(Runnable r) {
run(r, 0); run(r, 0);
} }
public static void run(Runnable r, int delay) { public static void run(Runnable r, int delay) {
Bukkit.getScheduler().scheduleSyncDelayedTask(ModuleLoader.getPlugin(), r, delay); Bukkit.getScheduler().scheduleSyncDelayedTask(ModuleLoader.getPlugin(), r, delay);
} }
} }

View File

@@ -1,27 +1,30 @@
package com.redstoner.misc; package com.redstoner.misc;
import java.lang.annotation.Annotation;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
import com.redstoner.exceptions.MissingVersionException; import com.redstoner.exceptions.MissingVersionException;
/** This class can be used to compare modules against the loader version or against each other to prevent dependency issues. import java.lang.annotation.Annotation;
*
* @author Pepich */ /**
@Version(major = 2, minor = 1, revision = 3, compatible = 0) * This class can be used to compare modules against the loader version or against each other to prevent dependency issues.
public final class VersionHelper *
{ * @author Pepich
private VersionHelper() */
{} @Version (major = 2, minor = 1, revision = 3, compatible = 0)
public final class VersionHelper {
/** Checks two classes versions for compatibility. private VersionHelper() {}
*
* @param base The API to compare to. /**
* Checks two classes versions for compatibility.
*
* @param base The API to compare to.
* @param module The module to compare. * @param module The module to compare.
*
* @return true, when the module is up to date with the API, or the API supports outdated modules. * @return true, when the module is up to date with the API, or the API supports outdated modules.
* @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation. */ *
public static boolean isCompatible(Class<?> api, Class<?> module) throws MissingVersionException * @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation.
{ */
public static boolean isCompatible(Class<?> api, Class<?> module) throws MissingVersionException {
if (!api.isAnnotationPresent(Version.class)) if (!api.isAnnotationPresent(Version.class))
throw new MissingVersionException("The API is not annotated with a version."); throw new MissingVersionException("The API is not annotated with a version.");
if (!module.isAnnotationPresent(Version.class)) if (!module.isAnnotationPresent(Version.class))
@@ -30,42 +33,16 @@ public final class VersionHelper
Version moduleVersion = module.getAnnotation(Version.class); Version moduleVersion = module.getAnnotation(Version.class);
return isCompatible(apiVersion, moduleVersion); return isCompatible(apiVersion, moduleVersion);
} }
/** Checks two classes versions for compatibility. /**
* * Checks two versions for compatibility.
* @param base The API to compare to. *
* @param module The module to compare. * @param base The API version to compare to.
* @return true, when the module is up to date with the API, or the API supports outdated modules.
* @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation. */
public static boolean isCompatible(Version apiVersion, Class<?> module) throws MissingVersionException
{
if (!module.isAnnotationPresent(Version.class))
throw new MissingVersionException("The module is not annotated with a version.");
Version moduleVersion = module.getAnnotation(Version.class);
return isCompatible(apiVersion, moduleVersion);
}
/** Checks two classes versions for compatibility.
*
* @param base The API to compare to.
* @param module The module to compare.
* @return true, when the module is up to date with the API, or the API supports outdated modules.
* @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation. */
public static boolean isCompatible(Class<?> api, Version moduleVersion) throws MissingVersionException
{
if (!api.isAnnotationPresent(Version.class))
throw new MissingVersionException("The API is not annotated with a version.");
Version apiVersion = api.getAnnotation(Version.class);
return isCompatible(apiVersion, moduleVersion);
}
/** Checks two versions for compatibility.
*
* @param base The API version to compare to.
* @param module The module version to compare. * @param module The module version to compare.
* @return true, when the module is up to date with the API, or the API supports outdated modules. */ *
public static boolean isCompatible(Version apiVersion, Version moduleVersion) * @return true, when the module is up to date with the API, or the API supports outdated modules.
{ */
public static boolean isCompatible(Version apiVersion, Version moduleVersion) {
if (apiVersion.major() >= moduleVersion.compatible()) if (apiVersion.major() >= moduleVersion.compatible())
return true; return true;
if (apiVersion.compatible() == -1) if (apiVersion.compatible() == -1)
@@ -74,76 +51,111 @@ public final class VersionHelper
return true; return true;
return false; return false;
} }
/** Returns the version of a given class as a String. /**
* * Checks two classes versions for compatibility.
*
* @param base The API to compare to.
* @param module The module to compare.
*
* @return true, when the module is up to date with the API, or the API supports outdated modules.
*
* @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation.
*/
public static boolean isCompatible(Version apiVersion, Class<?> module) throws MissingVersionException {
if (!module.isAnnotationPresent(Version.class))
throw new MissingVersionException("The module is not annotated with a version.");
Version moduleVersion = module.getAnnotation(Version.class);
return isCompatible(apiVersion, moduleVersion);
}
/**
* Checks two classes versions for compatibility.
*
* @param base The API to compare to.
* @param module The module to compare.
*
* @return true, when the module is up to date with the API, or the API supports outdated modules.
*
* @throws MissingVersionException When one of the parameters is not annotated with a @Version annotation.
*/
public static boolean isCompatible(Class<?> api, Version moduleVersion) throws MissingVersionException {
if (!api.isAnnotationPresent(Version.class))
throw new MissingVersionException("The API is not annotated with a version.");
Version apiVersion = api.getAnnotation(Version.class);
return isCompatible(apiVersion, moduleVersion);
}
/**
* Returns the version of a given class as a String.
*
* @param clazz The class to grab the version number from. * @param clazz The class to grab the version number from.
*
* @return The version number of the class in format major.minor.revision.compatible. * @return The version number of the class in format major.minor.revision.compatible.
* @throws MissingVersionException If the class is not annotated with @Version. */ *
public static String getVersion(Class<?> clazz) throws MissingVersionException * @throws MissingVersionException If the class is not annotated with @Version.
{ */
public static String getVersion(Class<?> clazz) throws MissingVersionException {
if (!clazz.isAnnotationPresent(Version.class)) if (!clazz.isAnnotationPresent(Version.class))
throw new MissingVersionException("The given class is not associated with a version."); throw new MissingVersionException("The given class is not associated with a version.");
Version ver = clazz.getAnnotation(Version.class); Version ver = clazz.getAnnotation(Version.class);
return getString(ver); return getString(ver);
} }
/** Returns the String representation of a version. /**
* * Returns the String representation of a version.
*
* @param ver The version to be represented. * @param ver The version to be represented.
* @return The String representation. */ *
public static String getString(Version ver) * @return The String representation.
{ */
public static String getString(Version ver) {
return ver.major() + "." + ver.minor() + "." + ver.revision() + "." + ver.compatible(); return ver.major() + "." + ver.minor() + "." + ver.revision() + "." + ver.compatible();
} }
public static Version getVersion(String ver) public static Version getVersion(String ver) {
{
String[] raw = ver.split("\\."); String[] raw = ver.split("\\.");
if (raw.length != 4) if (raw.length != 4)
return null; return null;
return VersionHelper.create(Integer.parseInt(raw[0]), Integer.parseInt(raw[1]), Integer.parseInt(raw[2]), return VersionHelper.create(Integer.parseInt(raw[0]), Integer.parseInt(raw[1]), Integer.parseInt(raw[2]),
Integer.parseInt(raw[3])); Integer.parseInt(raw[3])
);
} }
/** This method creates a new Version to use for compatibility checks. /**
* * This method creates a new Version to use for compatibility checks.
* @param major The major version *
* @param minor The minor version * @param major The major version
* @param revision The revision * @param minor The minor version
* @param revision The revision
* @param compatible The compatibility tag * @param compatible The compatibility tag
* @return */ *
public static Version create(int major, int minor, int revision, int compatible) * @return
{ */
return new Version() public static Version create(int major, int minor, int revision, int compatible) {
{ return new Version() {
@Override @Override
public Class<? extends Annotation> annotationType() public Class<? extends Annotation> annotationType() {
{
return Version.class; return Version.class;
} }
@Override @Override
public int revision() public int revision() {
{
return revision; return revision;
} }
@Override @Override
public int minor() public int minor() {
{
return minor; return minor;
} }
@Override @Override
public int major() public int major() {
{
return major; return major;
} }
@Override @Override
public int compatible() public int compatible() {
{
return compatible; return compatible;
} }
}; };

View File

@@ -1,215 +1,170 @@
package com.redstoner.misc.mysql; package com.redstoner.misc.mysql;
import java.io.File; import com.redstoner.exceptions.NonSaveableConfigException;
import java.io.FileReader; import com.redstoner.misc.Main;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import com.redstoner.exceptions.NonSaveableConfigException; import java.io.File;
import com.redstoner.misc.Main; import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;
import java.util.Map.Entry;
public class Config public class Config {
{ private File file;
private File file;
private JSONObject config; private JSONObject config;
private JSONParser parser; private JSONParser parser;
public Config() public Config() {
{
file = null; file = null;
parser = new JSONParser(); parser = new JSONParser();
config = new JSONObject(); config = new JSONObject();
} }
public Config(JSONObject config) public Config(JSONObject config) {
{
this.file = null; this.file = null;
this.parser = new JSONParser(); this.parser = new JSONParser();
this.config = config; this.config = config;
} }
private Config(File file) throws IOException, ParseException private Config(File file) throws IOException, ParseException {
{
this.file = file; this.file = file;
parser = new JSONParser(); parser = new JSONParser();
if (file.exists()) if (file.exists()) {
{
config = loadConfig(file); config = loadConfig(file);
} } else {
else
{
config = new JSONObject(); config = new JSONObject();
} }
} }
public static final Config getConfig(String fileName) throws IOException, ParseException private JSONObject loadConfig(File file) throws IOException, ParseException {
{
return new Config(new File(Main.plugin.getDataFolder(), fileName));
}
public static final Config getConfig(File file) throws IOException, ParseException
{
return new Config(file);
}
private JSONObject loadConfig(File file) throws IOException, ParseException
{
FileReader reader = new FileReader(file); FileReader reader = new FileReader(file);
JSONObject object = (JSONObject) parser.parse(reader); JSONObject object = (JSONObject) parser.parse(reader);
reader.close(); reader.close();
return object; return object;
} }
public static final Config getConfig(String fileName) throws IOException, ParseException {
return new Config(new File(Main.plugin.getDataFolder(), fileName));
}
public static final Config getConfig(File file) throws IOException, ParseException {
return new Config(file);
}
@Override @Override
public String toString() public String toString() {
{
return config.toJSONString(); return config.toJSONString();
} }
public JSONObject asObject() public JSONObject asObject() {
{
return config; return config;
} }
public void save() throws IOException, NonSaveableConfigException public void save() throws IOException, NonSaveableConfigException {
{ if (file == null) {
if (file == null)
{
throw new NonSaveableConfigException(); throw new NonSaveableConfigException();
} }
PrintWriter writer = new PrintWriter(file); PrintWriter writer = new PrintWriter(file);
writer.write(config.toJSONString()); writer.write(config.toJSONString());
writer.close(); writer.close();
} }
public void refresh() throws IOException, ParseException, NonSaveableConfigException public void refresh() throws IOException, ParseException, NonSaveableConfigException {
{ if (file == null) {
if (file == null)
{
throw new NonSaveableConfigException(); throw new NonSaveableConfigException();
} }
loadConfig(file); loadConfig(file);
} }
public void setFile(String fileName) public void setFile(String fileName) {
{
file = new File(Main.plugin.getDataFolder(), fileName); file = new File(Main.plugin.getDataFolder(), fileName);
} }
public void setFile(File file) public void setFile(File file) {
{
this.file = file; this.file = file;
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void put(String key, String value) public void put(String key, String value) {
{
config.put(key, value); config.put(key, value);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void put(String key, List<String> value) public void put(String key, List<String> value) {
{
JSONArray array = new JSONArray(); JSONArray array = new JSONArray();
for (String entry : value) for (String entry : value) {
{
array.add(entry); array.add(entry);
} }
config.put(key, array); config.put(key, array);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void putArray(String key, JSONArray value) public void putArray(String key, JSONArray value) {
{
config.put(key, value); config.put(key, value);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void put(String key, Map<String, String> value) public void put(String key, Map<String, String> value) {
{
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
for (String valKey : value.keySet()) for (String valKey : value.keySet()) {
{
String valVal = value.get(valKey); String valVal = value.get(valKey);
object.put(valKey, valVal); object.put(valKey, valVal);
} }
config.put(key, object); config.put(key, object);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void put(String key, JSONObject value) public void put(String key, JSONObject value) {
{
config.put(key, value); config.put(key, value);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public void putAll(Map<String, String> entry) public void putAll(Map<String, String> entry) {
{ for (String key : entry.keySet()) {
for (String key : entry.keySet())
{
String value = entry.get(key); String value = entry.get(key);
config.put(key, value); config.put(key, value);
} }
} }
public boolean containsKey(String key) public String get(String key) {
{ if (containsKey(key)) {
return config.containsKey(key);
}
public String get(String key)
{
if (containsKey(key))
{
Object value = config.get(key); Object value = config.get(key);
if (value instanceof String) if (value instanceof String) {
{
return (String) value; return (String) value;
} }
} }
return null; return null;
} }
public String getOrDefault(String key, String defaultValue) public boolean containsKey(String key) {
{ return config.containsKey(key);
if (containsKey(key)) }
{
public String getOrDefault(String key, String defaultValue) {
if (containsKey(key)) {
Object value = config.get(key); Object value = config.get(key);
if (value instanceof String) if (value instanceof String) {
{
return (String) value; return (String) value;
} }
return null; return null;
} } else {
else
{
return defaultValue; return defaultValue;
} }
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public List<String> getList(String key) public List<String> getList(String key) {
{ if (containsKey(key)) {
if (containsKey(key))
{
Object value = config.get(key); Object value = config.get(key);
if (value instanceof JSONArray) if (value instanceof JSONArray) {
{ JSONArray array = (JSONArray) value;
JSONArray array = (JSONArray) value;
List<String> output = new ArrayList<String>(); List<String> output = new ArrayList<String>();
for (String entry : (String[]) array.toArray(new String[0])) for (String entry : (String[]) array.toArray(new String[0])) {
{
output.add(entry); output.add(entry);
} }
return output; return output;
@@ -217,34 +172,27 @@ public class Config
} }
return null; return null;
} }
public JSONArray getArray(String key) public JSONArray getArray(String key) {
{ if (containsKey(key)) {
if (containsKey(key))
{
Object value = config.get(key); Object value = config.get(key);
if (value instanceof JSONArray) if (value instanceof JSONArray) {
{
JSONArray array = (JSONArray) value; JSONArray array = (JSONArray) value;
return array; return array;
} }
} }
return null; return null;
} }
public Map<String, String> getMap(String key) public Map<String, String> getMap(String key) {
{ if (containsKey(key)) {
if (containsKey(key))
{
Object value = config.get(key); Object value = config.get(key);
if (value instanceof JSONObject) if (value instanceof JSONObject) {
{
JSONObject object = (JSONObject) value; JSONObject object = (JSONObject) value;
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
Set<Map.Entry<String, String>> entrySet = object.entrySet(); Set<Map.Entry<String, String>> entrySet = object.entrySet();
Map<String, String> output = new HashMap<String, String>(); Map<String, String> output = new HashMap<String, String>();
for (Map.Entry<String, String> entry : entrySet) for (Map.Entry<String, String> entry : entrySet) {
{
output.put(entry.getKey(), entry.getValue()); output.put(entry.getKey(), entry.getValue());
} }
return output; return output;
@@ -252,29 +200,24 @@ public class Config
} }
return null; return null;
} }
public JSONObject getObject(String key) public JSONObject getObject(String key) {
{ if (containsKey(key)) {
if (containsKey(key))
{
Object value = config.get(key); Object value = config.get(key);
if (value instanceof JSONObject) if (value instanceof JSONObject) {
{
JSONObject object = (JSONObject) value; JSONObject object = (JSONObject) value;
return object; return object;
} }
} }
return null; return null;
} }
public void remove(String key) public void remove(String key) {
{
config.remove(key); config.remove(key);
} }
@SuppressWarnings("unchecked") @SuppressWarnings ("unchecked")
public Set<Entry<String, String>> getAll() public Set<Entry<String, String>> getAll() {
{
return config.entrySet(); return config.entrySet();
} }
} }

View File

@@ -1,106 +1,79 @@
package com.redstoner.misc.mysql; package com.redstoner.misc.mysql;
import java.io.File; import com.redstoner.misc.Main;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser; import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException; import org.json.simple.parser.ParseException;
import com.redstoner.misc.Main; import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JSONManager public class JSONManager {
{ public static Map<Serializable, Serializable> getConfiguration(String fileName) {
public static Map<Serializable, Serializable> getConfiguration(String fileName)
{
File file = new File(Main.plugin.getDataFolder(), fileName); File file = new File(Main.plugin.getDataFolder(), fileName);
if (!file.exists()) if (!file.exists()) {
{ try {
try
{
PrintWriter writer = new PrintWriter(file.getAbsolutePath(), "UTF-8"); PrintWriter writer = new PrintWriter(file.getAbsolutePath(), "UTF-8");
writer.println("{}"); writer.println("{}");
writer.close(); writer.close();
} } catch (FileNotFoundException | UnsupportedEncodingException e) {
catch (FileNotFoundException | UnsupportedEncodingException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
try try {
{
return loadMap(file); return loadMap(file);
} } catch (IOException | ParseException e) {
catch (IOException | ParseException e)
{
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
public static void saveConfiguration(Map<Serializable, Serializable> config, String fileName) public static Map<Serializable, Serializable> loadMap(File file) throws IOException, ParseException {
{ FileReader reader = new FileReader(file);
try JSONObject map = (JSONObject) new JSONParser().parse(reader);
{ Map<Serializable, Serializable> entries = new HashMap<>();
saveMap(new File(Main.plugin.getDataFolder(), fileName), config); for (Object o : map.keySet()) {
} entries.put((Serializable) o, (Serializable) map.get(o));
catch (IOException e)
{
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static void saveList(File file, List<Serializable> entries) throws IOException
{
JSONArray array = new JSONArray();
array.addAll(entries);
FileWriter writer = new FileWriter(file);
writer.write(array.toJSONString());
writer.close();
}
public static List<Serializable> loadList(File file) throws IOException, ParseException
{
FileReader read = new FileReader(file);
List<Serializable> entries = new ArrayList<>();
JSONArray array = (JSONArray) new JSONParser().parse(read);
for (Object o : array)
{
entries.add((Serializable) o);
} }
return entries; return entries;
} }
@SuppressWarnings("unchecked") public static void saveConfiguration(Map<Serializable, Serializable> config, String fileName) {
public static void saveMap(File file, Map<Serializable, Serializable> entries) throws IOException try {
{ saveMap(new File(Main.plugin.getDataFolder(), fileName), config);
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings ("unchecked")
public static void saveMap(File file, Map<Serializable, Serializable> entries) throws IOException {
JSONObject map = new JSONObject(); JSONObject map = new JSONObject();
map.putAll(entries); map.putAll(entries);
FileWriter writer = new FileWriter(file); FileWriter writer = new FileWriter(file);
writer.write(map.toJSONString()); writer.write(map.toJSONString());
writer.close(); writer.close();
} }
public static Map<Serializable, Serializable> loadMap(File file) throws IOException, ParseException @SuppressWarnings ("unchecked")
{ public static void saveList(File file, List<Serializable> entries) throws IOException {
FileReader reader = new FileReader(file); JSONArray array = new JSONArray();
JSONObject map = (JSONObject) new JSONParser().parse(reader); array.addAll(entries);
Map<Serializable, Serializable> entries = new HashMap<>(); FileWriter writer = new FileWriter(file);
for (Object o : map.keySet()) writer.write(array.toJSONString());
{ writer.close();
entries.put((Serializable) o, (Serializable) map.get(o)); }
public static List<Serializable> loadList(File file) throws IOException, ParseException {
FileReader read = new FileReader(file);
List<Serializable> entries = new ArrayList<>();
JSONArray array = (JSONArray) new JSONParser().parse(read);
for (Object o : array) {
entries.add((Serializable) o);
} }
return entries; return entries;
} }

View File

@@ -1,113 +1,86 @@
package com.redstoner.misc.mysql; package com.redstoner.misc.mysql;
import com.redstoner.misc.Main;
import com.redstoner.misc.mysql.elements.MysqlDatabase;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.json.simple.parser.ParseException;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.sql.Connection; import java.sql.*;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.bukkit.Bukkit; public class MysqlHandler {
import org.bukkit.ChatColor;
import org.json.simple.parser.ParseException;
import com.redstoner.misc.Main;
import com.redstoner.misc.mysql.elements.MysqlDatabase;
public class MysqlHandler
{
public static MysqlHandler INSTANCE; public static MysqlHandler INSTANCE;
private String url, username, password; private String url, username, password;
public MysqlHandler(String hostname, int port, String username, String password) public MysqlHandler(String hostname, int port, String username, String password) {
{
this.url = "jdbc:mysql://" + hostname + ":" + port + "/"; this.url = "jdbc:mysql://" + hostname + ":" + port + "/";
this.username = username; this.username = username;
this.password = password; this.password = password;
} }
public static void init() public static void init() {
{ Map<Serializable, Serializable> mysqlCredentials = new HashMap<>();
Map<Serializable, Serializable> mysqlCredentials = new HashMap<>(); File mysqlCredentialsFile = new File(Main.plugin.getDataFolder(), "mysqlCredentials.json");
File mysqlCredentialsFile = new File(Main.plugin.getDataFolder(), "mysqlCredentials.json"); if (mysqlCredentialsFile.exists()) {
if (mysqlCredentialsFile.exists()) try {
{
try
{
mysqlCredentials = JSONManager.loadMap(mysqlCredentialsFile); mysqlCredentials = JSONManager.loadMap(mysqlCredentialsFile);
} } catch (IOException | ParseException e) {
catch (IOException | ParseException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} } else {
else
{
Bukkit.getConsoleSender().sendMessage( Bukkit.getConsoleSender().sendMessage(
ChatColor.RED + "MySQL config does not exist, creating an example one, things might (will) break!"); ChatColor.RED + "MySQL config does not exist, creating an example one, things might (will) break!");
mysqlCredentials.put("hostname", "localhost"); mysqlCredentials.put("hostname", "localhost");
mysqlCredentials.put("port", "3306"); mysqlCredentials.put("port", "3306");
mysqlCredentials.put("username", "your username here"); mysqlCredentials.put("username", "your username here");
mysqlCredentials.put("password", "your password here"); mysqlCredentials.put("password", "your password here");
try try {
{
JSONManager.saveMap(mysqlCredentialsFile, mysqlCredentials); JSONManager.saveMap(mysqlCredentialsFile, mysqlCredentials);
} } catch (IOException e) {
catch (IOException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
String hostname = (String) mysqlCredentials.get("hostname"); String hostname = (String) mysqlCredentials.get("hostname");
int port = Integer.valueOf((String) mysqlCredentials.get("port")); int port = Integer.valueOf((String) mysqlCredentials.get("port"));
String username = (String) mysqlCredentials.get("username"); String username = (String) mysqlCredentials.get("username");
String password = (String) mysqlCredentials.get("password"); String password = (String) mysqlCredentials.get("password");
INSTANCE = new MysqlHandler(hostname, port, username, password); INSTANCE = new MysqlHandler(hostname, port, username, password);
} }
private Connection getConnection(String databaseName) throws IllegalStateException public MysqlDatabase getDatabase(String databaseName) {
{ return new MysqlDatabase(getConnection(databaseName));
}
private Connection getConnection(String databaseName) throws IllegalStateException {
Connection connection = null; Connection connection = null;
try try {
{
connection = DriverManager.getConnection(url + databaseName, username, password); connection = DriverManager.getConnection(url + databaseName, username, password);
} } catch (SQLException e) {
catch (SQLException e)
{
throw new IllegalStateException("Cannot connect to the database!", e); throw new IllegalStateException("Cannot connect to the database!", e);
} }
return connection; return connection;
} }
public MysqlDatabase getDatabase(String databaseName) public List<MysqlDatabase> getDatabases() {
{ try {
return new MysqlDatabase(getConnection(databaseName)); List<MysqlDatabase> databases = new ArrayList<>();
} Connection connection = DriverManager.getConnection(url.substring(0, url.length()), username, password);
DatabaseMetaData metadata = connection.getMetaData();
public List<MysqlDatabase> getDatabases() ResultSet queryResults = metadata.getCatalogs();
{ while (queryResults.next()) {
try
{
List<MysqlDatabase> databases = new ArrayList<>();
Connection connection = DriverManager.getConnection(url.substring(0, url.length()), username, password);
DatabaseMetaData metadata = connection.getMetaData();
ResultSet queryResults = metadata.getCatalogs();
while (queryResults.next())
{
String databaseName = queryResults.getString("TABLE_CAT"); String databaseName = queryResults.getString("TABLE_CAT");
databases.add(new MysqlDatabase(getConnection(databaseName))); databases.add(new MysqlDatabase(getConnection(databaseName)));
} }
connection.close(); connection.close();
return databases; return databases;
} } catch (SQLException e) {
catch (SQLException e)
{
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }

View File

@@ -1,29 +1,25 @@
package com.redstoner.misc.mysql; package com.redstoner.misc.mysql;
import java.sql.CallableStatement; import java.sql.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlQueryHandler { public class MysqlQueryHandler {
public static ResultSet queryResult(Connection connection, String query) { public static ResultSet queryResult(Connection connection, String query) {
try { try {
Statement statement = connection.createStatement(); Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery(query); ResultSet results = statement.executeQuery(query);
return results; return results;
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
public static boolean queryNoResult(Connection connection, String query) { public static boolean queryNoResult(Connection connection, String query) {
try { try {
CallableStatement statement = connection.prepareCall(query); CallableStatement statement = connection.prepareCall(query);
statement.execute(); statement.execute();
return true; return true;
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -2,7 +2,7 @@ package com.redstoner.misc.mysql.elements;
public enum ConstraintOperator { public enum ConstraintOperator {
LESS_THAN, GREATER_THAN, EQUAL, NOT_EQUAL, LESS_THAN_OR_EQUAL, GREATER_THAN_OR_EQUAL; LESS_THAN, GREATER_THAN, EQUAL, NOT_EQUAL, LESS_THAN_OR_EQUAL, GREATER_THAN_OR_EQUAL;
public String toString() { public String toString() {
switch (this) { switch (this) {
case LESS_THAN: case LESS_THAN:

View File

@@ -3,7 +3,7 @@ package com.redstoner.misc.mysql.elements;
public class MysqlConstraint { public class MysqlConstraint {
private String fieldName, value; private String fieldName, value;
private ConstraintOperator operator; private ConstraintOperator operator;
public MysqlConstraint(String fieldName, ConstraintOperator operator, String value) { public MysqlConstraint(String fieldName, ConstraintOperator operator, String value) {
this.fieldName = fieldName; this.fieldName = fieldName;
this.operator = operator; this.operator = operator;

View File

@@ -1,5 +1,7 @@
package com.redstoner.misc.mysql.elements; package com.redstoner.misc.mysql.elements;
import com.redstoner.misc.mysql.MysqlQueryHandler;
import java.sql.Connection; import java.sql.Connection;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.ResultSet; import java.sql.ResultSet;
@@ -7,15 +9,55 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.redstoner.misc.mysql.MysqlQueryHandler;
public class MysqlDatabase { public class MysqlDatabase {
private Connection connection; private Connection connection;
public MysqlDatabase(Connection connection) { public MysqlDatabase(Connection connection) {
this.connection = connection; this.connection = connection;
} }
public MysqlTable getTable(String name) {
return new MysqlTable(this, name);
}
public boolean createTable(String name, MysqlField... description) {
return MysqlQueryHandler.queryNoResult(connection, "CREATE TABLE `" + name + "` " + getDescription(description) + ";");
}
private String getDescription(MysqlField... description) {
String desc = "(";
for (int i = 0; i < description.length; i++) {
String nil = "";
if (description[i].canBeNull()) {
nil = " NOT NULL";
}
desc += "`" + description[i].getName() + "` " + description[i].getType().getName() + nil;
if (i < description.length - 1) {
desc += ",";
}
}
desc += ")";
return desc;
}
public boolean createTableIfNotExists(String name, MysqlField... description) {
return MysqlQueryHandler.queryNoResult(connection, "CREATE TABLE IF NOT EXISTS `" + name + "` " + getDescription(description) + ";");
}
public boolean dropTable(String name) {
return MysqlQueryHandler.queryNoResult(connection, "DROP TABLE `" + name + "`;");
}
public boolean drop() {
return MysqlQueryHandler.queryNoResult(connection, "DROP DATABASE `" + getName() + "`;");
}
public String getName() { public String getName() {
try { try {
return connection.getCatalog(); return connection.getCatalog();
@@ -24,67 +66,25 @@ public class MysqlDatabase {
return null; return null;
} }
} }
public MysqlTable getTable(String name) {
return new MysqlTable(this, name);
}
public boolean createTable(String name, MysqlField... description) {
return MysqlQueryHandler.queryNoResult(connection, "CREATE TABLE `" + name + "` " + getDescription(description) + ";");
}
public boolean createTableIfNotExists(String name, MysqlField... description) {
return MysqlQueryHandler.queryNoResult(connection, "CREATE TABLE IF NOT EXISTS `" + name + "` " + getDescription(description) + ";");
}
public boolean dropTable(String name) {
return MysqlQueryHandler.queryNoResult(connection, "DROP TABLE `" + name + "`;");
}
public boolean drop() {
return MysqlQueryHandler.queryNoResult(connection, "DROP DATABASE `" + getName() + "`;");
}
public List<MysqlTable> getTables() { public List<MysqlTable> getTables() {
try { try {
List<MysqlTable> tables = new ArrayList<>(); List<MysqlTable> tables = new ArrayList<>();
DatabaseMetaData metadata = connection.getMetaData(); DatabaseMetaData metadata = connection.getMetaData();
ResultSet queryResults = metadata.getTables(null, null, "%", null); ResultSet queryResults = metadata.getTables(null, null, "%", null);
while (queryResults.next()) { while (queryResults.next()) {
tables.add(new MysqlTable(this, queryResults.getString(3))); tables.add(new MysqlTable(this, queryResults.getString(3)));
} }
return tables; return tables;
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
protected Connection getConnection() { protected Connection getConnection() {
return connection; return connection;
} }
private String getDescription(MysqlField... description) {
String desc = "(";
for (int i = 0; i < description.length; i++) {
String nil = "";
if (description[i].canBeNull()) {
nil = " NOT NULL";
}
desc += "`" + description[i].getName() + "` " + description[i].getType().getName() + nil;
if (i < description.length - 1) {
desc += ",";
}
}
desc += ")";
return desc;
}
} }

View File

@@ -3,30 +3,30 @@ package com.redstoner.misc.mysql.elements;
import com.redstoner.misc.mysql.types.MysqlType; import com.redstoner.misc.mysql.types.MysqlType;
public class MysqlField { public class MysqlField {
private String name; private String name;
private MysqlType type; private MysqlType type;
private boolean canBeNull; private boolean canBeNull;
public MysqlField(String name, MysqlType type, boolean canBeNull) { public MysqlField(String name, MysqlType type, boolean canBeNull) {
this.name = name; this.name = name;
this.type = type; this.type = type;
this.canBeNull = canBeNull; this.canBeNull = canBeNull;
} }
public MysqlField(String name, String type, boolean canBeNull) { public MysqlField(String name, String type, boolean canBeNull) {
this.name = name; this.name = name;
this.type = MysqlType.getTypeFromString(type); this.type = MysqlType.getTypeFromString(type);
this.canBeNull = canBeNull; this.canBeNull = canBeNull;
} }
public String getName() { public String getName() {
return name; return name;
} }
public MysqlType getType() { public MysqlType getType() {
return type; return type;
} }
public boolean canBeNull() { public boolean canBeNull() {
return canBeNull; return canBeNull;
} }

View File

@@ -5,11 +5,11 @@ import java.sql.SQLException;
public class MysqlResult { public class MysqlResult {
private ResultSet results; private ResultSet results;
public MysqlResult(ResultSet results) { public MysqlResult(ResultSet results) {
this.results = results; this.results = results;
} }
public Object getObject(int columnIndex, Class<?> type) throws SQLException { public Object getObject(int columnIndex, Class<?> type) throws SQLException {
return results.getObject(columnIndex, type); return results.getObject(columnIndex, type);
} }

View File

@@ -1,133 +1,113 @@
package com.redstoner.misc.mysql.elements; package com.redstoner.misc.mysql.elements;
import com.redstoner.misc.mysql.MysqlQueryHandler;
import java.sql.DatabaseMetaData; import java.sql.DatabaseMetaData;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.redstoner.misc.mysql.MysqlQueryHandler; public class MysqlTable {
public class MysqlTable
{
private MysqlDatabase database; private MysqlDatabase database;
private String name; private String name;
public MysqlTable(MysqlDatabase database, String name) public MysqlTable(MysqlDatabase database, String name) {
{
this.database = database; this.database = database;
this.name = name; this.name = name;
} }
public String getName() public String getName() {
{
return this.name; return this.name;
} }
public MysqlField[] describe() public boolean insert(String... values) {
{ MysqlField[] description = describe();
try if (values.length > 0 && values.length == description.length) {
{ String val = "(\"" + String.join("\",\"", values) + "\")";
List<MysqlField> description = new ArrayList<>(); return MysqlQueryHandler.queryNoResult(
DatabaseMetaData metadata = database.getConnection().getMetaData(); database.getConnection(),
ResultSet queryResults = metadata.getColumns(null, null, name, null); "INSERT INTO `" + name + "` VALUES " + val + ";"
while (queryResults.next()) );
{ } else {
description.add(new MysqlField(queryResults.getString(4), return false;
}
}
public MysqlField[] describe() {
try {
List<MysqlField> description = new ArrayList<>();
DatabaseMetaData metadata = database.getConnection().getMetaData();
ResultSet queryResults = metadata.getColumns(null, null, name, null);
while (queryResults.next()) {
description.add(new MysqlField(
queryResults.getString(4),
queryResults.getString(6).split(" ")[0] + "(" + queryResults.getString(7) + ")", queryResults.getString(6).split(" ")[0] + "(" + queryResults.getString(7) + ")",
queryResults.getBoolean(11))); queryResults.getBoolean(11)
));
} }
return description.toArray(new MysqlField[0]); return description.toArray(new MysqlField[0]);
} } catch (SQLException e) {
catch (SQLException e)
{
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
public boolean insert(String... values) public Object[] get(String fieldName, MysqlConstraint... constraints) {
{ ResultSet results = MysqlQueryHandler.queryResult(
MysqlField[] description = describe(); database.getConnection(),
if (values.length > 0 && values.length == description.length) "SELECT " + fieldName + " FROM `" + name + "`" + getConstraints(constraints) + ";"
{ );
String val = "(\"" + String.join("\",\"", values) + "\")";
return MysqlQueryHandler.queryNoResult(database.getConnection(),
"INSERT INTO `" + name + "` VALUES " + val + ";");
}
else
{
return false;
}
}
public Object[] get(String fieldName, MysqlConstraint... constraints)
{
ResultSet results = MysqlQueryHandler.queryResult(database.getConnection(),
"SELECT " + fieldName + " FROM `" + name + "`" + getConstraints(constraints) + ";");
List<Object> resObj = new ArrayList<>(); List<Object> resObj = new ArrayList<>();
try try {
{ while (results.next()) {
while (results.next())
{
resObj.add(results.getObject(1)); resObj.add(results.getObject(1));
} }
} } catch (SQLException e) {
catch (SQLException e)
{
e.printStackTrace(); e.printStackTrace();
return new Object[0]; return new Object[0];
} }
return resObj.toArray(new Object[0]); return resObj.toArray(new Object[0]);
} }
public Object[] get(String statement) private String getConstraints(MysqlConstraint... constraints) {
{
ResultSet results = MysqlQueryHandler.queryResult(database.getConnection(), statement);
List<Object> resObj = new ArrayList<>();
try
{
while (results.next())
{
resObj.add(results.getObject(1));
}
}
catch (SQLException e)
{
e.printStackTrace();
return new Object[0];
}
return resObj.toArray(new Object[0]);
}
public boolean delete(MysqlConstraint... constraints)
{
return MysqlQueryHandler.queryNoResult(database.getConnection(),
"DELETE FROM `" + name + "`" + getConstraints(constraints) + ";");
}
public boolean drop()
{
return MysqlQueryHandler.queryNoResult(database.getConnection(), "DROP TABLE `" + name + "`;");
}
private String getConstraints(MysqlConstraint... constraints)
{
String cons = ""; String cons = "";
if (constraints.length > 0) if (constraints.length > 0) {
{
cons += " WHERE "; cons += " WHERE ";
for (int i = 0; i < constraints.length; i++) for (int i = 0; i < constraints.length; i++) {
{
MysqlConstraint constraint = constraints[i]; MysqlConstraint constraint = constraints[i];
cons += constraint.getFieldName() + constraint.getOperator().toString() + "\"" + constraint.getValue() cons += constraint.getFieldName() + constraint.getOperator().toString() + "\"" + constraint.getValue()
+ "\""; + "\"";
if (i < constraints.length - 1) if (i < constraints.length - 1) {
{
cons += " AND "; cons += " AND ";
} }
} }
} }
return cons; return cons;
} }
public Object[] get(String statement) {
ResultSet results = MysqlQueryHandler.queryResult(database.getConnection(), statement);
List<Object> resObj = new ArrayList<>();
try {
while (results.next()) {
resObj.add(results.getObject(1));
}
} catch (SQLException e) {
e.printStackTrace();
return new Object[0];
}
return resObj.toArray(new Object[0]);
}
public boolean delete(MysqlConstraint... constraints) {
return MysqlQueryHandler.queryNoResult(
database.getConnection(),
"DELETE FROM `" + name + "`" + getConstraints(constraints) + ";"
);
}
public boolean drop() {
return MysqlQueryHandler.queryNoResult(database.getConnection(), "DROP TABLE `" + name + "`;");
}
} }

View File

@@ -1,45 +1,21 @@
package com.redstoner.misc.mysql.types; package com.redstoner.misc.mysql.types;
import com.redstoner.misc.mysql.types.date.Date; import com.redstoner.misc.mysql.types.date.*;
import com.redstoner.misc.mysql.types.date.DateTime;
import com.redstoner.misc.mysql.types.date.Time;
import com.redstoner.misc.mysql.types.date.TimeStamp;
import com.redstoner.misc.mysql.types.date.Year;
import com.redstoner.misc.mysql.types.number.BigInt;
import com.redstoner.misc.mysql.types.number.Decimal;
import com.redstoner.misc.mysql.types.number.Double; import com.redstoner.misc.mysql.types.number.Double;
import com.redstoner.misc.mysql.types.number.Float; import com.redstoner.misc.mysql.types.number.Float;
import com.redstoner.misc.mysql.types.number.Int; import com.redstoner.misc.mysql.types.number.*;
import com.redstoner.misc.mysql.types.number.MediumInt;
import com.redstoner.misc.mysql.types.number.SmallInt;
import com.redstoner.misc.mysql.types.number.TinyInt;
import com.redstoner.misc.mysql.types.text.Blob;
import com.redstoner.misc.mysql.types.text.Char;
import com.redstoner.misc.mysql.types.text.Enum; import com.redstoner.misc.mysql.types.text.Enum;
import com.redstoner.misc.mysql.types.text.LongBlob; import com.redstoner.misc.mysql.types.text.*;
import com.redstoner.misc.mysql.types.text.LongText;
import com.redstoner.misc.mysql.types.text.MediumBlob;
import com.redstoner.misc.mysql.types.text.MediumText;
import com.redstoner.misc.mysql.types.text.Set;
import com.redstoner.misc.mysql.types.text.Text;
import com.redstoner.misc.mysql.types.text.TinyText;
import com.redstoner.misc.mysql.types.text.VarChar;
public abstract class MysqlType public abstract class MysqlType {
{ public static MysqlType getTypeFromString(String type) {
public abstract String getName();
public static MysqlType getTypeFromString(String type)
{
String[] splitType = type.split("\\("); String[] splitType = type.split("\\(");
String toSwitch = splitType[0].toUpperCase(); String toSwitch = splitType[0].toUpperCase();
String value = ""; String value = "";
if (type.contains("(") && type.endsWith(")")) if (type.contains("(") && type.endsWith(")")) {
{
value = splitType[1].substring(0, splitType[1].length() - 1); value = splitType[1].substring(0, splitType[1].length() - 1);
} }
switch (toSwitch) switch (toSwitch) {
{
case "CHAR": case "CHAR":
return new Char(Integer.valueOf(value)); return new Char(Integer.valueOf(value));
case "ENUM": case "ENUM":
@@ -93,4 +69,6 @@ public abstract class MysqlType
} }
return null; return null;
} }
public abstract String getName();
} }

View File

@@ -4,11 +4,11 @@ import com.redstoner.misc.mysql.types.MysqlType;
public class Int extends MysqlType { public class Int extends MysqlType {
private int maxSize; private int maxSize;
public Int(int maxSize) { public Int(int maxSize) {
this.maxSize = maxSize; this.maxSize = maxSize;
} }
@Override @Override
public String getName() { public String getName() {
return "INT(" + maxSize + ")"; return "INT(" + maxSize + ")";

View File

@@ -4,11 +4,11 @@ import com.redstoner.misc.mysql.types.MysqlType;
public class Char extends MysqlType { public class Char extends MysqlType {
private int size; private int size;
public Char(int size) { public Char(int size) {
this.size = size; this.size = size;
} }
@Override @Override
public String getName() { public String getName() {
return "CHAR(" + size + ")"; return "CHAR(" + size + ")";

View File

@@ -4,24 +4,24 @@ import com.redstoner.misc.mysql.types.MysqlType;
public class Enum extends MysqlType { public class Enum extends MysqlType {
private String[] possibleValues; private String[] possibleValues;
public Enum(String... possibleValues) { public Enum(String... possibleValues) {
this.possibleValues = possibleValues; this.possibleValues = possibleValues;
} }
@Override @Override
public String getName() { public String getName() {
String name = "ENUM("; String name = "ENUM(";
for (int i = 0; i < possibleValues.length; i++) { for (int i = 0; i < possibleValues.length; i++) {
name += "'" + possibleValues[i] + "'"; name += "'" + possibleValues[i] + "'";
if (i != possibleValues.length - 1) { if (i != possibleValues.length - 1) {
name += ","; name += ",";
} }
} }
return name + ")"; return name + ")";
} }
} }

View File

@@ -4,24 +4,24 @@ import com.redstoner.misc.mysql.types.MysqlType;
public class Set extends MysqlType { public class Set extends MysqlType {
private String[] possibleValues; private String[] possibleValues;
public Set(String... possibleValues) { public Set(String... possibleValues) {
this.possibleValues = possibleValues; this.possibleValues = possibleValues;
} }
@Override @Override
public String getName() { public String getName() {
String name = "SET("; String name = "SET(";
for (int i = 0; i < possibleValues.length; i++) { for (int i = 0; i < possibleValues.length; i++) {
name += "'" + possibleValues[i] + "'"; name += "'" + possibleValues[i] + "'";
if (i != possibleValues.length - 1) { if (i != possibleValues.length - 1) {
name += ","; name += ",";
} }
} }
return name + ")"; return name + ")";
} }
} }

View File

@@ -4,11 +4,11 @@ import com.redstoner.misc.mysql.types.MysqlType;
public class VarChar extends MysqlType { public class VarChar extends MysqlType {
private int maxSize; private int maxSize;
public VarChar(int maxSize) { public VarChar(int maxSize) {
this.maxSize = maxSize; this.maxSize = maxSize;
} }
@Override @Override
public String getName() { public String getName() {
return "VARCHAR(" + maxSize + ")"; return "VARCHAR(" + maxSize + ")";

View File

@@ -2,23 +2,22 @@ package com.redstoner.modules;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
/** This class shall be used for "CoreModules", which are acting on a lower level than modules and are also exempted from being disabled or reloaded on the go.</br> /**
* This class shall be used for "CoreModules", which are acting on a lower level than modules and are also exempted from being disabled or reloaded on the go.</br>
* Please note that CoreModules will not be known to the ModuleLoader itself!</br> * Please note that CoreModules will not be known to the ModuleLoader itself!</br>
* Examples are the ModuleLoader and the Debugger. * Examples are the ModuleLoader and the Debugger.
* *
* @author Pepich */ * @author Pepich
@Version(major = 2, minor = 0, revision = 0, compatible = -1) */
public interface CoreModule extends Module @Version (major = 2, minor = 0, revision = 0, compatible = -1)
{ public interface CoreModule extends Module {
/** Core modules don't need to be enabled. */ /** Core modules don't need to be enabled. */
@Override @Override
public default boolean onEnable() public default boolean onEnable() {
{
return true; return true;
} }
/** Core modules don't need to be disabled. */ /** Core modules don't need to be disabled. */
@Override @Override
public default void onDisable() public default void onDisable() {}
{}
} }

View File

@@ -3,52 +3,51 @@ package com.redstoner.modules;
import com.redstoner.annotations.Version; import com.redstoner.annotations.Version;
import com.redstoner.coremods.moduleLoader.ModuleLoader; import com.redstoner.coremods.moduleLoader.ModuleLoader;
/** Interface for the Module class. Modules must always have an empty constructor to be invoked by the ModuleLoader. /**
* * Interface for the Module class. Modules must always have an empty constructor to be invoked by the ModuleLoader.
* @author Pepich */ *
@Version(major = 4, minor = 0, revision = 0, compatible = 0) * @author Pepich
public interface Module */
{ @Version (major = 4, minor = 0, revision = 0, compatible = 0)
public interface Module {
/** Will be called when the module gets enabled. */ /** Will be called when the module gets enabled. */
public default boolean onEnable() public default boolean onEnable() {
{
return true; return true;
} }
/** This methods gets called after all modules were enabled, please use this method to register commands and similar. <br/> /**
* It will only get called if and only if the module was successfully enabled. */ * This methods gets called after all modules were enabled, please use this method to register commands and similar. <br/>
public default void postEnable() * It will only get called if and only if the module was successfully enabled.
{} */
public default void postEnable() {}
/** Will be called when the module gets disabled. */ /** Will be called when the module gets disabled. */
public default void onDisable() public default void onDisable() {}
{}
/**
/** Gets called on registration of the module, when this option is selected for command registration * Gets called on registration of the module, when this option is selected for command registration
* *
* @return The String used for the CommandManager to register the commands. */ * @return The String used for the CommandManager to register the commands.
public default String getCommandString() */
{ public default String getCommandString() {
return null; return null;
} }
public default ModuleLogger getLogger()
{
return ModuleLoader.getModuleLogger(this);
}
/** This method gets run the very first time a module gets loaded. You can use this to set up file structures or background data. */ /** This method gets run the very first time a module gets loaded. You can use this to set up file structures or background data. */
public default void firstLoad() public default void firstLoad() {}
{}
/**
/** This method gets run every time a module gets loaded and its version has changed. * This method gets run every time a module gets loaded and its version has changed.
* *
* @param old The version of the previous module. */ * @param old The version of the previous module.
public default void migrate(Version old) */
{} public default void migrate(Version old) {}
default void setPrefix(final String name) default void setPrefix(final String name) {
{
getLogger().setName(name); getLogger().setName(name);
} }
public default ModuleLogger getLogger() {
return ModuleLoader.getModuleLogger(this);
}
} }

View File

@@ -1,77 +1,63 @@
package com.redstoner.modules; package com.redstoner.modules;
import com.redstoner.annotations.Version;
import net.nemez.chatapi.ChatAPI;
import net.nemez.chatapi.click.Message;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import com.redstoner.annotations.Version; @Version (major = 4, minor = 0, revision = 0, compatible = -1)
public class ModuleLogger {
import net.nemez.chatapi.ChatAPI; public static final String PREFIX_WARN = "§8[§eWARN§8]:§7 ";
import net.nemez.chatapi.click.Message;
@Version(major = 4, minor = 0, revision = 0, compatible = -1)
public class ModuleLogger
{
public static final String PREFIX_WARN = "§8[§eWARN§8]:§7 ";
public static final String PREFIX_ERROR = "§8[§cERROR§8]:§7 "; public static final String PREFIX_ERROR = "§8[§cERROR§8]:§7 ";
public static final String PREFIX_INFO = "§8[§fINFO§8]:§7 "; public static final String PREFIX_INFO = "§8[§fINFO§8]:§7 ";
private String name; private String name;
public ModuleLogger(final String name) public ModuleLogger(final String name) {
{
this.name = name; this.name = name;
} }
public void info(final String message) public void info(final String message) {
{
Bukkit.getConsoleSender().sendMessage(PREFIX_INFO + getPrefix() + ChatAPI.colorify(null, message)); Bukkit.getConsoleSender().sendMessage(PREFIX_INFO + getPrefix() + ChatAPI.colorify(null, message));
} }
public void warn(final String message) public String getPrefix() {
{ return getPrefix(false);
}
public String getPrefix(final boolean error) {
return "§8[§" + (error ? 'c' : '2') + name + "§8]§7 ";
}
public void warn(final String message) {
Bukkit.getConsoleSender().sendMessage(PREFIX_WARN + getPrefix() + ChatAPI.colorify(null, message)); Bukkit.getConsoleSender().sendMessage(PREFIX_WARN + getPrefix() + ChatAPI.colorify(null, message));
} }
public void error(final String message) public void error(final String message) {
{
Bukkit.getConsoleSender().sendMessage(PREFIX_ERROR + getPrefix() + ChatAPI.colorify(null, message)); Bukkit.getConsoleSender().sendMessage(PREFIX_ERROR + getPrefix() + ChatAPI.colorify(null, message));
} }
public void message(final CommandSender recipient, final String... message) public void message(final CommandSender recipient, final String... message) {
{
message(recipient, false, message); message(recipient, false, message);
} }
public void message(final CommandSender recipient, final boolean error, final String... message) public void message(final CommandSender recipient, final boolean error, final String... message) {
{
Message m = new Message(recipient, null); Message m = new Message(recipient, null);
if (message.length == 1) if (message.length == 1)
m.appendText(getPrefix(error) + message[0]); m.appendText(getPrefix(error) + message[0]);
else else {
{
m.appendText(getHeader()); m.appendText(getHeader());
m.appendText("&7" + String.join("\n&7", message)); m.appendText("&7" + String.join("\n&7", message));
} }
m.send(); m.send();
} }
public String getPrefix() public String getHeader() {
{
return getPrefix(false);
}
public String getPrefix(final boolean error)
{
return "§8[§" + (error ? 'c' : '2') + name + "§8]§7 ";
}
public String getHeader()
{
return "§2--=[ " + name + " ]=--\n"; return "§2--=[ " + name + " ]=--\n";
} }
protected final void setName(final String name) protected final void setName(final String name) {
{
this.name = name; this.name = name;
} }
} }