package net.knarcraft.permissionsigns.command; import net.knarcraft.permissionsigns.PermissionSigns; import net.knarcraft.permissionsigns.container.PermissionSign; import net.knarcraft.permissionsigns.formatting.StringFormatter; import net.knarcraft.permissionsigns.formatting.TranslatableMessage; 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 org.jetbrains.annotations.NotNull; import java.util.List; /** * The command used to create a new permission sign */ public class CreateCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { // /ps create to create a new permission-sign //Name and permission(s) required, but duration and cost optional String usage = "/ps create [cost] [duration] - Used for creating" + " a new permission sign"; if (!(sender instanceof Player)) { sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COMMAND_PLAYER_ONLY)); return false; } if (!sender.hasPermission("permissionsigns.admin.create")) { sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COMMAND_PERMISSION_DENIED)); return false; } if (args.length < 3) { sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.MISSING_CREATION_INFO)); sender.sendMessage(usage); return true; } PermissionSign newSign = parseSign(sender, args); if (newSign == null) { sender.sendMessage(usage); return true; } PermissionSigns.addSignCreationRequest((Player) sender, newSign); sender.sendMessage(StringFormatter.getTranslatedInfoMessage(TranslatableMessage.CREATION_REQUEST_CREATED)); return true; } /** * Parses the permission sign given in user input * * @param sender

The sender that initiated the command

* @param args

The given command arguments

* @return

The parsed sign, or null if it could not be parsed

*/ private PermissionSign parseSign(@NotNull CommandSender sender, @NotNull String[] args) { String name = args[0]; String description = replaceUnderscoresWithSpaces(args[1]); String[] permissions = args[2].replaceAll("\\?", " ").split(","); for (String permission : permissions) { if (permission.contains(":")) { String world = permission.split(":")[0]; if (!world.equalsIgnoreCase("all") && !world.equalsIgnoreCase("any") && Bukkit.getWorld(world) == null) { sender.sendMessage(StringFormatter.replacePlaceholder(StringFormatter.getTranslatedErrorMessage( TranslatableMessage.PERMISSION_WORLD_INVALID), "{world}", world)); return null; } } } double cost = 0; int duration = 0; if (args.length > 3) { try { cost = Double.parseDouble(args[3]); } catch (NumberFormatException exception) { sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COST_INVALID_NUMBER)); return null; } } if (args.length > 4) { try { duration = Integer.parseInt(args[4]); } catch (NumberFormatException exception) { sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.DURATION_INVALID_NUMBER)); return null; } } return new PermissionSign(name, description, List.of(permissions), duration, cost); } /** * Replaces underscores with spaces in the given description * *

This basically replaces all underscores with spaces, but keeps escaped underscores (\_) as underscores.

* * @param description

The description to replace underscores in

* @return

The string with underscores replaced

*/ private @NotNull String replaceUnderscoresWithSpaces(@NotNull String description) { String temporaryString = "\\|ESCAPED-UNDERSCORE\\|"; description = description.replaceAll("\\\\_", temporaryString); description = description.replaceAll("_", " "); description = description.replaceAll(temporaryString, "_"); return description; } }