From c2f3201533a57573fb9a183ea176b38b4fb807c8 Mon Sep 17 00:00:00 2001
From: Phoenix616 <max@themoep.de>
Date: Wed, 27 Mar 2024 20:42:48 +0100
Subject: [PATCH] Update to latest Velocity and Waterfall

Also use Java 17 now seeing as Velocity requires it now too!
---
 pom.xml                                       | 16 +++----
 .../java/de/themoep/snap/PluginConfig.java    | 48 ++++++++++---------
 .../themoep/snap/forwarding/SnapPlayer.java   | 34 +++++++++++++
 .../listener/ForwardingListener.java          | 15 ++++++
 .../forwarding/listener/PreLoginListener.java | 15 ++++++
 5 files changed, 98 insertions(+), 30 deletions(-)

diff --git a/pom.xml b/pom.xml
index 96fd2b9..a4b086f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,12 +7,12 @@
 
     <groupId>de.themoep</groupId>
     <artifactId>snap</artifactId>
-    <version>1.1-SNAPSHOT</version>
+    <version>1.2-SNAPSHOT</version>
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <maven.compiler.target>1.8</maven.compiler.target>
-        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <maven.compiler.source>17</maven.compiler.source>
         <build.number>${buildNumber}</build.number>
         <minecraft.plugin.version>${project.version} ${buildDescription}</minecraft.plugin.version>
     </properties>
@@ -28,13 +28,13 @@
         <dependency>
             <groupId>com.velocitypowered</groupId>
             <artifactId>velocity-api</artifactId>
-            <version>3.1.1</version>
+            <version>3.3.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>io.github.waterfallmc</groupId>
             <artifactId>waterfall-api</artifactId>
-            <version>1.19-R0.1-SNAPSHOT</version>
+            <version>1.20-R0.3-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
         <!-- API requirements, not actually part of API -->
@@ -80,7 +80,7 @@
         <dependency>
             <groupId>com.mysql</groupId>
             <artifactId>mysql-connector-j</artifactId>
-            <version>8.0.33</version>
+            <version>8.2.0</version>
             <scope>runtime</scope>
         </dependency>
     </dependencies>
@@ -131,7 +131,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
+                <version>3.11.0</version>
                 <configuration>
                     <proc>none</proc>
                 </configuration>
@@ -139,7 +139,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
-                <version>3.2.3</version>
+                <version>3.5.1</version>
                 <executions>
                     <execution>
                         <phase>package</phase>
diff --git a/src/main/java/de/themoep/snap/PluginConfig.java b/src/main/java/de/themoep/snap/PluginConfig.java
index 7c7483b..ec880f3 100644
--- a/src/main/java/de/themoep/snap/PluginConfig.java
+++ b/src/main/java/de/themoep/snap/PluginConfig.java
@@ -17,11 +17,10 @@
  * You should have received a copy of the GNU Lesser General Public
  * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-import com.typesafe.config.ConfigParseOptions;
-import com.typesafe.config.ConfigRenderOptions;
-import ninja.leaping.configurate.ConfigurationNode;
-import ninja.leaping.configurate.hocon.HoconConfigurationLoader;
-import ninja.leaping.configurate.yaml.YAMLConfigurationLoader;
+
+import org.spongepowered.configurate.ConfigurationNode;
+import org.spongepowered.configurate.hocon.HoconConfigurationLoader;
+import org.spongepowered.configurate.serialize.SerializationException;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -51,9 +50,7 @@ public PluginConfig(Snap plugin, Path configFile, String defaultFile) {
         this.configFile = configFile;
         this.defaultFile = defaultFile;
         configLoader = HoconConfigurationLoader.builder()
-                .setPath(configFile)
-                .setParseOptions(ConfigParseOptions.defaults())
-                .setRenderOptions(ConfigRenderOptions.defaults())
+                .path(configFile)
                 .build();
     }
 
@@ -62,13 +59,11 @@ public boolean load() {
             config = configLoader.load();
             if (defaultFile != null && plugin.getClass().getClassLoader().getResource(defaultFile) != null) {
                 defaultConfig = HoconConfigurationLoader.builder()
-                        .setPath(configFile)
-                        .setParseOptions(ConfigParseOptions.defaults())
-                        .setRenderOptions(ConfigRenderOptions.defaults())
-                        .setSource(() -> new BufferedReader(new InputStreamReader(plugin.getClass().getClassLoader().getResourceAsStream(defaultFile))))
+                        .path(configFile)
+                        .source(() -> new BufferedReader(new InputStreamReader(plugin.getClass().getClassLoader().getResourceAsStream(defaultFile))))
                         .build()
                         .load();
-                if (config.isEmpty()) {
+                if (config.empty()) {
                     config = defaultConfig.copy();
                 }
             }
@@ -113,15 +108,24 @@ public void save() {
     }
 
     public Object set(String path, Object value) {
-        ConfigurationNode node = config.getNode(splitPath(path));
-        Object prev = node.getValue();
-        node.setValue(value);
+        ConfigurationNode node = config.node(splitPath(path));
+        Object prev = node.raw();
+        try {
+            node.set(value);
+        } catch (SerializationException e) {
+            plugin.getLogger().error("Could not set node at " + path, e);
+        }
         return prev;
     }
 
     public ConfigurationNode remove(String path) {
-        ConfigurationNode node = config.getNode(splitPath(path));
-        return node.isVirtual() ? node : node.setValue(null);
+        ConfigurationNode node = config.node(splitPath(path));
+        try {
+            return node.virtual() ? node : node.set(null);
+        } catch (SerializationException e) {
+            plugin.getLogger().error("Could not remove node at " + path, e);
+            return null;
+        }
     }
 
     public ConfigurationNode getRawConfig() {
@@ -129,15 +133,15 @@ public ConfigurationNode getRawConfig() {
     }
 
     public ConfigurationNode getRawConfig(String path) {
-        return getRawConfig().getNode(splitPath(path));
+        return getRawConfig().node(splitPath(path));
     }
 
     public boolean has(String path) {
-        return !getRawConfig(path).isVirtual();
+        return !getRawConfig(path).virtual();
     }
 
     public boolean isSection(String path) {
-        return getRawConfig(path).hasMapChildren();
+        return getRawConfig(path).isMap();
     }
     
     public int getInt(String path) {
@@ -157,7 +161,7 @@ public double getDouble(String path, double def) {
     }
     
     public String getString(String path) {
-        return getString(path, null);
+        return getRawConfig(path).getString();
     }
 
     public String getString(String path, String def) {
diff --git a/src/main/java/de/themoep/snap/forwarding/SnapPlayer.java b/src/main/java/de/themoep/snap/forwarding/SnapPlayer.java
index 159e0f6..cd174cf 100644
--- a/src/main/java/de/themoep/snap/forwarding/SnapPlayer.java
+++ b/src/main/java/de/themoep/snap/forwarding/SnapPlayer.java
@@ -47,6 +47,7 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 public class SnapPlayer extends SnapCommandSender implements ProxiedPlayer {
@@ -108,6 +109,20 @@ public boolean isLegacy() {
                 return player.getProtocolVersion().isLegacy();
             }
 
+            @Override
+            public boolean isTransferred() {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections are not supported in Velocity's API yet!");
+                return false;
+            }
+
+            @Override
+            public CompletableFuture<byte[]> retrieveCookie(String s) {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+                return null;
+            }
+
             @Override
             public InetSocketAddress getAddress() {
                 return player.getRemoteAddress();
@@ -423,6 +438,25 @@ public Scoreboard getScoreboard() {
         return (Scoreboard) snap.unsupported("Scoreboards are not supported by Snap");
     }
 
+    @Override
+    public CompletableFuture<byte[]> retrieveCookie(String s) {
+        // TODO: Support 1.20.5 features
+        snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+        return CompletableFuture.completedFuture(null);
+    }
+
+    @Override
+    public void storeCookie(String s, byte[] bytes) {
+        // TODO: Support 1.20.5 features
+        snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+    }
+
+    @Override
+    public void transfer(String s, int i) {
+        // TODO: Support 1.20.5 features
+        snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+    }
+
     @Override
     public String getName() {
         return player.getUsername();
diff --git a/src/main/java/de/themoep/snap/forwarding/listener/ForwardingListener.java b/src/main/java/de/themoep/snap/forwarding/listener/ForwardingListener.java
index 9075cf9..152d947 100644
--- a/src/main/java/de/themoep/snap/forwarding/listener/ForwardingListener.java
+++ b/src/main/java/de/themoep/snap/forwarding/listener/ForwardingListener.java
@@ -28,6 +28,7 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 
 public abstract class ForwardingListener {
     protected final Snap snap;
@@ -94,6 +95,20 @@ public boolean isLegacy() {
                 return connection.getProtocolVersion().isLegacy();
             }
 
+            @Override
+            public boolean isTransferred() {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections are not supported in Velocity's API yet!");
+                return false;
+            }
+
+            @Override
+            public CompletableFuture<byte[]> retrieveCookie(String s) {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+                return null;
+            }
+
             @Override
             public InetSocketAddress getAddress() {
                 return connection.getRemoteAddress();
diff --git a/src/main/java/de/themoep/snap/forwarding/listener/PreLoginListener.java b/src/main/java/de/themoep/snap/forwarding/listener/PreLoginListener.java
index 4c99c67..09492e8 100644
--- a/src/main/java/de/themoep/snap/forwarding/listener/PreLoginListener.java
+++ b/src/main/java/de/themoep/snap/forwarding/listener/PreLoginListener.java
@@ -31,6 +31,7 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 
 public class PreLoginListener extends ForwardingListener {
 
@@ -107,6 +108,20 @@ public boolean isLegacy() {
                 return event.getConnection().getProtocolVersion().isLegacy();
             }
 
+            @Override
+            public boolean isTransferred() {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections are not supported in Velocity's API yet!");
+                return false;
+            }
+
+            @Override
+            public CompletableFuture<byte[]> retrieveCookie(String s) {
+                // TODO: Support 1.20.5 features
+                snap.unsupported("Transferred connections and cookies are not supported in Velocity's API yet!");
+                return null;
+            }
+
             @Override
             public InetSocketAddress getAddress() {
                 return event.getConnection().getRemoteAddress();