diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 883041f..a4d49c8 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -1,8 +1,5 @@ dependencies { - api("com.google.inject", "guice", Versions.GUICE) - - compileOnlyApi("net.kyori", "adventure-api", Versions.ADVENTURE) - compileOnlyApi("net.kyori", "adventure-text-minimessage", Versions.ADVENTURE) - - api("net.kyori", "event-api", Versions.EVENT) -} + api(libs.guice.core) + api(libs.minimessage) + api(libs.event.api) +} \ No newline at end of file diff --git a/api/src/main/java/broccolai/tags/api/model/tag/ConstructedTag.java b/api/src/main/java/broccolai/tags/api/model/tag/ConstructedTag.java index 9ed2728..f23799a 100644 --- a/api/src/main/java/broccolai/tags/api/model/tag/ConstructedTag.java +++ b/api/src/main/java/broccolai/tags/api/model/tag/ConstructedTag.java @@ -3,6 +3,7 @@ import broccolai.tags.api.model.Permissible; import net.kyori.adventure.text.Component; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; public final class ConstructedTag implements Permissible { @@ -11,19 +12,22 @@ public final class ConstructedTag implements Permissible { private final boolean secret; private final @NonNull Component component; private final @NonNull String reason; + private final @Nullable TagDisplayInformation displayInformation; public ConstructedTag( final int id, final @NonNull String name, final boolean secret, final @NonNull Component component, - final @NonNull String reason + final @NonNull String reason, + final @Nullable TagDisplayInformation displayInformation ) { this.id = id; this.name = name; this.secret = secret; this.component = component; this.reason = reason; + this.displayInformation = displayInformation; } public int id() { @@ -51,4 +55,8 @@ public boolean secret() { return "tags.tag." + this.id(); } + public @Nullable TagDisplayInformation displayInformation() { + return this.displayInformation; + } + } diff --git a/api/src/main/java/broccolai/tags/api/model/tag/TagDisplayInformation.java b/api/src/main/java/broccolai/tags/api/model/tag/TagDisplayInformation.java new file mode 100644 index 0000000..be554f6 --- /dev/null +++ b/api/src/main/java/broccolai/tags/api/model/tag/TagDisplayInformation.java @@ -0,0 +1,25 @@ +package broccolai.tags.api.model.tag; + +import org.checkerframework.checker.nullness.qual.NonNull; + +public final class TagDisplayInformation { + private final @NonNull String material; + private final int customModelData; + + public TagDisplayInformation( + @NonNull String material, + int customModelData + ) { + this.material = material; + this.customModelData = customModelData; + } + + public @NonNull String material() { + return this.material; + } + + public int customModelData() { + return this.customModelData; + } + +} diff --git a/api/src/main/java/broccolai/tags/api/service/TagsService.java b/api/src/main/java/broccolai/tags/api/service/TagsService.java index 8d99df7..47c9463 100644 --- a/api/src/main/java/broccolai/tags/api/service/TagsService.java +++ b/api/src/main/java/broccolai/tags/api/service/TagsService.java @@ -2,6 +2,7 @@ import broccolai.tags.api.model.Service; import broccolai.tags.api.model.tag.ConstructedTag; +import broccolai.tags.api.model.tag.TagDisplayInformation; import broccolai.tags.api.model.user.TagsUser; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -18,7 +19,8 @@ void create( @NonNull String name, boolean secret, @NonNull String componentString, - @NonNull String reason + @NonNull String reason, + @Nullable TagDisplayInformation information ); @Nullable ConstructedTag load(int id); diff --git a/build.gradle.kts b/build.gradle.kts index e8d682d..20160c7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,13 +3,15 @@ import net.kyori.indra.IndraCheckstylePlugin import net.kyori.indra.IndraPlugin plugins { - id("net.kyori.indra") version Versions.INDRA - id("net.kyori.indra.publishing") version Versions.INDRA - id("net.kyori.indra.checkstyle") version Versions.INDRA - id("com.github.ben-manes.versions") version "0.44.0" + id("net.kyori.indra") + id("net.kyori.indra.publishing") + id("net.kyori.indra.checkstyle") + id("com.github.johnrengelman.shadow") + id("com.github.ben-manes.versions") + id("net.ltgt.errorprone") } -group = "love.broccolai.tags" +group = "broccolai.tags" version = "2.0.0-SNAPSHOT" subprojects { @@ -23,7 +25,7 @@ subprojects { maven("https://papermc.io/repo/repository/maven-public/") maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") maven("https://jitpack.io") - maven("https://repo.broccol.ai") + maven("https://repo.broccol.ai/releases") } tasks { diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index b1cfad0..bed38d2 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -7,3 +7,6 @@ repositories { gradlePluginPortal() } +dependencies { + implementation("gradle.plugin.com.github.jengelman.gradle.plugins", "shadow", "7.0.0") +} diff --git a/buildSrc/src/main/kotlin/Configurations.kt b/buildSrc/src/main/kotlin/Configurations.kt new file mode 100644 index 0000000..d99fbb7 --- /dev/null +++ b/buildSrc/src/main/kotlin/Configurations.kt @@ -0,0 +1,55 @@ +import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.invoke +import org.gradle.kotlin.dsl.withType + +fun Project.setupShadowJar() { + apply() + + tasks { + withType { + + dependencies { + exclude(dependency("com.google.guava:")) + exclude(dependency("com.google.errorprone:")) + exclude(dependency("org.checkerframework:")) + } + + relocate( + rootProject.group, + "com.github.benmanes.caffeine", + "com.typesafe.config", + "com.zaxxer.hikari", + "com.google.inject", + "org.antlr", + "org.jdbi", + "org.aopalliance", + "org.spongepowered.configurate", + "io.leangen.geantyref", + "cloud.commandframework", + "net.kyori.event", + "net.kyori.coffee", + "org.objectweb.asm", + "org.flyway", + "broccolai.corn" + ) + + archiveFileName.set(project.name + ".jar") + minimize() + } + + getByName("build") { + dependsOn(withType()) + } + } +} + +private fun ShadowJar.relocate(group: Any, vararg dependencies: String) { + dependencies.forEach { + val split = it.split('.') + val name = split.last() + relocate(it, "$group.dependencies.$name") + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt deleted file mode 100644 index 9f791c4..0000000 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ /dev/null @@ -1,21 +0,0 @@ -object Versions { - const val INDRA = "3.0.1" - const val SHADOW = "7.1.2" - - const val GUAVA = "21.0" - const val SPIGOT = "1.19.2-R0.1-SNAPSHOT" - const val PAPI = "2.11.2" - const val VAULT = "1.7.1" - const val GUICE = "5.1.0" - const val JDBI = "3.34.0" - const val HIKARI = "5.0.1" - const val FLYWAY = "9.8.1" - const val CONFIGURATE = "4.1.2" - const val CORN = "2.2.0" - const val ADVENTURE = "4.11.0" - const val ADVENTURE_PLATFORM = "4.1.2" - const val EVENT = "4.0.0-SNAPSHOT" - const val COFFEE = "1.0.0-SNAPSHOT" - const val CLOUD = "1.7.1" - const val LUCKPERMS = "5.4" -} diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 045253f..97ced37 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -1,71 +1,22 @@ -import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.invoke -import org.gradle.kotlin.dsl.withType - plugins { - id("com.github.johnrengelman.shadow") version "7.1.2" - id("xyz.jpenilla.run-paper") version "2.0.0" -} - -apply() - -tasks { - withType { - - dependencies { - exclude(dependency("com.google.guava:")) - exclude(dependency("com.google.errorprone:")) - exclude(dependency("org.checkerframework:")) - } - - relocate( - rootProject.group, - "com.github.benmanes.caffeine", - "com.typesafe.config", - "com.zaxxer.hikari", - "com.google.inject", - "org.antlr", - "org.slf4j", - "org.jdbi", - "org.aopalliance", - "org.spongepowered.configurate", - "io.leangen.geantyref", - "cloud.commandframework", - "net.kyori.event", - "net.kyori.coffee", - "org.objectweb.asm", - "broccolai.corn" - ) - - archiveFileName.set(project.name + ".jar") - } - - getByName("build") { - dependsOn(withType()) - } - - runServer { - minecraftVersion("1.19.2") - } + id("xyz.jpenilla.run-paper") version "2.2.0" } -fun ShadowJar.relocate(group: Any, vararg dependencies: String) { - dependencies.forEach { - val split = it.split('.') - val name = split.last() - relocate(it, "$group.dependencies.$name") - } -} +setupShadowJar() dependencies { api(project(":tags-core")) - compileOnly("io.papermc.paper", "paper-api", Versions.SPIGOT) - compileOnly("me.clip", "placeholderapi", Versions.PAPI) - compileOnly("com.github.MilkBowl", "VaultAPI", Versions.VAULT) + compileOnly(libs.paper.api) + compileOnly(libs.papi) + compileOnly(libs.vault) - api("cloud.commandframework", "cloud-paper", Versions.CLOUD) - api("cloud.commandframework", "cloud-minecraft-extras", Versions.CLOUD) + api(libs.cloud.paper) + api(libs.cloud.extras) } + +tasks { + runServer { + minecraftVersion("1.20") + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java index 954a615..e2f104d 100644 --- a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java +++ b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java @@ -22,7 +22,6 @@ import cloud.commandframework.paper.PaperCommandManager; import com.google.inject.Guice; import com.google.inject.Injector; -import net.kyori.adventure.audience.ForwardingAudience; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -84,22 +83,22 @@ private CommandManager getCommandManager( try { PaperCommandManager commandManager = new PaperCommandManager<>( this, - AsynchronousCommandExecutionCoordinator.newBuilder().build(), + AsynchronousCommandExecutionCoordinator.builder().build(), BukkitTagsPlatform::from, user -> user.cast().sender() ); - if (commandManager.queryCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + if (commandManager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { commandManager.registerAsynchronousCompletions(); } - if (commandManager.queryCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + if (commandManager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { commandManager.registerBrigadier(); } new MinecraftExceptionHandler() .withDefaultHandlers() - .apply(commandManager, ForwardingAudience.Single::audience); + .apply(commandManager, (e) -> e); commandManager.registerExceptionHandler(UserArgument.UserArgumentException.class, (user, ex) -> { user.sendMessage(messageService.commandErrorUserNotFound(ex.input())); @@ -116,12 +115,9 @@ private CommandManager getCommandManager( } private static CommandUser from(final @NonNull CommandSender sender) { - if (sender instanceof ConsoleCommandSender) { - ConsoleCommandSender console = (ConsoleCommandSender) sender; - + if (sender instanceof ConsoleCommandSender console) { return new BukkitConsoleCommandUser(console); - } else if (sender instanceof Player) { - Player player = (Player) sender; + } else if (sender instanceof Player player) { return new BukkitPlayerCommandUser(player); } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 4116669..3723d21 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,24 +1,21 @@ dependencies { api(project(":tags-api")) - compileOnlyApi("com.google.guava", "guava", Versions.GUAVA) - compileOnly("net.luckperms", "api", Versions.LUCKPERMS) + compileOnlyApi(libs.guava) + compileOnly(libs.luckperms) - implementation("com.google.inject.extensions", "guice-assistedinject", Versions.GUICE) { + implementation(libs.guice.assisted) { isTransitive = false } - api("org.jdbi", "jdbi3-core", Versions.JDBI) - implementation("com.zaxxer", "HikariCP", Versions.HIKARI) - implementation("org.flywaydb", "flyway-core", Versions.FLYWAY) + api(libs.jdbi.core) + implementation(libs.hikari) + implementation(libs.flyway) - implementation("org.spongepowered", "configurate-hocon", Versions.CONFIGURATE) + implementation(libs.configurate) - api("broccolai.corn", "corn-core", Versions.CORN) + api(libs.corn.misc) - api("cloud.commandframework", "cloud-core", Versions.CLOUD) - api("net.kyori", "coffee-functional", Versions.COFFEE) - - api("net.kyori", "event-method-asm", Versions.EVENT) - - implementation( "com.h2database", "h2", "2.1.214") -} + api(libs.cloud.core) + api(libs.event.asm) + api(libs.coffee) +} \ No newline at end of file diff --git a/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java b/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java index 9b26229..cd6a076 100644 --- a/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java +++ b/core/src/main/java/broccolai/tags/core/config/TagConfiguration.java @@ -1,5 +1,6 @@ package broccolai.tags.core.config; +import broccolai.tags.api.model.tag.TagDisplayInformation; import org.checkerframework.checker.nullness.qual.NonNull; import org.spongepowered.configurate.objectmapping.ConfigSerializable; import org.spongepowered.configurate.objectmapping.meta.Comment; @@ -29,6 +30,9 @@ public final class TagConfiguration { @Comment("How to obtain this tag, can be null") public String reason = null; + @Setting + public TagDisplayInformation displayInformation = null; + public TagConfiguration() { } diff --git a/core/src/main/java/broccolai/tags/core/service/tags/MappedTagsService.java b/core/src/main/java/broccolai/tags/core/service/tags/MappedTagsService.java index 19f055f..54836cf 100644 --- a/core/src/main/java/broccolai/tags/core/service/tags/MappedTagsService.java +++ b/core/src/main/java/broccolai/tags/core/service/tags/MappedTagsService.java @@ -1,6 +1,7 @@ package broccolai.tags.core.service.tags; import broccolai.tags.api.model.tag.ConstructedTag; +import broccolai.tags.api.model.tag.TagDisplayInformation; import broccolai.tags.api.model.user.TagsUser; import broccolai.tags.api.service.PermissionService; import broccolai.tags.api.service.TagsService; @@ -43,7 +44,7 @@ public MappedTagsService( this.defaultId = mainConfiguration.defaultTag; for (TagConfiguration config : mainConfiguration.tags) { - this.create(config.id, config.name, config.secret, config.component, config.reason); + this.create(config.id, config.name, config.secret, config.component, config.reason, config.displayInformation); } } @@ -58,11 +59,12 @@ public void create( final @NonNull String name, final boolean secret, final @NonNull String componentString, - final @NonNull String reason + final @NonNull String reason, + final @Nullable TagDisplayInformation displayInformation ) { Component component = MINI.deserialize(componentString); - ConstructedTag tag = new ConstructedTag(id, name, secret, component, reason); + ConstructedTag tag = new ConstructedTag(id, name, secret, component, reason, displayInformation); this.idToTags.put(id, tag); this.nameToTags.put(name.toLowerCase(), tag); diff --git a/gradle/libs.versions.conf b/gradle/libs.versions.conf new file mode 100644 index 0000000..b33f8d0 --- /dev/null +++ b/gradle/libs.versions.conf @@ -0,0 +1,132 @@ +metadata = { + format = {version = "1.0"} + polyglot-extensions = [plugins] +} + +plugins = { + "net.kyori.indra" = "3.1.3" + "net.kyori.indra.publishing" = "3.1.3" + "net.kyori.indra.checkstyle" = "3.1.3" + "ca.stellardrift.opinionated" = "5.0.1" + "com.github.ben-manes.versions" = "0.49.0" + "com.github.johnrengelman.shadow" = "8.1.1" + "net.ltgt.errorprone" = "3.1.0" + "xyz.jpenilla.run-paper" = "1.0.6" + "com.adarshr.test-logger" = "3.2.0" +} + +versions = { + # Tooling + checker-qual = "3.22.0" + errorprone = "2.13.1" + + # Testing + truth = "1.1.3" + junit = "5.8.2" + mockito = "4.5.1" + + # Google + guava = "31.1-jre" + gson = "2.9.0" + guice = "7.0.0" + + # Incendo + http4j = "1.3" + cloud = "1.8.4" + + # Kyori + adventure = "4.14.0" + moonshine = "2.0.4" + coffee = "1.0.0-SNAPSHOT" + event = "4.0.0-SNAPSHOT" + + # Storage + jdbi = "3.41.3" + hikari = "5.0.1" + flyway = "9.22.3" + h2 = "2.1.212" + configurate = "4.1.2" + + # Misc + corn = "3.2.0" + slf4j = "1.7.30" + caffeine = "3.1.0" + + # Bukkit + paper-api = "1.19-R0.1-SNAPSHOT" + paper-lib = "1.0.6" + + # Velocity + velocity = "1.1.8" + + # Plugin APIs + papi = "2.11.4" + vault = "1.7.1" + luckperms = "5.4" +} + +dependencies = { + # Tooling + checker-qual = {group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual"} + errorprone = {group = "com.google.errorprone", name = "error_prone_core", version.ref = "errorprone"} + + # Google + guava = {group = "com.google.guava", name = "guava", version.ref = "guava"} + gson = {group = "com.google.code.gson", name = "gson", version.ref = "gson"} + guice-core = {group = "com.google.inject", name = "guice", version.ref = "guice"} + guice-assisted = {group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice"} + + # Incendo + http4j = {group = "com.intellectualsites.http", name = "HTTP4J", version.ref = "http4j"} + cloud-core = {group = "cloud.commandframework", name = "cloud-core", version.ref = "cloud"} + cloud-paper = {group = "cloud.commandframework", name = "cloud-paper", version.ref = "cloud"} + cloud-velocity = {group = "cloud.commandframework", name = "cloud-velocity", version.ref = "cloud"} + cloud-extras = {group = "cloud.commandframework", name = "cloud-minecraft-extras", version.ref = "cloud"} + + # Kyori + adventure-api = {group = "net.kyori", name = "adventure-api", version.ref = "adventure"} + minimessage = {group = "net.kyori", name = "adventure-text-minimessage", version.ref = "adventure"} + moonshine-core = {group = "net.kyori.moonshine", name = "moonshine-core", version.ref = "moonshine"} + moonshine-standard = {group = "net.kyori.moonshine", name = "moonshine-standard", version.ref = "moonshine"} + coffee = {group = "net.kyori", name = "coffee-functional", version.ref = "coffee"} + # todo(josh): move to 5.0.0-SNAPSHOT + event-api = {group = "net.kyori", name = "event-api", version.ref = "event"} + event-asm = {group = "net.kyori", name = "event-method-asm", version.ref = "event"} + + # Storage + jdbi-core = {group = "org.jdbi", name = "jdbi3-core", version.ref = "jdbi"} + jdbi-testing = {group = "org.jdbi", name = "jdbi3-testing", version.ref = "jdbi"} + hikari = {group = "com.zaxxer", name = "HikariCP", version.ref = "hikari"} + flyway = {group = "org.flywaydb", name = "flyway-core", version.ref = "flyway"} + h2 = {group = "com.h2database", name = "h2", version.ref = "h2"} + configurate = {group = "org.spongepowered", name = "configurate-hocon", version.ref = "configurate"} + + # Misc + corn-misc = {group = "broccolai.corn", name = "corn-misc", version.ref = "corn"} + corn-context = {group = "broccolai.corn", name = "corn-context", version.ref = "corn"} + slf4j = {group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j"} + caffeine = {group = "com.github.ben-manes.caffeine", name = "caffeine", version.ref = "caffeine"} + + # Bukkit + paper-api = {group = "io.papermc.paper", name = "paper-api", version.ref = "paper-api"} + paper-lib = {group = "io.papermc", name = "paperlib", version.ref = "paper-lib"} + + # Velocity + velocity = {group = "com.velocitypowered", name = "velocity-api", version.ref = "velocity"} + + # Testing + truth-core = {group = "com.google.truth", name = "truth", version.ref = "truth"} + truth-java-eight = {group = "com.google.truth.extensions", name = "truth-java8-extension", version.ref = "truth"} + junit-api = {group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit"} + junit-engine = {group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit"} + mockito = {group = "org.mockito", name = "mockito-inline", version.ref = "mockito"} + + # Plugin APIs + papi = {group = "me.clip", name = "placeholderapi", version.ref = "papi"} + vault = {group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault"} + luckperms = {group = "net.luckperms", name = "api", version.ref = "luckperms"} +} + +bundles = { + guice = [guice-core, guice-assisted] +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..e411586 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index 9c2f88a..2187230 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,10 +1,9 @@ +plugins { + id("ca.stellardrift.polyglot-version-catalogs") version "6.0.0" +} + rootProject.name = "tags" -//include("api") -//include("core") -// -//project(":api").name = "tags-api" -//project(":core").name = "tags-core" use("api", "core", "bukkit") @@ -13,4 +12,4 @@ fun use(vararg names: String) { include(name) project(":$name").name = "${rootProject.name}-$name" } -} +} \ No newline at end of file