Giter Site home page Giter Site logo

servertap-io / servertap Goto Github PK

View Code? Open in Web Editor NEW
208.0 8.0 52.0 796 KB

ServerTap is a REST API for Bukkit/Spigot/Paper Minecraft servers

Home Page: https://servertap.io

License: MIT License

Java 99.96% Shell 0.04%
minecraft-plugin javalin hacktoberfest

servertap's Introduction

ServerTap

GitHub Workflow Status bukkit version %3E%3D 1.16 GitHub all releases chat on Discord

ServerTap is a REST API for Bukkit, Spigot, and PaperMC Minecraft servers. It allows for server admins to query and interact with their servers using simple REST semantics.

Head over to https://github.com/servertap-io/servertap/releases/latest to grab the latest and greatest plugin JAR.

Discord

Join the Discord to talk about this plugin https://discord.gg/nSWRYzBMfp

Note: If you have a question please post in the support forum on our discord instead of just asking in general chat. This helps us keep track of issues and questions more effectively and answer your questions quicker.

Contents

Usage

Install this plugin by dropping the jar into the plugins/ directory on your server. Then, you can query the server using curl or Postman, or anything that speaks HTTP.

For example, query for information about the server itself:

$ curl http://localhost:4567/v1/server
{
  "name": "Paper",
  "motd": "This is my MOTD",
  "version": "git-Paper-89 (MC: 1.15.2)",
  "bukkitVersion": "1.15.2-R0.1-SNAPSHOT",
  "health": {
    "cpus": 4,
    "uptime": 744,
    "totalMemory": 2010644480,
    "maxMemory": 2010644480,
    "freeMemory": 1332389360
  },
  "bannedIps": [],
  "bannedPlayers": [
    {
      "target": "phybros",
      "source": "Server"
    }
  ]
}

Or get a list of players that are currently online:

$ curl http://localhost:4567/v1/players
[
  {
    "uuid": "55f584e4-f095-48e0-bb8a-eb5c87ffe494",
    "displayName": "phybros",
    "address": "localhost",
    "port": 58529,
    "exhaustion": 3.5640976,
    "exp": 0.45454547,
    "whitelisted": false,
    "banned": false,
    "op": true
  }
]

ServerTap Command

ServerTap currently supports only one management command in game. The supported subcommands are reload & info which as their names imply let you reload and display basic information about the plugin (version, author, etc).

Note: The Permission for the /servertap Command is servertap.admin.

Current Endpoints

This plugin self-hosts its own API documentation using Swagger. You can see the full API documentation at http://your-server.net:4567/swagger. You can even explore and test the API right from the UI!

Some examples of capabilities are:

  • Ping
  • Server
    • Get/Add/Remove Ops
    • Get/Add Whitelist
  • Get/Save/List Worlds
  • List/Read Scoreboard(s)
  • Broadcast
  • List/Find Players
  • Get/Pay/Debt Economy (W/ Plugin)
  • List Plugins

TLS

ServerTap supports TLS (a.k.a. SSL) via a Java "keystore" file. You can generate a keystore for yourself using the keytool utility that ships with Java.

Using TLS is highly recommended as it encrypts the requests and responses to/from your server on the wire.

Example:

keytool -genkey -keyalg RSA -alias servertap -keystore selfsigned.jks -validity 365 -keysize 2048

Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:
...
<you can mostly answer whatever you want to all these questions>

Make sure to save the output file selfsigned.jks into the plugins/ServerTap directory

Then in config.yml:

tls:
  enabled: true
  keystore: selfsigned.jks
  keystorePassword: testing

Then make sure to use https:// when talking to the API.

SNI

TLS optionally supports Server Name Indication (SNI) since v0.5.0. Set tls.sni to true in your config to enable it (expert). 99.9% of users won't need to think about this option and can just leave it false.

Authentication

Authentication is very rudimentary at this point. Add this to your plugins/ServerTap/config.yml file:

useKeyAuth: true
key: some-long-super-random-string

Then include a Header called key with your specified key on every request to Authenticate.

We need help making this better! See #5 for more info.

CORS

By default, ServerTap allows cross-origin requests from any origin (*). To change this, change the corsOrigins setting in the config file.

Example:

corsOrigins:
  - https://mysite.com

The setting supports as many origins as you want, just add them to the array.

Webhooks

ServerTap can send webhook messages in response to events on the server.

To use webhooks, just define them in your plugins/ServerTap/config.yml file like so:

webhooks:
  default:
    listener: "https://your-webhook-target.com/whatever"
    events:
    - PlayerJoin
    - PlayerQuit

The webhook requests are POST containing a simple JSON payload:

{
  "player": {
    "uuid": "55f584e4-f095-48e0-bb8a-eb5c87ffe494",
    "displayName": "phybros",
    "address": "localhost",
    "port": 52809,
    "exhaustion": 0,
    "exp": 0.5714286,
    "whitelisted": true,
    "banned": false,
    "op": true
  },
  "joinMessage": "§ephybros joined the game",
  "eventType": "PlayerJoin"
}

The available events are currently:

  • PlayerJoin
  • PlayerDeath
  • PlayerChat
  • PlayerKick
  • PlayerQuit

Websockets

ServerTap has a bi-directional websockets interface which allows you to receive server log lines in realtime (no polling!).

Once connected, any server log line that goes through the normal logging filters on the server will come down the websocket in a JSON object like this:

{
  "message": "§6/version: §fGets the version of this server including any plugins in use",
  "timestampMillis": 1631834015918,
  "loggerName": "",
  "level": "INFO"
}

Note: you can use a library like ansicolors to parse the color codes for the browser.

Connect to ws://<host>:4567/v1/ws/console (or use wss:// if you have TLS enabled). The last 1000 server log messages will be sent to the connecting client. You can configure the size of the server log buffer by changing websocketConsoleBuffer in config.yml.

You can also send commands through the WS connection and they will be executed on the server.

Authenticating Websockets

Since you can't set headers on websocket connections, you can't use the header key to authenticate like you can with regular API routes.

Instead you must set a cookie called x-servertap-key on the page hosting the websocket connection.

Example:

// set cookie to authenticate the connection
document.cookie = "x-servertap-key=change_me";

this.ws = new WebSocket("ws://localhost:4567/v1/ws/console");

this.ws.onopen = function() {
  console.log("Opened connection");
};

Note: If you don't have authentication enabled, you are basically opening a remote admin console to your server up to the internet (bad idea).

Using the Developer API

ServerTap provides a Developer API allowing you to register your own Request Handlers and Websockets from your Plugin!

To get ServerTap Builds you can use Jitpack. First, add the Jitpack Repository to your pom.xml:

<repository>
  <id>jitpack.io</id>
  <url>https://jitpack.io</url>
</repository>

Then you can add the following Dependency:

<dependency>
  <groupId>com.github.phybros</groupId>
  <artifactId>servertap</artifactId>
  <version>vX.X.X</version>
  <scope>provided</scope>
</dependency>

Replace the Version with the latest available Releases Version Number.

You can retrieve the API using Bukkits ServiceProvider:

// In your Main Class extended from JavaPlugin, for example in the onEnable() Method
ServerTapWebserverService webserverService = this.getServer().getServicesManager().load(ServerTapWebserverService.class);

The Interface provides you with methods to directly add Endpoints to the Webserver:

webserverService.get("/test/ping", ctx -> ctx.status(200).result("Pong!"));
webserverService.websocket("/test/ws", websocketConfig -> {
    websocketConfig.onMessage(wsMessageContext -> System.out.println(wsMessageContext.message()));
});

Your Endpoints (HTTP & WebSocket) are protected the same way all other Endpoints in the Server are.

The API provides the getWebserver() Method that will return the internal Javalin Instance. This will give you deep access to the Webserver providing you every ability possible. Be careful not to break ServerTaps Functionality (e.g. the AccessManager checking Security)! Use this only if necessary.

Contributing to ServerTap

You need a few things to get started

  • An IDE (e.g. IntelliJ)
  • JDK 19
  • Maven

Then, you can build the plugin jar by using the mvn package command.

servertap's People

Contributors

atechadventurer avatar au5ton avatar c1oneman avatar dependabot[bot] avatar diddyy avatar earlh21 avatar hedlund01 avatar jadlokin-scarlet avatar koutsie avatar phybros avatar renovate[bot] avatar scarsz avatar srmullaney avatar tadhgboyle avatar timecodings avatar tschlienger avatar velyn-n avatar zoeleu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

servertap's Issues

Advancements

add an event for advancements, and also the ability to check all advancements

Authentication

Currently the API is completely unrestricted. Anyone who can access the ip/port where the server is running can talk to it.

There are a few different options that might be feasible:

1. JWT

This was the first idea I had, and started spiking it out in #5 - unfortunately, without a signin mechanism, this is basically as secure as just sending a shared secret. Yes, you can generate short lived tokens on the client side using the shared HMAC secret, but that might be a bit too complicated for users of this plugin? We want this thing to be easy to use for the most amount of people.

2. Usernames/Passwords

Just create a map of username: bcrypt(password) in config.yml and then authenticate based on that using HTTP BASIC auth.

Deeper Vault integration

Create a whole new EconomyApi class with methods for manipulating player balances and other economy commands. If the server doesn't have Vault, all of these methods should return a helpful error.

The API should live under /v1/economy

Move whitelist routes under /server

  • /server/whitelist should take the place of the current /whitelist routes for both GET and POST
  • POSTing to /server/whitelist should take a form param called playerUuid OR username to create the whitelist entry for that player

Essentials, Luckperms and Vault Support

Would it be possible to add support for Essentials, Luckperms and Vault? It would be really useful to be able to manage player permissions with LuckPerms and have the ability to use essentials commands through the API.

Routes:
/v1/players/perms ( Return all player perms )

/v1/player/perms/update ( Update player perms )

/v1/player/:id/mute ( Mute a player )

Swagger endpoints blocked by new authentication

The new authentication (0.0.5) now blocks the /swagger and /swagger-doc endpoints.
I have a running workaround on my branch that just adds to the check to see if the call is swagger.
But, the problem gets deeper when you make test calls through swagger, as the endpoints are still blocked due to no authentication key provided.

Test and validate Java 11

This plugin is built with Java 1.8. Things like Paper are starting to throw warnings like this:

[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] ************************************************************
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * WARNING - YOU ARE RUNNING AN OUTDATED VERSION OF JAVA.
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * PAPER WILL STOP BEING COMPATIBLE WITH THIS VERSION OF
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * JAVA WHEN MINECRAFT 1.17 IS RELEASED.
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] *
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * Please update the version of Java you use to run Paper
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * to at least Java 11. When Paper for Minecraft 1.17 is
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * released support for versions of Java before 11 will
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * be dropped.
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] *
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * Current Java version: 1.8.0_181
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] *
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] * Check this forum post for more information:
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] *   https://papermc.io/java11
[09:27:45 WARN]: [io.papermc.paper.util.PaperJvmChecker] ************************************************************

Should make sure that Servertap will work on Java 11 (might need to start requiring 11 to build this plugin)

Renovate Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Ignored or Blocked

These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.

Detected dependencies

github-actions
.github/workflows/build.yml
  • actions/checkout v3
  • actions/setup-java v3
  • softprops/action-gh-release v1
  • eregon/publish-release v1
.github/workflows/publish-docs.yaml
  • actions/checkout v3
  • actions/setup-python v4
  • actions/setup-python v4
  • ubuntu 22.04
maven
pom.xml
  • org.spigotmc:spigot-api 1.16.5-R0.1-SNAPSHOT
  • io.javalin:javalin 5.6.2
  • io.javalin.community.openapi:javalin-openapi-plugin 5.6.2
  • io.javalin.community.openapi:javalin-swagger-plugin 5.6.2
  • io.javalin.community.ssl:ssl-plugin 5.6.2
  • com.fasterxml.jackson.core:jackson-databind 2.15.2
  • org.apache.commons:commons-compress 1.23.0
  • commons-io:commons-io 2.13.0
  • net.milkbowl.vault:VaultAPI 1.7
  • de.tr7zw:item-nbt-api-plugin 2.11.3
  • org.slf4j:slf4j-jdk14 2.0.7
  • org.slf4j:slf4j-api 2.0.7
  • org.apache.logging.log4j:log4j-core 2.20.0
  • me.clip:placeholderapi 2.11.3
  • com.github.seeseemelk:MockBukkit-v1.16 1.5.0
  • com.konghq:unirest-java 3.14.5
  • org.junit.jupiter:junit-jupiter-api 5.9.3
  • org.apache.maven.plugins:maven-compiler-plugin 3.11.0
  • io.javalin.community.openapi:openapi-annotation-processor 5.6.2
  • org.apache.maven.plugins:maven-release-plugin 3.0.1
  • com.google.code.maven-replacer-plugin:replacer 1.5.3
  • org.apache.maven.plugins:maven-shade-plugin 3.5.0
  • org.apache.maven.plugins:maven-surefire-plugin 3.1.2

  • Check this box to trigger a request for Renovate to run again on this repository

World download endpoints are resulting in garbage zips on Windows

When attempting to hit any of the world download endpoints on windows the system spits out bad data.

java.util.regex.PatternSyntaxException: Unexpected internal error near index 2
^
at java.util.regex.Pattern.error(Pattern.java:2028) ~[?:?]
at java.util.regex.Pattern.compile(Pattern.java:1789) ~[?:?]
at java.util.regex.Pattern.(Pattern.java:1430) ~[?:?]
at java.util.regex.Pattern.compile(Pattern.java:1069) ~[?:?]
at java.lang.String.replaceFirst(String.java:2895) ~[?:?]
at io.servertap.api.v1.ServerApi.addFolderToZip(ServerApi.java:223) ~[ServerTap-0.2.0.jar:?]
at io.servertap.api.v1.ServerApi.addFolderToZip(ServerApi.java:216) ~[ServerTap-0.2.0.jar:?]
at io.servertap.api.v1.ServerApi.downloadWorld(ServerApi.java:272) ~[ServerTap-0.2.0.jar:?]
at io.servertap.PluginEntrypoint.lambda$null$1(PluginEntrypoint.java:147) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet.addHandler$lambda-5(JavalinServlet.kt:113) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:44) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:39) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet.service$tryWithExceptionMapper(JavalinServlet.kt:129) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet.service$tryBeforeAndEndpointHandlers(JavalinServlet.kt:39) ~[ServerTap-0.2.0.jar:?]
at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:87) ~[ServerTap-0.2.0.jar:?]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.2.0.jar:?]
at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap-0.2.0.jar:?]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.2.0.jar:?]
at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:179) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) ~[ServerTap-0.2.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) ~[ServerTap-0.2.0.jar:?]
at java.lang.Thread.run(Thread.java:833) ~[?:?]

setting 'websocketConsoleBuffer' to zero causes many exceptions

The comments say "# Set to 0 to effectively disable this",
but setting it to zero produces an exception for every log line:

[15:26:54 INFO]: [ServerTap] Enabling ServerTap v0.3.0
> 2022-08-04 15:26:54,422 Server thread WARN org.apache.logging.log4j.spi.AbstractLogger caught java.lang.IndexOutOfBoundsException logging ReusableSimpleMessage: [ServerTap] TLS is not enabled. java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
	at java.base/java.util.Objects.checkIndex(Objects.java:359)
	at java.base/java.util.ArrayList.remove(ArrayList.java:504)
	at ServerTap-0.3.0.jar//io.servertap.api.v1.websockets.ConsoleListener.filter(ConsoleListener.java:24)
	at org.apache.logging.log4j.core.filter.CompositeFilter.filter(CompositeFilter.java:590)
	at org.apache.logging.log4j.core.filter.AbstractFilterable.isFiltered(AbstractFilterable.java:154)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:482)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
	at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
	at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
	at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
	at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2017)
	at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
	at org.apache.logging.log4j.spi.AbstractLogger.warn(AbstractLogger.java:2671)
	at org.bukkit.craftbukkit.v1_18_R2.util.ForwardLogHandler.publish(ForwardLogHandler.java:34)
	at java.logging/java.util.logging.Logger.log(Logger.java:980)
	at java.logging/java.util.logging.Logger.doLog(Logger.java:1007)
	at java.logging/java.util.logging.Logger.log(Logger.java:1030)
	at java.logging/java.util.logging.Logger.warning(Logger.java:1790)
	at ServerTap-0.3.0.jar//io.servertap.PluginEntrypoint.lambda$onEnable$2(PluginEntrypoint.java:133)
	at ServerTap-0.3.0.jar//io.javalin.core.JavalinConfig.applyUserConfig(JavalinConfig.java:205)
	at ServerTap-0.3.0.jar//io.javalin.Javalin.create(Javalin.java:93)
	at ServerTap-0.3.0.jar//io.servertap.PluginEntrypoint.onEnable(PluginEntrypoint.java:101)
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264)
	at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370)
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501)
	at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugin(CraftServer.java:559)
	at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugins(CraftServer.java:473)
	at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:289)
	at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1163)
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:315)
	at java.base/java.lang.Thread.run(Thread.java:833)

Realtime streams / websockets

Javalin has good support for websockets. We could create a websocket handler to send console output in realtime, chat, server events (player join/leave etc) and so on.

Create a top-level /economy route

We already have some interactive routes for economy stuff (pay and debit). Doing a GET to the top level /economy should provide some basic information, like enabled (true or false) as well as the name and version of the economy plugin (use the same format that is used in the /plugins route for those attributes.

Something like this:

{
  "enabled": true,
  "name": "Vault",
  "version": "1.7-R0"
}

Thread qtp1823191462-91 failed main thread check: Chunk getEntities call ?

Evaluates fine via console.
Edit: forgot to mention im on servertap 0.2.0
image

java.lang.Throwable: null
        at org.spigotmc.AsyncCatcher.catchOp(AsyncCatcher.java:15) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at net.minecraft.server.level.WorldServer.I(WorldServer.java:2397) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at org.bukkit.craftbukkit.v1_18_R1.CraftWorld.getNMSEntities(CraftWorld.java:990) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at org.bukkit.craftbukkit.v1_18_R1.CraftRegionAccessor.getEntitiesByClasses(CraftRegionAccessor.java:438) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at com.extendedclip.papi.expansion.server.ServerExpansion.onRequest(ServerExpansion.java:184) ~[?:?]
        at me.clip.placeholderapi.replacer.CharsReplacer.apply(CharsReplacer.java:160) ~[PlaceholderAPI-2.10.10.jar:?]
        at me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(PlaceholderAPI.java:70) ~[PlaceholderAPI-2.10.10.jar:?]
        at io.servertap.api.v1.PAPIApi.replacePlaceholders(PAPIApi.java:52) ~[ServerTap.jar:?]
        at io.servertap.PluginEntrypoint.lambda$null$1(PluginEntrypoint.java:154) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.addHandler$lambda-5(JavalinServlet.kt:113) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:44) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:39) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service$tryWithExceptionMapper(JavalinServlet.kt:129) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service$tryBeforeAndEndpointHandlers(JavalinServlet.kt:39) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:87) ~[ServerTap.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap.jar:?]
        at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap.jar:?]
        at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) ~[ServerTap.jar:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
[02:55:46 WARN]: [io.javalin.Javalin] Uncaught exception
java.lang.IllegalStateException: Asynchronous Chunk getEntities call!
        at org.spigotmc.AsyncCatcher.catchOp(AsyncCatcher.java:16) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at net.minecraft.server.level.WorldServer.I(WorldServer.java:2397) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at org.bukkit.craftbukkit.v1_18_R1.CraftWorld.getNMSEntities(CraftWorld.java:990) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at org.bukkit.craftbukkit.v1_18_R1.CraftRegionAccessor.getEntitiesByClasses(CraftRegionAccessor.java:438) ~[purpur-1.18.1.jar:git-Purpur-1441]
        at com.extendedclip.papi.expansion.server.ServerExpansion.onRequest(ServerExpansion.java:184) ~[?:?]
        at me.clip.placeholderapi.replacer.CharsReplacer.apply(CharsReplacer.java:160) ~[PlaceholderAPI-2.10.10.jar:?]
        at me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(PlaceholderAPI.java:70) ~[PlaceholderAPI-2.10.10.jar:?]
        at io.servertap.api.v1.PAPIApi.replacePlaceholders(PAPIApi.java:52) ~[ServerTap.jar:?]
        at io.servertap.PluginEntrypoint.lambda$null$1(PluginEntrypoint.java:154) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.addHandler$lambda-5(JavalinServlet.kt:113) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:44) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet$service$tryBeforeAndEndpointHandlers$1.invoke(JavalinServlet.kt:39) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service$tryWithExceptionMapper(JavalinServlet.kt:129) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service$tryBeforeAndEndpointHandlers(JavalinServlet.kt:39) ~[ServerTap.jar:?]
        at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:87) ~[ServerTap.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap.jar:?]
        at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap.jar:?]
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap.jar:?]
        at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap.jar:?]
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392) ~[ServerTap.jar:?]
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap.jar:?]
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) ~[ServerTap.jar:?]
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) ~[ServerTap.jar:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]

Come up with a plan for Error Handling

Right now, all errors are using status code 200 OK and then including a raw string in the body.

Example:

HTTP/1.1 200 OK
Date: Thu, 30 Apr 2020 22:11:39 GMT
Server: Javalin
Content-Type: application/json
Content-Length: 42

"error: The server has whitelist disabled"

If you're writing a JSON client for this API there's nothing to tell you that there was an error. Usually you'd rely on the statusCode of the response. Some poorly implemented JSON parsers would also fail to parse just a string, even though it's technically correct JSON.

Some options:

  1. Still just return a raw string, but include a relevant error code (404 Not Found, 405 Method Not Allowed etc etc)
  2. Keep returning 200 but create a JSON structure including some attribute like "error": true
  3. Do nothing

@ATechAdventurer maybe you have opinions but I'm leaning towards 1.

Incorrect item id in Inventory Route when using Forge + Spigot

When using any forge + (bukkit/spigot/paper) environment (MCPC+, Cauldron, CatServer) the /player inventory route returns all items with minecraft: this is not correct.

The resolution to this problem requires a way to determine if an item is provided by a mod that is outside of vanilla Minecraft.

This is not a huge issue and will likely not be fixed because servertap does not support Forge server environments. But if a solution is possible it might be valuable to address this issue.

This is mostly just here for reference purposes.

Add ability to get more detailed user info

From a server management side, it would be useful if I could see more detailed things about my players. For instance what dimension they're in, what their coordinates are, etc.

Right now I think I could approximate this with the v1/server/exec endpoint, having it do /data get entity Username. This returns a lot of info about the user. However having this data returned by the v1/player route (and perhaps even updatable through POST/PUT) would be much nicer!

Webhooks for server events

It would be nice to be able to register an IP to receive HTTP requests when certain events occur on the server, such as players leaving or joining.

Not all commands have output when using the execute endpoint.

For some reason, executing a command such as help will list all the commands in the response content, but something like
scoreboard players get theangrybagel totalKills has no output in the response. (when I execute the command in the console, it shows output, but there isn't any output in the response)

Support for SSL

We could just support self signed certs to get some encryption in flight going

More plugin data

The addition of a plugins description and author would be nice.

Secure

Is it secure to transfer data with this plugin?

Question

Hello,

First, I love your work with this plugin. Can I do sth. like /givemoney/80/? Or can I perform any command (like /eco set 80) with feedback?

~kial1

Feature request: Selective auth?

Eg: I'd like the auth key be asked for everything else but for example getting a scoreboard.
This'd make fetching stuff client side (eg a website with js) possible "securely" (not exposing ex: add ops to the client (because they don't need the key to get what they need))

Move chat things under /chat

  • /broadcast should become /chat/broadcast
  • POST to /chat/tell should send a message to a specific player only identified by formParam :playerUuid

Routes for opping people

POST to /players/:playerUuid/op should OP that player. Also maybe GET to /players/ops should give a list of OPs

[feat] selectively disable API routes

By adding something like this into config:

disabledRoutes:
  - /op
  - /kick

Would just "turn off" those routes. This would supercede any other selective route-based configurations such as the stuff mentioned in #75

OpenApi spews tons of WARNs into the logs when viewing /swagger

This is new since I made some changes to the javalin-openapi version etc. The error is harmless, but barfs this into the server log when you visit /swagger:

[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/ping -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/exec -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: DELETE path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/:uuid/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard/:name -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/broadcast -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/tell -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/all -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:playerUuid/:worldUuid/inventory -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/pay -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/debit -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/economy -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:50 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/plugins -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/ping -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/exec -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: DELETE path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/:uuid/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard/:name -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/broadcast -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/tell -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/all -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:playerUuid/:worldUuid/inventory -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/pay -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/debit -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/economy -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/plugins -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/ping -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/exec -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: DELETE path: /v1/server/ops -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/server/whitelist -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/worlds/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/worlds/:uuid/save -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/scoreboard/:name -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/broadcast -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/chat/tell -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/all -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:uuid -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/players/:playerUuid/:worldUuid/inventory -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/pay -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: POST path: /v1/economy/debit -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/economy -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:51 WARN]: [io.javalin.plugin.openapi.dsl.ExtractDocumentation] cannot match handler: GET path: /v1/plugins -- no Handler-type fields declared in class io.servertap.PluginEntrypoint
[01:12:52 WARN]: [io.javalin.plugin.openapi.JavalinOpenApi] A default response was added to the documentation of GET /v1/server/ops
[01:12:52 WARN]: [io.javalin.plugin.openapi.JavalinOpenApi] A default response was added to the documentation of GET /v1/worlds/{uuid}
[01:12:52 WARN]: [io.javalin.plugin.openapi.JavalinOpenApi] A default response was added to the documentation of GET /v1/scoreboard/{name}

ServerTap does not handle /reload properly

If you do /reload confirm you get this mess:

> reload confirm
[20:19:13 INFO]: CONSOLE: Please note that this command is not supported and may cause issues when using some plugins.
[20:19:13 INFO]: CONSOLE: If you encounter any issues please use the /stop command to restart your server.
[20:19:13 INFO]: Debug logging is disabled
[20:19:13 INFO]: Server Ping Player Sample Count: 12
[20:19:13 INFO]: Using 4 threads for Netty based IO
[20:19:13 INFO]: -------- World Settings For [world] --------
[20:19:13 INFO]: View Distance: 10
[20:19:13 INFO]: Allow Zombie Pigmen to spawn from portal blocks: true
[20:19:13 INFO]: Arrow Despawn Rate: 1200 Trident Respawn Rate:1200
[20:19:13 INFO]: Item Merge Radius: 2.5
[20:19:13 INFO]: Item Despawn Rate: 6000
[20:19:13 INFO]: Zombie Aggressive Towards Villager: true
[20:19:13 INFO]: Nerfing mobs spawned from spawners: false
[20:19:13 INFO]: Hopper Transfer: 8 Hopper Check: 1 Hopper Amount: 1
[20:19:13 INFO]: Experience Merge Radius: 3.0
[20:19:13 INFO]: Mob Spawn Range: 8
[20:19:13 INFO]: Cactus Growth Modifier: 100%
[20:19:13 INFO]: Cane Growth Modifier: 100%
[20:19:13 INFO]: Melon Growth Modifier: 100%
[20:19:13 INFO]: Mushroom Growth Modifier: 100%
[20:19:13 INFO]: Pumpkin Growth Modifier: 100%
[20:19:13 INFO]: Sapling Growth Modifier: 100%
[20:19:13 INFO]: Beetroot Growth Modifier: 100%
[20:19:13 INFO]: Carrot Growth Modifier: 100%
[20:19:13 INFO]: Potato Growth Modifier: 100%
[20:19:13 INFO]: Wheat Growth Modifier: 100%
[20:19:13 INFO]: NetherWart Growth Modifier: 100%
[20:19:13 INFO]: Vine Growth Modifier: 100%
[20:19:13 INFO]: Cocoa Growth Modifier: 100%
[20:19:13 INFO]: Bamboo Growth Modifier: 100%
[20:19:13 INFO]: SweetBerry Growth Modifier: 100%
[20:19:13 INFO]: Kelp Growth Modifier: 100%
[20:19:13 INFO]: Entity Activation Range: An 32 / Mo 32 / Ra 48 / Mi 16 / Tiv true
[20:19:13 INFO]: Entity Tracking Range: Pl 48 / An 48 / Mo 48 / Mi 32 / Other 64
[20:19:13 INFO]: Custom Map Seeds:  Village: 10387312 Desert: 14357617 Igloo: 14357618 Jungle: 14357619 Swamp: 14357620 Monument: 10387313 Ocean: 14357621 Shipwreck: 165745295 Slime: 987234911
[20:19:13 INFO]: Max TNT Explosions: 100
[20:19:13 INFO]: Tile Max Tick Time: 50ms Entity max Tick Time: 50ms
[20:19:13 INFO]: -------- World Settings For [world_nether] --------
[20:19:13 INFO]: View Distance: 10
[20:19:13 INFO]: Allow Zombie Pigmen to spawn from portal blocks: true
[20:19:13 INFO]: Arrow Despawn Rate: 1200 Trident Respawn Rate:1200
[20:19:13 INFO]: Item Merge Radius: 2.5
[20:19:13 INFO]: Item Despawn Rate: 6000
[20:19:13 INFO]: Zombie Aggressive Towards Villager: true
[20:19:13 INFO]: Nerfing mobs spawned from spawners: false
[20:19:13 INFO]: Hopper Transfer: 8 Hopper Check: 1 Hopper Amount: 1
[20:19:13 INFO]: Experience Merge Radius: 3.0
[20:19:13 INFO]: Mob Spawn Range: 8
[20:19:13 INFO]: Cactus Growth Modifier: 100%
[20:19:13 INFO]: Cane Growth Modifier: 100%
[20:19:13 INFO]: Melon Growth Modifier: 100%
[20:19:13 INFO]: Mushroom Growth Modifier: 100%
[20:19:13 INFO]: Pumpkin Growth Modifier: 100%
[20:19:13 INFO]: Sapling Growth Modifier: 100%
[20:19:13 INFO]: Beetroot Growth Modifier: 100%
[20:19:13 INFO]: Carrot Growth Modifier: 100%
[20:19:13 INFO]: Potato Growth Modifier: 100%
[20:19:13 INFO]: Wheat Growth Modifier: 100%
[20:19:13 INFO]: NetherWart Growth Modifier: 100%
[20:19:13 INFO]: Vine Growth Modifier: 100%
[20:19:13 INFO]: Cocoa Growth Modifier: 100%
[20:19:13 INFO]: Bamboo Growth Modifier: 100%
[20:19:13 INFO]: SweetBerry Growth Modifier: 100%
[20:19:13 INFO]: Kelp Growth Modifier: 100%
[20:19:13 INFO]: Entity Activation Range: An 32 / Mo 32 / Ra 48 / Mi 16 / Tiv true
[20:19:13 INFO]: Entity Tracking Range: Pl 48 / An 48 / Mo 48 / Mi 32 / Other 64
[20:19:13 INFO]: Custom Map Seeds:  Village: 10387312 Desert: 14357617 Igloo: 14357618 Jungle: 14357619 Swamp: 14357620 Monument: 10387313 Ocean: 14357621 Shipwreck: 165745295 Slime: 987234911
[20:19:13 INFO]: Max TNT Explosions: 100
[20:19:13 INFO]: Tile Max Tick Time: 50ms Entity max Tick Time: 50ms
[20:19:13 INFO]: -------- World Settings For [world_the_end] --------
[20:19:13 INFO]: View Distance: 10
[20:19:13 INFO]: Allow Zombie Pigmen to spawn from portal blocks: true
[20:19:13 INFO]: Arrow Despawn Rate: 1200 Trident Respawn Rate:1200
[20:19:13 INFO]: Item Merge Radius: 2.5
[20:19:13 INFO]: Item Despawn Rate: 6000
[20:19:13 INFO]: Zombie Aggressive Towards Villager: true
[20:19:13 INFO]: Nerfing mobs spawned from spawners: false
[20:19:13 INFO]: Hopper Transfer: 8 Hopper Check: 1 Hopper Amount: 1
[20:19:13 INFO]: Experience Merge Radius: 3.0
[20:19:13 INFO]: Mob Spawn Range: 8
[20:19:13 INFO]: Cactus Growth Modifier: 100%
[20:19:13 INFO]: Cane Growth Modifier: 100%
[20:19:13 INFO]: Melon Growth Modifier: 100%
[20:19:13 INFO]: Mushroom Growth Modifier: 100%
[20:19:13 INFO]: Pumpkin Growth Modifier: 100%
[20:19:13 INFO]: Sapling Growth Modifier: 100%
[20:19:13 INFO]: Beetroot Growth Modifier: 100%
[20:19:13 INFO]: Carrot Growth Modifier: 100%
[20:19:13 INFO]: Potato Growth Modifier: 100%
[20:19:13 INFO]: Wheat Growth Modifier: 100%
[20:19:13 INFO]: NetherWart Growth Modifier: 100%
[20:19:13 INFO]: Vine Growth Modifier: 100%
[20:19:13 INFO]: Cocoa Growth Modifier: 100%
[20:19:13 INFO]: Bamboo Growth Modifier: 100%
[20:19:13 INFO]: SweetBerry Growth Modifier: 100%
[20:19:13 INFO]: Kelp Growth Modifier: 100%
[20:19:13 INFO]: Entity Activation Range: An 32 / Mo 32 / Ra 48 / Mi 16 / Tiv true
[20:19:13 INFO]: Entity Tracking Range: Pl 48 / An 48 / Mo 48 / Mi 32 / Other 64
[20:19:13 INFO]: Custom Map Seeds:  Village: 10387312 Desert: 14357617 Igloo: 14357618 Jungle: 14357619 Swamp: 14357620 Monument: 10387313 Ocean: 14357621 Shipwreck: 165745295 Slime: 987234911
[20:19:13 INFO]: Max TNT Explosions: 100
[20:19:13 INFO]: Tile Max Tick Time: 50ms Entity max Tick Time: 50ms
[20:19:13 INFO]: [ServerTap] Disabling ServerTap v1.0-SNAPSHOT
[20:19:13 INFO]: Reloading ResourceManager: Default, bukkit
[20:19:13 INFO]: Loaded 6 recipes
[20:19:13 INFO]: Reloading ResourceManager: Default, bukkit
[20:19:13 INFO]: Loaded 6 recipes
[20:19:13 INFO]: [ServerTap] Loading ServerTap v1.0-SNAPSHOT
[20:19:14 INFO]: Server permissions file permissions.yml is empty, ignoring it
[20:19:14 INFO]: [ServerTap] Enabling ServerTap v1.0-SNAPSHOT
[20:19:14 INFO]: [io.javalin.Javalin]
           __                      __ _
          / /____ _ _   __ ____ _ / /(_)____
     __  / // __ `/| | / // __ `// // // __ \
    / /_/ // /_/ / | |/ // /_/ // // // / / /
    \____/ \__,_/  |___/ \__,_//_//_//_/ /_/

        https://javalin.io/documentation

[20:19:14 INFO]: [org.eclipse.jetty.util.log] Logging initialized @119728ms to org.eclipse.jetty.util.log.Slf4jLog
[20:19:14 INFO]: [io.javalin.Javalin] Starting Javalin ...
[20:19:14 ERROR]: [io.javalin.Javalin] Failed to start Javalin
[20:19:14 INFO]: [io.javalin.Javalin] Stopping Javalin ...
[20:19:14 INFO]: [io.javalin.Javalin] Javalin has stopped
[20:19:14 ERROR]: Error occurred while enabling ServerTap v1.0-SNAPSHOT (Is it up to date?)
java.lang.RuntimeException: Port already in use. Make sure no other process is using port 4567 and try again.
	at io.javalin.Javalin.start(Javalin.java:182) ~[?:?]
	at io.javalin.Javalin.start(Javalin.java:150) ~[?:?]
	at io.servertap.PluginEntrypoint.onEnable(PluginEntrypoint.java:55) ~[?:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:435) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:470) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:384) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.craftbukkit.v1_15_R1.CraftServer.reload(CraftServer.java:862) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.Bukkit.reload(Bukkit.java:610) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchCommand(CraftServer.java:742) ~[patched_1.15.2.jar:git-Paper-89]
	at org.bukkit.craftbukkit.v1_15_R1.CraftServer.dispatchServerCommand(CraftServer.java:704) ~[patched_1.15.2.jar:git-Paper-89]
	at net.minecraft.server.v1_15_R1.DedicatedServer.handleCommandQueue(DedicatedServer.java:469) ~[patched_1.15.2.jar:git-Paper-89]
	at net.minecraft.server.v1_15_R1.DedicatedServer.b(DedicatedServer.java:431) ~[patched_1.15.2.jar:git-Paper-89]
	at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:1112) ~[patched_1.15.2.jar:git-Paper-89]
	at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:934) ~[patched_1.15.2.jar:git-Paper-89]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: java.io.IOException: Failed to bind to 0.0.0.0/0.0.0.0:4567
	at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:346) ~[?:?]
	at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:307) ~[?:?]
	at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) ~[?:?]
	at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:231) ~[?:?]
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) ~[?:?]
	at org.eclipse.jetty.server.Server.doStart(Server.java:385) ~[?:?]
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) ~[?:?]
	at io.javalin.core.JavalinServer.start(JavalinServer.kt:72) ~[?:?]
	at io.javalin.Javalin.start(Javalin.java:172) ~[?:?]
	... 18 more
Caused by: java.net.BindException: Address already in use
	at sun.nio.ch.Net.bind0(Native Method) ~[?:1.8.0_181]
	at sun.nio.ch.Net.bind(Net.java:433) ~[?:1.8.0_181]
	at sun.nio.ch.Net.bind(Net.java:425) ~[?:1.8.0_181]
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[?:1.8.0_181]
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74) ~[?:1.8.0_181]
	at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:342) ~[?:?]
	at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:307) ~[?:?]
	at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80) ~[?:?]
	at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:231) ~[?:?]
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) ~[?:?]
	at org.eclipse.jetty.server.Server.doStart(Server.java:385) ~[?:?]
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72) ~[?:?]
	at io.javalin.core.JavalinServer.start(JavalinServer.kt:72) ~[?:?]
	at io.javalin.Javalin.start(Javalin.java:172) ~[?:?]
	... 18 more
[20:19:14 INFO]: [ServerTap] Disabling ServerTap v1.0-SNAPSHOT
[20:19:14 INFO]: CONSOLE: Reload complete.
[20:19:14 INFO]: Timings Reset
>

Not 100% sure it's that big of a deal since it's not a supported command, but it might be nice to investigate if anything can be done.

[Request] Economy comparable, New endpoint

Many server may using following this plugin for comparable there economy system
Essentialx, GemsEconomy, etc.

Request Endpoint:
/v1/groups | This endpoint can give group permission using plugin like Luckperms, bPermission, etc

This my help people to do thing outside minecraft server that work with java or not

Discord, Slack, Gitter or Rocketchat group

@phybros It seems like there are quite a few people aware of this project, it would be cool to have a place you can funnel people if they want to ask questions or give feedback without spamming the Github issues. Is that something you would want to have? Given the nature of this project, I think a discord server would make sense but really any kind of group chat platform would work.

Missing Economy makes Vault appear as it doesn't exist

If you have vault installed but no economy plugin hitting /v1/economy returns the following:

{
  "title": "Vault not found. Related functionality disabled",
  "status": 500,
  "type": "https://javalin.io/documentation#internalservererrorresponse",
  "details": []
}

This error is incorrect and should say that no economy plugin was found.

Errors in log about missing vault when opening swagger

First off:

[13Sep2022 18:18:27.050] [Server thread/INFO] [ServerTap/]: Enabling ServerTap v0.3.1
[13Sep2022 18:18:27.066] [Server thread/INFO] [Minecraft/]: [ServerTap] No Vault plugin detected
[13Sep2022 18:18:27.188] [Server thread/WARN] [Minecraft/]: [ServerTap] TLS is not enabled.
[13Sep2022 18:18:27.199] [Server thread/INFO] [Minecraft/]: [ServerTap] Enabling CORS for *
[13Sep2022 18:18:27.219] [Server thread/WARN] [io.javalin.Javalin/]: JDK15 and Kotlin 1.5 break reflection in different ways - the OpenAPI plugin will not work properly. Please visit https://github.com/tipsy/javalin/issues/1193 if you want to help fix this issue.
[13Sep2022 18:18:27.219] [Server thread/WARN] [io.javalin.Javalin/]: You can disable this warning by doing `OpenApiVersionUtil.logWarnings = false`
[13Sep2022 18:18:27.299] [Server thread/INFO] [org.eclipse.jetty.util.log/]: Logging initialized @81544ms to org.eclipse.jetty.util.log.Slf4jLog
[13Sep2022 18:18:27.439] [Server thread/INFO] [io.javalin.Javalin/]: Starting Javalin ...
[13Sep2022 18:18:27.446] [Server thread/INFO] [io.javalin.Javalin/]: You are running Javalin 4.6.4 (released July 8, 2022).
[13Sep2022 18:18:27.916] [Server thread/INFO] [io.javalin.Javalin/]: Static file handler added: StaticFileConfig(hostedPath=/, directory=META-INF/resources/webjars, location=CLASSPATH, precompress=false, aliasCheck=null, headers={Cache-Control=max-age=31622400}). File system location: 'jar:file:/home/container/plugins/ServerTap-0.3.1.jar!/META-INF/resources/webjars'
[13Sep2022 18:18:27.916] [Server thread/INFO] [io.javalin.Javalin/]: Listening on http://localhost:9998/
[13Sep2022 18:18:27.916] [Server thread/INFO] [io.javalin.Javalin/]: Javalin started in 485ms \o/

I got two exceptions while trying out the swagger on a custom port on servertap. First:
Can't read from file http://myserverip:9998/swagger-docs"

and exceptions in the console. I don't have the vault plugin, since I thought it is a soft-dependency:

[13Sep2022 18:59:59.973] [JettyServerThreadPool-157/ERROR] [io.javalin.Javalin/]: Exception occurred while servicing http-request
java.util.concurrent.CompletionException: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1194) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:181) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:137) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) [ServerTap-0.3.1.jar:?] {}
	at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
Caused by: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at io.izzel.arclight.common.mod.util.remapper.ClassLoaderRemapper.tryDefineClass(ClassLoaderRemapper.java:183) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {re:mixin,re:classloading}
	at io.izzel.arclight.common.mod.util.remapper.generated.ArclightReflectionHandler_11.redirectGetDeclaredFields(ArclightReflectionHandler.java:78) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {}
	at io.javalin.core.util.ReflectionUtilKt.getJavaFieldName(ReflectionUtil.kt:12) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.isJavaField(ReflectionUtil.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.getLambdaField(ReflectionUtil.kt:65) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.Reflection.getLambdaField(ReflectionUtil.kt:118) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.getOpenApiAnnotationFromReference(extractDocumentation.kt:83) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.extractDocumentation(extractDocumentation.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiBuilderDslKt.applyMetaInfoList(openApiBuilderDsl.kt:42) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:54) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiUpdaterDslKt.updateComponents(openApiUpdaterDsl.kt:19) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.runWithModelConverter(JavalinOpenApi.kt:72) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.access$runWithModelConverter(JavalinOpenApi.kt:1) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi.createSchema(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.createOpenAPISchema(OpenApiHandler.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.initializeSchemaSynchronized(OpenApiHandler.kt:121) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.handle(OpenApiHandler.kt:129) ~[ServerTap-0.3.1.jar:?] {}
	at io.servertap.PluginEntrypoint.lambda$onEnable$1(PluginEntrypoint.java:153) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:99) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	... 44 more
[13Sep2022 18:59:59.975] [JettyServerThreadPool-154/ERROR] [io.javalin.Javalin/]: Exception occurred while servicing http-request
java.util.concurrent.CompletionException: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1194) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:181) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) [ServerTap-0.3.1.jar:?] {}
	at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
Caused by: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at io.izzel.arclight.common.mod.util.remapper.ClassLoaderRemapper.tryDefineClass(ClassLoaderRemapper.java:183) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {re:mixin,re:classloading}
	at io.izzel.arclight.common.mod.util.remapper.generated.ArclightReflectionHandler_11.redirectGetDeclaredFields(ArclightReflectionHandler.java:78) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {}
	at io.javalin.core.util.ReflectionUtilKt.getJavaFieldName(ReflectionUtil.kt:12) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.isJavaField(ReflectionUtil.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.getLambdaField(ReflectionUtil.kt:65) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.Reflection.getLambdaField(ReflectionUtil.kt:118) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.getOpenApiAnnotationFromReference(extractDocumentation.kt:83) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.extractDocumentation(extractDocumentation.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiBuilderDslKt.applyMetaInfoList(openApiBuilderDsl.kt:42) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:54) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiUpdaterDslKt.updateComponents(openApiUpdaterDsl.kt:19) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.runWithModelConverter(JavalinOpenApi.kt:72) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.access$runWithModelConverter(JavalinOpenApi.kt:1) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi.createSchema(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.createOpenAPISchema(OpenApiHandler.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.initializeSchemaSynchronized(OpenApiHandler.kt:121) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.handle(OpenApiHandler.kt:129) ~[ServerTap-0.3.1.jar:?] {}
	at io.servertap.PluginEntrypoint.lambda$onEnable$1(PluginEntrypoint.java:153) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:99) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	... 45 more
[13Sep2022 18:59:59.978] [JettyServerThreadPool-403/ERROR] [io.javalin.Javalin/]: Exception occurred while servicing http-request
java.util.concurrent.CompletionException: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:315) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1194) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask$lambda-11$lambda-10(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:684) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:662) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2168) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:119) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$javalin(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.service(JavalinServlet.kt:89) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.jetty.JettyServer$start$wsAndHttpHandler$1.doHandle(JettyServer.kt:52) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:181) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.Server.handle(Server.java:516) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) ~[ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) [ServerTap-0.3.1.jar:?] {}
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) [ServerTap-0.3.1.jar:?] {}
	at java.lang.Thread.run(Thread.java:833) [?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
Caused by: java.lang.NoClassDefFoundError: net/milkbowl/vault/economy/Economy
	at io.izzel.arclight.common.mod.util.remapper.ClassLoaderRemapper.tryDefineClass(ClassLoaderRemapper.java:183) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {re:mixin,re:classloading}
	at io.izzel.arclight.common.mod.util.remapper.generated.ArclightReflectionHandler_11.redirectGetDeclaredFields(ArclightReflectionHandler.java:78) ~[arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe.jar%2369!/:arclight-1.18.2-1.0.7-SNAPSHOT-7d2418fe] {}
	at io.javalin.core.util.ReflectionUtilKt.getJavaFieldName(ReflectionUtil.kt:12) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.isJavaField(ReflectionUtil.kt:58) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.ReflectionUtilKt.getLambdaField(ReflectionUtil.kt:65) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.core.util.Reflection.getLambdaField(ReflectionUtil.kt:118) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.getOpenApiAnnotationFromReference(extractDocumentation.kt:83) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.ExtractDocumentationKt.extractDocumentation(extractDocumentation.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiBuilderDslKt.applyMetaInfoList(openApiBuilderDsl.kt:42) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:54) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1$1$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.dsl.OpenApiUpdaterDslKt.updateComponents(openApiUpdaterDsl.kt:19) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:53) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi$createSchema$1.invoke(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.runWithModelConverter(JavalinOpenApi.kt:72) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApiKt.access$runWithModelConverter(JavalinOpenApi.kt:1) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.JavalinOpenApi.createSchema(JavalinOpenApi.kt:49) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.createOpenAPISchema(OpenApiHandler.kt:41) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.initializeSchemaSynchronized(OpenApiHandler.kt:121) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.plugin.openapi.OpenApiHandler.handle(OpenApiHandler.kt:129) ~[ServerTap-0.3.1.jar:?] {}
	at io.servertap.PluginEntrypoint.lambda$onEnable$1(PluginEntrypoint.java:153) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet.addHandler$lambda-0(JavalinServlet.kt:96) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServlet$lifecycle$2$1$1.invoke(JavalinServlet.kt:43) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.executeNextTask(JavalinServletHandler.kt:99) ~[ServerTap-0.3.1.jar:?] {}
	at io.javalin.http.JavalinServletHandler.queueNextTaskOrFinish$lambda-1(JavalinServletHandler.kt:85) ~[ServerTap-0.3.1.jar:?] {}
	at java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[?:?] {re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin,re:mixin}
	... 45 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.