diff --git a/build.gradle.kts b/build.gradle.kts index fe4f6ed..b2c3fa3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -37,6 +37,10 @@ gradlePlugin { id = "net.minecrell.plugin-yml.bungee" implementationClass = "net.minecrell.pluginyml.bungee.BungeePlugin" } + "nukkit" { + id = "net.minecrell.plugin-yml.nukkit" + implementationClass = "net.minecrell.pluginyml.nukkit.NukkitPlugin" + } } } @@ -53,7 +57,7 @@ pluginBundle { website = url vcsUrl = url description = project.description - tags = listOf("bukkit", "bungee") + tags = listOf("bukkit", "bungee", "nukkit") (plugins) { "bukkit" { @@ -64,6 +68,10 @@ pluginBundle { id = "net.minecrell.plugin-yml.bungee" displayName = "plugin-yml (Bungee)" } + "nukkit" { + id = "net.minecrell.plugin-yml.nukkit" + displayName = "plugin-yml (Nukkit)" + } } } diff --git a/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPlugin.kt b/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPlugin.kt new file mode 100644 index 0000000..e69360b --- /dev/null +++ b/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPlugin.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Minecrell + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.minecrell.pluginyml.nukkit + +import net.minecrell.pluginyml.InvalidPluginDescriptionException +import net.minecrell.pluginyml.PlatformPlugin +import org.gradle.api.Project + +class NukkitPlugin : PlatformPlugin("Nukkit", "nukkit.yml") { + override fun createExtension(project: Project) = NukkitPluginDescription(project) + + override fun setDefaults(project: Project, description: NukkitPluginDescription) { + description.name = description.name ?: project.name + description.version = description.version ?: project.version.toString() + description.description = description.description ?: project.description + description.website = description.website ?: project.findProperty("url")?.toString() + description.author = description.author ?: project.findProperty("author")?.toString() + } + + override fun validate(description: NukkitPluginDescription) { + if (description.name == null) { + throw InvalidPluginDescriptionException("Plugin name is not set") + } + + if (description.main == null) { + throw InvalidPluginDescriptionException("Main class is not defined") + } + + if (description.version == null) { + throw InvalidPluginDescriptionException("Plugin version class is not set") + } + + if (description.api == null || description.api!!.isEmpty()) { + throw InvalidPluginDescriptionException("Nukkit API version is not set") + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPluginDescription.kt b/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPluginDescription.kt new file mode 100644 index 0000000..427b100 --- /dev/null +++ b/src/main/kotlin/net/minecrell/pluginyml/nukkit/NukkitPluginDescription.kt @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2017 Minecrell + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.minecrell.pluginyml.nukkit + +import com.fasterxml.jackson.annotation.JsonIgnore +import com.fasterxml.jackson.annotation.JsonProperty +import groovy.lang.Closure +import org.gradle.api.NamedDomainObjectContainer +import org.gradle.api.Project +import java.io.Serializable + +class NukkitPluginDescription(project: Project) : Serializable { + var name: String? = null + var main: String? = null + var version: String? = null + var api: List? = null + var description: String? = null + var load: PluginLoadOrder? = null + var author: String? = null + var authors: List? = null + var website: String? = null + var depend: List? = null + @JsonProperty("softdepend") var softDepend: List? = null + @JsonProperty("loadbefore") var loadBefore: List? = null + var prefix: String? = null + @JsonProperty("default-permission") var defaultPermission: Permission.Default? = null + + // DSL provider for commands and permissions (not serialized) + @Transient @JsonIgnore + val commands: NamedDomainObjectContainer = project.container(NukkitPluginDescription.Command::class.java) + @Transient @JsonIgnore + val permissions: NamedDomainObjectContainer = project.container(NukkitPluginDescription.Permission::class.java) { + Permission(project, it) + } + + // Java/Jackson serialization for commands and permissions + internal val commandMap: Map = commands.asMap + @JsonProperty("commands") get() = field.toMap() // Return copy + internal val permissionMap: Map = permissions.asMap + @JsonProperty("permissions") get() = field.toMap() // Return copy + + // For Groovy DSL + fun commands(closure: Closure) = commands.configure(closure) + fun permissions(closure: Closure) = permissions.configure(closure) + + enum class PluginLoadOrder { + STARTUP, + POSTWORLD + } + + data class Command(@Transient @JsonIgnore val name: String) : Serializable { + var description: String? = null + var aliases: List? = null + var permission: String? = null + @JsonProperty("permission-message") var permissionMessage: String? = null + var usage: String? = null + } + + data class Permission(@Transient @JsonIgnore val project: Project, @Transient @JsonIgnore val name: String) : Serializable { + + var description: String? = null + var default: Default? = null + + // DSL provider for recursive children (not serialized) + @Transient @JsonIgnore + val children: NamedDomainObjectContainer = project.container(NukkitPluginDescription.Permission::class.java) { + Permission(project, it) + } + + // Java/Jackson serialization for commands and permissions + internal val childrenMap: Map = children.asMap + @JsonProperty("children") get() = field.toMap() // Return copy + + // For Groovy DSL + fun children(closure: Closure) = children.configure(closure) + + enum class Default { + @JsonProperty("true") TRUE, + @JsonProperty("false") FALSE, + @JsonProperty("op") OP, + @JsonProperty("!op") NOT_OP + } + } +} +