diff --git a/src/main/java/fr/moribus/imageonmap/Permissions.java b/src/main/java/fr/moribus/imageonmap/Permissions.java index 098bcc5..ec1be2f 100644 --- a/src/main/java/fr/moribus/imageonmap/Permissions.java +++ b/src/main/java/fr/moribus/imageonmap/Permissions.java @@ -37,7 +37,11 @@ package fr.moribus.imageonmap; +import fr.zcraft.quartzlib.components.i18n.I; +import fr.zcraft.quartzlib.tools.PluginLogger; +import java.util.Set; import org.bukkit.permissions.Permissible; +import org.bukkit.permissions.PermissionAttachmentInfo; public enum Permissions { NEW("imageonmap.new", "imageonmap.userender"), @@ -54,6 +58,8 @@ public enum Permissions { UPDATEOTHER("imageonmap.updateother"), ADMINISTRATIVE("imageonmap.administrative"), BYPASS_SIZE("imageonmap.bypasssize"), + BYPASS_IMAGE_LIMIT("imageonmap.bypassimagelimit"), + BYPASS_MAP_LIMIT("imageonmap.bypassmaplimit"), GIVE("imageonmap.give"); private final String permission; @@ -83,4 +89,37 @@ public enum Permissions { return false; } + + /** + * Return the limit of map the user is allowed to make + * + * @param permissible The permissible to check. + * @return the limit + */ + public int getLimitPermission(Permissible permissible, LimitType type) { + Set perms = permissible.getEffectivePermissions(); + String prefix = String.format("imageonmap.%slimit.", type.name()); + for (PermissionAttachmentInfo pai : perms) { + String permString = pai.getPermission().toLowerCase(); + if (permString.startsWith(prefix)) { + if (pai.getValue()) { + try { + int limit = Integer.parseInt(permString.split(prefix)[1].trim()); + return limit; + } catch (Exception e) { + PluginLogger.warning( + I.t("The correct syntax for setting map limit node is: ImageOnMap.mapLimit.X " + + "where you can replace X with the limit of map a player is allowed to have")); + } + + } + } + } + return 2147483647; //Virtually no limit + } + + public enum LimitType { + map, + image + } } \ No newline at end of file diff --git a/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java b/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java index 8fe0389..51dbfaa 100644 --- a/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java +++ b/src/main/java/fr/moribus/imageonmap/commands/maptool/NewCommand.java @@ -41,6 +41,7 @@ import fr.moribus.imageonmap.commands.IoMCommand; import fr.moribus.imageonmap.image.ImageRendererExecutor; import fr.moribus.imageonmap.image.ImageUtils; import fr.moribus.imageonmap.map.ImageMap; +import fr.moribus.imageonmap.map.MapManager; import fr.moribus.imageonmap.map.PosterMap; import fr.zcraft.quartzlib.components.commands.CommandException; import fr.zcraft.quartzlib.components.commands.CommandInfo; @@ -87,7 +88,23 @@ public class NewCommand extends IoMCommand { if (args.length < 1) { throwInvalidArgument(I.t("You must give an URL to take the image from.")); } - + //Checking if the map limit and image limit + if (!Permissions.BYPASS_IMAGE_LIMIT.grantedTo(player)) { + int imageLimit = Permissions.NEW.getLimitPermission(player, Permissions.LimitType.image); + int imageCount = MapManager.getPlayerMapStore(player.getUniqueId()).getImagesCount(); + if (imageLimit <= imageCount) { + throwInvalidArgument( + I.t("Your image limit is set to {0} and you currently have {1} ", imageLimit, imageCount)); + } + } + if (!Permissions.BYPASS_MAP_LIMIT.grantedTo(player)) { + int mapLimit = Permissions.NEW.getLimitPermission(player, Permissions.LimitType.map); + int mapCount = MapManager.getPlayerMapStore(player.getUniqueId()).getMapCount(); + if (mapLimit <= mapCount) { + throwInvalidArgument( + I.t("Your map limit is set to {0} and you currently have {1} ", mapLimit, mapCount)); + } + } try { url = new URL(args[0]); } catch (MalformedURLException ex) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 785d785..9fc4b97 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -38,6 +38,8 @@ permissions: imageonmap.give: false imageonmap.update: true imageonmap.updateother: false + imageonmap.bypassmaplimit: false + imageonmap.bypassimagelimit: false imageonmap.userender: description: "Allows you to use /tomap and related commands (/maptool getremaining). Alias of imageonmap.new." @@ -110,3 +112,11 @@ permissions: imageonmap.updateother: description: "Allows you to update an existing map of an other player with a new image." default: op + + imageonmap.bypassmaplimit: + description: "Allows you to bypass permission node check for the number of used map (by default users have an unlimited amount of maps)." + default: op + + imageonmap.bypassimagelimit: + description: "Allows you to bypass permission node check for the number of images in the playerMapStore(by default users have an unlimited amount of images)." + default: op \ No newline at end of file