Search in sources :

Example 1 with LimitEnvironment

use of dev.frankheijden.insights.api.config.LimitEnvironment in project Insights by InsightsPlugin.

the class InsightsListener method handleAddition.

protected boolean handleAddition(Player player, Location location, ScanObject<?> item, int delta, boolean included) {
    Optional<Region> regionOptional = plugin.getAddonManager().getRegion(location);
    var chunk = location.getChunk();
    var world = location.getWorld();
    UUID worldUid = world.getUID();
    long chunkKey = ChunkUtils.getKey(chunk);
    boolean queued;
    String area;
    LimitEnvironment env;
    if (regionOptional.isPresent()) {
        var region = regionOptional.get();
        queued = plugin.getAddonScanTracker().isQueued(region.getKey());
        area = plugin.getAddonManager().getAddon(region.getAddon()).getAreaName();
        env = new LimitEnvironment(player, world.getName(), region.getAddon());
    } else {
        queued = plugin.getWorldChunkScanTracker().isQueued(worldUid, chunkKey);
        area = "chunk";
        env = new LimitEnvironment(player, world.getName());
    }
    if (queued) {
        if (plugin.getSettings().canReceiveAreaScanNotifications(player)) {
            plugin.getMessages().getMessage(Messages.Key.AREA_SCAN_QUEUED).addTemplates(Messages.tagOf("area", area)).sendTo(player);
        }
        return true;
    }
    // Get the first (smallest) limit for the specific user (bypass permissions taken into account)
    Optional<Limit> limitOptional = plugin.getLimits().getFirstLimit(item, env);
    if (limitOptional.isEmpty())
        return false;
    var limit = limitOptional.get();
    var limitInfo = limit.getLimit(item);
    if (regionOptional.isEmpty() && limit.getSettings().isDisallowedPlacementOutsideRegion()) {
        plugin.getMessages().getMessage(Messages.Key.LIMIT_DISALLOWED_PLACEMENT).addTemplates(TagResolver.resolver(Messages.tagOf("name", limitInfo.getName()), Messages.tagOf("area", area))).sendTo(player);
        return true;
    }
    Consumer<Storage> storageConsumer = storage -> {
        // Only iff the block was included in the chunk AND its not a cuboid/area scan.
        if (included && regionOptional.isEmpty()) {
            storage.modify(item, -delta);
        }
        // Notify the user scan completed
        if (plugin.getSettings().canReceiveAreaScanNotifications(player)) {
            plugin.getMessages().getMessage(Messages.Key.AREA_SCAN_COMPLETED).sendTo(player);
        }
    };
    Optional<Storage> storageOptional;
    if (regionOptional.isPresent()) {
        storageOptional = handleAddonAddition(player, regionOptional.get(), storageConsumer);
    } else {
        storageOptional = handleChunkAddition(player, chunk, storageConsumer);
    }
    // If the storage is not present, cancel.
    if (storageOptional.isEmpty())
        return true;
    var storage = storageOptional.get();
    long count = storage.count(limit, item);
    // If count is beyond limit, act
    if (count + delta > limitInfo.getLimit()) {
        plugin.getMessages().getMessage(Messages.Key.LIMIT_REACHED).addTemplates(Messages.tagOf("limit", StringUtils.pretty(limitInfo.getLimit())), Messages.tagOf("name", limitInfo.getName()), Messages.tagOf("area", area)).sendTo(player);
        return true;
    }
    return false;
}
Also used : LimitInfo(dev.frankheijden.insights.api.config.limits.LimitInfo) StringUtils(dev.frankheijden.insights.api.utils.StringUtils) ScanTask(dev.frankheijden.insights.api.tasks.ScanTask) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ScanObject(dev.frankheijden.insights.api.objects.wrappers.ScanObject) Player(org.bukkit.entity.Player) Level(java.util.logging.Level) ChunkStorage(dev.frankheijden.insights.api.concurrent.storage.ChunkStorage) Messages(dev.frankheijden.insights.api.config.Messages) ScanOptions(dev.frankheijden.insights.api.concurrent.ScanOptions) ChunkPart(dev.frankheijden.insights.api.objects.chunk.ChunkPart) Block(org.bukkit.block.Block) Location(org.bukkit.Location) World(org.bukkit.World) Chunk(org.bukkit.Chunk) InsightsPlugin(dev.frankheijden.insights.api.InsightsPlugin) TagResolver(net.kyori.adventure.text.minimessage.tag.resolver.TagResolver) Material(org.bukkit.Material) Listener(org.bukkit.event.Listener) Limit(dev.frankheijden.insights.api.config.limits.Limit) WorldStorage(dev.frankheijden.insights.api.concurrent.storage.WorldStorage) BlockState(org.bukkit.block.BlockState) InsightsBase(dev.frankheijden.insights.api.objects.InsightsBase) ChunkUtils(dev.frankheijden.insights.api.utils.ChunkUtils) UUID(java.util.UUID) EntityType(org.bukkit.entity.EntityType) Consumer(java.util.function.Consumer) List(java.util.List) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Optional(java.util.Optional) AddonStorage(dev.frankheijden.insights.api.concurrent.storage.AddonStorage) DistributionStorage(dev.frankheijden.insights.api.concurrent.storage.DistributionStorage) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ChunkStorage(dev.frankheijden.insights.api.concurrent.storage.ChunkStorage) WorldStorage(dev.frankheijden.insights.api.concurrent.storage.WorldStorage) AddonStorage(dev.frankheijden.insights.api.concurrent.storage.AddonStorage) DistributionStorage(dev.frankheijden.insights.api.concurrent.storage.DistributionStorage) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Limit(dev.frankheijden.insights.api.config.limits.Limit) UUID(java.util.UUID)

Example 2 with LimitEnvironment

use of dev.frankheijden.insights.api.config.LimitEnvironment in project Insights by InsightsPlugin.

the class InsightsListener method handleRemoval.

protected void handleRemoval(Player player, Location location, ScanObject<?> item, int delta, boolean included) {
    Optional<Region> regionOptional = plugin.getAddonManager().getRegion(location);
    Chunk chunk = location.getChunk();
    World world = location.getWorld();
    UUID worldUid = world.getUID();
    long chunkKey = ChunkUtils.getKey(chunk);
    UUID uuid = player.getUniqueId();
    boolean queued;
    LimitEnvironment env;
    Optional<Storage> storageOptional;
    if (regionOptional.isPresent()) {
        Region region = regionOptional.get();
        queued = plugin.getAddonScanTracker().isQueued(region.getKey());
        env = new LimitEnvironment(player, world.getName(), region.getAddon());
        storageOptional = plugin.getAddonStorage().get(region.getKey());
    } else {
        queued = plugin.getWorldChunkScanTracker().isQueued(worldUid, chunkKey);
        env = new LimitEnvironment(player, world.getName());
        storageOptional = plugin.getWorldStorage().getWorld(worldUid).get(chunkKey);
    }
    // Modify the area to account for the broken block.
    storageOptional.ifPresent(storage -> storage.modify(item, -delta));
    // Notify the user (if they have permission)
    if (player.hasPermission("insights.notifications")) {
        // If the area is queued, stop check here (notification will be displayed when it completes).
        if (queued)
            return;
        // Get the first (smallest) limit for the specific user (bypass permissions taken into account)
        Optional<Limit> limitOptional = plugin.getLimits().getFirstLimit(item, env);
        if (limitOptional.isEmpty())
            return;
        Limit limit = limitOptional.get();
        LimitInfo limitInfo = limit.getLimit(item);
        // Create a runnable for the notification.
        Consumer<Storage> notification = storage -> {
            long count = storage.count(limit, item);
            float progress = (float) count / limitInfo.getLimit();
            plugin.getNotifications().getCachedProgress(uuid, Messages.Key.LIMIT_NOTIFICATION).progress(progress).add(player).create().addTemplates(Messages.tagOf("name", limitInfo.getName()), Messages.tagOf("count", StringUtils.pretty(count)), Messages.tagOf("limit", StringUtils.pretty(limitInfo.getLimit()))).send();
        };
        // If the data is already stored, send the notification immediately.
        if (storageOptional.isPresent()) {
            notification.accept(storageOptional.get());
            return;
        }
        // Else, we need to scan the area first.
        Consumer<Storage> storageConsumer = storage -> {
            // Only if we're not scanning a cuboid (iff cuboid, the block is already removed from the chunk)
            if (included && regionOptional.isEmpty())
                storage.modify(item, -delta);
            // Notify the user
            notification.accept(storage);
        };
        if (regionOptional.isPresent()) {
            scanRegion(player, regionOptional.get(), storageConsumer);
        } else {
            plugin.getChunkContainerExecutor().submit(chunk).thenAccept(storageConsumer).exceptionally(th -> {
                plugin.getLogger().log(Level.SEVERE, th, th::getMessage);
                return null;
            });
        }
    }
}
Also used : LimitInfo(dev.frankheijden.insights.api.config.limits.LimitInfo) StringUtils(dev.frankheijden.insights.api.utils.StringUtils) ScanTask(dev.frankheijden.insights.api.tasks.ScanTask) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ScanObject(dev.frankheijden.insights.api.objects.wrappers.ScanObject) Player(org.bukkit.entity.Player) Level(java.util.logging.Level) ChunkStorage(dev.frankheijden.insights.api.concurrent.storage.ChunkStorage) Messages(dev.frankheijden.insights.api.config.Messages) ScanOptions(dev.frankheijden.insights.api.concurrent.ScanOptions) ChunkPart(dev.frankheijden.insights.api.objects.chunk.ChunkPart) Block(org.bukkit.block.Block) Location(org.bukkit.Location) World(org.bukkit.World) Chunk(org.bukkit.Chunk) InsightsPlugin(dev.frankheijden.insights.api.InsightsPlugin) TagResolver(net.kyori.adventure.text.minimessage.tag.resolver.TagResolver) Material(org.bukkit.Material) Listener(org.bukkit.event.Listener) Limit(dev.frankheijden.insights.api.config.limits.Limit) WorldStorage(dev.frankheijden.insights.api.concurrent.storage.WorldStorage) BlockState(org.bukkit.block.BlockState) InsightsBase(dev.frankheijden.insights.api.objects.InsightsBase) ChunkUtils(dev.frankheijden.insights.api.utils.ChunkUtils) UUID(java.util.UUID) EntityType(org.bukkit.entity.EntityType) Consumer(java.util.function.Consumer) List(java.util.List) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Optional(java.util.Optional) AddonStorage(dev.frankheijden.insights.api.concurrent.storage.AddonStorage) DistributionStorage(dev.frankheijden.insights.api.concurrent.storage.DistributionStorage) Chunk(org.bukkit.Chunk) World(org.bukkit.World) LimitInfo(dev.frankheijden.insights.api.config.limits.LimitInfo) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ChunkStorage(dev.frankheijden.insights.api.concurrent.storage.ChunkStorage) WorldStorage(dev.frankheijden.insights.api.concurrent.storage.WorldStorage) AddonStorage(dev.frankheijden.insights.api.concurrent.storage.AddonStorage) DistributionStorage(dev.frankheijden.insights.api.concurrent.storage.DistributionStorage) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Limit(dev.frankheijden.insights.api.config.limits.Limit) UUID(java.util.UUID)

Example 3 with LimitEnvironment

use of dev.frankheijden.insights.api.config.LimitEnvironment in project Insights by InsightsPlugin.

the class InsightsListener method evaluateAddition.

protected void evaluateAddition(Player player, Location location, ScanObject<?> item, int delta) {
    Optional<Region> regionOptional = plugin.getAddonManager().getRegion(location);
    World world = location.getWorld();
    long chunkKey = ChunkUtils.getKey(location);
    UUID uuid = player.getUniqueId();
    LimitEnvironment env;
    Optional<Storage> storageOptional;
    if (regionOptional.isPresent()) {
        Region region = regionOptional.get();
        env = new LimitEnvironment(player, world.getName(), region.getAddon());
        storageOptional = plugin.getAddonStorage().get(region.getKey());
    } else {
        env = new LimitEnvironment(player, world.getName());
        storageOptional = plugin.getWorldStorage().getWorld(world.getUID()).get(chunkKey);
    }
    if (storageOptional.isEmpty())
        return;
    Storage storage = storageOptional.get();
    // If limit is not present, stop here
    Optional<Limit> limitOptional = plugin.getLimits().getFirstLimit(item, env);
    if (limitOptional.isEmpty())
        return;
    Limit limit = limitOptional.get();
    LimitInfo limitInfo = limit.getLimit(item);
    long count = storage.count(limit, item);
    // Notify the user (if they have permission)
    if (player.hasPermission("insights.notifications")) {
        float progress = (float) (count + delta) / limitInfo.getLimit();
        plugin.getNotifications().getCachedProgress(uuid, Messages.Key.LIMIT_NOTIFICATION).progress(progress).add(player).create().addTemplates(Messages.tagOf("name", limitInfo.getName()), Messages.tagOf("count", StringUtils.pretty(count + delta)), Messages.tagOf("limit", StringUtils.pretty(limitInfo.getLimit()))).send();
    }
}
Also used : Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ChunkStorage(dev.frankheijden.insights.api.concurrent.storage.ChunkStorage) WorldStorage(dev.frankheijden.insights.api.concurrent.storage.WorldStorage) AddonStorage(dev.frankheijden.insights.api.concurrent.storage.AddonStorage) DistributionStorage(dev.frankheijden.insights.api.concurrent.storage.DistributionStorage) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Limit(dev.frankheijden.insights.api.config.limits.Limit) World(org.bukkit.World) UUID(java.util.UUID) LimitInfo(dev.frankheijden.insights.api.config.limits.LimitInfo)

Example 4 with LimitEnvironment

use of dev.frankheijden.insights.api.config.LimitEnvironment in project Insights by InsightsPlugin.

the class InsightsPlaceholderExpansion method onPlaceholderRequest.

@Override
public String onPlaceholderRequest(Player player, String identifier) {
    if (identifier == null)
        return "";
    String[] args = identifier.split("_");
    switch(args[0].toLowerCase(Locale.ENGLISH)) {
        case "limits":
            if (args.length < 3)
                break;
            String itemString = StringUtils.join(args, "_", 2).toUpperCase(Locale.ENGLISH);
            final ScanObject<?> item;
            try {
                item = ScanObject.parse(itemString);
            } catch (IllegalArgumentException ex) {
                return "";
            }
            Location location = player.getLocation();
            World world = location.getWorld();
            UUID worldUid = world.getUID();
            LimitEnvironment env = new LimitEnvironment(player, world.getName());
            Optional<Limit> limitOptional = plugin.getLimits().getFirstLimit(item, env);
            if (!limitOptional.isPresent())
                break;
            Limit limit = limitOptional.get();
            switch(args[1].toLowerCase(Locale.ENGLISH)) {
                case "name":
                    return limit.getLimit(item).getName();
                case "max":
                    return String.valueOf(limit.getLimit(item).getLimit());
                case "count":
                    Optional<Region> regionOptional = plugin.getAddonManager().getRegion(location);
                    Optional<Storage> storageOptional;
                    if (regionOptional.isPresent()) {
                        Region region = regionOptional.get();
                        storageOptional = plugin.getAddonStorage().get(region.getKey());
                    } else {
                        long chunkKey = ChunkUtils.getKey(location);
                        storageOptional = plugin.getWorldStorage().getWorld(worldUid).get(chunkKey);
                    }
                    return storageOptional.map(storage -> String.valueOf(storage.count(limit, item))).orElse("");
                default:
                    break;
            }
            break;
        default:
            break;
    }
    return "";
}
Also used : Limit(dev.frankheijden.insights.api.config.limits.Limit) PlaceholderExpansion(me.clip.placeholderapi.expansion.PlaceholderExpansion) StringUtils(dev.frankheijden.insights.api.utils.StringUtils) ChunkUtils(dev.frankheijden.insights.api.utils.ChunkUtils) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) ScanObject(dev.frankheijden.insights.api.objects.wrappers.ScanObject) Player(org.bukkit.entity.Player) UUID(java.util.UUID) Region(dev.frankheijden.insights.api.addons.Region) Location(org.bukkit.Location) World(org.bukkit.World) Locale(java.util.Locale) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Optional(java.util.Optional) InsightsPlugin(dev.frankheijden.insights.api.InsightsPlugin) World(org.bukkit.World) Storage(dev.frankheijden.insights.api.concurrent.storage.Storage) Region(dev.frankheijden.insights.api.addons.Region) LimitEnvironment(dev.frankheijden.insights.api.config.LimitEnvironment) Limit(dev.frankheijden.insights.api.config.limits.Limit) UUID(java.util.UUID) Location(org.bukkit.Location)

Aggregations

Region (dev.frankheijden.insights.api.addons.Region)4 Storage (dev.frankheijden.insights.api.concurrent.storage.Storage)4 LimitEnvironment (dev.frankheijden.insights.api.config.LimitEnvironment)4 Limit (dev.frankheijden.insights.api.config.limits.Limit)4 UUID (java.util.UUID)4 World (org.bukkit.World)4 InsightsPlugin (dev.frankheijden.insights.api.InsightsPlugin)3 AddonStorage (dev.frankheijden.insights.api.concurrent.storage.AddonStorage)3 ChunkStorage (dev.frankheijden.insights.api.concurrent.storage.ChunkStorage)3 DistributionStorage (dev.frankheijden.insights.api.concurrent.storage.DistributionStorage)3 WorldStorage (dev.frankheijden.insights.api.concurrent.storage.WorldStorage)3 LimitInfo (dev.frankheijden.insights.api.config.limits.LimitInfo)3 ScanObject (dev.frankheijden.insights.api.objects.wrappers.ScanObject)3 ChunkUtils (dev.frankheijden.insights.api.utils.ChunkUtils)3 StringUtils (dev.frankheijden.insights.api.utils.StringUtils)3 Optional (java.util.Optional)3 Location (org.bukkit.Location)3 Player (org.bukkit.entity.Player)3 ScanOptions (dev.frankheijden.insights.api.concurrent.ScanOptions)2 Messages (dev.frankheijden.insights.api.config.Messages)2