diff --git a/README.md b/README.md index 14b436b..471b5e7 100644 --- a/README.md +++ b/README.md @@ -1,193 +1,35 @@ [![](https://jitpack.io/v/de.itsTyrion/PluginAnnotationProcessor.svg)](https://jitpack.io/#de.itsTyrion/PluginAnnotationProcessor) # Plugin Annotation Processor -A Bukkit/Spigot or BungeeCord plugin that simplifies the generation of `plugin.yml` file using annotations. +A toolkit that simplifies the generation of Minecraft server plugin meta files using annotations. ## Overview -This tool provides a convenient way to generate the `plugin.yml` file for your Spigot/Paper/BungeeCord/Waterfall plugin. -It utilizes annotations to define essential information directly in your code. +This tool provides a convenient way to generate the `plugin.yml`/`bungee.yml`/`velocity-plugin.json` file for your plugin. +It utilizes annotations to define the required information directly in your code and fill in the version automatically. ## Prerequisites - Java 8 or higher -- Bukkit/Spigot/Paper latest recommended but should work down to 1.7 -- BungeeCord/Waterfall latest - it supports down to MC 1.8 as of 2023 +- Bukkit/Spigot/Paper/Pufferfish/Purpur - latest version recommended but should down to 1.8 and further +- BungeeCord/Waterfall latest - it supports down to MC 1.8 as of 2024 +- Velocity latest (but any 3.x should work) - it supports down to MC 1.8 as of 2024 ## Features -- **Annotation-based Configuration**: Use the `@Plugin` and `@BungeePlugin` annotations to define plugin information directly in your Java/Kotlin code. -- **Cross-Compatibility**: Works with Bukkit, Spigot, Paper, BungeeCord, and Waterfall. +- **Annotation-based Configuration**: Use the `@BukkitPlugin`/`@BungeePlugin`/`@VelocityPlugin` annotations to define plugin information directly in your Java/Kotlin code. +- **Cross-Compatibility**: Works with Bukkit, Spigot, Paper, Pufferfish, Purpur, BungeeCord, Waterfall and Velocity. - **Versioning**: Version number is derived from the Gradle/Maven project version. (Optional) --- ## Usage +Moved to [the wiki](https://github.com/itsTyrion/PluginAnnotationProcessor/wiki) -### Bukkit/Spigot/Paper -(This example does not show all properties) -```java -import org.bukkit.plugin.java.JavaPlugin; - -import de.itsTyrion.pluginAnnotation.Plugin; - -@Plugin( - name = "MyPlugin", - description = "Awesome Bukkit plugin", - authors = {"Your Name"}, - depend = {"aDependency"} -) -public class MyPlugin extends JavaPlugin { - // Your plugin code here -} -``` - -### BungeeCord/Waterfall -```java -import net.md_5.bungee.api.plugin.Plugin; - -import de.itsTyrion.pluginAnnotation.BungeePlugin; - -@Plugin( - name = "MyPlugin", - description = "Awesome Bungee/Waterfall plugin", - author = "Your Name", - depends = {"aDependency"} -) -public class MyBungeePlugin extends Plugin { - // Your plugin code here -} -``` -### Custom version/version format (all platforms): -Set the `version` parameter to either something completely different (why?) or e.g. `"aPrefix-%mcPluginVersion%-aSuffix"` -## Gradle -#### Add the Jitpack repo if you haven't already: -```groovy -repositories { - // Add your other repositories here - maven { url 'https://jitpack.io' } -} -``` ---- -If you want to use the Spigot Library Loader (plugin.yml `libraries` section), create a new dependency config like so: -(The name is up to you, I used `spigotLib` here) -**Keep in mind it can only load from Maven Central!** -```groovy -configurations { - spigotLib - compileOnly { extendsFrom spigotLib } -} -// Change the dependency scope from `implementation`/`compileOnly` to the config name of your choice. Example: -spigotLib 'com.google.inject:guice:7.0.0' // example dependency -``` -Then, pass the list to the compiler/annotation processor according to the sections below. - ---- -#### For Java sources: -```groovy -dependencies { - // Add your other dependencies here - compileOnly 'de.itsTyrion:PluginAnnotationProcessor:1.1' - annotationProcessor 'de.itsTyrion:PluginAnnotationProcessor:1.1' -} - -tasks.withType(JavaCompile).configureEach { - // Add other annotation processor arguments as/if needed or use different values, this is just what I use. - options.compilerArgs += - "-AmcPluginVersion=${"$version".contains("SNAPSHOT") ? (version + new Date().format('yyyyMMdd_HHmm')) : version}" - // This is only needed if you use the Spigot Library Loader. If you use a different name, replace `spigotLib` with it. - options.compilerArgs += - "-AspigotLibraries=${configurations.spigotLib.dependencies.collect { "$it.group:$it.name:$it.version" }.join(' ')}" -} -``` - - -#### For Kotlin sources: -```groovy -plugins { - // Add your other gradle plugins here - id 'org.jetbrains.kotlin.kapt' version 'current.kotlin.version' -} - -dependencies { - // Add your other dependencies here - compileOnly 'de.itsTyrion:PluginAnnotationProcessor:1.1' - kapt 'de.itsTyrion:PluginAnnotationProcessor:1.1' -} - -kapt.arguments { - // Add other annotation processor arguments as/if needed or use different values, this is just what I use. - arg 'mcPluginVersion', version.contains("SNAPSHOT") ? (version + new Date().format('yyyyMMdd_HHmm')) : version - // This is only needed if you use the Spigot Library Loader. If you use a different name, replace `spigotLib` with it. - arg 'spigotLibraries', configurations.spigotLib.dependencies.collect { "$it.group:$it.name:$it.version" }.join(';') -} -``` - -## Maven -Hint: I have no idea how to do the `libraries` part with maven, tips or a PR are welcome. -#### Add the Jitpack repo if you haven't already: -```xml - - jitpack.io - https://jitpack.io - -``` -#### For Java sources: -```xml - - de.itsTyrion - PluginAnnotationProcessor - 1.1 - -``` -```xml - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - 17 - 17 - - - -Aproject.version=${project.version} - - - - - -``` -#### For Kotlin sources (I recommend you use Gradle): -(Copied from [the docs](https://kotlinlang.org/docs/kapt.html#use-in-maven)) -Add an execution of the kapt goal from kotlin-maven-plugin before compile: -```xml - - kapt - - kapt - - - - src/main/kotlin - src/main/java - - - - de.itsTyrion - PluginAnnotationProcessor - 1.1 - - - - -``` ## Contributing Feel free to contribute to the development of this plugin by opening issues or submitting pull requests. ## API Reference Just add it to the plugin's main class -Parameter names match plugin.yml/bungee.yml +Parameter names match plugin.yml/bungee.yml and Velocity's own `@Plugin` annotation ## License This project is licensed under the MIT License. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 566138f..e84600f 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ repositories { } group 'de.itsTyrion' -version '1.3' +version '1.4' dependencies { implementation 'jakarta.annotation:jakarta.annotation-api:2.1.1' diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/PluginAnnotationProcessor.java b/src/main/java/de/itsTyrion/pluginAnnotation/PluginAnnotationProcessor.java index 92f720c..529cfbd 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/PluginAnnotationProcessor.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/PluginAnnotationProcessor.java @@ -1,5 +1,8 @@ package de.itsTyrion.pluginAnnotation; +import de.itsTyrion.pluginAnnotation.bukkit.BukkitPlugin; +import de.itsTyrion.pluginAnnotation.bukkit.CommandInfo; +import de.itsTyrion.pluginAnnotation.bungee.BungeePlugin; import de.itsTyrion.pluginAnnotation.util.Generator; import de.itsTyrion.pluginAnnotation.velocity.VelocityPlugin; import lombok.val; @@ -10,7 +13,6 @@ import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic; import javax.tools.Diagnostic.Kind; import javax.tools.StandardLocation; import java.io.IOException; @@ -19,9 +21,10 @@ @SupportedOptions(value = {"mcPluginVersion", "spigotLibraries"}) @SupportedAnnotationTypes({ - "de.itsTyrion.pluginAnnotation.Plugin", - "de.itsTyrion.pluginAnnotation.BungeePlugin", - "de.itsTyrion.pluginAnnotation.velocity.VelocityPlugin"}) + "de.itsTyrion.pluginAnnotation.bukkit.BukkitPlugin", + "de.itsTyrion.pluginAnnotation.bungee.BungeePlugin", + "de.itsTyrion.pluginAnnotation.velocity.VelocityPlugin" +}) public class PluginAnnotationProcessor extends AbstractProcessor { private String pluginMainClassFound = null; @@ -40,7 +43,7 @@ public boolean process(Set annotations, RoundEnvironment return false; } - for (val element : roundEnv.getElementsAnnotatedWith(Plugin.class)) { + for (val element : roundEnv.getElementsAnnotatedWith(BukkitPlugin.class)) { // fully qualified name, required for plugin.yml `main` property val fqName = ((TypeElement) element).getQualifiedName().toString(); @@ -58,7 +61,7 @@ public boolean process(Set annotations, RoundEnvironment val commandInfos = roundEnv.getElementsAnnotatedWith(CommandInfo.class).stream() .map(element1 -> element1.getAnnotation(CommandInfo.class)).toArray(CommandInfo[]::new); - val pluginAnnotation = element.getAnnotation(Plugin.class); + val pluginAnnotation = element.getAnnotation(BukkitPlugin.class); val content = Generator.pluginYML(pluginAnnotation, fqName, projectVersion, libraries, commandInfos); writeResource("plugin.yml", content, fqName); } @@ -92,7 +95,7 @@ public boolean process(Set annotations, RoundEnvironment val plugin = element.getAnnotation(VelocityPlugin.class); if (!Generator.VELOCITY_ID_PATTERN.matcher(plugin.id()).matches()) { - processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, + processingEnv.getMessager().printMessage(Kind.ERROR, "Invalid ID for plugin " + fqName + ". IDs must start alphabetically," + "have lowercase alphanumeric characters, and can contain dashes or underscores."); return false; diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/Plugin.java b/src/main/java/de/itsTyrion/pluginAnnotation/bukkit/BukkitPlugin.java similarity index 83% rename from src/main/java/de/itsTyrion/pluginAnnotation/Plugin.java rename to src/main/java/de/itsTyrion/pluginAnnotation/bukkit/BukkitPlugin.java index 1aeaa12..f664bb3 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/Plugin.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/bukkit/BukkitPlugin.java @@ -1,10 +1,10 @@ -package de.itsTyrion.pluginAnnotation; +package de.itsTyrion.pluginAnnotation.bukkit; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(ElementType.TYPE) -public @interface Plugin { +public @interface BukkitPlugin { String name(); String[] depend() default {}; String description() default ""; @@ -16,7 +16,6 @@ String[] loadBefore() default {}; String logPrefix() default ""; String[] provides() default {}; - String version() default "%mcPluginVersion%"; LoadAt load() default LoadAt.POSTWORLD; @SuppressWarnings("unused") diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/CommandInfo.java b/src/main/java/de/itsTyrion/pluginAnnotation/bukkit/CommandInfo.java similarity index 83% rename from src/main/java/de/itsTyrion/pluginAnnotation/CommandInfo.java rename to src/main/java/de/itsTyrion/pluginAnnotation/bukkit/CommandInfo.java index bb718d8..b98265c 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/CommandInfo.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/bukkit/CommandInfo.java @@ -1,4 +1,4 @@ -package de.itsTyrion.pluginAnnotation; +package de.itsTyrion.pluginAnnotation.bukkit; public @interface CommandInfo { String name(); diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/BungeePlugin.java b/src/main/java/de/itsTyrion/pluginAnnotation/bungee/BungeePlugin.java similarity index 77% rename from src/main/java/de/itsTyrion/pluginAnnotation/BungeePlugin.java rename to src/main/java/de/itsTyrion/pluginAnnotation/bungee/BungeePlugin.java index 35698b8..8ea17bb 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/BungeePlugin.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/bungee/BungeePlugin.java @@ -1,4 +1,4 @@ -package de.itsTyrion.pluginAnnotation; +package de.itsTyrion.pluginAnnotation.bungee; import java.lang.annotation.ElementType; import java.lang.annotation.Target; @@ -10,5 +10,4 @@ String description() default ""; String author() default ""; String[] softDepends() default {}; - String version() default "%mcPluginVersion%"; } diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/util/Generator.java b/src/main/java/de/itsTyrion/pluginAnnotation/util/Generator.java index 244bb91..64dc3ad 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/util/Generator.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/util/Generator.java @@ -1,9 +1,9 @@ package de.itsTyrion.pluginAnnotation.util; import com.grack.nanojson.JsonWriter; -import de.itsTyrion.pluginAnnotation.BungeePlugin; -import de.itsTyrion.pluginAnnotation.CommandInfo; -import de.itsTyrion.pluginAnnotation.Plugin; +import de.itsTyrion.pluginAnnotation.bungee.BungeePlugin; +import de.itsTyrion.pluginAnnotation.bukkit.CommandInfo; +import de.itsTyrion.pluginAnnotation.bukkit.BukkitPlugin; import de.itsTyrion.pluginAnnotation.velocity.VelocityPlugin; import lombok.val; @@ -16,11 +16,11 @@ public final class Generator { private Generator() {} - public static String pluginYML(Plugin plugin, String fqName, String version, String[] libraries, + public static String pluginYML(BukkitPlugin plugin, String fqName, String version, String[] libraries, CommandInfo[] commands) { val builder = new StringBuilder() .append("name: ").append(plugin.name()).append('\n') - .append("version: ").append(plugin.version().replace("%mcPluginVersion%", version)).append('\n') + .append("version: ").append(version).append('\n') .append("main: ").append(fqName).append('\n') .append("api-version: ").append(plugin.apiVersion()).append('\n') .append("load: ").append(plugin.load().name()).append('\n'); @@ -63,7 +63,7 @@ public static String pluginYML(Plugin plugin, String fqName, String version, Str public static String bungeeYML(BungeePlugin plugin, String fqName, String version) { val builder = new StringBuilder() .append("name: ").append(plugin.name()).append('\n') - .append("version: ").append(plugin.version().replace("%mcPluginVersion%", version)).append('\n') + .append("version: ").append(version).append('\n') .append("main: ").append(fqName).append('\n'); appendIfPresent(builder, "depends", plugin.depends()); diff --git a/src/main/java/de/itsTyrion/pluginAnnotation/velocity/VelocityPlugin.java b/src/main/java/de/itsTyrion/pluginAnnotation/velocity/VelocityPlugin.java index e1176f4..92e02dd 100644 --- a/src/main/java/de/itsTyrion/pluginAnnotation/velocity/VelocityPlugin.java +++ b/src/main/java/de/itsTyrion/pluginAnnotation/velocity/VelocityPlugin.java @@ -8,7 +8,7 @@ package de.itsTyrion.pluginAnnotation.velocity; import java.lang.annotation.ElementType; -import java.lang.annotation.Target; + import java.lang.annotation.Target; @Target(ElementType.TYPE) public @interface VelocityPlugin {