diff --git a/.factorypath b/.factorypath new file mode 100644 index 0000000..610dea5 --- /dev/null +++ b/.factorypath @@ -0,0 +1,2 @@ + + diff --git a/.gitignore b/.gitignore index 1917a1a..84dff78 100644 --- a/.gitignore +++ b/.gitignore @@ -224,3 +224,4 @@ TheButtonAutoFlair/out/artifacts/Autoflair/Autoflair.jar *.xml TBMC/ +/.apt_generated/ diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 672496e..edf183d 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,14 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.processAnnotations=enabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/META-INF/services/javax.annotation.processing.Processor b/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 0000000..c52a464 --- /dev/null +++ b/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +buttondevteam.lib.AnnotationProcessor \ No newline at end of file diff --git a/src/main/java/buttondevteam/core/CommandCaller.java b/src/main/java/buttondevteam/core/CommandCaller.java index cb1b050..732f4ce 100644 --- a/src/main/java/buttondevteam/core/CommandCaller.java +++ b/src/main/java/buttondevteam/core/CommandCaller.java @@ -8,6 +8,8 @@ import org.bukkit.command.PluginCommand; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.CommandClass; +import buttondevteam.lib.chat.PlayerCommandBase; import buttondevteam.lib.chat.TBMCChatAPI; import buttondevteam.lib.chat.TBMCCommandBase; @@ -69,11 +71,12 @@ public class CommandCaller implements CommandExecutor { } return true; } - if (cmd.GetModOnly() && !MainPlugin.permission.has(sender, "tbmc.admin")) { + if (cmd.getClass().getAnnotation(CommandClass.class).modOnly() + && !MainPlugin.permission.has(sender, "tbmc.admin")) { sender.sendMessage("§cYou need to be a mod to use this command."); return true; } - if (cmd.GetPlayerOnly() && !(sender instanceof Player)) { + if (cmd instanceof PlayerCommandBase && !(sender instanceof Player)) { sender.sendMessage("§cOnly ingame players can use this command."); return true; } diff --git a/src/main/java/buttondevteam/core/ScheduledRestartCommand.java b/src/main/java/buttondevteam/core/ScheduledRestartCommand.java index 77bc185..82090d2 100644 --- a/src/main/java/buttondevteam/core/ScheduledRestartCommand.java +++ b/src/main/java/buttondevteam/core/ScheduledRestartCommand.java @@ -9,8 +9,10 @@ import org.bukkit.command.CommandSender; import org.bukkit.scheduler.BukkitTask; import buttondevteam.lib.ScheduledServerRestartEvent; +import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; +@CommandClass(modOnly = true, path = "schrestart") public class ScheduledRestartCommand extends TBMCCommandBase { private static volatile int restartcounter; private static volatile BukkitTask restarttask; @@ -66,19 +68,4 @@ public class ScheduledRestartCommand extends TBMCCommandBase { "You can optionally set the amount of ticks to wait before the restart." // }; } - - @Override - public boolean GetPlayerOnly() { - return false; - } - - @Override - public boolean GetModOnly() { - return true; - } - - @Override - public String GetCommandPath() { - return "schrestart"; - } } diff --git a/src/main/java/buttondevteam/core/UpdatePluginCommand.java b/src/main/java/buttondevteam/core/UpdatePluginCommand.java index dab077e..06f5787 100644 --- a/src/main/java/buttondevteam/core/UpdatePluginCommand.java +++ b/src/main/java/buttondevteam/core/UpdatePluginCommand.java @@ -4,8 +4,10 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import buttondevteam.lib.TBMCCoreAPI; +import buttondevteam.lib.chat.CommandClass; import buttondevteam.lib.chat.TBMCCommandBase; +@CommandClass(modOnly = true) public class UpdatePluginCommand extends TBMCCommandBase { @Override public boolean OnCommand(CommandSender sender, String alias, String[] args) { @@ -37,14 +39,4 @@ public class UpdatePluginCommand extends TBMCCommandBase { "To list the plugin names: /" + alias // }; } - - @Override - public boolean GetPlayerOnly() { - return false; - } - - @Override - public boolean GetModOnly() { - return true; - } } diff --git a/src/main/java/buttondevteam/lib/AnnotationProcessor.java b/src/main/java/buttondevteam/lib/AnnotationProcessor.java new file mode 100644 index 0000000..8e763ec --- /dev/null +++ b/src/main/java/buttondevteam/lib/AnnotationProcessor.java @@ -0,0 +1,33 @@ +package buttondevteam.lib; + +import java.util.List; +import java.util.Set; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; + +import buttondevteam.lib.player.ChromaGamerEnforcer; + +/** * A simple session bean type annotation processor. The implementation * is based on the standard annotation processing API in Java 6. */ +@SupportedSourceVersion(SourceVersion.RELEASE_8) +public class AnnotationProcessor extends AbstractProcessor { + /** * Check if both @Stateful and @Stateless are present in an * session bean. If so, emits a warning message. */ + @Override + public boolean process(Set typeElements, RoundEnvironment roundEnv) { // TODO: SEparate JAR + Set elements = roundEnv.getElementsAnnotatedWith(ChromaGamerEnforcer.class); + for (Element element : elements) { + System.out.println("Processing " + element); + List annotationMirrors = element.getAnnotationMirrors(); + System.out.println("Annotations: " + annotationMirrors); + for (AnnotationMirror annotation : annotationMirrors) { + String type = annotation.getAnnotationType().toString(); + System.out.println("Type: " + type); + } + } + return true; // claim the annotations + } +} diff --git a/src/main/java/buttondevteam/lib/chat/CommandClass.java b/src/main/java/buttondevteam/lib/chat/CommandClass.java new file mode 100644 index 0000000..fd5ac9d --- /dev/null +++ b/src/main/java/buttondevteam/lib/chat/CommandClass.java @@ -0,0 +1,29 @@ +package buttondevteam.lib.chat; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Inherited +public @interface CommandClass { + /** + * Determines whether the command can only be used by mods and above or regular players can use it as well. + * + * @return If the command is mod only + */ + public boolean modOnly(); + + /** + * The command's path, or name if top-level command.
+ * For example:
+ * "u admin updateplugin" or "u" for the top level one
+ * The path must be lowercase!
+ * + * @return The command path, which is the command class name by default (removing any "command" from it) + */ + public String path() default ""; +} diff --git a/src/main/java/buttondevteam/lib/chat/Format.java b/src/main/java/buttondevteam/lib/chat/Format.java deleted file mode 100644 index b13d45b..0000000 --- a/src/main/java/buttondevteam/lib/chat/Format.java +++ /dev/null @@ -1,24 +0,0 @@ -package buttondevteam.lib.chat; - -public enum Format implements TellrawSerializableEnum { - Bold("bold"), Underlined("underlined"), Italic("italic"), Strikethrough("strikethrough"), Obfuscated( - "obfuscated"); - // TODO: Add format codes to /u c - private String name; - - Format(String name) { - this.name = name; - this.flag = 1 << this.ordinal(); - } - - @Override - public String getName() { - return name; - } - - private final int flag; - - public int getFlag() { - return flag; - } -} \ No newline at end of file diff --git a/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java b/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java new file mode 100644 index 0000000..66a60b9 --- /dev/null +++ b/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java @@ -0,0 +1,16 @@ +package buttondevteam.lib.chat; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public abstract class PlayerCommandBase extends TBMCCommandBase { + public abstract boolean OnCommand(Player player, String alias, String[] args); + + @Override + public boolean OnCommand(CommandSender sender, String alias, String[] args) { + if (sender instanceof Player) + return OnCommand((Player) sender, alias, args); + sender.sendMessage("§cYou need to be a player to use this command."); + return true; + } +} diff --git a/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java index b6317ee..0babdb8 100644 --- a/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java +++ b/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java @@ -61,9 +61,10 @@ public class TBMCChatAPI { }; for (TBMCCommandBase cmd : TBMCChatAPI.GetCommands().values()) { if (cmd.GetCommandPath().startsWith(command + " ")) { - if (cmd.GetPlayerOnly() && !(sender instanceof Player)) + if (cmd instanceof PlayerCommandBase && !(sender instanceof Player)) continue; - if (cmd.GetModOnly() && !MainPlugin.permission.has(sender, "tbmc.admin")) + if (cmd.getClass().getAnnotation(CommandClass.class).modOnly() + && !MainPlugin.permission.has(sender, "tbmc.admin")) continue; int ind = cmd.GetCommandPath().indexOf(' ', command.length() + 2); if (ind >= 0) { diff --git a/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java b/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java index 111e057..2c0cff4 100644 --- a/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java +++ b/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java @@ -27,24 +27,13 @@ public abstract class TBMCCommandBase { * * @return The command path, which is the command class name by default (removing any "command" from it) */ - public String GetCommandPath() { - return getClass().getSimpleName().toLowerCase().replace("command", ""); + public final String GetCommandPath() { + if (!getClass().isAnnotationPresent(CommandClass.class)) + throw new RuntimeException("No @Command annotation on command class " + getClass().getSimpleName() + "!"); + String path = getClass().getAnnotation(CommandClass.class).path(); + return path.length() == 0 ? getClass().getSimpleName().toLowerCase().replace("command", "") : path; } - /** - * Determines whether the command can only be used as a player, or command blocks or the console can use it as well. - * - * @return If the command is player only - */ - public abstract boolean GetPlayerOnly(); - - /** - * Determines whether the command can only be used by mods or regular players can use it as well. - * - * @return If the command is mod only - */ - public abstract boolean GetModOnly(); - Plugin plugin; // Used By TBMCChatAPI public final Plugin getPlugin() { // Used by CommandCaller (ButtonChat) diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java index 944b676..d22d120 100644 --- a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java +++ b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java @@ -9,6 +9,7 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import buttondevteam.lib.TBMCCoreAPI; +@ChromaGamerEnforcer public abstract class ChromaGamerBase implements AutoCloseable { public static final String TBMC_PLAYERS_DIR = "TBMC/players/"; diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java b/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java new file mode 100644 index 0000000..35ffdf4 --- /dev/null +++ b/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java @@ -0,0 +1,14 @@ +package buttondevteam.lib.player; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.SOURCE) +@Target(ElementType.TYPE) +@Inherited +public @interface ChromaGamerEnforcer { + +}