use of dev.frankheijden.insights.api.concurrent.storage.Storage in project Insights by InsightsPlugin.
the class CommandScanCache method handleScan.
/**
* Checks the player's location for a cache and displays the distribution of items.
*/
public void handleScan(Player player, Set<? extends ScanObject<?>> items, boolean displayZeros) {
Location loc = player.getLocation();
Optional<Region> optionalRegion = plugin.getAddonManager().getRegion(loc);
Optional<Storage> optionalStorage;
// If a region is present, try to fetch cache of the region.
if (optionalRegion.isPresent()) {
optionalStorage = plugin.getAddonStorage().get(optionalRegion.get().getKey());
} else {
optionalStorage = plugin.getWorldStorage().getWorld(loc.getWorld().getUID()).get(ChunkUtils.getKey(loc.getChunk()));
}
if (optionalStorage.isPresent()) {
var storage = optionalStorage.get();
var messages = plugin.getMessages();
// Check which items we need to display & sort them based on their name.
ScanObject<?>[] displayItems = (items == null ? storage.keys() : items).stream().filter(item -> storage.count(item) != 0 || displayZeros).sorted(Comparator.comparing(ScanObject::name)).toArray(ScanObject[]::new);
var footer = messages.getMessage(Messages.Key.SCANCACHE_RESULT_FOOTER).addTemplates(Messages.tagOf("area", optionalRegion.map(r -> plugin.getAddonManager().getAddon(r.getAddon()).getAreaName()).orElse("chunk")));
var message = messages.createPaginatedMessage(messages.getMessage(Messages.Key.SCANCACHE_RESULT_HEADER), Messages.Key.SCANCACHE_RESULT_FORMAT, footer, displayItems, storage::count, item -> Component.text(EnumUtils.pretty(item.getObject())));
plugin.getScanHistory().setHistory(player.getUniqueId(), message);
message.sendTo(player, 0);
} else {
plugin.getMessages().getMessage(Messages.Key.SCANCACHE_NO_CACHE).sendTo(player);
}
}
use of dev.frankheijden.insights.api.concurrent.storage.Storage 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;
}
use of dev.frankheijden.insights.api.concurrent.storage.Storage 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;
});
}
}
}
use of dev.frankheijden.insights.api.concurrent.storage.Storage 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();
}
}
use of dev.frankheijden.insights.api.concurrent.storage.Storage in project Insights by InsightsPlugin.
the class InsightsListener method handleAddonAddition.
private Optional<Storage> handleAddonAddition(Player player, Region region, Consumer<Storage> storageConsumer) {
String key = region.getKey();
AddonStorage addonStorage = plugin.getAddonStorage();
Optional<Storage> storageOptional = addonStorage.get(key);
if (storageOptional.isEmpty()) {
// Notify the user scan started
if (plugin.getSettings().canReceiveAreaScanNotifications(player)) {
plugin.getMessages().getMessage(Messages.Key.AREA_SCAN_STARTED).addTemplates(Messages.tagOf("area", plugin.getAddonManager().getAddon(region.getAddon()).getAreaName())).sendTo(player);
}
scanRegion(player, region, storageConsumer);
return Optional.empty();
}
return storageOptional;
}
Aggregations