fix webhook format and cluster repeat detection issues

This commit is contained in:
2026-01-25 19:55:49 -05:00
parent 91b1fa24ba
commit a95f5c02b3
9 changed files with 35 additions and 40 deletions

View File

@@ -79,32 +79,21 @@ public class DetectionEngine implements Listener {
} }
/** /**
* Shutdown the detection engine. * Analyze clusters and generate detection events.
*/ */
public void shutdown() { private void analyzeClusters() {
asyncExecutor.shutdown(); long now = System.currentTimeMillis();
try { long maxAge = 300000L; // 5 minutes default
if (!asyncExecutor.awaitTermination(5, TimeUnit.SECONDS)) {
asyncExecutor.shutdownNow(); for (Map.Entry<String, Cluster> 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());
} }
} }

View File

@@ -141,27 +141,33 @@ public class WebhookManager {
embed.put("color", getConfidenceColor(event.getConfidence())); embed.put("color", getConfidenceColor(event.getConfidence()));
// Fields for additional information // Fields for additional information
StringBuilder fieldsText = new StringBuilder();
// Nearest players field
if (!event.getNearestPlayers().isEmpty()) { if (!event.getNearestPlayers().isEmpty()) {
fieldsText.append("**Players:**\n"); // Players field
StringBuilder playersText = new StringBuilder();
for (DetectionEvent.NearestPlayerInfo player : event.getNearestPlayers()) { for (DetectionEvent.NearestPlayerInfo player : event.getNearestPlayers()) {
String gamemode = player.isSurvival() ? "Survival" : "Creative"; 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)); player.getPlayerName(), player.getDistance(), gamemode));
} }
}
// Teleport command field
// Teleport command field String tpCommand = String.format("/tp %d %d %d",
String tpCommand = String.format("/tp %d %d %d", event.getCenter().getBlockX(),
event.getCenter().getBlockX(), event.getCenter().getBlockY(),
event.getCenter().getBlockY(), event.getCenter().getBlockZ());
event.getCenter().getBlockZ());
fieldsText.append("\n**Teleport:** `").append(tpCommand).append("`"); // Create fields array
ObjectNode playersField = objectMapper.createObjectNode();
if (fieldsText.length() > 0) { playersField.put("name", "Players");
embed.put("fields", fieldsText.toString()); 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 // Timestamp