Adds tab completion for the creation command, and fixes several bugs
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							@@ -5,7 +5,7 @@
 | 
				
			|||||||
    <modelVersion>4.0.0</modelVersion>
 | 
					    <modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <groupId>net.knarcraft</groupId>
 | 
					    <groupId>net.knarcraft</groupId>
 | 
				
			||||||
    <artifactId>permissionsigns</artifactId>
 | 
					    <artifactId>PermissionSigns</artifactId>
 | 
				
			||||||
    <version>1.0-SNAPSHOT</version>
 | 
					    <version>1.0-SNAPSHOT</version>
 | 
				
			||||||
    <packaging>jar</packaging>
 | 
					    <packaging>jar</packaging>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,8 +5,10 @@ import net.knarcraft.permissionsigns.command.PermissionSignsTabCompleter;
 | 
				
			|||||||
import net.knarcraft.permissionsigns.container.PermissionSign;
 | 
					import net.knarcraft.permissionsigns.container.PermissionSign;
 | 
				
			||||||
import net.knarcraft.permissionsigns.container.SignCreationRequest;
 | 
					import net.knarcraft.permissionsigns.container.SignCreationRequest;
 | 
				
			||||||
import net.knarcraft.permissionsigns.formatting.Translator;
 | 
					import net.knarcraft.permissionsigns.formatting.Translator;
 | 
				
			||||||
 | 
					import net.knarcraft.permissionsigns.listener.SignListener;
 | 
				
			||||||
import net.knarcraft.permissionsigns.manager.EconomyManager;
 | 
					import net.knarcraft.permissionsigns.manager.EconomyManager;
 | 
				
			||||||
import net.knarcraft.permissionsigns.manager.PermissionManager;
 | 
					import net.knarcraft.permissionsigns.manager.PermissionManager;
 | 
				
			||||||
 | 
					import net.knarcraft.permissionsigns.manager.SignManager;
 | 
				
			||||||
import net.knarcraft.permissionsigns.thread.SignCreationRequestTimeoutThread;
 | 
					import net.knarcraft.permissionsigns.thread.SignCreationRequestTimeoutThread;
 | 
				
			||||||
import net.milkbowl.vault.economy.Economy;
 | 
					import net.milkbowl.vault.economy.Economy;
 | 
				
			||||||
import net.milkbowl.vault.permission.Permission;
 | 
					import net.milkbowl.vault.permission.Permission;
 | 
				
			||||||
@@ -19,6 +21,7 @@ import org.bukkit.plugin.ServicesManager;
 | 
				
			|||||||
import org.bukkit.plugin.java.JavaPlugin;
 | 
					import org.bukkit.plugin.java.JavaPlugin;
 | 
				
			||||||
import org.bukkit.scheduler.BukkitScheduler;
 | 
					import org.bukkit.scheduler.BukkitScheduler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.PriorityQueue;
 | 
					import java.util.PriorityQueue;
 | 
				
			||||||
import java.util.Queue;
 | 
					import java.util.Queue;
 | 
				
			||||||
@@ -94,8 +97,10 @@ public final class PermissionSigns extends JavaPlugin {
 | 
				
			|||||||
        Stream<SignCreationRequest> matchingRequests = signCreationRequests.stream().filter(
 | 
					        Stream<SignCreationRequest> matchingRequests = signCreationRequests.stream().filter(
 | 
				
			||||||
                (item) -> item.getPlayer().getUniqueId().equals(uuid));
 | 
					                (item) -> item.getPlayer().getUniqueId().equals(uuid));
 | 
				
			||||||
        List<SignCreationRequest> requestList = matchingRequests.toList();
 | 
					        List<SignCreationRequest> requestList = matchingRequests.toList();
 | 
				
			||||||
 | 
					        if (requestList.size() > 0) {
 | 
				
			||||||
            signCreationRequests.remove(requestList.get(0));
 | 
					            signCreationRequests.remove(requestList.get(0));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onEnable() {
 | 
					    public void onEnable() {
 | 
				
			||||||
@@ -153,11 +158,13 @@ public final class PermissionSigns extends JavaPlugin {
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            throw new IllegalStateException("[PermissionSigns] Error: Vault could not be loaded");
 | 
					            throw new IllegalStateException("[PermissionSigns] Error: Vault could not be loaded");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        getServer().getPluginManager().registerEvents(new SignListener(), this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Translator.loadLanguages("en");
 | 
					        Translator.loadLanguages("en");
 | 
				
			||||||
        registerCommands();
 | 
					        registerCommands();
 | 
				
			||||||
        BukkitScheduler scheduler = Bukkit.getScheduler();
 | 
					        BukkitScheduler scheduler = Bukkit.getScheduler();
 | 
				
			||||||
        scheduler.runTaskTimer(this, new SignCreationRequestTimeoutThread(signCreationRequests), 0L, 100L);
 | 
					        scheduler.runTaskTimer(this, new SignCreationRequestTimeoutThread(signCreationRequests), 0L, 100L);
 | 
				
			||||||
 | 
					        SignManager.loadSigns();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -173,7 +180,11 @@ public final class PermissionSigns extends JavaPlugin {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void onDisable() {
 | 
					    public void onDisable() {
 | 
				
			||||||
        // Plugin shutdown logic
 | 
					        try {
 | 
				
			||||||
 | 
					            SignManager.saveSigns();
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            e.printStackTrace();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ public class CreateCommand implements CommandExecutor {
 | 
				
			|||||||
    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
 | 
					    public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
 | 
				
			||||||
        // /ps create <name> <permission,permission> <cost> <duration> to create a new permission-sign
 | 
					        // /ps create <name> <permission,permission> <cost> <duration> to create a new permission-sign
 | 
				
			||||||
        //Name and permission(s) required, but duration and cost optional
 | 
					        //Name and permission(s) required, but duration and cost optional
 | 
				
			||||||
 | 
					        String usage = "/ps create <name> <permission,permission> [cost] [duration] - Used for creating a new permission sign";
 | 
				
			||||||
        if (!(sender instanceof Player)) {
 | 
					        if (!(sender instanceof Player)) {
 | 
				
			||||||
            sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COMMAND_PLAYER_ONLY));
 | 
					            sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COMMAND_PLAYER_ONLY));
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
@@ -31,12 +32,14 @@ public class CreateCommand implements CommandExecutor {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        if (args.length < 2) {
 | 
					        if (args.length < 2) {
 | 
				
			||||||
            sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.MISSING_CREATION_INFO));
 | 
					            sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.MISSING_CREATION_INFO));
 | 
				
			||||||
            return false;
 | 
					            sender.sendMessage(usage);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        PermissionSign newSign = parseSign(sender, args);
 | 
					        PermissionSign newSign = parseSign(sender, args);
 | 
				
			||||||
        if (newSign == null) {
 | 
					        if (newSign == null) {
 | 
				
			||||||
            return false;
 | 
					            sender.sendMessage(usage);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        PermissionSigns.addSignCreationRequest((Player) sender, newSign);
 | 
					        PermissionSigns.addSignCreationRequest((Player) sender, newSign);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,20 +57,24 @@ public class CreateCommand implements CommandExecutor {
 | 
				
			|||||||
    private PermissionSign parseSign(@NotNull CommandSender sender, @NotNull String[] args) {
 | 
					    private PermissionSign parseSign(@NotNull CommandSender sender, @NotNull String[] args) {
 | 
				
			||||||
        String name = args[0];
 | 
					        String name = args[0];
 | 
				
			||||||
        String[] permissions = args[1].split(",");
 | 
					        String[] permissions = args[1].split(",");
 | 
				
			||||||
        double cost;
 | 
					        double cost = 0;
 | 
				
			||||||
        int duration;
 | 
					        int duration = 0;
 | 
				
			||||||
 | 
					        if (args.length > 2) {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                cost = Double.parseDouble(args[2]);
 | 
					                cost = Double.parseDouble(args[2]);
 | 
				
			||||||
            } catch (NumberFormatException exception) {
 | 
					            } catch (NumberFormatException exception) {
 | 
				
			||||||
                sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COST_INVALID_NUMBER));
 | 
					                sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.COST_INVALID_NUMBER));
 | 
				
			||||||
                return null;
 | 
					                return null;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (args.length > 3) {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                duration = Integer.parseInt(args[3]);
 | 
					                duration = Integer.parseInt(args[3]);
 | 
				
			||||||
            } catch (NumberFormatException exception) {
 | 
					            } catch (NumberFormatException exception) {
 | 
				
			||||||
                sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.DURATION_INVALID_NUMBER));
 | 
					                sender.sendMessage(StringFormatter.getTranslatedErrorMessage(TranslatableMessage.DURATION_INVALID_NUMBER));
 | 
				
			||||||
                return null;
 | 
					                return null;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new PermissionSign(name, List.of(permissions), duration, cost);
 | 
					        return new PermissionSign(name, List.of(permissions), duration, cost);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,20 +1,159 @@
 | 
				
			|||||||
package net.knarcraft.permissionsigns.command;
 | 
					package net.knarcraft.permissionsigns.command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.command.Command;
 | 
					import org.bukkit.command.Command;
 | 
				
			||||||
import org.bukkit.command.CommandSender;
 | 
					import org.bukkit.command.CommandSender;
 | 
				
			||||||
import org.bukkit.command.TabCompleter;
 | 
					import org.bukkit.command.TabCompleter;
 | 
				
			||||||
 | 
					import org.bukkit.permissions.Permission;
 | 
				
			||||||
 | 
					import org.bukkit.plugin.Plugin;
 | 
				
			||||||
import org.jetbrains.annotations.NotNull;
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The tab completer for the create command
 | 
					 * The tab completer for the create command
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class CreateTabCompleter implements TabCompleter {
 | 
					public class CreateTabCompleter implements TabCompleter {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static List<String> plugins;
 | 
				
			||||||
 | 
					    private static Map<String, List<String>> permissions;
 | 
				
			||||||
 | 
					    private static List<String> numbers;
 | 
				
			||||||
 | 
					    private static List<String> empty;
 | 
				
			||||||
 | 
					    private static List<String> name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
 | 
					    public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias,
 | 
				
			||||||
        return null;
 | 
					                                      @NotNull String[] args) {
 | 
				
			||||||
 | 
					        //First, display all plugins, filtering on written text
 | 
				
			||||||
 | 
					        //Second, if a dot has been input, go to the correct branch,
 | 
				
			||||||
 | 
					        //Might want to save the plugin list, but generate permission lists on the fly as needed
 | 
				
			||||||
 | 
					        if (plugins == null) {
 | 
				
			||||||
 | 
					            loadAvailablePermissions();
 | 
				
			||||||
 | 
					            numbers = new ArrayList<>();
 | 
				
			||||||
 | 
					            numbers.add(String.valueOf(0));
 | 
				
			||||||
 | 
					            empty = new ArrayList<>();
 | 
				
			||||||
 | 
					            name = new ArrayList<>();
 | 
				
			||||||
 | 
					            name.add("<name>");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (args.length > 4) {
 | 
				
			||||||
 | 
					            return empty;
 | 
				
			||||||
 | 
					        } else if (args.length > 2) {
 | 
				
			||||||
 | 
					            return numbers;
 | 
				
			||||||
 | 
					        } else if (args.length > 1) {
 | 
				
			||||||
 | 
					            return tabCompletePermission(args[1]);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return name;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Gets the tab complete value for the permission typed
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param typedNode <p>The full permission node typed by the player</p>
 | 
				
			||||||
 | 
					     * @return <p>All known valid auto-complete options</p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private List<String> tabCompletePermission(String typedNode) {
 | 
				
			||||||
 | 
					        StringBuilder permissionListString = new StringBuilder();
 | 
				
			||||||
 | 
					        if (typedNode.contains(",")) {
 | 
				
			||||||
 | 
					            String[] permissionList = typedNode.split(",");
 | 
				
			||||||
 | 
					            for (int i = 0; i < permissionList.length - 1; i++) {
 | 
				
			||||||
 | 
					                permissionListString.append(permissionList[i]);
 | 
				
			||||||
 | 
					                permissionListString.append(",");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            typedNode = permissionList[permissionList.length - 1];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        String permissionPrefix = permissionListString.toString();
 | 
				
			||||||
 | 
					        List<String> output;
 | 
				
			||||||
 | 
					        if (typedNode.contains(".")) {
 | 
				
			||||||
 | 
					            List<String> matchingPermissions = permissions.get(typedNode.substring(0, typedNode.lastIndexOf(".")));
 | 
				
			||||||
 | 
					            if (matchingPermissions == null) {
 | 
				
			||||||
 | 
					                if (permissionPrefix.isEmpty()) {
 | 
				
			||||||
 | 
					                    output = new ArrayList<>();
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    List<String> onlyPrefix = new ArrayList<>();
 | 
				
			||||||
 | 
					                    onlyPrefix.add(permissionPrefix);
 | 
				
			||||||
 | 
					                    output = onlyPrefix;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                //Filter by the typed text
 | 
				
			||||||
 | 
					                output = filterMatching(matchingPermissions, typedNode);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            output = plugins;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //Add previous permissions in the comma-separated lists as a prefix
 | 
				
			||||||
 | 
					        if (permissionPrefix.isEmpty()) {
 | 
				
			||||||
 | 
					            return output;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            List<String> prefixed = new ArrayList<>(output.size());
 | 
				
			||||||
 | 
					            for (String matchingCompletion : output) {
 | 
				
			||||||
 | 
					                prefixed.add(permissionPrefix + matchingCompletion);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return prefixed;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Find completable strings which match the text typed by the command's sender
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param values    <p>The values to filter</p>
 | 
				
			||||||
 | 
					     * @param typedText <p>The text the player has started typing</p>
 | 
				
			||||||
 | 
					     * @return <p>The given string values which start with the player's typed text</p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private List<String> filterMatching(List<String> values, String typedText) {
 | 
				
			||||||
 | 
					        List<String> configValues = new ArrayList<>();
 | 
				
			||||||
 | 
					        for (String value : values) {
 | 
				
			||||||
 | 
					            if (value.toLowerCase().startsWith(typedText.toLowerCase())) {
 | 
				
			||||||
 | 
					                configValues.add(value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return configValues;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Loads all permissions available from bukkit plugins
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static void loadAvailablePermissions() {
 | 
				
			||||||
 | 
					        plugins = new ArrayList<>();
 | 
				
			||||||
 | 
					        permissions = new HashMap<>();
 | 
				
			||||||
 | 
					        for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
 | 
				
			||||||
 | 
					            for (Permission permission : plugin.getDescription().getPermissions()) {
 | 
				
			||||||
 | 
					                loadPermission(permission);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Loads a given permission into the proper lists and maps
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param permission <p>The permission to load</p>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static void loadPermission(Permission permission) {
 | 
				
			||||||
 | 
					        String permissionName = permission.getName();
 | 
				
			||||||
 | 
					        String[] permissionParts = permissionName.split("\\.");
 | 
				
			||||||
 | 
					        for (int i = 0; i < permissionParts.length; i++) {
 | 
				
			||||||
 | 
					            if (i == 0) {
 | 
				
			||||||
 | 
					                plugins.add(permissionParts[0]);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                StringBuilder pathBuilder = new StringBuilder();
 | 
				
			||||||
 | 
					                for (int j = 0; j < i; j++) {
 | 
				
			||||||
 | 
					                    pathBuilder.append(".");
 | 
				
			||||||
 | 
					                    pathBuilder.append(permissionParts[j]);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                String path = pathBuilder.substring(1);
 | 
				
			||||||
 | 
					                List<String> permissionList = permissions.get(path);
 | 
				
			||||||
 | 
					                if (permissionList == null) {
 | 
				
			||||||
 | 
					                    permissionList = new ArrayList<>();
 | 
				
			||||||
 | 
					                    permissions.put(pathBuilder.substring(1), permissionList);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                permissionList.add(permissionName);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -165,7 +165,7 @@ public class PermissionSign {
 | 
				
			|||||||
            return Translator.getTranslatedMessage(TranslatableMessage.SIGN_COST_FREE);
 | 
					            return Translator.getTranslatedMessage(TranslatableMessage.SIGN_COST_FREE);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            String currency = EconomyManager.getCurrency(cost != 1);
 | 
					            String currency = EconomyManager.getCurrency(cost != 1);
 | 
				
			||||||
            return String.format("%f%s", cost, currency);
 | 
					            return String.format("%.2f%s", cost, currency);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,10 +13,10 @@ public class StringFormatter {
 | 
				
			|||||||
     * @param input       <p>The input string to replace in</p>
 | 
					     * @param input       <p>The input string to replace in</p>
 | 
				
			||||||
     * @param placeholder <p>The placeholder to replace</p>
 | 
					     * @param placeholder <p>The placeholder to replace</p>
 | 
				
			||||||
     * @param replacement <p>The replacement value</p>
 | 
					     * @param replacement <p>The replacement value</p>
 | 
				
			||||||
     * @return <p>The input string with all placeholder instances replaced</p>
 | 
					     * @return <p>The input string with the placeholder replaced</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String replacePlaceholder(String input, String placeholder, String replacement) {
 | 
					    public static String replacePlaceholder(String input, String placeholder, String replacement) {
 | 
				
			||||||
        return input.replaceAll(placeholder, replacement);
 | 
					        return input.replace(placeholder, replacement);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -25,7 +25,7 @@ public class StringFormatter {
 | 
				
			|||||||
     * @param input        <p>The input string to replace in</p>
 | 
					     * @param input        <p>The input string to replace in</p>
 | 
				
			||||||
     * @param placeholders <p>The placeholders to replace</p>
 | 
					     * @param placeholders <p>The placeholders to replace</p>
 | 
				
			||||||
     * @param replacements <p>The replacement values</p>
 | 
					     * @param replacements <p>The replacement values</p>
 | 
				
			||||||
     * @return <p>The input string with all placeholder instances replaced</p>
 | 
					     * @return <p>The input string with placeholders replaced</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String replacePlaceholders(String input, String[] placeholders, String[] replacements) {
 | 
					    public static String replacePlaceholders(String input, String[] placeholders, String[] replacements) {
 | 
				
			||||||
        for (int i = 0; i < Math.min(placeholders.length, replacements.length); i++) {
 | 
					        for (int i = 0; i < Math.min(placeholders.length, replacements.length); i++) {
 | 
				
			||||||
@@ -61,7 +61,7 @@ public class StringFormatter {
 | 
				
			|||||||
     * @return <p>The formatted message</p>
 | 
					     * @return <p>The formatted message</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String formatInfoMessage(String message) {
 | 
					    public static String formatInfoMessage(String message) {
 | 
				
			||||||
        return ChatColor.DARK_RED + formatMessage(message);
 | 
					        return ChatColor.DARK_GREEN + formatMessage(message);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -71,7 +71,7 @@ public class StringFormatter {
 | 
				
			|||||||
     * @return <p>The formatted message</p>
 | 
					     * @return <p>The formatted message</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static String formatErrorMessage(String message) {
 | 
					    public static String formatErrorMessage(String message) {
 | 
				
			||||||
        return ChatColor.DARK_GREEN + formatMessage(message);
 | 
					        return ChatColor.DARK_RED + formatMessage(message);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -82,7 +82,8 @@ public class StringFormatter {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private static String formatMessage(String message) {
 | 
					    private static String formatMessage(String message) {
 | 
				
			||||||
        return ChatColor.translateAlternateColorCodes('&',
 | 
					        return ChatColor.translateAlternateColorCodes('&',
 | 
				
			||||||
                Translator.getTranslatedMessage(TranslatableMessage.PREFIX)) + ChatColor.RESET + message;
 | 
					                Translator.getTranslatedMessage(TranslatableMessage.PREFIX)) + " " + ChatColor.RESET +
 | 
				
			||||||
 | 
					                ChatColor.translateAlternateColorCodes('&', message);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,7 +135,11 @@ public class SignListener implements Listener {
 | 
				
			|||||||
            if (!player.hasPermission(permissionNode)) {
 | 
					            if (!player.hasPermission(permissionNode)) {
 | 
				
			||||||
                permissionsBuilder.append(permissionNode);
 | 
					                permissionsBuilder.append(permissionNode);
 | 
				
			||||||
                permissionsBuilder.append(", ");
 | 
					                permissionsBuilder.append(", ");
 | 
				
			||||||
                PermissionManager.addPermission(player, permissionNode, permissionSign.getDuration() == 0);
 | 
					                if (permissionSign.getDuration() == 0) {
 | 
				
			||||||
 | 
					                    PermissionManager.addPermission(player, permissionNode);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    PermissionManager.addTemporaryPermission(player, permissionNode, permissionSign.getDuration());
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -144,7 +148,7 @@ public class SignListener implements Listener {
 | 
				
			|||||||
        grantedPermissions = grantedPermissions.substring(0, grantedPermissions.length() - 2);
 | 
					        grantedPermissions = grantedPermissions.substring(0, grantedPermissions.length() - 2);
 | 
				
			||||||
        String timeUnit = Translator.getTranslatedMessage(TranslatableMessage.SIGN_TIME_UNIT);
 | 
					        String timeUnit = Translator.getTranslatedMessage(TranslatableMessage.SIGN_TIME_UNIT);
 | 
				
			||||||
        player.sendMessage(StringFormatter.replacePlaceholders(successMessage, new String[]{"{permissions}", "{time}"},
 | 
					        player.sendMessage(StringFormatter.replacePlaceholders(successMessage, new String[]{"{permissions}", "{time}"},
 | 
				
			||||||
                new String[]{grantedPermissions, permissionSign.getDuration() + timeUnit}));
 | 
					                new String[]{grantedPermissions, permissionSign.getDuration() + " " + timeUnit}));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -24,28 +24,13 @@ public class PermissionManager {
 | 
				
			|||||||
        PermissionManager.permission = permission;
 | 
					        PermissionManager.permission = permission;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Grants a permission to the given player
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param player         <p>The player to grant the permission to</p>
 | 
					 | 
				
			||||||
     * @param permissionNode <p>The permission node to grant the player</p>
 | 
					 | 
				
			||||||
     * @param permanent      <p>Whether to permanently grant the permission node</p>
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public static void addPermission(Player player, String permissionNode, boolean permanent) {
 | 
					 | 
				
			||||||
        if (permanent) {
 | 
					 | 
				
			||||||
            addPermission(player, permissionNode);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            addTemporaryPermission(player, permissionNode);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Grants a permanent permission to a player
 | 
					     * Grants a permanent permission to a player
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param player         <p>The player to grant the permission to</p>
 | 
					     * @param player         <p>The player to grant the permission to</p>
 | 
				
			||||||
     * @param permissionNode <p>The permission node to grant to the player</p>
 | 
					     * @param permissionNode <p>The permission node to grant to the player</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private static void addPermission(Player player, String permissionNode) {
 | 
					    public static void addPermission(Player player, String permissionNode) {
 | 
				
			||||||
        permission.playerAdd(player, permissionNode);
 | 
					        permission.playerAdd(player, permissionNode);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -54,9 +39,11 @@ public class PermissionManager {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param player         <p>The player to give the permission to</p>
 | 
					     * @param player         <p>The player to give the permission to</p>
 | 
				
			||||||
     * @param permissionNode <p>The temporary permission to grant</p>
 | 
					     * @param permissionNode <p>The temporary permission to grant</p>
 | 
				
			||||||
 | 
					     * @param duration       <p>The duration for which the player should keep the given permission</p>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private static void addTemporaryPermission(OfflinePlayer player, String permissionNode) {
 | 
					    public static void addTemporaryPermission(OfflinePlayer player, String permissionNode, int duration) {
 | 
				
			||||||
        permission.playerAddTransient(player, permissionNode);
 | 
					        permission.playerAddTransient(player, permissionNode);
 | 
				
			||||||
 | 
					        temporaryPermissions.add(new TemporaryPermission(player, permissionNode, duration));
 | 
				
			||||||
        //TODO: Create and store a temporary permission
 | 
					        //TODO: Create and store a temporary permission
 | 
				
			||||||
        // Check all stored temporary permissions on startup:
 | 
					        // Check all stored temporary permissions on startup:
 | 
				
			||||||
        //  * Remove expired temporary permissions
 | 
					        //  * Remove expired temporary permissions
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@ import java.util.HashMap;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Objects;
 | 
					import java.util.Objects;
 | 
				
			||||||
 | 
					import java.util.UUID;
 | 
				
			||||||
import java.util.logging.Level;
 | 
					import java.util.logging.Level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -81,10 +82,10 @@ public class SignManager {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public static void loadSigns() {
 | 
					    public static void loadSigns() {
 | 
				
			||||||
        YamlConfiguration configuration = YamlConfiguration.loadConfiguration(signsFile);
 | 
					        YamlConfiguration configuration = YamlConfiguration.loadConfiguration(signsFile);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        ConfigurationSection signSection = configuration.getConfigurationSection("signs");
 | 
					        ConfigurationSection signSection = configuration.getConfigurationSection("signs");
 | 
				
			||||||
        managedSigns = new HashMap<>();
 | 
					        managedSigns = new HashMap<>();
 | 
				
			||||||
        if (signSection == null) {
 | 
					        if (signSection == null) {
 | 
				
			||||||
 | 
					            PermissionSigns.getInstance().getLogger().log(Level.WARNING, "Signs section not found in signs.yml");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (String key : signSection.getKeys(false)) {
 | 
					        for (String key : signSection.getKeys(false)) {
 | 
				
			||||||
@@ -95,6 +96,7 @@ public class SignManager {
 | 
				
			|||||||
                        e.getMessage());
 | 
					                        e.getMessage());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        PermissionSigns.getInstance().getLogger().log(Level.INFO, "Permission signs finished loading");
 | 
				
			||||||
        //TODO: Might want to re-draw signs here in case any signs have changed
 | 
					        //TODO: Might want to re-draw signs here in case any signs have changed
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,8 +122,9 @@ public class SignManager {
 | 
				
			|||||||
        String[] locationParts = key.split(",");
 | 
					        String[] locationParts = key.split(",");
 | 
				
			||||||
        Location signLocation;
 | 
					        Location signLocation;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            signLocation = new Location(Bukkit.getWorld(locationParts[0]), Double.parseDouble(locationParts[1]),
 | 
					            signLocation = new Location(Bukkit.getWorld(UUID.fromString(locationParts[0])),
 | 
				
			||||||
                    Double.parseDouble(locationParts[2]), Double.parseDouble(locationParts[3]));
 | 
					                    Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]),
 | 
				
			||||||
 | 
					                    Double.parseDouble(locationParts[3]));
 | 
				
			||||||
        } catch (NumberFormatException exception) {
 | 
					        } catch (NumberFormatException exception) {
 | 
				
			||||||
            throw new InvalidConfigurationException("Invalid sign coordinates");
 | 
					            throw new InvalidConfigurationException("Invalid sign coordinates");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
name: PermissionSigns
 | 
					name: PermissionSigns
 | 
				
			||||||
version: '${project.version}'
 | 
					version: 1.0
 | 
				
			||||||
main: net.knarcraft.permissionsigns.Permissionsigns
 | 
					main: net.knarcraft.permissionsigns.PermissionSigns
 | 
				
			||||||
api-version: 1.18
 | 
					api-version: 1.18
 | 
				
			||||||
prefix: PermissionSigns
 | 
					prefix: PermissionSigns
 | 
				
			||||||
depend: [ Vault ]
 | 
					depend: [ Vault ]
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user