Files
AdminMode/src/main/java/org/blz/adminmode/commands/AdminModeCommand.java

296 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package org.blz.adminmode.commands;
import java.util.List;
import java.util.UUID;
import org.blz.adminmode.config.ConfigManager;
import org.blz.adminmode.dialog.AdminDialogService;
import org.blz.adminmode.integrations.CoreProtectIntegration;
import org.blz.adminmode.moderation.ModeManager;
import org.blz.adminmode.moderation.ModeratorProfile;
import org.blz.adminmode.moderation.PlayerListAction;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.kyori.adventure.text.Component;
public class AdminModeCommand implements CommandExecutor {
private final ConfigManager configManager;
private final ModeManager modeManager;
private final CoreProtectIntegration coreProtectIntegration;
private AdminDialogService dialogService;
public AdminModeCommand(
ConfigManager configManager,
ModeManager modeManager,
CoreProtectIntegration coreProtectIntegration) {
this.configManager = configManager;
this.modeManager = modeManager;
this.coreProtectIntegration = coreProtectIntegration;
}
public void setDialogService(AdminDialogService dialogService) {
this.dialogService = dialogService;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length > 0 && args[0].equalsIgnoreCase("reload")) {
if (!sender.hasPermission("adminmode.reload")) {
sender.sendMessage(configManager.getPrefixedMessage(configManager.getMsgNoPermission()));
return true;
}
configManager.loadConfig();
sender.sendMessage(configManager.getPrefixedMessage(configManager.getMsgReloaded()));
return true;
}
if (args.length > 0 && args[0].equalsIgnoreCase("disable")) {
if (!canUseHardActions(sender)) {
sender.sendMessage(configManager.getPrefixedMessage(configManager.getMsgNoPermission()));
return true;
}
if (args.length < 2) {
sender.sendMessage(configManager.getPrefixedMessage("§cИспользование: /adminmode disable <игрок>"));
return true;
}
forceDisableTarget(sender, args[1]);
return true;
}
if (!(sender instanceof Player player)) {
sender.sendMessage("Эта команда доступна только игрокам!");
return true;
}
if (!configManager.isEnabled()) {
player.sendMessage(configManager.getPrefixedMessage("§cРежим администратора отключен!"));
return true;
}
if (args.length > 0 && args[0].equalsIgnoreCase("dialog")) {
if (!openRelevantDialog(player)) {
player.sendMessage(configManager.getPrefixedMessage("§eDialog-панель сейчас недоступна."));
}
return true;
}
if (args.length > 0 && (args[0].equalsIgnoreCase("enable") || args[0].equalsIgnoreCase("profile"))) {
if (args.length < 2) {
openRelevantDialog(player);
return true;
}
ModeratorProfile profile = ModeratorProfile.fromInput(args[1]).orElse(null);
if (profile == null) {
player.sendMessage(configManager.getPrefixedMessage("§cНеизвестный профиль. Доступно: soft, hard."));
return true;
}
activateProfile(player, profile);
return true;
}
if (!isInAdminMode(player.getUniqueId()) && getAvailableProfiles(player).isEmpty()) {
player.sendMessage(configManager.getPrefixedMessage(configManager.getMsgNoPermission()));
return true;
}
openRelevantDialog(player);
return true;
}
public boolean activateProfile(Player player, ModeratorProfile profile) {
if (profile == null) {
return openRelevantDialog(player);
}
if (!profile.isAvailableFor(player)) {
player.sendMessage(configManager.getPrefixedMessage(configManager.getMsgNoPermission()));
return false;
}
if (modeManager.hasSession(player.getUniqueId())) {
ModeratorProfile activeProfile = getActiveProfile(player.getUniqueId());
if (activeProfile == profile) {
return openRelevantDialog(player);
}
player.sendMessage(configManager.getPrefixedMessage(
"§eУ вас уже активен профиль §f" + activeProfile.getDisplayName() + "§e. Сначала выйдите из режима."));
return false;
}
return modeManager.enterMode(player, profile);
}
public boolean exitMode(Player player) {
return modeManager.exitMode(player);
}
public boolean recoverSession(Player player) {
return modeManager.recoverSession(player);
}
public List<ModeratorProfile> getAvailableProfiles(Player player) {
return modeManager.getAvailableProfiles(player);
}
public ModeratorProfile getActiveProfile(UUID playerId) {
return modeManager.getProfile(playerId);
}
public boolean isInAdminMode(UUID playerId) {
return modeManager.hasSession(playerId);
}
public List<Component> getOnlineSummary(Player player) {
return modeManager.buildOnlineSummary(player);
}
public void applyAdminSettings(Player player, float flySpeed, float walkSpeed, boolean godMode) {
if (!modeManager.hasSession(player.getUniqueId())) {
return;
}
modeManager.applyAdminSettings(player, flySpeed, walkSpeed, godMode);
player.sendMessage(configManager.getPrefixedMessage("§aНастройки режима обновлены."));
}
public boolean performPlayerListAction(Player moderator, PlayerListAction action, String targetName) {
Player target = validateActiveTarget(moderator, targetName);
if (target == null) {
return false;
}
return switch (action) {
case SPECTATE -> modeManager.spectatePlayer(moderator, target);
case TELEPORT -> modeManager.teleportToPlayer(moderator, target);
case INVSEE -> modeManager.openInvsee(moderator, target);
};
}
public boolean teleportToPlayer(Player moderator, String targetName) {
Player target = validateActiveTarget(moderator, targetName);
return target != null && modeManager.teleportToPlayer(moderator, target);
}
public boolean teleportPlayerHere(Player moderator, String targetName) {
if (!validateHardActionPlayer(moderator)) {
return false;
}
Player target = resolveOnlinePlayer(targetName, moderator);
return target != null && modeManager.teleportPlayerHere(moderator, target);
}
public boolean forceDisableTarget(CommandSender sender, String targetName) {
if (!canUseHardActions(sender)) {
sender.sendMessage(configManager.getPrefixedMessage(configManager.getMsgNoPermission()));
return false;
}
Player target = resolveOnlinePlayer(targetName, sender);
if (target == null) {
return false;
}
forceDisableAbilities(target);
sender.sendMessage(configManager.getPrefixedMessage("§aРежим и способности игрока §f" + target.getName() + "§a сброшены."));
target.sendMessage(configManager.getPrefixedMessage("§eВаш режим модерации был принудительно отключен."));
return true;
}
public boolean executeCPLookup(Player player, String targetPlayer, int radius, String time) {
if (!validateHardActionPlayer(player)) {
return false;
}
return coreProtectIntegration.lookup(player, targetPlayer, radius, time);
}
public boolean executeCPRollback(Player player, int radius, String time, String targetPlayer) {
if (!validateHardActionPlayer(player)) {
return false;
}
return coreProtectIntegration.rollback(player, radius, time, targetPlayer);
}
public boolean toggleInspector(Player player) {
if (!validateHardActionPlayer(player)) {
return false;
}
return coreProtectIntegration.toggleInspector(player);
}
public void forceDisableAbilities(Player player) {
if (modeManager.hasSession(player.getUniqueId())) {
modeManager.exitMode(player);
return;
}
player.setInvulnerable(false);
player.setFlying(false);
player.setAllowFlight(false);
player.setFlySpeed(0.1f);
player.setWalkSpeed(0.2f);
}
public boolean canUseHardActions(CommandSender sender) {
return modeManager.canUseHardActions(sender);
}
private boolean openRelevantDialog(Player player) {
if (dialogService == null || !configManager.isDialogsEnabled()) {
return false;
}
if (modeManager.hasSession(player.getUniqueId())) {
return dialogService.openCurrentPanel(player);
}
return dialogService.openModeSelectDialog(player);
}
private boolean validateHardActionPlayer(Player moderator) {
if (!canUseHardActions(moderator)) {
moderator.sendMessage(configManager.getPrefixedMessage("§cДля этого действия нужен активный профиль Hard Moder."));
return false;
}
return true;
}
private Player validateActiveTarget(Player moderator, String targetName) {
if (!modeManager.hasSession(moderator.getUniqueId())) {
moderator.sendMessage(configManager.getPrefixedMessage("§cСначала войдите в режим модерации."));
return null;
}
return resolveOnlinePlayer(targetName, moderator);
}
private Player resolveOnlinePlayer(String targetName, CommandSender sender) {
if (targetName == null || targetName.isBlank()) {
sender.sendMessage(configManager.getPrefixedMessage("§cУкажите ник игрока."));
return null;
}
Player target = Bukkit.getPlayerExact(targetName.trim());
if (target == null) {
target = Bukkit.getPlayer(targetName.trim());
}
if (target == null) {
sender.sendMessage(configManager.getPrefixedMessage("§cИгрок не найден!"));
return null;
}
return target;
}
}