Preperation for the 1.0.0 release

This commit is contained in:
2025-09-07 20:39:06 +02:00
parent 07c0de8514
commit e2d76ac1fb
4 changed files with 250 additions and 9 deletions

View File

@@ -6,10 +6,11 @@
<groupId>com.user404_</groupId>
<artifactId>TNTChat</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>TNTChat</name>
<description>Ein Plugin, das Nachrichten sendet, wenn TNT platziert wird</description>
<properties>
<java.version>21</java.version>

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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."