From e2d76ac1fb3480fdf3191a8a46553089a51315d4 Mon Sep 17 00:00:00 2001 From: deutschich Date: Sun, 7 Sep 2025 20:39:06 +0200 Subject: [PATCH] Preperation for the 1.0.0 release --- pom.xml | 3 +- .../java/com/user404_/tntchat/TNTChat.java | 214 +++++++++++++++++- src/main/resources/plugin.yml | 21 +- src/main/resources/texts.yml | 21 ++ 4 files changed, 250 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index fd7376b..f8ec1b8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,10 +6,11 @@ com.user404_ TNTChat - 1.0-SNAPSHOT + 1.0.0 jar TNTChat + Ein Plugin, das Nachrichten sendet, wenn TNT platziert wird 21 diff --git a/src/main/java/com/user404_/tntchat/TNTChat.java b/src/main/java/com/user404_/tntchat/TNTChat.java index b33297b..e718e58 100644 --- a/src/main/java/com/user404_/tntchat/TNTChat.java +++ b/src/main/java/com/user404_/tntchat/TNTChat.java @@ -1,17 +1,221 @@ -package com.user404_.tNTChat; +package com.user404_.tntchat; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.plugin.java.JavaPlugin; -public final class TNTChat extends JavaPlugin { +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +public final class TNTChat extends JavaPlugin implements Listener { + + private FileConfiguration textsConfig; + private File textsFile; + private Logger logLogger; + private FileHandler logFileHandler; @Override public void onEnable() { - // Plugin startup logic + // Lade oder erstelle die texts.yml + setupTextsConfig(); + // Setup Logging + setupLogging(); + + // Registriere Event-Handler + getServer().getPluginManager().registerEvents(this, this); + + // Registriere Command + getCommand("tntinfo").setExecutor(this); + + // Logge, dass das Plugin aktiviert wurde + getLogger().info(getText("plugin-enabled")); } @Override public void onDisable() { - // Plugin shutdown logic + // Schließe den Log-Handler + if (logFileHandler != null) { + logFileHandler.close(); + } + + // Logge, dass das Plugin deaktiviert wurde + getLogger().info(getText("plugin-disabled")); } -} + + private void setupTextsConfig() { + textsFile = new File(getDataFolder(), "texts.yml"); + + // Erstelle das Plugin-Verzeichnis, falls es nicht existiert + if (!textsFile.exists()) { + getDataFolder().mkdirs(); + try (InputStream in = getResource("texts.yml")) { + Files.copy(in, textsFile.toPath()); + } catch (IOException e) { + getLogger().severe("Could not create texts.yml file: " + e.getMessage()); + } + } + + textsConfig = YamlConfiguration.loadConfiguration(textsFile); + } + + private void setupLogging() { + try { + // Erstelle den Log-Ordner, falls nicht vorhanden + File logFolder = new File(getDataFolder(), "logs"); + if (!logFolder.exists()) { + logFolder.mkdirs(); + } + + // Erstelle einen separaten Logger für TNT-Ereignisse + logLogger = Logger.getLogger("TntChatLogger"); + logLogger.setUseParentHandlers(false); // Deaktiviere Konsolenausgabe + + // Erstelle einen Dateihandler mit täglicher Rotation + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + logFileHandler = new FileHandler(new File(logFolder, "tnt-events-" + date + ".log").getPath(), true); + logFileHandler.setFormatter(new SimpleFormatter()); + + // Füge den Handler zum Logger hinzu + logLogger.addHandler(logFileHandler); + } catch (IOException e) { + getLogger().log(Level.SEVERE, "Could not create log file", e); + } + } + + private String getText(String key) { + // Hole den Text aus der Konfiguration oder gib einen Standardwert zurück + return textsConfig.getString(key, "Text not found: " + key); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (command.getName().equalsIgnoreCase("tntinfo")) { + // Überprüfe Berechtigungen + if (!sender.hasPermission("tntchat.info") && + !sender.isOp()) { + sender.sendMessage(ChatColor.RED + getText("no-permission")); + return true; + } + + // Zeige TNT-Info der letzten 24 Stunden + showTntInfo(sender); + return true; + } + return false; + } + + private void showTntInfo(CommandSender sender) { + File logFolder = new File(getDataFolder(), "logs"); + if (!logFolder.exists() || logFolder.listFiles() == null) { + sender.sendMessage(ChatColor.YELLOW + getText("no-logs-found")); + return; + } + + // Finde die Log-Datei für heute + String today = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + File todayLog = new File(logFolder, "tnt-events-" + today + ".log"); + + if (!todayLog.exists()) { + sender.sendMessage(ChatColor.YELLOW + getText("no-logs-today")); + return; + } + + // Lese die Log-Datei und zeige die Einträge an + try { + String content = new String(Files.readAllBytes(todayLog.toPath())); + String[] lines = content.split("\n"); + + sender.sendMessage(ChatColor.GOLD + "=== TNT Aktivitäten der letzten 24 Stunden ==="); + for (String line : lines) { + if (!line.trim().isEmpty()) { + sender.sendMessage(ChatColor.WHITE + line); + } + } + sender.sendMessage(ChatColor.GOLD + "============================================"); + + } catch (IOException e) { + sender.sendMessage(ChatColor.RED + getText("error-reading-logs")); + getLogger().log(Level.SEVERE, "Error reading log file", e); + } + } + + @EventHandler + public void onBlockPlace(BlockPlaceEvent event) { + Block block = event.getBlock(); + Player player = event.getPlayer(); + + // Prüfe, ob der platzierte Block TNT ist + if (block.getType() == Material.TNT) { + sendTntMessage(player, block.getLocation(), getText("tnt-block")); + } + } + + @EventHandler + public void onEntityPlace(EntityPlaceEvent event) { + Entity entity = event.getEntity(); + Player player = event.getPlayer(); + + // Prüfe, ob das platzierte Entity ein TNT-Minecart ist + if (entity.getType() == EntityType.TNT_MINECART) { + sendTntMessage(player, entity.getLocation(), getText("tnt-minecart")); + } + } + + /** + * Sendet eine Nachricht über TNT-Platzierung an alle Spieler und in die Konsole + * @param player Der Spieler, der das TNT platziert hat + * @param location Die Location, an der das TNT platziert wurde + * @param tntType Die Art des TNT (z.B. "TNT-Block" oder "TNT-Minecart") + */ + private void sendTntMessage(Player player, Location location, String tntType) { + String coordinates = String.format(getText("coordinates-format"), + location.getBlockX(), location.getBlockY(), location.getBlockZ()); + + // Formatierte Nachricht erstellen + String message = ChatColor.translateAlternateColorCodes('&', + getText("chat-message") + .replace("%player%", player.getName()) + .replace("%tnt_type%", tntType) + .replace("%coordinates%", coordinates)); + + // Nachricht an alle Spieler senden + Bukkit.broadcastMessage(message); + + // Nachricht in die Konsole loggen + String logMessage = getText("log-message") + .replace("%player%", player.getName()) + .replace("%tnt_type%", tntType) + .replace("%coordinates%", coordinates); + + getLogger().info(logMessage); + + // In die Log-Datei schreiben + if (logLogger != null) { + String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + logLogger.info("[" + timestamp + "] " + logMessage); + } + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7abe81d..f47b05c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,4 +1,19 @@ -name: TNTChat -version: '1.0-SNAPSHOT' -main: com.user404_.tNTChat.TNTChat +name: TntChat +version: 1.0.0 +main: com.user404_.tntchat.TNTChat api-version: '1.21' +authors: [deutschich aka User404] +description: Sends a message when TNT or TNT minecarts are placed with logging and admin commands + +commands: + tntinfo: + description: Shows TNT activities of the last 24 hours + usage: /tntinfo + +permissions: + tntchat.use: + description: Allows using the TntChat plugin + default: true + tntchat.info: + description: Allows using the /tntinfo command + default: op \ No newline at end of file diff --git a/src/main/resources/texts.yml b/src/main/resources/texts.yml index e69de29..dbc4e36 100644 --- a/src/main/resources/texts.yml +++ b/src/main/resources/texts.yml @@ -0,0 +1,21 @@ +# TntChat Plugin Translations +# You can customize these messages as needed + +# Plugin status messages +plugin-enabled: "TntChat plugin has been enabled!" +plugin-disabled: "TntChat plugin has been disabled!" + +# TNT types +tnt-block: "TNT Block" +tnt-minecart: "TNT Minecart" + +# Message formats +coordinates-format: "X: %d, Y: %d, Z: %d" +chat-message: "&e%player% has placed a %tnt_type%! Coordinates: &c%coordinates%" +log-message: "[TNT] %player% has placed a %tnt_type%! Coordinates: %coordinates%" + +# Command messages +no-permission: "You don't have permission to use this command!" +no-logs-found: "No TNT logs found." +no-logs-today: "No TNT activities logged today." +error-reading-logs: "Error reading log files." \ No newline at end of file