diff --git a/src/main/java/party/cybsec/griefdetect/core/DetectionEngine.java b/src/main/java/party/cybsec/griefdetect/core/DetectionEngine.java index 505cb59..0405eb8 100644 --- a/src/main/java/party/cybsec/griefdetect/core/DetectionEngine.java +++ b/src/main/java/party/cybsec/griefdetect/core/DetectionEngine.java @@ -79,32 +79,21 @@ public class DetectionEngine implements Listener { } /** - * Shutdown the detection engine. + * Analyze clusters and generate detection events. */ - public void shutdown() { - asyncExecutor.shutdown(); - try { - if (!asyncExecutor.awaitTermination(5, TimeUnit.SECONDS)) { - asyncExecutor.shutdownNow(); + private void analyzeClusters() { + long now = System.currentTimeMillis(); + long maxAge = 300000L; // 5 minutes default + + for (Map.Entry entry : activeClusters.entrySet()) { + String worldName = entry.getKey(); + Cluster cluster = entry.getValue(); + + // Only analyze if cluster hasn't been evaluated recently + if (cluster.shouldEvaluate()) { + // Evaluate cluster directly + evaluateCluster(cluster); } - } catch (InterruptedException e) { - asyncExecutor.shutdownNow(); - Thread.currentThread().interrupt(); - } - plugin.getLogger().info("Detection engine stopped"); - } - - /** - * Event capture methods - minimal processing on main thread. - */ - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockFromTo(BlockFromToEvent event) { - // Capture lava-water interactions - if (event.getBlock().getType().name().contains("LAVA") && - (event.getToBlock().getType().name().contains("WATER") || - event.getToBlock().getType().name().contains("ICE"))) { - processBlockEvent(event.getBlock(), event.getToBlock().getLocation()); } } diff --git a/src/main/java/party/cybsec/griefdetect/core/WebhookManager.java b/src/main/java/party/cybsec/griefdetect/core/WebhookManager.java index 74bb30f..b1e56f7 100644 --- a/src/main/java/party/cybsec/griefdetect/core/WebhookManager.java +++ b/src/main/java/party/cybsec/griefdetect/core/WebhookManager.java @@ -141,27 +141,33 @@ public class WebhookManager { embed.put("color", getConfidenceColor(event.getConfidence())); // Fields for additional information - StringBuilder fieldsText = new StringBuilder(); - - // Nearest players field if (!event.getNearestPlayers().isEmpty()) { - fieldsText.append("**Players:**\n"); + // Players field + StringBuilder playersText = new StringBuilder(); for (DetectionEvent.NearestPlayerInfo player : event.getNearestPlayers()) { String gamemode = player.isSurvival() ? "Survival" : "Creative"; - fieldsText.append(String.format("- %s (%.1fm, %s)\n", + playersText.append(String.format("- %s (%.1fm, %s)\n", player.getPlayerName(), player.getDistance(), gamemode)); } - } - - // Teleport command field - String tpCommand = String.format("/tp %d %d %d", - event.getCenter().getBlockX(), - event.getCenter().getBlockY(), - event.getCenter().getBlockZ()); - fieldsText.append("\n**Teleport:** `").append(tpCommand).append("`"); - - if (fieldsText.length() > 0) { - embed.put("fields", fieldsText.toString()); + + // Teleport command field + String tpCommand = String.format("/tp %d %d %d", + event.getCenter().getBlockX(), + event.getCenter().getBlockY(), + event.getCenter().getBlockZ()); + + // Create fields array + ObjectNode playersField = objectMapper.createObjectNode(); + playersField.put("name", "Players"); + playersField.put("value", playersText.toString()); + playersField.put("inline", false); + + ObjectNode teleportField = objectMapper.createObjectNode(); + teleportField.put("name", "Teleport Command"); + teleportField.put("value", "`" + tpCommand + "`"); + teleportField.put("inline", false); + + embed.set("fields", objectMapper.createArrayNode().add(playersField).add(teleportField)); } // Timestamp diff --git a/target/classes/party/cybsec/griefdetect/core/DetectionEngine$Cluster.class b/target/classes/party/cybsec/griefdetect/core/DetectionEngine$Cluster.class index 6bca9b9..2ebe44a 100644 Binary files a/target/classes/party/cybsec/griefdetect/core/DetectionEngine$Cluster.class and b/target/classes/party/cybsec/griefdetect/core/DetectionEngine$Cluster.class differ diff --git a/target/classes/party/cybsec/griefdetect/core/DetectionEngine$PlayerPosition.class b/target/classes/party/cybsec/griefdetect/core/DetectionEngine$PlayerPosition.class index 0056deb..765c60b 100644 Binary files a/target/classes/party/cybsec/griefdetect/core/DetectionEngine$PlayerPosition.class and b/target/classes/party/cybsec/griefdetect/core/DetectionEngine$PlayerPosition.class differ diff --git a/target/classes/party/cybsec/griefdetect/core/DetectionEngine.class b/target/classes/party/cybsec/griefdetect/core/DetectionEngine.class index bc5e1bf..bdcb024 100644 Binary files a/target/classes/party/cybsec/griefdetect/core/DetectionEngine.class and b/target/classes/party/cybsec/griefdetect/core/DetectionEngine.class differ diff --git a/target/classes/party/cybsec/griefdetect/core/WebhookManager$WebhookCallback.class b/target/classes/party/cybsec/griefdetect/core/WebhookManager$WebhookCallback.class index cd04b69..6a309a7 100644 Binary files a/target/classes/party/cybsec/griefdetect/core/WebhookManager$WebhookCallback.class and b/target/classes/party/cybsec/griefdetect/core/WebhookManager$WebhookCallback.class differ diff --git a/target/classes/party/cybsec/griefdetect/core/WebhookManager.class b/target/classes/party/cybsec/griefdetect/core/WebhookManager.class index 17ded07..23aa03e 100644 Binary files a/target/classes/party/cybsec/griefdetect/core/WebhookManager.class and b/target/classes/party/cybsec/griefdetect/core/WebhookManager.class differ diff --git a/target/griefdetect-1.0.0-SNAPSHOT.jar b/target/griefdetect-1.0.0-SNAPSHOT.jar index 4d7aad0..fb7467f 100644 Binary files a/target/griefdetect-1.0.0-SNAPSHOT.jar and b/target/griefdetect-1.0.0-SNAPSHOT.jar differ diff --git a/target/original-griefdetect-1.0.0-SNAPSHOT.jar b/target/original-griefdetect-1.0.0-SNAPSHOT.jar index 48f282e..387d3bb 100644 Binary files a/target/original-griefdetect-1.0.0-SNAPSHOT.jar and b/target/original-griefdetect-1.0.0-SNAPSHOT.jar differ