diff --git a/src/main/java/com/minster586/devmode/ChatEventListener.java b/src/main/java/com/minster586/devmode/ChatEventListener.java index 2b4a8ab..3424990 100644 --- a/src/main/java/com/minster586/devmode/ChatEventListener.java +++ b/src/main/java/com/minster586/devmode/ChatEventListener.java @@ -5,8 +5,8 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.EventPriority; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; +import java.util.Optional; import java.util.stream.Collectors; public class ChatEventListener implements Listener { @@ -20,6 +20,7 @@ public class ChatEventListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onPlayerChat(AsyncPlayerChatEvent event) { if (!manager.isDevModeEnabled()) return; + if (!manager.isChatLoggingEnabled()) return; String sender = event.getPlayer().getName(); boolean isCancelled = event.isCancelled(); @@ -29,20 +30,19 @@ public class ChatEventListener implements Listener { .collect(Collectors.joining(", ")); StringBuilder log = new StringBuilder(); - log.append("[DevMode] CHAT EVENT:\n"); - log.append(" Sender: ").append(sender).append("\n"); - log.append(" Message: \"").append(message).append("\"\n"); + log.append("Sender: ").append(sender).append(" | "); + log.append("Message: \"").append(message).append("\" | "); if (isCancelled) { - log.append(" Status: CANCELLED\n"); - log.append(" Reason: Message was blocked (possible plugin interference)\n"); + Optional blocker = PluginInterceptor.getCancellingPlugin(event); + log.append("Status: CANCELLED | "); + log.append("Blocked by: ").append(blocker.orElse("Unknown")); } else { - log.append(" Status: Delivered\n"); - log.append(" Recipients: ").append(recipients.isEmpty() ? "None" : recipients).append("\n"); + log.append("Status: Delivered | "); + log.append("Recipients: ").append(recipients.isEmpty() ? "None" : recipients); } - System.out.println(log.toString()); - - // Eventually this will route to LogWriter once wired up + // Log to CSV file in /logs/chat/ + manager.getLogWriter().logToCategory("chat", log.toString()); } } diff --git a/src/main/java/com/minster586/devmode/LogWriter.java b/src/main/java/com/minster586/devmode/LogWriter.java index 1b88bcd..4069525 100644 --- a/src/main/java/com/minster586/devmode/LogWriter.java +++ b/src/main/java/com/minster586/devmode/LogWriter.java @@ -1,5 +1,7 @@ package com.minster586.devmode; +import org.bukkit.plugin.Plugin; + import java.io.*; import java.nio.file.*; import java.text.SimpleDateFormat; @@ -9,24 +11,34 @@ import java.util.zip.ZipOutputStream; public class LogWriter { - private static final String BASE_FOLDER = "plugins/ServerDevMode/logs/"; - private static final String ZIP_FOLDER = "plugins/ServerDevMode/zipped_logs/"; - private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + private final String baseFolder = "plugins/ServerDevMode/logs/"; + private final String zipFolder = "plugins/ServerDevMode/zipped_logs/"; - public LogWriter() { - createFolder(BASE_FOLDER); - createFolder(ZIP_FOLDER); + private final SimpleDateFormat timestampFormatter; + private final String fileExtension; + + public LogWriter(Plugin plugin) { + // Load config values + String formatString = plugin.getConfig().getString("timestamp-format", "h:mm a | MM-dd-yyyy"); + this.timestampFormatter = new SimpleDateFormat(formatString); + + this.fileExtension = plugin.getConfig().getString("log-extension", "csv").replace(".", ""); + + // Create folder structure + createFolder(baseFolder); + createFolder(zipFolder); } public void logToCategory(String category, String message) { - String folderPath = BASE_FOLDER + category + "/"; + String folderPath = baseFolder + category + "/"; createFolder(folderPath); - String fileName = "log_" + FORMAT.format(new Date()) + ".log"; + String fileName = "log_" + getTimeStamp("yyyy-MM-dd_HH-mm-ss") + "." + fileExtension; File file = new File(folderPath, fileName); try (BufferedWriter writer = new BufferedWriter(new FileWriter(file, true))) { - String entry = "[" + FORMAT.format(new Date()) + "] " + message; + String timestamp = timestampFormatter.format(new Date()); + String entry = timestamp + "," + message; writer.write(entry); writer.newLine(); } catch (IOException e) { @@ -34,39 +46,44 @@ public class LogWriter { } } - private void createFolder(String path) { - File folder = new File(path); - if (!folder.exists()) folder.mkdirs(); - } - public void zipLogs() { - String zipName = "logs_" + FORMAT.format(new Date()) + ".zip"; - File zipFile = new File(ZIP_FOLDER + zipName); + String zipName = "logs_" + getTimeStamp("yyyy-MM-dd_HH-mm-ss") + ".zip"; + File zipFile = new File(zipFolder + zipName); try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) { - Path basePath = Paths.get(BASE_FOLDER); + Path root = Paths.get(baseFolder); - Files.walk(basePath) + Files.walk(root) .filter(Files::isRegularFile) .forEach(path -> { try (InputStream is = Files.newInputStream(path)) { - String entryName = basePath.relativize(path).toString().replace("\\", "/"); - zos.putNextEntry(new ZipEntry(entryName)); + String entryPath = root.relativize(path).toString().replace("\\", "/"); + zos.putNextEntry(new ZipEntry(entryPath)); byte[] buffer = new byte[4096]; int len; while ((len = is.read(buffer)) > 0) { zos.write(buffer, 0, len); } + zos.closeEntry(); } catch (IOException e) { - System.err.println("Failed to zip file: " + path + " — " + e.getMessage()); + System.err.println("Failed to zip file " + path + ": " + e.getMessage()); } }); - System.out.println("[ServerDevMode] Logs zipped to " + zipFile.getName()); + System.out.println("[ServerDevMode] Logs zipped to: " + zipName); } catch (IOException e) { - System.err.println("Failed to create zip file: " + e.getMessage()); + System.err.println("Zip creation failed: " + e.getMessage()); } } + + private String getTimeStamp(String format) { + return new SimpleDateFormat(format).format(new Date()); + } + + private void createFolder(String path) { + File folder = new File(path); + if (!folder.exists()) folder.mkdirs(); + } }