Untitled

 avatar
unknown
plain_text
5 months ago
14 kB
4
Indexable
package archivo.ar;

import org.bukkit.BanList;
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;
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("report")) {
            if (args.length == 0) {
                sender.sendMessage(ChatColor.RED + "Uso: /report <jugador> <razón> o /report menu");
                return true;
            }

            if (args[0].equalsIgnoreCase("menu")) {
                if (sender instanceof Player) {
                    if (sender.hasPermission("admin.report")) {
                        openReportMenu((Player) sender);
                    } else {
                        sender.sendMessage(ChatColor.RED + "No tienes permiso para ver la lista de reportes.");
                    }
                } else {
                    sender.sendMessage(ChatColor.RED + "Este comando solo puede ser ejecutado por jugadores.");
                }
                return true;
            }

            if (args[0].equalsIgnoreCase("lista")) {
                if (sender.hasPermission("admin.report")) {
                    mostrarReportes(sender);
                } else {
                    sender.sendMessage(ChatColor.RED + "No tienes permiso para usar este comando.");
                }
                return true;
            }

            if (sender instanceof Player) {
                Player player = (Player) sender;

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

                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;
            } else {
                sender.sendMessage(ChatColor.RED + "Este comando solo puede ser ejecutado por jugadores.");
            }
        }
        return false;
    }

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

        ItemStack listaReportes = new ItemStack(Material.PAPER);
        ItemMeta meta1 = listaReportes.getItemMeta();
        meta1.setDisplayName(ChatColor.AQUA + "Ver Reportes");
        listaReportes.setItemMeta(meta1);
        inventory.addItem(listaReportes);
        player.openInventory(inventory);
    }

    private void mostrarReportes(CommandSender sender) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(ChatColor.RED + "Este comando solo puede ser ejecutado por jugadores.");
            return;
        }

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

            if (!rs.next()) {
                player.sendMessage(ChatColor.RED + "No hay reportes para mostrar.");
                return;
            }

            int size = Math.max(9, (rs.getFetchSize() / 9 + 1) * 9);
            Inventory inventory = Bukkit.createInventory(null, size, ChatColor.YELLOW + "Reportes Activos");

            do {
                String jugador = rs.getString("Jugador");
                String razon = rs.getString("Razon");
                String fecha = rs.getString("fecha");
                ItemStack item = getPlayerHead(jugador);
                ItemMeta meta = item.getItemMeta();
                if (meta != null) {
                    meta.setLore(Arrays.asList(ChatColor.GRAY + "Razón: " + razon + " Fecha: " + fecha, ChatColor.YELLOW + "Clic para gestionar reporte"));
                    item.setItemMeta(meta);
                }

                inventory.addItem(item);
            } while (rs.next());

            player.openInventory(inventory); // Abre el inventario

            // Simular clic en un ítem (esto solo es un ejemplo conceptual, no funcionará directamente)
            for (ItemStack item : inventory.getContents()) {
                if (item != null && item.hasItemMeta()) {
                    ItemMeta meta = item.getItemMeta();
                    if (meta != null && meta.getLore() != null && meta.getLore().contains(ChatColor.YELLOW + "Clic para gestionar reporte")) {
                        // Llama a la lógica de clic en el inventario
                        // Aquí puedes llamar a openActionMenu o la lógica que necesites
                        openActionMenu(player, player.getName()); // O el nombre del jugador que corresponde
                        break; // Sale del bucle después de manejar un clic
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            sender.sendMessage(ChatColor.RED + "Error al obtener los reportes: " + e.getMessage());
        }
    }

    private ItemStack getPlayerHead(String playerName) {
        ItemStack head = new ItemStack(Material.PLAYER_HEAD);
        SkullMeta meta = (SkullMeta) head.getItemMeta();
        meta.setOwningPlayer(Bukkit.getOfflinePlayer(playerName));
        meta.setDisplayName(playerName);
        head.setItemMeta(meta);
        return head;
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (event.getView().getTitle().equals(ChatColor.YELLOW + "Reportes Activos")) {
            if (event.getCurrentItem() != null && event.getCurrentItem().hasItemMeta()) {
                ItemMeta meta = event.getCurrentItem().getItemMeta();
                if (meta != null && meta.getLore() != null && !meta.getLore().isEmpty()) {
                    String jugador = meta.getDisplayName();

                    if (event.getWhoClicked() instanceof Player) {
                        Player player = (Player) event.getWhoClicked();
                        openActionMenu(player, jugador);
                    }
                }
            }
        }
    }

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

        ItemStack banear = new ItemStack(Material.BARRIER);
        ItemMeta metaBanear = banear.getItemMeta();
        metaBanear.setDisplayName(ChatColor.RED + "Banear");
        banear.setItemMeta(metaBanear);

        ItemStack mutear = new ItemStack(Material.OAK_SIGN);
        ItemMeta metaMutear = mutear.getItemMeta();
        metaMutear.setDisplayName(ChatColor.GOLD + "Mutear");
        mutear.setItemMeta(metaMutear);

        ItemStack sumarPunto = new ItemStack(Material.EMERALD);
        ItemMeta metaSumarPunto = sumarPunto.getItemMeta();
        metaSumarPunto.setDisplayName(ChatColor.GREEN + "Sumar 1 Punto");
        sumarPunto.setItemMeta(metaSumarPunto);

        actionMenu.addItem(banear, mutear, sumarPunto);
        player.openInventory(actionMenu);
    }

    @EventHandler
    public void onActionMenuClick(InventoryClickEvent event) {
        if (event.getView().getTitle().startsWith(ChatColor.YELLOW + "Acciones sobre ")) {
            event.setCancelled(true);

            if (event.getCurrentItem() != null && event.getCurrentItem().hasItemMeta()) {
                String name = event.getCurrentItem().getItemMeta().getDisplayName();
                Player player = (Player) event.getWhoClicked();
                String jugador = event.getView().getTitle().replace(ChatColor.YELLOW + "Acciones sobre ", "");

                if (name.equals(ChatColor.RED + "Banear")) {
                    banearJugador(jugador);
                    player.sendMessage(ChatColor.GREEN + "Jugador " + jugador + " ha sido baneado.");
                    player.closeInventory();
                } else if (name.equals(ChatColor.GOLD + "Mutear")) {
                    mutearJugador(jugador);
                    player.sendMessage(ChatColor.GREEN + "Jugador " + jugador + " ha sido muteado.");
                    player.closeInventory();
                } else if (name.equals(ChatColor.GREEN + "Sumar 1 Punto")) {
                    sumarPunto(jugador);
                    player.sendMessage(ChatColor.GREEN + "Se ha sumado 1 punto a " + jugador + ".");
                    player.closeInventory();
                }
            }
        }
    }

    private void banearJugador(String jugadorABanear) {
        Bukkit.getBanList(BanList.Type.NAME).addBan(jugadorABanear, "Baneado por un administrador", null, null);
        Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + jugadorABanear + " 10d Baneado por el sistema de reportes");
        Bukkit.getConsoleSender().sendMessage("Jugador " + jugadorABanear + " ha sido baneado 10d por el sistema de reportes.");
    }

    private void mutearJugador(String jugadorAMutear) {
        // Implementa la lógica para mutear al jugador aquí
        // Puedes usar un sistema similar al de banearJugador
        Bukkit.getConsoleSender().sendMessage("Jugador " + jugadorAMutear + " ha sido muteado.");
    }

    private void sumarPunto(String jugador) {
        String query = "UPDATE Jugadores SET puntos = puntos + 1 WHERE nombre = ?";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            stmt.executeUpdate();
            Bukkit.getConsoleSender().sendMessage("Se ha sumado 1 punto a " + jugador);

            // Verificar el número de puntos y aplicar las acciones correspondientes
            verificarPuntos(jugador);
        } catch (SQLException e) {
            e.printStackTrace();
            Bukkit.getConsoleSender().sendMessage("Error al sumar punto a " + jugador + ": " + e.getMessage());
        }
    }

    private void verificarPuntos(String jugador) {
        String query = "SELECT puntos FROM Jugadores WHERE nombre = ?";
        try (PreparedStatement stmt = dbManager.getConnection().prepareStatement(query)) {
            stmt.setString(1, jugador);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                int puntos = rs.getInt("puntos");

                if (puntos == 2) {
                    // Dar un warn
                    Bukkit.getConsoleSender().sendMessage("El jugador " + jugador + " ha recibido un warn por el sistema de reportes (2 infracciones).");
                    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "warn " + jugador + " Warneado automáticamente por el sistema de reportes por tener 2 infracciones.");
                } else if (puntos >= 5) {
                    // Mutear
                    Bukkit.getConsoleSender().sendMessage("El jugador " + jugador + " ha recibido un muteo de 30d por el sistema de reportes (5 infracciones).");
                    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mute " + jugador + " 30d muteado por el sistema de reportes por tener 5 infracciones");
                } else if (puntos >= 7) {
                    // Banear
                    Bukkit.getConsoleSender().sendMessage("El jugador " + jugador + " ha recibido un baneo de 30d por el sistema de reportes (7 infracciones).");
                    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "ban " + jugador + " 30d Baneado por el sistema de reportes por tener 7 infracciones");
                    banearJugador(jugador);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            Bukkit.getConsoleSender().sendMessage("Error al verificar puntos de " + jugador + ": " + e.getMessage());
        }
    }

    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