Giter Club home page Giter Club logo

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

Support for SSL

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

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.

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)

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))

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

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.

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.

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) ~[?:?]

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

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!

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.

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)

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) ~[?:?]

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}

Advancements

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

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

[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

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

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.

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

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)

More plugin data

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

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.

[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

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

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.

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

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"
}

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.

Secure

Is it secure to transfer data with this plugin?

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 )

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.

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.