Untitled

 avatar
unknown
plain_text
5 months ago
18 kB
3
Indexable
package archivo.ar;

import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.CommandExecutor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

public class Comando implements CommandExecutor, Listener {
    private final DatabaseManager dbManager;

    public Comando(DatabaseManager dbManager) {
        this.dbManager = dbManager;
    }

    private boolean jugadorYaReportado(String playerName) {
        String query = "SELECT COUNT(*) FROM Reportes WHERE Jugador = ? AND DATE(fecha) = CURDATE()";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, playerName);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getInt(1) > 0;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }

    private int obtenerPuntos(String jugador) {
        String query = "SELECT puntos FROM Jugadores WHERE Nombre = ?";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getInt("puntos");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("report")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.RED + "Este comando solo puede ser ejecutado por jugadores.");
                return true;
            }

            Player player = (Player) sender;

            if (args.length == 0) {
                player.sendMessage(ChatColor.RED + "Uso: /report <jugador> <razón> o /report menu o /report lista");
                return true;
            }

            if (args[0].equalsIgnoreCase("menu")) {
                if (player.hasPermission("admin.report")) {
                    openReportMenu(player);
                } else {
                    player.sendMessage(ChatColor.RED + "No tienes permiso para ver el menú de reportes.");
                }
                return true;
            }

            if (args[0].equalsIgnoreCase("lista")) {
                if (player.hasPermission("admin.report")) {
                    mostrarReportes(player);
                } else {
                    player.sendMessage(ChatColor.RED + "No tienes permiso para ver la lista de reportes.");
                }
                return true;
            }

            if (args[0].equalsIgnoreCase("jugadoresconpuntos")) {
                if (player.hasPermission("admin.report")) {
                    mostrarJugadoresConPuntos(player);
                } else {
                    player.sendMessage(ChatColor.RED + "No tienes permiso para ver la lista de jugadores con puntos.");
                }
                return true;
            }

            // Reportar jugador
            if (args.length < 2) {
                player.sendMessage(ChatColor.RED + "Uso: /report <jugador> <razón>");
                return true;
            }

            String playerName = args[0];
            Player targetPlayer = Bukkit.getPlayer(playerName);
            if (targetPlayer == null || !targetPlayer.isOnline()) {
                player.sendMessage(ChatColor.RED + "El jugador " + playerName + " no está en línea.");
                return true;
            }

            if (player.getName().equalsIgnoreCase(playerName)) {
                player.sendMessage(ChatColor.RED + "No puedes reportarte a ti mismo.");
                return true;
            }

            if (jugadorYaReportado(playerName)) {
                player.sendMessage(ChatColor.RED + "Este jugador ya ha sido reportado y está siendo revisado.");
                return true;
            }

            String reason = String.join(" ", Arrays.copyOfRange(args, 1, args.length));
            guardarReporte(playerName, reason);
            player.sendMessage(ChatColor.GREEN + "Reporte enviado para " + playerName + " por: " + reason);

            // Notificar a los admins
            Bukkit.getOnlinePlayers().stream()
                    .filter(p -> p.hasPermission("report.admin"))
                    .forEach(admin -> admin.sendMessage(ChatColor.RED + player.getName() + " ha reportado a " + playerName + " por: " + reason));
            return true;
        }
        return false;
    }

    private void openReportMenu(Player player) {
        Inventory reportMenu = Bukkit.createInventory(null, 9, ChatColor.YELLOW + "Menú de Reportes");

        // Botón para ver lista de reportes
        ItemStack viewReports = new ItemStack(Material.PAPER);
        ItemMeta viewReportsMeta = viewReports.getItemMeta();
        viewReportsMeta.setDisplayName(ChatColor.GREEN + "Ver lista de reportes");
        viewReports.setItemMeta(viewReportsMeta);
        reportMenu.setItem(0, viewReports);

        // Botón para ver jugadores con puntos
        ItemStack viewPlayersWithPoints = new ItemStack(Material.GOLD_INGOT);
        ItemMeta viewPlayersWithPointsMeta = viewPlayersWithPoints.getItemMeta();
        viewPlayersWithPointsMeta.setDisplayName(ChatColor.GOLD + "Ver jugadores con puntos");
        viewPlayersWithPoints.setItemMeta(viewPlayersWithPointsMeta);
        reportMenu.setItem(1, viewPlayersWithPoints);

        player.openInventory(reportMenu);
    }

    private void mostrarReportes(Player player) {
        String query = "SELECT Jugador, Razon, fecha FROM Reportes WHERE DATE(fecha) = CURDATE()";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query);
             ResultSet rs = stmt.executeQuery()) {

            Inventory inventory = Bukkit.createInventory(null, 54, ChatColor.YELLOW + "Reportes Activos");

            int count = 0;
            while (rs.next() && count < 54) {
                String jugador = rs.getString("Jugador");
                String razon = rs.getString("Razon");
                String fecha = rs.getString("fecha");
                int puntos = obtenerPuntos(jugador);

                ItemStack item = new ItemStack(Material.PLAYER_HEAD);
                SkullMeta meta = (SkullMeta) item.getItemMeta();
                meta.setOwningPlayer(Bukkit.getOfflinePlayer(jugador));
                meta.setDisplayName(ChatColor.YELLOW + jugador + " (" + puntos + " puntos)");
                meta.setLore(Arrays.asList(
                        ChatColor.GRAY + "Razón: " + razon,
                        ChatColor.GRAY + "Fecha: " + fecha,
                        ChatColor.YELLOW + "Clic para gestionar reporte"
                ));
                item.setItemMeta(meta);
                inventory.addItem(item);
                count++;
            }

            if (count == 0) {
                player.sendMessage(ChatColor.RED + "No hay reportes para mostrar.");
                return;
            }

            player.openInventory(inventory);
        } catch (SQLException e) {
            e.printStackTrace();
            player.sendMessage(ChatColor.RED + "Error al obtener los reportes: " + e.getMessage());
        }
    }

    private void mostrarJugadoresConPuntos(Player player) {
        String query = "SELECT Jugador, puntos FROM Reportes WHERE puntos > 0";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query);
             ResultSet rs = stmt.executeQuery()) {

            Inventory inventory = Bukkit.createInventory(null, 54, ChatColor.YELLOW + "Jugadores con Puntos");

            int count = 0;
            while (rs.next() && count < 54) {
                String jugador = rs.getString("Nombre");
                int puntos = rs.getInt("puntos");

                ItemStack item = new ItemStack(Material.PLAYER_HEAD);
                SkullMeta meta = (SkullMeta) item.getItemMeta();
                meta.setOwningPlayer(Bukkit.getOfflinePlayer(jugador));
                meta.setDisplayName(ChatColor.YELLOW + jugador + " (" + puntos + " puntos)");
                item.setItemMeta(meta);
                inventory.addItem(item);
                count++;
            }

            if (count == 0) {
                player.sendMessage(ChatColor.RED + "No hay jugadores con puntos.");
                return;
            }

            player.openInventory(inventory);
        } catch (SQLException e) {
            e.printStackTrace();
            player.sendMessage(ChatColor.RED + "Error al obtener los jugadores: " + e.getMessage());
        }
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (!(event.getWhoClicked() instanceof Player)) return;
        Player player = (Player) event.getWhoClicked();
        String title = event.getView().getTitle();

        if (title.equals(ChatColor.YELLOW + "Menú de Reportes")) {
            event.setCancelled(true);
            if (event.getCurrentItem() != null && event.getCurrentItem().hasItemMeta()) {
                if (event.getCurrentItem().getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Ver lista de reportes")) {
                    player.closeInventory();
                    mostrarReportes(player);
                } else if (event.getCurrentItem().getItemMeta().getDisplayName().equals(ChatColor.GOLD + "Ver jugadores con puntos")) {
                    player.closeInventory();
                    mostrarJugadoresConPuntos(player);
                }
            }
        } else if (title.equals(ChatColor.YELLOW + "Reportes Activos")) {
            event.setCancelled(true);
            if (event.getCurrentItem() != null && event.getCurrentItem().hasItemMeta()) {
                String jugador = ChatColor.stripColor(event.getCurrentItem().getItemMeta().getDisplayName());
                String razon = getRazonReporte(jugador);
                player.closeInventory();
                openActionMenu(player, jugador, razon);
            }
        } else if (title.startsWith(ChatColor.YELLOW + "Acciones para ")) {
            event.setCancelled(true);
            if (event.getCurrentItem() != null && event.getCurrentItem().hasItemMeta()) {
                String action = ChatColor.stripColor(event.getCurrentItem().getItemMeta().getDisplayName());
                String jugador = title.replace(ChatColor.YELLOW + "Acciones para ", "");
                int puntos = obtenerPuntos(jugador);

                switch (action) {
                    case "Culpable":
                        sumarPunto(jugador); // Sumar punto al jugador
                        eliminarReporte(jugador); // Eliminar el reporte
                        player.sendMessage(ChatColor.GREEN + "Se ha sumado un punto a " + jugador + " y el reporte ha sido eliminado.");
                        realizarAccionesAutomáticas(jugador, obtenerPuntos(jugador) + 1); // Verifica los puntos después de sumar
                        player.closeInventory();
                        break;
                    case "Baneo":
                        String banReason = "Baneado por reportes";
                        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + jugador + " 10d " + banReason);
                        eliminarReporte(jugador);
                        player.sendMessage(ChatColor.GREEN + "El jugador " + jugador + " ha sido baneado y el reporte ha sido eliminado.");
                        player.closeInventory();
                        break;
                    case "Muteo":
                        String muteReason = "Muteado por reportes";
                        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mute " + jugador + " 10d " + muteReason);
                        eliminarReporte(jugador);
                        player.sendMessage(ChatColor.GREEN + "El jugador " + jugador + " ha sido muteado y el reporte ha sido eliminado.");
                        player.closeInventory();
                        break;
                    case "Ver detalles del reporte":
                        player.sendMessage(ChatColor.GREEN + "Razón del reporte: " + getRazonReporte(jugador));
                        player.closeInventory();
                        break;
                }
            }
        }
    }

    private void realizarAccionesAutomáticas(String jugador, int nuevosPuntos) {
        if (nuevosPuntos == 2) {
            // Ejecutar warn
            Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "warn " + jugador + " Has acumulado 2 puntos.");
        } else if (nuevosPuntos == 5) {
            // Ejecutar mute
            Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mute " + jugador + " 10d Muteado por acumulación de puntos.");
        } else if (nuevosPuntos >= 7) {
            // Ejecutar ban
            Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + jugador + " 10d Baneado por acumulación de puntos.");
        }
    }

    private String getRazonReporte(String jugador) {
        String query = "SELECT Razon FROM Reportes WHERE Jugador = ? AND DATE(fecha) = CURDATE()";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            try (ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getString("Razon");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "No se encontró la razón.";
    }

    private void openActionMenu(Player player, String jugador, String razon) {
        Inventory actionMenu = Bukkit.createInventory(null, 9, ChatColor.YELLOW + "Acciones para " + jugador);

        // Botón para marcar como culpable
        ItemStack guilty = new ItemStack(Material.GREEN_WOOL);
        ItemMeta guiltyMeta = guilty.getItemMeta();
        guiltyMeta.setDisplayName(ChatColor.RED + "Culpable");
        guilty.setItemMeta(guiltyMeta);
        actionMenu.setItem(0, guilty);

        // Botón para baneo
        ItemStack ban = new ItemStack(Material.BARRIER);
        ItemMeta banMeta = ban.getItemMeta();
        banMeta.setDisplayName(ChatColor.RED + "Baneo");
        ban.setItemMeta(banMeta);
        actionMenu.setItem(1, ban);

        // Botón para muteo
        ItemStack mute = new ItemStack(Material.MUSIC_DISC_PIGSTEP);
        ItemMeta muteMeta = mute.getItemMeta();
        muteMeta.setDisplayName(ChatColor.RED + "Muteo");
        mute.setItemMeta(muteMeta);
        actionMenu.setItem(2, mute);

        // Botón para ver detalles del reporte
        ItemStack viewDetails = new ItemStack(Material.PAPER);
        ItemMeta viewDetailsMeta = viewDetails.getItemMeta();
        viewDetailsMeta.setDisplayName(ChatColor.GREEN + "Ver detalles del reporte");
        viewDetails.setItemMeta(viewDetailsMeta);
        actionMenu.setItem(3, viewDetails);

        player.openInventory(actionMenu);
    }

    private void sumarPunto(String jugador) {
        String query = "UPDATE Reportes SET puntos = puntos + 1 WHERE Jugador = ? AND DATE(fecha) = CURDATE()";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            int rowsAffected = stmt.executeUpdate();
            if (rowsAffected > 0) {
                Bukkit.getConsoleSender().sendMessage("Puntos sumados a: " + jugador);
            } else {
                Bukkit.getConsoleSender().sendMessage("No se encontraron registros para sumar puntos a: " + jugador);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private void eliminarReporte(String jugador) {
        String query = "DELETE FROM Reportes WHERE Jugador = ? AND DATE(fecha) = CURDATE()";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            int rowsAffected = stmt.executeUpdate();
            if (rowsAffected > 0) {
                Bukkit.getConsoleSender().sendMessage("Reporte eliminado para: " + jugador);
            } else {
                Bukkit.getConsoleSender().sendMessage("No se encontraron reportes para eliminar de: " + jugador);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private void guardarReporte(String jugador, String razon) {
        String query = "INSERT INTO Reportes (Jugador, Razon, fecha) VALUES (?, ?, NOW())";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            stmt.setString(2, razon);
            stmt.executeUpdate();
            Bukkit.getConsoleSender().sendMessage("Reporte guardado: " + jugador + " - " + razon);
        } catch (SQLException e) {
            e.printStackTrace();
            Bukkit.getConsoleSender().sendMessage("Error al guardar el reporte: " + e.getMessage());
        }
    }
}
Editor is loading...
Leave a Comment