From e09ae6cc18f18a46541613522abf52c79e3739ca Mon Sep 17 00:00:00 2001 From: kento2 Date: Sat, 18 Apr 2026 12:52:34 +0200 Subject: [PATCH] . + improve build system --- README.md | 2 +- build.gradle.kts | 65 +++++++++++++++++++ kencommandapi-bukkit/build.gradle.kts | 50 +------------- .../kencommandapi/BukkitKenCommandApi.java | 7 ++ .../type/OfflinePlayerArgumentType.java | 8 +-- .../type/PlayerArgumentType.java | 3 +- kencommandapi-core/build.gradle.kts | 47 -------------- .../java/de/kentoj/kencommandapi/Main.java | 6 ++ .../api/processing/CommandException.java | 15 +++++ .../impl/AbstractKenCommandApi.java | 21 ++++-- 10 files changed, 117 insertions(+), 107 deletions(-) create mode 100644 build.gradle.kts delete mode 100644 kencommandapi-core/build.gradle.kts create mode 100644 kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/processing/CommandException.java diff --git a/README.md b/README.md index 149f1e0..d069ae1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -As of v2.0.2, a command for getting/setting coins of a player could look like this: +As of v2.2.0, a command for getting/setting coins of a player could look like this: ```java public class CoinsCommand { diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..db5cff7 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,65 @@ +val scrowToken = providers.gradleProperty("scrowMavenToken") + .orElse(providers.environmentVariable("SCROW_MAVEN_TOKEN")).get() + +plugins { + id("java") + id("io.freefair.lombok") version "9.2.0" apply false +} + +group = "de.kentoj.scrow" +version = "0.2" + +fun RepositoryHandler.scrowRepo() = maven { + name = "scrow" + url = uri("http://forge.kentoj.de/api/packages/scrow/maven") + isAllowInsecureProtocol = true + credentials(HttpHeaderCredentials::class) { + name = "Authorization" + value = "token $scrowToken" + } + authentication { + create("header") + } +} + +subprojects { + apply(plugin = "java") + apply(plugin = "maven-publish") + apply(plugin = "io.freefair.lombok") + + java { + withSourcesJar() + withJavadocJar() + } + + tasks.withType().configureEach { + (options as StandardJavadocDocletOptions).addStringOption("Xdoclint:all,-missing", "-quiet") + } + + repositories { + mavenCentral() + maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") { + name = "spigotmc-repo" + } + scrowRepo() + } + + dependencies { + // https://mvnrepository.com/artifact/org.jetbrains/annotations + implementation("org.jetbrains:annotations:26.0.2-1") + } + + extensions.configure { + publications { + create("KenCommandAPI") { + groupId = rootProject.group.toString() + version = rootProject.version.toString() + artifactId = project.name + from(components["java"]) + } + } + repositories { + scrowRepo() + } + } +} diff --git a/kencommandapi-bukkit/build.gradle.kts b/kencommandapi-bukkit/build.gradle.kts index 39f3d29..01f582f 100644 --- a/kencommandapi-bukkit/build.gradle.kts +++ b/kencommandapi-bukkit/build.gradle.kts @@ -4,56 +4,12 @@ val scrowToken = providers.gradleProperty("scrowMavenToken") plugins { id("java") id("java-library") - id("maven-publish") - id("io.freefair.lombok") version "9.2.0" } group = "de.kentoj" -version = "2.0.2" - -fun scrowRepo(handler: RepositoryHandler) = handler.maven { - name = "scrow" - url = uri("http://forge.kentoj.de/api/packages/scrow/maven") - isAllowInsecureProtocol = true - - credentials(HttpHeaderCredentials::class) { - name = "Authorization" - value = "token $scrowToken" - } - - authentication { - create("header") - } -} - -repositories { - mavenCentral() - maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") { - name = "spigotmc-repo" - } - scrowRepo(this) -} +version = "2.2.0" dependencies { -// https://mvnrepository.com/artifact/org.jetbrains/annotations - implementation("org.jetbrains:annotations:26.0.2-1") - - api("de.kentoj:kencommandapi-core:2.0.2") - - api("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") - implementation("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") -} - -publishing { - publications { - create("KenCommandAPIBukkit") { - groupId = project.group.toString() - artifactId = "kencommandapi-bukkit" - version = project.version.toString() - from(components["java"]) - } - } - repositories { - scrowRepo(this) - } + api(project(":kencommandapi-core")) + compileOnly("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT") } diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java index cf12ffa..f7415b5 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java @@ -1,5 +1,6 @@ package de.kentoj.kencommandapi; +import de.kentoj.kencommandapi.api.processing.CommandException; import de.kentoj.kencommandapi.api.processing.ParsedArgument; import de.kentoj.kencommandapi.api.structure.node.CommandNode; import de.kentoj.kencommandapi.impl.AbstractKenCommandApi; @@ -20,6 +21,12 @@ public class BukkitKenCommandApi extends AbstractKenCommandApi rootNode) { try { Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java index a3176e0..240f1bd 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java @@ -1,7 +1,7 @@ package de.kentoj.kencommandapi.type; import de.kentoj.kencommandapi.BukkitCommandContext; -import de.kentoj.kencommandapi.api.processing.CommandContext; +import de.kentoj.kencommandapi.api.processing.CommandException; import de.kentoj.kencommandapi.api.structure.argument.ArgumentType; import de.kentoj.kencommandapi.api.structure.argument.SuggestionProvider; import lombok.AccessLevel; @@ -22,15 +22,15 @@ public class OfflinePlayerArgumentType implements ArgumentType("KenCommandAPI") { - groupId = project.group.toString() - artifactId = "kencommandapi-core" - version = project.version.toString() - from(components["java"]) - } - } - repositories { - maven { - name = "scrow" - url = uri("http://forge.kentoj.de/api/packages/scrow/maven") - isAllowInsecureProtocol = true - - credentials(HttpHeaderCredentials::class) { - name = "Authorization" - value = "token $scrowToken" - } - - authentication { - create("header") - } - } - } -} \ No newline at end of file diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/Main.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/Main.java index 2e79a5e..7ecc0de 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/Main.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/Main.java @@ -1,5 +1,6 @@ package de.kentoj.kencommandapi; +import de.kentoj.kencommandapi.api.processing.CommandException; import de.kentoj.kencommandapi.api.processing.ParsedArgument; import de.kentoj.kencommandapi.api.structure.argument.types.IntegerArgumentType; import de.kentoj.kencommandapi.impl.AbstractKenCommandApi; @@ -28,6 +29,11 @@ public class Main { public BasicCommandContext createContext(PrintStream sender, Map> parsedArguments) { return new BasicCommandContext(sender, parsedArguments); } + + @Override + public void sendErrorMessage(PrintStream printStream, CommandException ex) { + System.err.println(ex.getMessage()); + } }; var root = api.createNode("coins"); diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/processing/CommandException.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/processing/CommandException.java new file mode 100644 index 0000000..b72a2a2 --- /dev/null +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/processing/CommandException.java @@ -0,0 +1,15 @@ +package de.kentoj.kencommandapi.api.processing; + +public class CommandException extends RuntimeException { + public CommandException(String message) { + super(message); + } + + public CommandException(String message, Throwable cause) { + super(message, cause); + } + + public CommandException(Throwable cause) { + super(cause); + } +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java index 648049f..e8f08b4 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java @@ -2,6 +2,7 @@ package de.kentoj.kencommandapi.impl; import de.kentoj.kencommandapi.api.KenCommandApi; import de.kentoj.kencommandapi.api.processing.CommandContext; +import de.kentoj.kencommandapi.api.processing.CommandException; import de.kentoj.kencommandapi.api.processing.ParsedArgument; import de.kentoj.kencommandapi.api.structure.argument.ArgumentType; import de.kentoj.kencommandapi.api.structure.argument.CommandArgument; @@ -21,6 +22,8 @@ public abstract class AbstractKenCommandApi> i public abstract S createContext(T sender, Map> parsedArguments); + public abstract void sendErrorMessage(T t, CommandException exception); + @Override public CommandNode createNode(String... name) { return new CommandNodeImpl<>(name); @@ -35,16 +38,20 @@ public abstract class AbstractKenCommandApi> i public void invoke(CommandNode node, T sender, String[] args) { var iter = Arrays.stream(args).iterator(); - var executableLiteral = processLiterals(node, iter); - var parsedArguments = parseArguments(executableLiteral, iter); - assert executableLiteral.getExecutor() != null; - executableLiteral.getExecutor().execute(createContext(sender, parsedArguments)); + try { + var executableLiteral = processLiterals(node, iter); + var parsedArguments = parseArguments(executableLiteral, iter); + assert executableLiteral.getExecutor() != null; + executableLiteral.getExecutor().execute(createContext(sender, parsedArguments)); + } catch (CommandException ex) { + sendErrorMessage(sender, ex); + } } private CommandNode processLiterals(CommandNode commandNode, Iterator iter) { if (!iter.hasNext()) { // literals/arguments are optional if the node itself is executable - if (commandNode.getExecutor() == null) throw new RuntimeException("no literal given but required"); + if (commandNode.getExecutor() == null) throw new CommandException("no literal given but required"); return commandNode; } @@ -55,7 +62,7 @@ public abstract class AbstractKenCommandApi> i final var arg = iter.next(); final var literal = commandNode.getLiteral(arg); if (literal == null) { - throw new RuntimeException("Invalid literal: " + arg); + throw new CommandException("Invalid literal: " + arg); } return processLiterals(literal, iter); } @@ -68,7 +75,7 @@ public abstract class AbstractKenCommandApi> i if (!iter.hasNext()) { var defaultValue = arg.getDefaultValue(); - if (defaultValue == null) throw new RuntimeException("no argument given but required"); + if (defaultValue == null) throw new CommandException("no argument given but required"); parsedArguments.put(arg.getId(), new ParsedArgumentImpl<>(defaultValue, arg)); continue; }