diff --git a/.gitignore b/.gitignore
index 6742be5..398c0da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,8 @@
.idea
*.iml
-dependency-reduced-pom.xml
-**/target/**
+**/out/**
+**/build/**
+.gradle
pom.xml.versionsBackup
**/spigot/**
!**/archetype-resources/spigot/**
diff --git a/.maven.xml b/.maven.xml
deleted file mode 100644
index 4bd6f9a..0000000
--- a/.maven.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
- ossrh
- ${env.SONATYPE_USERNAME}
- ${env.SONATYPE_PASSWORD}
-
-
-
-
-
- ossrh
-
- true
-
-
- gpg
-
- ${env.GPG_PASSPHRASE}
-
-
-
-
diff --git a/.travis.yml b/.travis.yml
index 0dcd791..c7c692d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,20 +1,30 @@
language: java
jdk: openjdk8
+install: skip
+
before_install:
- - echo $GPG_SECRET_KEYS | base64 --decode | $GPG_EXECUTABLE --import
- - echo $GPG_OWNERTRUST | base64 --decode | $GPG_EXECUTABLE --import-ownertrust
- - export MAVEN_OPTS=-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
-before_deploy:
- - mvn help:evaluate -N -Dexpression=project.version|grep -v '\['
- - export project_version=$(mvn help:evaluate -N -Dexpression=project.version|grep -v '\[')
+ - chmod +x gradlew
+
+before_cache:
+ - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
+ - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
+
+cache:
+ directories:
+ - $HOME/.gradle/caches/
+ - $HOME/.gradle/wrapper/
+
+script:
+ - ./gradlew build --scan -s
+
deploy:
provider: script
- skip_cleanup: true
- ## Build and release to maven central on tagged version
- script: mvn deploy --settings .maven.xml -DskipTests=true -B -U -Prelease
+ cleanup: false
+ script:
+ - ./gradlew bintrayPublish -Dorg.gradle.project.bintray.user=$BINTRAY_USER -Dorg.gradle.project.bintray.key=$BINTRAY_KEY
+ # TODO add in publishing for plugin
+ # - ./ -Dorg.gradle.project.gradle.publish.key=$PLUGIN_PORTAL_API_KEY -Dorg.gradle.project.gradle.publish.secret=$PLUGIN_PORTAL_API_SECRET
on:
tags: true
branch: master
name: $project_version
-install:
- mvn --settings .maven.xml clean install -DskipTests=true -Dgpg.skip -Dmaven.javadoc.skip=true -B -V
diff --git a/README.md b/README.md
index d46be2b..b6fb261 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# mcspring [](https://travis-ci.org/kylepls/mcspring) 
+# mcspring [](https://travis-ci.org/kylepls/mcspring) 
Writing Bukkit plugins is a nightmare. I often lay awake in my bed late at night unable to sleep
because Bukkit made events an annotation but commands are created by implementing a class.
@@ -9,7 +9,7 @@ Writing Bukkit plugins is a nightmare. I often lay awake in my bed late at night
These are solved problems. Spring Boot took care of this issue ages ago.
So how about we ditch this ridiculous programming model and hop on the Spring train.
-```java
+```kotlin
@Component
class Test { // We don't have to extend JavaPlugin. The plugin.yml is also generated for us.
@@ -69,15 +69,13 @@ class Test { // We don't have to extend JavaPlugin. The plugin.yml is also gener
* Schedulers are defined with `@Scheduler`. Another thing to schlep away somewhere.
* `@EventHandler` now registers itself. About damn time.
* Like money? Vault support is in the box `in.kyle.mcspring.economy.EconomyService`
-* Want my hot take on sub-command handing? We've got you covered (see the wiki)
+* Want my hot take on sub-command handling? We've got you covered (see the wiki)
+* I've also added some other optionionated libraries to the project with some pretty neat functionality. Check out mcspring-chat-actions, mcspring-chat, mcspring-guis, mcspring-nms.
## Getting Started
-I went ahead and wrote a full tutorial series for you newcomers. Get started [here](https://github.com/kylepls/mcspring/wiki/Getting-Setup)
+Please use the simple-factions project as a reference. This can be found in the `/mcspring-examples` folder.
-If you think you're too smart for the beginner tutorial; go to the
-[wiki](https://github.com/kylepls/mcspring/wiki) and piece it together.
-
-If you're really really smart; check out the example plugins in the `mcspring-example` folder.
+Each subproject has attached documentation.
---
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..3974385
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ `mcspring-docs`
+}
+
+allprojects {
+ group = "in.kyle.mcspring"
+ version = "0.1.0"
+}
+
+subprojects {
+ apply(plugin = "mcspring-build")
+ apply(plugin = "mcspring-publish")
+}
+
+defaultTasks("build")
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
new file mode 100644
index 0000000..09aa405
--- /dev/null
+++ b/buildSrc/build.gradle.kts
@@ -0,0 +1,26 @@
+plugins {
+ `kotlin-dsl`
+}
+
+configure {
+ experimentalWarning.set(false)
+}
+
+repositories {
+ jcenter()
+ mavenCentral()
+}
+
+dependencies {
+ implementation("org.springframework.boot:spring-boot-gradle-plugin:2.3.1.RELEASE")
+ implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72")
+ implementation("io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE")
+ implementation("org.jetbrains.dokka:dokka-gradle-plugin:0.10.1")
+ implementation("com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.5")
+ implementation("gradle.plugin.com.eden:orchidPlugin:0.20.0") {
+ repositories {
+ maven("https://plugins.gradle.org/m2/")
+ }
+ }
+}
+
diff --git a/buildSrc/src/main/kotlin/mcspring-build.gradle.kts b/buildSrc/src/main/kotlin/mcspring-build.gradle.kts
new file mode 100644
index 0000000..94b4b29
--- /dev/null
+++ b/buildSrc/src/main/kotlin/mcspring-build.gradle.kts
@@ -0,0 +1,41 @@
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ kotlin("jvm")
+}
+
+repositories {
+ jcenter()
+ mavenCentral()
+ mavenLocal()
+ maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/")
+ maven("https://oss.sonatype.org/content/repositories/snapshots")
+}
+
+dependencies {
+ val spigotVersion = "1.15.2-R0.1-SNAPSHOT"
+ compileOnly("org.spigotmc:spigot-api:$spigotVersion")
+
+ implementation(kotlin("stdlib"))
+
+ testImplementation("org.mockito:mockito-core:2.+")
+ testImplementation("io.mockk:mockk:1.10.0")
+ testImplementation("org.junit.jupiter:junit-jupiter:5.6.2")
+ testImplementation("org.spigotmc:spigot-api:$spigotVersion")
+
+ val kotestVersion = "4.1.0.RC2"
+ testImplementation("io.kotest:kotest-runner-junit5-jvm:$kotestVersion")
+ testImplementation("io.kotest:kotest-assertions-core-jvm:$kotestVersion")
+ testImplementation("io.kotest:kotest-property-jvm:$kotestVersion")
+ testImplementation("io.kotest:kotest-runner-console-jvm:$kotestVersion")
+ testImplementation("io.kotest:kotest-extensions-spring:$kotestVersion")
+}
+
+tasks.test {
+ useJUnitPlatform()
+}
+
+tasks.withType().configureEach {
+ kotlinOptions.suppressWarnings = true
+ kotlinOptions.jvmTarget = "1.8"
+}
diff --git a/buildSrc/src/main/kotlin/mcspring-docs.gradle.kts b/buildSrc/src/main/kotlin/mcspring-docs.gradle.kts
new file mode 100644
index 0000000..8217ace
--- /dev/null
+++ b/buildSrc/src/main/kotlin/mcspring-docs.gradle.kts
@@ -0,0 +1,29 @@
+plugins {
+ id("org.jetbrains.dokka")
+ id("com.eden.orchidPlugin")
+}
+
+repositories {
+ jcenter()
+}
+
+dependencies {
+ orchidRuntimeOnly("io.github.javaeden.orchid:OrchidDocs:0.20.0")
+ orchidRuntimeOnly("io.github.javaeden.orchid:OrchidSourceDoc:0.20.0")
+ orchidRuntimeOnly("io.github.javaeden.orchid:OrchidKotlindoc:0.20.0")
+ orchidRuntimeOnly("io.github.javaeden.orchid:OrchidPluginDocs:0.20.0")
+}
+
+tasks.withType(org.jetbrains.dokka.gradle.DokkaTask::class) {
+ outputFormat = "html"
+ configuration {
+ externalDocumentationLink {
+ url = uri("https://hub.spigotmc.org/javadocs/bukkit/").toURL()
+ url = uri("http://milkbowl.github.io/VaultAPI/").toURL()
+ }
+ }
+}
+
+orchid {
+ theme = "Editorial"
+}
diff --git a/buildSrc/src/main/kotlin/mcspring-publish.gradle.kts b/buildSrc/src/main/kotlin/mcspring-publish.gradle.kts
new file mode 100644
index 0000000..1a3e966
--- /dev/null
+++ b/buildSrc/src/main/kotlin/mcspring-publish.gradle.kts
@@ -0,0 +1,85 @@
+import com.jfrog.bintray.gradle.BintrayExtension
+
+plugins {
+ kotlin("jvm")
+ `maven-publish`
+ id("com.jfrog.bintray")
+}
+
+val sourcesJar by tasks.creating(Jar::class) {
+ archiveClassifier.set("sources")
+ from(sourceSets.getByName("main").allSource)
+ dependsOn(tasks.classes)
+}
+
+val artifactName = project.name
+val artifactGroup = project.group.toString()
+val artifactVersion = project.version.toString()
+
+val pomUrl = "https://github.com/kylepls/mcspring"
+val pomScmUrl = "https://github.com/kylepls/mcspring"
+val pomIssueUrl = "https://github.com/kylepls/mcspring/issues"
+val pomDesc = "https://github.com/kylepls/mcspring"
+
+val githubRepo = "kylepls/mcspring"
+val githubReadme = "README.md"
+
+val pomLicenseName = "MIT"
+val pomLicenseUrl = "https://opensource.org/licenses/mit-license.php"
+val pomLicenseDist = "repo"
+
+val pomDeveloperId = "kylepls"
+val pomDeveloperName = "Kyle"
+
+publishing {
+ publications {
+ create("mcspring") {
+ groupId = artifactGroup
+ artifactId = artifactName
+ version = artifactVersion
+ from(components["java"])
+ artifact(sourcesJar) {
+ classifier = "sources"
+ }
+
+ pom.withXml {
+ asNode().apply {
+ appendNode("description", pomDesc)
+ appendNode("name", rootProject.name)
+ appendNode("url", pomUrl)
+ appendNode("licenses").appendNode("license").apply {
+ appendNode("name", pomLicenseName)
+ appendNode("url", pomLicenseUrl)
+ appendNode("distribution", pomLicenseDist)
+ }
+ appendNode("developers").appendNode("developer").apply {
+ appendNode("id", pomDeveloperId)
+ appendNode("name", pomDeveloperName)
+ }
+ appendNode("scm").apply {
+ appendNode("url", pomScmUrl)
+ }
+ }
+ }
+ }
+ }
+}
+
+bintray {
+ user = project.findProperty("bintray.user")?.toString() ?: System.getProperty("bintray.user")
+ key = project.findProperty("bintray.key")?.toString() ?: System.getProperty("bintray.key")
+ setPublications("mcspring")
+ override = true
+ publish = true
+
+ pkg(delegateClosureOf {
+ repo = "maven"
+ name = "mcspring"
+ userOrg = "mcspring"
+ setLabels("kotlin", "spigot", "spring")
+ vcsUrl = "https://github.com/kylepls/mcspring"
+ })
+}
+
+tasks.findByName("build")!!.dependsOn(tasks.findByName("publishToMavenLocal"))
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..62d4c05
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a4f0001
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..fbd7c51
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..5093609
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,104 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/mcspring-api/mcspring-base/README.md b/mcspring-api/mcspring-base/README.md
new file mode 100644
index 0000000..6776d17
--- /dev/null
+++ b/mcspring-api/mcspring-base/README.md
@@ -0,0 +1,36 @@
+mcspring-base
+
+---
+
+_A lightweight Spring Boot wrapper for Bukkit_
+
+This is the "core" of mcspring. Most of the magic sauce is in here (and the gradle plugin).
+
+* Adds support for `@Scheduled`, `@EventHandler` and plugin dependency annotations.
+* Bootstraps Spring on top of the plugin system.
+
+### Quickstart
+
+#### Annotations:
+* `@PluginDepend` - Add this annotation to a Spring component to add plugin dependencies to the generated `plugin.yml`
+* `@SoftPluginDepend` - Same as above but for soft dependencies.
+
+#### Events:
+Register a class as a component and event handlers will be automatically registered.
+
+```kotlin
+@Component
+class Demo {
+ @EventHandler
+ fun move(e: PlayerMoveEvent) {
+ println(e.getPlayer().getName().toString() + " moved")
+ }
+}
+```
+
+#### Scheduling
+There are 2 ways to schedule things depending on your use case.
+
+#1: Global Scheduling Annotation: See [The @Scheduled Annotation in Spring](https://www.baeldung.com/spring-scheduled-tasks)
+
+#2: A convenience wrapper for the Bukkit scheduler. See: in.kyle.mcspring.scheduler.SchedulerService.
diff --git a/mcspring-api/mcspring-base/build.gradle.kts b/mcspring-api/mcspring-base/build.gradle.kts
new file mode 100644
index 0000000..a5b344a
--- /dev/null
+++ b/mcspring-api/mcspring-base/build.gradle.kts
@@ -0,0 +1,24 @@
+plugins {
+ id("org.jetbrains.dokka")
+}
+
+repositories {
+ mavenCentral()
+}
+
+configurations.getByName("api") {
+// exclude("com.google.code.gson")
+}
+
+dependencies {
+// compileOnly("org.apache.logging.log4j:log4j-core:2.12.1")
+ api(platform("org.springframework.boot:spring-boot-dependencies:2.3.1.RELEASE"))
+
+ api("org.springframework.boot:spring-boot-loader") {
+ exclude("org.springframework.boot", "spring-boot-dependencies")
+ }
+ api("org.springframework.boot:spring-boot-starter") {
+ exclude("org.springframework.boot", "spring-boot-dependencies")
+ exclude("org.yaml", "snakeyaml")
+ }
+}
diff --git a/mcspring-api/mcspring-base/pom.xml b/mcspring-api/mcspring-base/pom.xml
deleted file mode 100644
index 420d80f..0000000
--- a/mcspring-api/mcspring-base/pom.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
- mcspring-api
- in.kyle.mcspring
- 0.0.9
-
-
- 4.0.0
-
- mcspring-base
-
-
-
- spigot-repo
- https://hub.spigotmc.org/nexus/content/repositories/snapshots/
-
-
-
-
-
- org.spigotmc
- spigot-api
-
-
- in.kyle.mcspring
- mcspring-jar-loader
- ${project.version}
-
-
- org.springframework.boot
- spring-boot-loader
-
-
- org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.apache.logging.log4j
- log4j-core
- 2.12.1
- provided
-
-
- org.springframework.boot
- spring-boot-starter-aop
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.projectlombok
- lombok
-
-
-
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringPlugin.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringPlugin.java
deleted file mode 100644
index 7988d2d..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringPlugin.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package in.kyle.mcspring;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.core.Logger;
-import org.bukkit.plugin.Plugin;
-import org.springframework.boot.Banner;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.core.io.DefaultResourceLoader;
-import org.springframework.core.io.ResourceLoader;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-@RequiredArgsConstructor
-public class SpringPlugin {
-
- private static final LinkedHashMap SETUP_PLUGINS = new LinkedHashMap<>();
-
- private final Plugin plugin;
- @Getter
- private ConfigurableApplicationContext context;
-
- public static void setup(Plugin plugin, Class> config) {
- setupLogger();
- SpringPlugin springPlugin = new SpringPlugin(plugin);
- springPlugin.initSpring(config);
- SETUP_PLUGINS.put(plugin, springPlugin);
- }
-
- public static void teardown(Plugin plugin) {
- SpringPlugin springPlugin = SETUP_PLUGINS.remove(plugin);
- if (springPlugin != null) {
- springPlugin.onDisable(plugin);
- }
- }
-
- public final void onDisable(Plugin plugin) {
- if (context != null) {
- context.close();
- context = null;
- SETUP_PLUGINS.remove(plugin);
- }
- }
-
- private void initSpring(Class> config) {
- SpringApplicationBuilder builder = new SpringApplicationBuilder();
- ClassLoader classLoader = plugin.getClass().getClassLoader();
- ResourceLoader loader = new DefaultResourceLoader(classLoader);
- Class>[] sources = new Class[]{config, SpringSpigotSupport.class};
- if (!SETUP_PLUGINS.isEmpty()) {
- SpringPlugin parent = findParentCandidate();
- builder.parent(parent.getContext());
- sources = Arrays.copyOfRange(sources, 0, 1);
- }
- context = builder.sources(sources)
- .resourceLoader(loader)
- .bannerMode(Banner.Mode.OFF)
- .properties("spigot.plugin=" + plugin.getName())
- .logStartupInfo(true)
- .run();
- }
-
- private static void setupLogger() {
- if (SETUP_PLUGINS.isEmpty()) {
- Logger rootLogger = (Logger) LogManager.getRootLogger();
- rootLogger.setLevel(Level.ALL);
- }
- }
-
- private SpringPlugin findParentCandidate() {
- return SETUP_PLUGINS.entrySet()
- .stream()
- .reduce((a, b) -> b)
- .map(Map.Entry::getValue)
- .orElse(null);
- }
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringSpigotSupport.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringSpigotSupport.java
deleted file mode 100644
index 4f8cf8e..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/SpringSpigotSupport.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package in.kyle.mcspring;
-
-import org.bukkit.Bukkit;
-import org.bukkit.Server;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.plugin.Plugin;
-import org.bukkit.plugin.PluginDescriptionFile;
-import org.bukkit.plugin.PluginLoader;
-import org.bukkit.plugin.PluginManager;
-import org.bukkit.plugin.messaging.Messenger;
-import org.bukkit.scheduler.BukkitScheduler;
-import org.bukkit.scoreboard.ScoreboardManager;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-import java.util.logging.Logger;
-
-@Configuration
-@ComponentScan(basePackageClasses = SpringPlugin.class)
-@EnableScheduling
-@EnableAspectJAutoProxy
-class SpringSpigotSupport {
-
- @Bean
- Plugin plugin(@Value("${spigot.plugin}") String pluginName) {
- return Bukkit.getPluginManager().getPlugin(pluginName);
- }
-
- @Bean(destroyMethod = "")
- Server server(Plugin plugin) {
- return plugin.getServer();
- }
-
- @Bean
- Logger logger(Plugin plugin) {
- return plugin.getLogger();
- }
-
- @Bean
- PluginManager pluginManager(Server server) {
- return server.getPluginManager();
- }
-
- @Bean
- ScoreboardManager scoreboardManager(Server server) {
- return server.getScoreboardManager();
- }
-
- @Bean
- Messenger messenger(Server server) {
- return server.getMessenger();
- }
-
- @Bean
- FileConfiguration configuration(Plugin plugin) {
- return plugin.getConfig();
- }
-
- @Bean
- PluginDescriptionFile description(Plugin plugin) {
- return plugin.getDescription();
- }
-
- @Bean
- BukkitScheduler scheduler(Server server) {
- return server.getScheduler();
- }
-
- @Bean
- PluginLoader pluginLoader(Plugin plugin) {
- return plugin.getPluginLoader();
- }
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/BukkitCommandRegistration.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/BukkitCommandRegistration.java
deleted file mode 100644
index 9c33f9e..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/BukkitCommandRegistration.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package in.kyle.mcspring.command;
-
-import org.bukkit.plugin.Plugin;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-
-import lombok.RequiredArgsConstructor;
-import lombok.var;
-
-@Component
-@ConditionalOnBean(Plugin.class)
-@RequiredArgsConstructor
-class BukkitCommandRegistration implements CommandRegistration {
-
- private final CommandController controller;
- private final CommandFactory commandFactory;
-
- @Override
- public void register(Command command, Method method, Object object) {
- String name = command.value();
- var bukkitCommand = commandFactory.makeCommand(method, object, name);
- bukkitCommand.setAliases(Arrays.asList(command.aliases()));
- bukkitCommand.setDescription(command.description());
- bukkitCommand.setUsage(command.usage());
- bukkitCommand.setPermission(command.permission());
- bukkitCommand.setPermissionMessage(command.permissionMessage());
- controller.registerCommand(bukkitCommand);
- }
-
- interface CommandFactory {
- org.bukkit.command.Command makeCommand(Method method, Object object, String name);
- }
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Command.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Command.java
deleted file mode 100644
index 8c45394..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Command.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package in.kyle.mcspring.command;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface Command {
-
- String value();
-
- String[] aliases() default {};
-
- String description() default "";
-
- String usage() default "";
-
- String permission() default "";
-
- String permissionMessage() default "";
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandController.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandController.java
deleted file mode 100644
index d4edc40..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandController.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package in.kyle.mcspring.command;
-
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandMap;
-import org.bukkit.plugin.Plugin;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Controller;
-
-import java.lang.reflect.Field;
-
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-
-@Controller
-@RequiredArgsConstructor
-@ConditionalOnBean(Plugin.class)
-class CommandController {
-
- private final CommandMap commandMap = getCommandMap();
- private final Plugin plugin;
-
- public void registerCommand(Command command) {
- commandMap.register(command.getLabel(), plugin.getName(), command);
- }
-
- @SneakyThrows
- private CommandMap getCommandMap() {
- Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");
- bukkitCommandMap.setAccessible(true);
- return (CommandMap) bukkitCommandMap.get(Bukkit.getServer());
- }
-
- @Bean
- CommandMap commandMap() {
- return commandMap;
- }
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandRegistration.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandRegistration.java
deleted file mode 100644
index 0a8a4f4..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandRegistration.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package in.kyle.mcspring.command;
-
-import java.lang.reflect.Method;
-
-public interface CommandRegistration {
- void register(Command command, Method method, Object object);
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandResolver.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandResolver.java
deleted file mode 100644
index 16d6309..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandResolver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package in.kyle.mcspring.command;
-
-import org.bukkit.command.CommandSender;
-
-import lombok.Value;
-
-public interface CommandResolver {
-
- Resolver makeResolver(Command command);
-
- @Value
- class Command {
- CommandSender sender;
- String[] args;
- String label;
- }
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandScanner.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandScanner.java
deleted file mode 100644
index fdd9811..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/CommandScanner.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package in.kyle.mcspring.command;
-
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import in.kyle.mcspring.util.SpringScanner;
-import lombok.AllArgsConstructor;
-import lombok.var;
-
-@Component
-@AllArgsConstructor
-class CommandScanner implements ApplicationContextAware {
-
- private final SpringScanner scanner;
- private final CommandRegistration commandRegistration;
- private final Set registeredCommands = new HashSet<>();
-
- @Override
- public void setApplicationContext(ApplicationContext ctx) throws BeansException {
- Map scan = scanner.scanMethods(Command.class);
- for (var e : scan.entrySet()) {
- if (!registeredCommands.contains(e.getKey())) {
- Command command = e.getKey().getAnnotation(Command.class);
- commandRegistration.register(command, e.getKey(), e.getValue());
- registeredCommands.add(e.getKey());
- }
- }
- }
-
-}
diff --git a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Resolver.java b/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Resolver.java
deleted file mode 100644
index c46e9b7..0000000
--- a/mcspring-api/mcspring-base/src/main/java/in/kyle/mcspring/command/Resolver.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package in.kyle.mcspring.command;
-
-import java.lang.reflect.Parameter;
-import java.util.Optional;
-
-public interface Resolver {
- Optional