diff --git a/pom.xml b/pom.xml
index 3153ca2..133ded2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
xyz.tronax
ZalmikConnectVelocity
- 1.0
+ 2.0
jar
ZalmikConnectVelocity
diff --git a/src/main/java/xyz/tronax/zalmikConnectVelocity/ZalmikConnectVelocity.java b/src/main/java/xyz/tronax/zalmikConnectVelocity/ZalmikConnectVelocity.java
index 2c5e5a7..390ff1d 100644
--- a/src/main/java/xyz/tronax/zalmikConnectVelocity/ZalmikConnectVelocity.java
+++ b/src/main/java/xyz/tronax/zalmikConnectVelocity/ZalmikConnectVelocity.java
@@ -1,18 +1,151 @@
package xyz.tronax.zalmikConnectVelocity;
import com.google.inject.Inject;
-import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+import com.velocitypowered.api.event.connection.PostLoginEvent;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.plugin.Plugin;
+import com.velocitypowered.api.proxy.Player;
+import com.velocitypowered.api.proxy.ProxyServer;
import org.slf4j.Logger;
-@Plugin(id = "zalmikconnectvelocity", name = "ZalmikConnectVelocity", version = "1.0", description = "Chest and Hotbar Items!", url = "https://tronax.xyz", authors = {"Tronax_"})
+import java.io.*;
+import java.net.InetSocketAddress;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+@Plugin(id = "zalmikconnectvelocity", name = "ZalmikConnectVelocity", version = "2.0", description = "Connect MC Server with Discord!", url = "https://tronax.xyz", authors = {"Tronax_"})
public class ZalmikConnectVelocity {
- @Inject
+ private ProxyServer server;
private Logger logger;
+ private final Map verificationCodes = new HashMap<>();
+ private final Map verifiedPlayers = new HashMap<>();
+ private static final String DATA_FILE = "verified_players.dat";
+
+ @Inject
+ public void DiscordLinkPlugin(ProxyServer server, Logger logger) {
+ this.server = server;
+ this.logger = logger;
+ loadVerifiedPlayers();
+ startHttpServer();
+ }
@Subscribe
- public void onProxyInitialization(ProxyInitializeEvent event) {
+ public void onPostLogin(PostLoginEvent event) {
+ Player player = event.getPlayer();
+ if (verifiedPlayers.getOrDefault(player.getUniqueId(), false)) {
+ player.sendMessage(net.kyori.adventure.text.Component.text("§e§lZalmik §r§8| §3Du bist bereits mit Discord verbunden!"));
+ } else {
+ String code = generateVerificationCode();
+ verificationCodes.put(player.getUniqueId(), code);
+ player.sendMessage(net.kyori.adventure.text.Component.text("§e§lZalmik §r§8| §3Nutze diesen Code um deinen Discord Account zu verbinden: §c" + code));
+ player.sendMessage(net.kyori.adventure.text.Component.text("§e§lZalmik §r§8| §3Nutze §c/verify §3im Discord um den Vorgang abzuschließen."));
+ }
+ }
+
+ private String generateVerificationCode() {
+ return UUID.randomUUID().toString().substring(0, 6); // 6-character code
+ }
+
+ private void startHttpServer() {
+ try {
+ HttpServer server = HttpServer.create(new InetSocketAddress(3636), 0);
+ server.createContext("/verify", new VerificationHandler());
+ server.setExecutor(null); // creates a default executor
+ server.start();
+ logger.info("HTTP server started on port 3636");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private class VerificationHandler implements HttpHandler {
+ @Override
+ public void handle(HttpExchange exchange) throws IOException {
+ if ("POST".equals(exchange.getRequestMethod())) {
+ String query = exchange.getRequestURI().getQuery();
+ Map params = queryToMap(query);
+
+ String discordId = params.get("discordId");
+ String code = params.get("code");
+
+ UUID playerId = null;
+ for (Map.Entry entry : verificationCodes.entrySet()) {
+ if (entry.getValue().equals(code)) {
+ playerId = entry.getKey();
+ break;
+ }
+ }
+
+ String response;
+ if (playerId != null && verificationCodes.get(playerId).equals(code)) {
+ verificationCodes.remove(playerId);
+ verifiedPlayers.put(playerId, true);
+ saveVerifiedPlayers();
+ exchange.sendResponseHeaders(200, 0);
+ response = "{\"success\": true}";
+ logger.info("Player with UUID " + playerId + " successfully linked their Discord account.");
+ } else {
+ exchange.sendResponseHeaders(400, 0);
+ response = "{\"success\": false}";
+ logger.info("Failed verification attempt for Discord ID " + discordId);
+ }
+
+ OutputStream os = exchange.getResponseBody();
+ os.write(response.getBytes());
+ os.close();
+ } else {
+ exchange.sendResponseHeaders(405, 0); // Method Not Allowed
+ exchange.close();
+ }
+ }
+
+ private Map queryToMap(String query) {
+ Map result = new HashMap<>();
+ if (query != null) {
+ for (String param : query.split("&")) {
+ String[] entry = param.split("=");
+ if (entry.length > 1) {
+ result.put(entry[0], entry[1]);
+ } else {
+ result.put(entry[0], "");
+ }
+ }
+ }
+ return result;
+ }
+ }
+
+ private void saveVerifiedPlayers() {
+ try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(DATA_FILE))) {
+ oos.writeObject(verifiedPlayers);
+ logger.info("Verified players data saved successfully.");
+ } catch (IOException e) {
+ logger.error("Failed to save verified players data.", e);
+ }
+ }
+
+ private void loadVerifiedPlayers() {
+ Path path = Paths.get(DATA_FILE);
+ if (Files.exists(path)) {
+ try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(DATA_FILE))) {
+ Object obj = ois.readObject();
+ if (obj instanceof HashMap) {
+ verifiedPlayers.putAll((HashMap) obj);
+ logger.info("Verified players data loaded successfully.");
+ }
+ } catch (IOException | ClassNotFoundException e) {
+ logger.error("Failed to load verified players data.", e);
+ }
+ } else {
+ logger.info("No verified players data file found, starting fresh.");
+ }
}
}