From b1b127e6d8362b5fce6bae0190065653872e1133 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Fri, 18 Nov 2016 07:07:12 -0800 Subject: [PATCH 01/30] Fixed permission handlers using uppercase permissions --- .../sponge/foxguard/plugin/handler/PermissionHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java index ea2c593..6bec480 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java @@ -484,7 +484,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N public Text details(CommandSource source, String arguments) { Text.Builder builder = Text.builder(); - Text prefix = Text.of("foxguard.handler.", TextColors.GOLD, this.name); + Text prefix = Text.of("foxguard.handler.", TextColors.GOLD, this.name.toLowerCase()); Text postfix = Text.of(".", TextColors.AQUA, "<", TextColors.GREEN, "allow", @@ -658,7 +658,7 @@ private boolean checkPermissionString(String perm) { } private String expandPermission(String perm) { - if (perm.isEmpty() || perm.startsWith(".")) perm = "foxguard.handler." + this.name + perm; + if (perm.isEmpty() || perm.startsWith(".")) perm = "foxguard.handler." + this.name.toLowerCase() + perm; return perm; } From aeea5997f1e35af6d1d2d0c482d51b886a7ca201 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Fri, 18 Nov 2016 07:08:52 -0800 Subject: [PATCH 02/30] I missed a spot --- .../sponge/foxguard/plugin/handler/util/PermissionEntry.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java index 7ff21df..0a23f38 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java @@ -42,12 +42,12 @@ public class PermissionEntry extends Entry { public PermissionEntry(Set set, String permission) { super(set); - this.permission = permission; + this.permission = permission.toLowerCase(); } public PermissionEntry(String permission, Flag... flags) { super(flags); - this.permission = permission; + this.permission = permission.toLowerCase(); } @Override From 41966b7d2302c638a099b89cc466e3cf4a55ddcb Mon Sep 17 00:00:00 2001 From: gravityfox Date: Sun, 11 Dec 2016 18:01:49 -0800 Subject: [PATCH 03/30] Lots of bugfixes and some changes to listeners. Fixed null tristates. Checks if tristates are nonnull in eventresult Fixes #60 --- .../sponge/foxguard/plugin/FGManager.java | 19 +- .../foxguard/plugin/handler/BasicHandler.java | 13 +- .../foxguard/plugin/handler/GroupHandler.java | 16 +- .../plugin/handler/PermissionHandler.java | 6 + .../plugin/handler/util/TristateEntry.java | 27 ++- .../plugin/listener/BlockChangeListener.java | 31 ++-- .../plugin/listener/DamageListener.java | 166 ++++++++++-------- .../plugin/listener/ExplosionListener.java | 36 ++-- .../plugin/listener/SpawnEntityListener.java | 37 ++-- .../plugin/listener/util/EventResult.java | 6 +- 10 files changed, 210 insertions(+), 147 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index e46fa3a..010ea76 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -32,6 +32,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.SetMultimap; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; @@ -43,6 +44,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; +import org.lwjgl.openal.AL; import org.spongepowered.api.Sponge; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.Tristate; @@ -93,17 +95,6 @@ public static FGManager getInstance() { return instance; } - public static boolean isNameValid(String name) { - if (name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$")) return false; - for (String s : FGStorageManager.FS_ILLEGAL_NAMES) { - if (name.equalsIgnoreCase(s)) return false; - } - for (String s : ILLEGAL_NAMES) { - if (name.equalsIgnoreCase(s)) return false; - } - return true; - } - public boolean isRegistered(IHandler handler) { return handlers.contains(handler); } @@ -501,6 +492,12 @@ public GlobalHandler getGlobalHandler() { return globalHandler; } + public static boolean isNameValid(String name) { + return !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && + !Aliases.isIn(FGStorageManager.FS_ILLEGAL_NAMES, name) && + !Aliases.isIn(ILLEGAL_NAMES, name); + } + public void markDirty(IRegion region, RegionCache.DirtyType type) { regionCache.markDirty(region, type); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 0d99886..0d4fa9a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -134,7 +134,7 @@ public BasicHandler(String name, boolean isEnabled, int priority, Map map = new CacheMap<>((k2, m2) -> { if (k2 instanceof FlagBitSet) { FlagBitSet flags = (FlagBitSet) k2; - Tristate state = null; + Tristate state = UNDEFINED; for (TristateEntry entry : entries) { if (flags.toFlagSet().containsAll(entry.set)) { state = entry.tristate; @@ -170,7 +170,7 @@ public BasicHandler(String name, boolean isEnabled, int priority, } Set set = (Set) k1; List list = new ArrayList<>(set); - Collections.sort(list, (g1, g2) -> this.groups.indexOf(g1) - this.groups.indexOf(g2)); + list.sort(Comparator.comparingInt(this.groups::indexOf)); Map map = new CacheMap<>((k2, m2) -> { if (k2 instanceof FlagBitSet) { Tristate state = null; @@ -1488,12 +1488,9 @@ private List getGroupPermissions(Group group) { } public static boolean isNameValid(String name) { - if (name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$")) return false; - if (name.equalsIgnoreCase("default")) return false; - for (String s : FGStorageManager.FS_ILLEGAL_NAMES) { - if (name.equalsIgnoreCase(s)) return false; - } - return true; + return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && + !name.equalsIgnoreCase("default") && + !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); } public enum PassiveSetting { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 7914c11..fae84ba 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -70,6 +70,7 @@ import java.util.stream.Collectors; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; +import static org.spongepowered.api.util.Tristate.UNDEFINED; public class GroupHandler extends HandlerBase { @@ -124,7 +125,7 @@ public GroupHandler(String name, boolean isEnabled, int priority, Map map = new CacheMap<>((k2, m2) -> { if (k2 instanceof FlagBitSet) { FlagBitSet flags = (FlagBitSet) k2; - Tristate state = null; + Tristate state = UNDEFINED; for (TristateEntry entry : entries) { if (flags.toFlagSet().containsAll(entry.set)) { state = entry.tristate; @@ -142,7 +143,7 @@ public GroupHandler(String name, boolean isEnabled, int priority, this.defaultPermCache = new CacheMap<>((k, m) -> { if (k instanceof FlagBitSet) { FlagBitSet flags = (FlagBitSet) k; - Tristate state = Tristate.UNDEFINED; + Tristate state = UNDEFINED; for (TristateEntry entry : GroupHandler.this.defaultPermissions) { if (flags.toFlagSet().containsAll(entry.set)) { state = entry.tristate; @@ -160,7 +161,7 @@ public GroupHandler(String name, boolean isEnabled, int priority, } Set set = (Set) k1; List list = new ArrayList<>(set); - Collections.sort(list, (g1, g2) -> this.groups.indexOf(g1) - this.groups.indexOf(g2)); + list.sort(Comparator.comparingInt(this.groups::indexOf)); Map map = new CacheMap<>((k2, m2) -> { if (k2 instanceof FlagBitSet) { Tristate state = null; @@ -1166,12 +1167,9 @@ private boolean userFilter(Operation op, boolean isPresent) { } public static boolean isNameValid(String name) { - if (name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$")) return false; - if (name.equalsIgnoreCase("default")) return false; - for (String s : FGStorageManager.FS_ILLEGAL_NAMES) { - if (name.equalsIgnoreCase(s)) return false; - } - return true; + return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && + !name.equalsIgnoreCase("default") && + !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); } public static class Group { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java index 6bec480..96464bd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java @@ -559,6 +559,12 @@ public void save(Path directory) { } } + @Override + public void setName(String name) { + super.setName(name); + this.permCache.clear(); + } + public boolean addFlagEntry(PermissionEntry entry) { return addFlagEntry(0, entry); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java index 43d7f52..cd8b1bb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler.util; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; import org.spongepowered.api.util.Tristate; @@ -42,15 +43,21 @@ public class TristateEntry extends Entry { public TristateEntry(Set set, Tristate tristate) { super(set); - this.tristate = tristate; + if(tristate == null){ + FoxGuardMain.instance().getLogger().warn("Tried to instantiate tristate entry with null tristate! Substituting default value UNDEFINED"); + this.tristate = Tristate.UNDEFINED; + } else this.tristate = tristate; } public TristateEntry(Tristate tristate, Flag... flags) { super(flags); - this.tristate = tristate; + if(tristate == null){ + FoxGuardMain.instance().getLogger().warn("Tried to instantiate tristate entry with null tristate! Substituting default value UNDEFINED"); + this.tristate = Tristate.UNDEFINED; + } else this.tristate = tristate; } - public String serializeValue(){ + public String serializeValue() { return tristate.name(); } @@ -61,10 +68,16 @@ public static TristateEntry deserialize(String string) { Set flagSet = new HashSet<>(); for (String flagName : flags) { Optional flagOptional = registry.getFlag(flagName); - if (flagOptional.isPresent()) { - flagSet.add(flagOptional.get()); - } + flagOptional.ifPresent(flagSet::add); } - return new TristateEntry(flagSet, Tristate.valueOf(parts[1])); + Tristate tristate; + try { + tristate = Tristate.valueOf(parts[1]); + } catch (IllegalArgumentException e) { + FoxGuardMain.instance().getLogger().error("Error deserializing tristate value \"" + parts[1] + "\"!", e); + FoxGuardMain.instance().getLogger().warn("Substituting default value UNDEFINED"); + tristate = Tristate.UNDEFINED; + } + return new TristateEntry(flagSet, tristate); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index 50ee921..513a1a1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -28,8 +28,10 @@ import com.flowpowered.math.vector.Vector3i; import net.foxdenstudio.sponge.foxcore.plugin.command.CommandDebug; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.block.BlockSnapshot; @@ -94,8 +96,6 @@ public void handle(ChangeBlockEvent event) throws Exception { //FoxGuardMain.instance().getLogger().info(player.getName()); - List handlerList; - List> transactions = event.getTransactions(); Set handlerSet = new HashSet<>(); if (transactions.size() == 1) { @@ -117,19 +117,26 @@ public void handle(ChangeBlockEvent event) throws Exception { .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } - handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); - int currPriority = handlerList.get(0).getPriority(); Tristate flagState = UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; + if (!handlerSet.isEmpty()) { + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); } - //flagState = flagState.and(handler.handle(user, typeFlag, Optional.of(event)).getState()); - flagState = flagState.and(handler.handle(user, flags, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); + } else { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); } -// if(flagState == UNDEFINED) flagState = TRUE; if (flagState == FALSE) { if (user instanceof Player) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index 0de2baa..ecf238f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -30,6 +30,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; @@ -51,9 +52,7 @@ import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.World; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; import static org.spongepowered.api.util.Tristate.*; @@ -97,94 +96,119 @@ public void handle(DamageEntityEvent event) throws Exception { } - List handlerList = new ArrayList<>(); + Set handlerSet = new HashSet<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getHandlers().stream() .filter(IFGObject::isEnabled) - .filter(handler -> !handlerList.contains(handler)) - .forEach(handlerList::add)); - - Collections.sort(handlerList); - int currPriority; + .forEach(handlerSet::add)); Tristate flagState = UNDEFINED; boolean invincible = false; - if (entity instanceof Player) { - currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; + if (!handlerSet.isEmpty()) { + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + + int currPriority; + if (entity instanceof Player) { + currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, INVINCIBLE_FLAG_SET, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); } - flagState = flagState.and(handler.handle((Player) entity, INVINCIBLE_FLAG_SET, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); - } -// if(flagState == UNDEFINED) flagState = FALSE; - if (flagState == TRUE) { - invincible = true; - flagState = FALSE; - } - } - if (!invincible) { - currPriority = handlerList.get(0).getPriority(); - flagState = UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; + + if (flagState == TRUE) { + invincible = true; + flagState = FALSE; } - flagState = flagState.and(handler.handle(player, flags, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); } -// if(flagState == UNDEFINED) flagState = TRUE; - } - if (flagState == FALSE) { - if (player != null && player.isOnline() && !invincible) { - player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); - } - event.setCancelled(true); - } else { - if (event.willCauseDeath()) { - flags.set(KILL); + if (!invincible) { + currPriority = handlerList.get(0).getPriority(); flagState = UNDEFINED; - invincible = false; - if (entity instanceof Player) { - currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; - } - flagState = flagState.and(handler.handle((Player) entity, UNDYING_FLAG_SET, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; } -// if(flagState == UNDEFINED) flagState = FALSE; - if (flagState == TRUE) { - invincible = true; - flagState = FALSE; + EventResult result = handler.handle(player, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); } + currPriority = handler.getPriority(); } - if (!invincible) { - currPriority = handlerList.get(0).getPriority(); +// if(flagState == UNDEFINED) flagState = TRUE; + } + if (flagState == FALSE) { + if (player != null && player.isOnline() && !invincible) { + player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); + } + event.setCancelled(true); + } else { + if (event.willCauseDeath()) { + flags.set(KILL); flagState = UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; + invincible = false; + if (entity instanceof Player) { + currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, UNDYING_FLAG_SET, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); + } +// if(flagState == UNDEFINED) flagState = FALSE; + if (flagState == TRUE) { + invincible = true; + flagState = FALSE; } - flagState = flagState.and(handler.handle(player, flags, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); } + if (!invincible) { + currPriority = handlerList.get(0).getPriority(); + flagState = UNDEFINED; + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); + } // if(flagState == UNDEFINED) flagState = TRUE; + } + if (flagState == FALSE) { + DamageModifier.Builder builder = DamageModifier.builder(); + builder.type(DamageModifierTypes.ABSORPTION); + builder.cause(FoxGuardMain.getCause()); + event.setDamage(builder.build(), damage -> ((Living) event.getTargetEntity()).getHealthData().health().get() - damage - 1); + if (player != null && player.isOnline() && !invincible) + player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission to kill!")); + } } - if (flagState == FALSE) { - DamageModifier.Builder builder = DamageModifier.builder(); - builder.type(DamageModifierTypes.ABSORPTION); - builder.cause(FoxGuardMain.getCause()); - event.setDamage(builder.build(), damage -> ((Living) event.getTargetEntity()).getHealthData().health().get() - damage - 1); - if (player != null && player.isOnline() && !invincible) - player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission to kill!")); - } + //makes sure that handlers are unable to cancel the event directly. + event.setCancelled(false); } - //makes sure that handlers are unable to cancel the event directly. - event.setCancelled(false); + } else { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); } + } private Player getPlayerCause(Cause cause) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index d38a965..73e04df 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -30,6 +30,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.explosive.Explosive; @@ -69,11 +70,7 @@ public void handle(ExplosionEvent event) throws Exception { Explosive explosive = explosiveOptional.get(); UUID uuid; Optional notifierOptional = explosive.getNotifier(); - if (notifierOptional.isPresent()) { - uuid = notifierOptional.get(); - } else { - uuid = explosive.getCreator().orElse(null); - } + uuid = notifierOptional.orElseGet(() -> explosive.getCreator().orElse(null)); if (uuid != null) { UserStorageService storageService = FoxGuardMain.instance().getUserStorage(); user = storageService.get(uuid).orElse(null); @@ -116,18 +113,29 @@ public void handle(ExplosionEvent event) throws Exception { .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } - List handlerList = new ArrayList<>(handlerSet); - - Collections.sort(handlerList); - int currPriority = handlerList.get(0).getPriority(); Tristate flagState = Tristate.UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { - break; + + if (!handlerSet.isEmpty()) { + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); } - flagState = flagState.and(handler.handle(user, flags, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); + } else { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); } + if (flagState == Tristate.FALSE) { if (user instanceof Player) ((Player) user).sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index 253c8a0..6ea38bc 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -27,8 +27,10 @@ import com.flowpowered.math.vector.Vector3d; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; @@ -47,9 +49,7 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; @@ -107,8 +107,7 @@ public void handle(SpawnEntityEvent event) throws Exception { flags.set(HANGING); } - List handlerList = new ArrayList<>(); - + Set handlerSet = new HashSet<>(); for (Entity entity : event.getEntities()) { Location loc = entity.getLocation(); Vector3d pos = loc.getPosition(); @@ -117,19 +116,29 @@ public void handle(SpawnEntityEvent event) throws Exception { .filter(region -> region.contains(pos, world)) .forEach(region -> region.getHandlers().stream() .filter(IFGObject::isEnabled) - .filter(handler -> !handlerList.contains(handler)) - .forEach(handlerList::add)); + .forEach(handlerSet::add)); } - Collections.sort(handlerList); - int currPriority = handlerList.get(0).getPriority(); Tristate flagState = Tristate.UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { - break; + if (!handlerSet.isEmpty()) { + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" returned null!"); + } + currPriority = handler.getPriority(); } - flagState = flagState.and(handler.handle(user, flags, ExtraContext.of(event)).getState()); - currPriority = handler.getPriority(); + } else { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); } + if (flagState == Tristate.FALSE) { if (user instanceof Player) ((Player) user).sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java index ddc6d79..33142e1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.listener.util; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import org.spongepowered.api.util.Tristate; public final class EventResult { @@ -37,7 +38,10 @@ public final class EventResult { private final boolean displayDefaultMessage; private EventResult(Tristate success, boolean displayDefaultMessage) { - this.state = success; + if(success == null){ + FoxGuardMain.instance().getLogger().warn("Tried to instantiate event result with null tristate! Substituting default value UNDEFINED"); + this.state = Tristate.UNDEFINED; + } else this.state = success; this.displayDefaultMessage = displayDefaultMessage; } From 3470917fd677823280e6118bc6f402a3544b03bc Mon Sep 17 00:00:00 2001 From: gravityfox Date: Wed, 21 Dec 2016 01:39:35 -0800 Subject: [PATCH 04/30] I BROKE EVERYTHING AGAIN AGAIN!!! Owners refactor + Optional Refactor Also IDEA reformat. --- .../sponge/foxguard/plugin/FGManager.java | 286 +++++++++++++----- .../foxguard/plugin/FGStorageManager.java | 167 ++++++---- .../sponge/foxguard/plugin/FoxGuardMain.java | 14 +- .../plugin/command/CommandCreate.java | 6 +- .../plugin/command/CommandDelete.java | 21 +- .../plugin/command/CommandDetail.java | 16 +- .../plugin/command/CommandEnableDisable.java | 10 +- .../foxguard/plugin/command/CommandHere.java | 5 +- .../foxguard/plugin/command/CommandLink.java | 17 +- .../foxguard/plugin/command/CommandList.java | 5 +- .../plugin/command/CommandModify.java | 24 +- .../plugin/command/CommandPriority.java | 2 +- .../plugin/command/CommandRename.java | 19 +- .../plugin/command/link/LinkageParser.java | 60 ++-- .../plugin/compat/djxy/pm/FGCompat.java | 6 +- .../plugin/controller/ControllerBase.java | 4 +- .../plugin/controller/LogicController.java | 11 +- .../foxguard/plugin/handler/BasicHandler.java | 51 ++-- .../foxguard/plugin/handler/DebugHandler.java | 7 +- .../foxguard/plugin/handler/GroupHandler.java | 42 +-- .../foxguard/plugin/handler/HandlerBase.java | 2 +- .../plugin/handler/PermissionHandler.java | 7 +- .../plugin/handler/StaticHandler.java | 13 +- .../plugin/handler/WelcomeHandler.java | 34 +++ .../foxguard/plugin/handler/util/Entry.java | 4 - .../plugin/handler/util/PermissionEntry.java | 12 +- .../plugin/handler/util/TristateEntry.java | 12 +- .../plugin/listener/ExplosionListener.java | 8 +- .../listener/InteractEntityListener.java | 10 +- .../plugin/listener/PlayerMoveListener.java | 74 ++--- .../listener/PlayerMoveListenerNew.java | 60 ++-- .../plugin/listener/util/EventResult.java | 2 +- .../plugin/misc/FGContextCalculator.java | 13 +- .../foxguard/plugin/object/FGObjectBase.java | 20 +- .../foxguard/plugin/object/IFGObject.java | 5 + .../foxguard/plugin/region/RegionBase.java | 2 +- .../plugin/region/world/CuboidRegion.java | 31 +- .../region/world/RectangularRegion.java | 51 ++-- .../plugin/state/ControllersStateField.java | 12 +- .../plugin/state/HandlersStateField.java | 12 +- .../plugin/state/RegionsStateField.java | 11 +- .../sponge/foxguard/plugin/util/FGUtil.java | 24 ++ .../foxguard/plugin/util/RegionCache.java | 50 +-- 43 files changed, 765 insertions(+), 477 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index 010ea76..e959703 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -30,6 +30,7 @@ import com.flowpowered.math.vector.Vector3i; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; import com.google.common.collect.SetMultimap; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; @@ -44,7 +45,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; -import org.lwjgl.openal.AL; import org.spongepowered.api.Sponge; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.Tristate; @@ -56,12 +56,13 @@ public final class FGManager { + public static final UUID SERVER_UUID = new UUID(0, 0); public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything"}; private static FGManager instance; - private final Map> worldRegions; - private final Set regions; - private final Set handlers; + private final Map> worldRegions; + private final Multimap regions; + private final Multimap handlers; private final GlobalRegion globalRegion; private final GlobalHandler globalHandler; @@ -71,51 +72,58 @@ private FGManager() { instance = this; worldRegions = new CacheMap<>((key, map) -> { if (key instanceof World) { - Set set = new HashSet<>(); - map.put((World) key, set); - return set; - } else return new HashSet<>(); + Multimap uuidMap = HashMultimap.create(); + map.put((World) key, uuidMap); + return uuidMap; + } else return null; }); - regions = new HashSet<>(); - handlers = new HashSet<>(); + regions = HashMultimap.create(); + handlers = HashMultimap.create(); globalRegion = new GlobalRegion(); globalHandler = new GlobalHandler(); - regions.add(globalRegion); - handlers.add(globalHandler); + regions.put(SERVER_UUID, globalRegion); + handlers.put(SERVER_UUID, globalHandler); globalRegion.addHandler(globalHandler); this.regionCache = new RegionCache(regions, worldRegions); } - public static synchronized void init() { + public static void init() { if (instance == null) instance = new FGManager(); + if (instance.regions.isEmpty()) instance.regions.put(SERVER_UUID, instance.globalRegion); + if (instance.handlers.isEmpty()) instance.handlers.put(SERVER_UUID, instance.globalHandler); } public static FGManager getInstance() { return instance; } + public static boolean isNameValid(String name) { + return !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && + !Aliases.isIn(FGStorageManager.FS_ILLEGAL_NAMES, name) && + !Aliases.isIn(ILLEGAL_NAMES, name); + } + public boolean isRegistered(IHandler handler) { - return handlers.contains(handler); + return handlers.containsValue(handler); } public boolean isRegionNameAvailable(String name) { - if (getRegion(name) != null) return false; + if (getRegion(name).isPresent()) return false; for (World world : worldRegions.keySet()) { - if (getWorldRegion(world, name) != null) return false; + if (getWorldRegion(world, name).isPresent()) return false; } return true; } public boolean isWorldRegionNameAvailable(String name, World world) { - if (getWorldRegion(world, name) != null || getRegion(name) != null) return false; - else return true; + return !(getWorldRegion(world, name).isPresent() || getRegion(name).isPresent()); } public Tristate isWorldRegionNameAvailable(String name) { Tristate available = null; for (World world : worldRegions.keySet()) { - if (getWorldRegion(world, name) == null) { + if (!getWorldRegion(world, name).isPresent()) { if (available == null) { available = Tristate.TRUE; } else if (available == Tristate.FALSE) { @@ -133,11 +141,15 @@ public Tristate isWorldRegionNameAvailable(String name) { } public boolean addWorldRegion(World world, IWorldRegion region) { + return addWorldRegion(world, region, SERVER_UUID); + } + + public boolean addWorldRegion(World world, IWorldRegion region, UUID uuid) { if (region == null || region.getWorld() != null || !isWorldRegionNameAvailable(region.getName(), world) || !isNameValid(region.getName())) return false; region.setWorld(world); - this.worldRegions.get(world).add(region); + this.worldRegions.get(world).put(uuid, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); FGStorageManager.getInstance().addObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); @@ -145,8 +157,12 @@ public boolean addWorldRegion(World world, IWorldRegion region) { } public boolean addRegion(IRegion region) { + return addRegion(region, SERVER_UUID); + } + + public boolean addRegion(IRegion region, UUID uuid) { if (region == null || !isRegionNameAvailable(region.getName()) || !isNameValid(region.getName())) return false; - this.regions.add(region); + this.regions.put(uuid, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); FGStorageManager.getInstance().addObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); @@ -154,64 +170,119 @@ public boolean addRegion(IRegion region) { } public boolean addRegion(IRegion region, World world) { + return addRegion(region, world, SERVER_UUID); + } + + public boolean addRegion(IRegion region, World world, UUID uuid) { if (region instanceof IWorldRegion) { - return world != null && addWorldRegion(world, (IWorldRegion) region); - } else return addRegion(region); + return world != null && addWorldRegion(world, (IWorldRegion) region, uuid); + } else return addRegion(region, uuid); } - public IWorldRegion getWorldRegion(World world, String name) { - for (IWorldRegion region : this.worldRegions.get(world)) { + public Optional getWorldRegion(World world, String name) { + return getWorldRegion(world, name, SERVER_UUID); + } + + public Optional getWorldRegion(World world, String name, UUID uuid) { + for (IWorldRegion region : this.worldRegions.get(world).get(uuid)) { if (region.getName().equalsIgnoreCase(name)) { - return region; + return Optional.of(region); } } - return null; + return Optional.empty(); + } + + public Optional getRegion(String name) { + return getRegion(name, SERVER_UUID); } - public IRegion getRegion(String name) { - for (IRegion region : this.regions) { + public Optional getRegion(String name, UUID uuid) { + for (IRegion region : this.regions.get(uuid)) { if (region.getName().equalsIgnoreCase(name)) { - return region; + return Optional.of(region); } } - return null; + return Optional.empty(); + } + + public Optional getRegionFromWorld(World world, String name) { + return getRegionFromWorld(world, name, SERVER_UUID); } - public IRegion getRegionFromWorld(World world, String name) { - IRegion region = getWorldRegion(world, name); - if (region == null) { - return getRegion(name); - } else return region; + public Optional getRegionFromWorld(World world, String name, UUID uuid) { + Optional region = getWorldRegion(world, name, uuid); + if (!region.isPresent()) { + return getRegion(name, uuid); + } else return Optional.of(region.get()); } public Set getRegions() { - return ImmutableSet.copyOf(this.regions); + return ImmutableSet.copyOf(this.regions.values()); + } + + public Set getServerRegions() { + return getRegions(SERVER_UUID); + } + + public Set getRegions(UUID uuid) { + return ImmutableSet.copyOf(this.regions.get(uuid)); } public Set getWorldRegions(World world) { - return ImmutableSet.copyOf(this.worldRegions.get(world)); + return ImmutableSet.copyOf(this.worldRegions.get(world).values()); + } + + public Set getServerWorldRegions(World world) { + return getWorldRegions(world, SERVER_UUID); + } + + public Set getWorldRegions(World world, UUID uuid) { + return ImmutableSet.copyOf(this.worldRegions.get(world).get(uuid)); } public Set getAllRegions() { Set set = new HashSet<>(); - this.worldRegions.forEach((world, worldSet) -> worldSet.forEach(set::add)); - this.regions.forEach(set::add); + this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.values().forEach(set::add)); + this.regions.values().forEach(set::add); return ImmutableSet.copyOf(set); } + public Set getAllServerRegions() { + return getAllRegions(SERVER_UUID); + } + + public Set getAllRegions(UUID uuid) { + Set set = new HashSet<>(); + this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.get(uuid).forEach(set::add)); + this.regions.get(uuid).forEach(set::add); + return ImmutableSet.copyOf(set); + } + + public Set getAllServerRegions(World world) { + return getAllRegions(world, SERVER_UUID); + } + public Set getAllRegions(World world) { if (world == null) return getRegions(); Set set = new HashSet<>(); - this.worldRegions.get(world).forEach(set::add); - this.regions.forEach(set::add); + this.worldRegions.get(world).values().forEach(set::add); + this.regions.values().forEach(set::add); + return ImmutableSet.copyOf(set); + } + + public Set getAllRegions(World world, UUID uuid) { + if (world == null) return getRegions(); + Set set = new HashSet<>(); + this.worldRegions.get(world).get(uuid).forEach(set::add); + this.regions.get(uuid).forEach(set::add); return ImmutableSet.copyOf(set); } - public Set getAllRegions(World world, Vector3i chunk) { - return getAllRegions(world, chunk, false); + public Set getRegionsInChunk(World world, Vector3i chunk) { + return getRegionsInChunk(world, chunk, false); } - public Set getAllRegions(World world, Vector3i chunk, boolean includeDisabled) { + public Set getRegionsInChunk(World world, Vector3i chunk, boolean includeDisabled) { return this.regionCache.getData(world, chunk).getRegions(includeDisabled); } @@ -350,66 +421,109 @@ public Set getRegionsInChunkAtPos(World world, Vector3d pos, boolean in } public Set getHandlers() { - return ImmutableSet.copyOf(this.handlers); + return ImmutableSet.copyOf(this.handlers.values()); + } + + public Set getServerHandlers() { + return getHandlers(SERVER_UUID); + } + + public Set getHandlers(UUID uuid) { + return ImmutableSet.copyOf(this.handlers.get(uuid)); } public Set getHandlers(boolean includeControllers) { if (includeControllers) { - return ImmutableSet.copyOf(this.handlers); + return getHandlers(); } else { - return this.handlers.stream() + return this.handlers.values().stream() + .filter(handler -> !(handler instanceof IController)) + .collect(GuavaCollectors.toImmutableSet()); + } + } + + public Set getServerHandlers(boolean includeControllers) { + return getHandlers(includeControllers, SERVER_UUID); + } + + public Set getHandlers(boolean includeControllers, UUID uuid) { + if (includeControllers) { + return getHandlers(uuid); + } else { + return this.handlers.get(uuid).stream() .filter(handler -> !(handler instanceof IController)) .collect(GuavaCollectors.toImmutableSet()); } } public Set getControllers() { - return this.handlers.stream() + return this.handlers.values().stream() + .filter(handler -> handler instanceof IController) + .map(handler -> ((IController) handler)) + .collect(GuavaCollectors.toImmutableSet()); + } + + public Set getServerControllers() { + return getControllers(SERVER_UUID); + } + + public Set getControllers(UUID uuid) { + return this.handlers.get(uuid).stream() .filter(handler -> handler instanceof IController) .map(handler -> ((IController) handler)) .collect(GuavaCollectors.toImmutableSet()); } public boolean addHandler(IHandler handler) { + return addHandler(handler, SERVER_UUID); + } + + public boolean addHandler(IHandler handler, UUID uuid) { if (handler == null) return false; - if (gethandler(handler.getName()) != null) return false; - handlers.add(handler); + if (gethandler(handler.getName()).isPresent()) return false; + handlers.put(uuid, handler); FGStorageManager.getInstance().addObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); return true; } - public IHandler gethandler(String name) { - for (IHandler handler : handlers) { + public Optional gethandler(String name) { + return gethandler(name, SERVER_UUID); + } + + public Optional gethandler(String name, UUID uuid) { + for (IHandler handler : handlers.get(uuid)) { if (handler.getName().equalsIgnoreCase(name)) { - return handler; + return Optional.of(handler); } } - return null; + return Optional.empty(); } - public IController getController(String name) { - for (IHandler handler : handlers) { + public Optional getController(String name) { + return getController(name, SERVER_UUID); + } + + public Optional getController(String name, UUID uuid) { + for (IHandler handler : handlers.get(uuid)) { if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { - return (IController) handler; + return Optional.of((IController) handler); } } - return null; + return Optional.empty(); } public boolean removeHandler(IHandler handler) { if (handler == null || handler instanceof GlobalHandler) return false; - this.worldRegions.forEach((world, set) -> { - set.stream() - .filter(region -> region.getHandlers().contains(handler)) - .forEach(region -> region.removeHandler(handler)); - }); - if (!this.handlers.contains(handler)) { + this.worldRegions.forEach((world, set) -> set.values().stream() + .filter(region -> region.getHandlers().contains(handler)) + .forEach(region -> region.removeHandler(handler))); + if (!this.handlers.values().contains(handler)) { return false; } FGStorageManager.getInstance().removeObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); - handlers.remove(handler); + handlers.values().remove(handler); return true; } @@ -418,8 +532,8 @@ public boolean removeRegion(IRegion region) { return removeWorldRegion((IWorldRegion) region); } else { if (region == null) return false; - if (!this.regions.contains(region)) return false; - this.regions.remove(region); + if (!this.regions.values().contains(region)) return false; + this.regions.values().remove(region); FGStorageManager.getInstance().removeObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); this.regionCache.markDirty(region, RegionCache.DirtyType.REMOVED); @@ -431,15 +545,15 @@ public boolean removeWorldRegion(IWorldRegion region) { if (region == null || region instanceof GlobalWorldRegion) return false; boolean removed = false; if (region.getWorld() != null) { - if (!this.worldRegions.get(region.getWorld()).contains(region)) { + if (!this.worldRegions.get(region.getWorld()).values().contains(region)) { return false; } - this.worldRegions.get(region.getWorld()).remove(region); + this.worldRegions.get(region.getWorld()).values().remove(region); removed = true; } else { - for (Set set : this.worldRegions.values()) { - if (set.contains(region)) { - set.remove(region); + for (Multimap multimap : this.worldRegions.values()) { + if (multimap.values().contains(region)) { + multimap.values().remove(region); removed = true; } } @@ -465,11 +579,15 @@ public boolean unlink(ILinkable linkable, IHandler handler) { } public boolean rename(IFGObject object, String newName) { - if (object instanceof IWorldRegion) { - IWorldRegion region = (IWorldRegion) object; - if (this.getWorldRegion(region.getWorld(), newName) != null) return false; + if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + IWorldRegion region = (IWorldRegion) object; + if (!isWorldRegionNameAvailable(newName, region.getWorld())) return false; + } else { + if (this.getRegion(newName).isPresent()) return false; + } } else if (object instanceof IHandler) { - if (this.gethandler(newName) != null) return false; + if (this.gethandler(newName).isPresent()) return false; } FGStorageManager.getInstance().removeObject(object); object.setName(newName); @@ -480,7 +598,7 @@ public boolean rename(IFGObject object, String newName) { public void initWorld(World world) { GlobalWorldRegion gwr = new GlobalWorldRegion(); gwr.setWorld(world); - this.worldRegions.get(world).add(gwr); + this.worldRegions.get(world).put(SERVER_UUID, gwr); this.regionCache.markDirty(gwr, RegionCache.DirtyType.ADDED); } @@ -488,14 +606,14 @@ public void unloadWorld(World world) { this.worldRegions.remove(world); } - public GlobalHandler getGlobalHandler() { - return globalHandler; + public void unloadServer() { + this.regions.clear(); + this.handlers.clear(); + this.regionCache.clearCaches(); } - public static boolean isNameValid(String name) { - return !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && - !Aliases.isIn(FGStorageManager.FS_ILLEGAL_NAMES, name) && - !Aliases.isIn(ILLEGAL_NAMES, name); + public GlobalHandler getGlobalHandler() { + return globalHandler; } public void markDirty(IRegion region, RegionCache.DirtyType type) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java index 49775d8..d6f060b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java @@ -39,6 +39,8 @@ import org.mapdb.*; import org.slf4j.Logger; import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.world.World; import java.io.IOException; @@ -46,6 +48,8 @@ import java.nio.file.attribute.BasicFileAttributes; import java.util.*; +import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; + /** * Created by Fox on 4/6/2016. */ @@ -53,15 +57,16 @@ public final class FGStorageManager { public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; - - public final HashMap defaultModifiedMap; private static FGStorageManager instance; + public final HashMap defaultModifiedMap; + private final UserStorageService userStorageService; private final Logger logger = FoxGuardMain.instance().getLogger(); private final Set loaded = new HashSet<>(); private final Path directory = getDirectory(); private final Map worldDirectories; private FGStorageManager() { + userStorageService = FoxGuardMain.instance().getUserStorage(); defaultModifiedMap = new CacheMap<>((k, m) -> { if (k instanceof IFGObject) { m.put((IFGObject) k, true); @@ -92,54 +97,62 @@ public synchronized void saveRegions(boolean force) { try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); mainMap.clear(); linksMap.clear(); - Path dir = directory.resolve("regions"); - constructDirectory(dir); + Path serverDir = directory.resolve("regions"); + constructDirectory(serverDir); FGManager.getInstance().getRegions().forEach(fgObject -> { String name = fgObject.getName(); + UUID owner = fgObject.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; if (fgObject.autoSave()) { - Path singleDir = dir.resolve(name.toLowerCase()); + Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving region \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving region " + logName + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving region \"" + name + "\"!", e); + logger.error("There was an error while saving region " + logName + "!", e); } - logger.info("Saving metadata for region \"" + name + "\""); + logger.info("Saving metadata for region " + logName); try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); + Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); metaName.set(name); metaCategory.set(FGUtil.getCategory(fgObject)); metaType.set(fgObject.getUniqueTypeString()); + metaOwner.set(owner); metaEnabled.set(fgObject.isEnabled()); } } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); + logger.info("Region " + logName + " is already up to date. Skipping..."); } mainMap.put(name, FGUtil.getCategory(fgObject)); typeMap.put(name, fgObject.getUniqueTypeString()); + ownerMap.put(name, owner); enabledMap.put(name, fgObject.isEnabled()); defaultModifiedMap.put(fgObject, false); } else { - logger.info("Region " + fgObject.getName() + " does not need saving. Skipping..."); + logger.info("Region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); } else { - logger.info("Region " + fgObject.getName() + " does not need its links saved. Skipping..."); + logger.info("Region " + logName + " does not need its links saved. Skipping..."); } }); } catch (DBException.DataCorruption e) { @@ -164,55 +177,63 @@ public synchronized void saveWorldRegions(World world, boolean force) { try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); mainMap.clear(); linksMap.clear(); - Path dir = worldDirectories.get(world.getName()).resolve("wregions"); - constructDirectory(dir); + Path serverDir = worldDirectories.get(world.getName()).resolve("wregions"); + constructDirectory(serverDir); FGManager.getInstance().getWorldRegions(world).forEach(fgObject -> { String name = fgObject.getName(); + UUID owner = fgObject.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; if (fgObject.autoSave()) { - Path singleDir = dir.resolve(name.toLowerCase()); + Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving world region \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving world region " + logName + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving world region \"" + name + "\" in world \"" + world.getName() + "\"!", e); + logger.error("There was an error while saving world region " + logName + " in world " + world.getName() + "!", e); } - logger.info("Saving metadata for world region \"" + name + "\""); + logger.info("Saving metadata for world region " + logName); try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); + Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); metaName.set(name); metaCategory.set(FGUtil.getCategory(fgObject)); metaType.set(fgObject.getUniqueTypeString()); + metaOwner.set(owner); metaEnabled.set(fgObject.isEnabled()); } } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); + logger.info("Region " + logName + " is already up to date. Skipping..."); } mainMap.put(name, FGUtil.getCategory(fgObject)); typeMap.put(name, fgObject.getUniqueTypeString()); + ownerMap.put(name, owner); enabledMap.put(name, fgObject.isEnabled()); defaultModifiedMap.put(fgObject, false); } else { - logger.info("World region " + fgObject.getName() + " does not need saving. Skipping..."); + logger.info("World region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); } else { - logger.info("World region " + fgObject.getName() + " does not need its links saved. Skipping..."); + logger.info("World region " + logName + " does not need its links saved. Skipping..."); } }); } catch (DBException.DataCorruption e) { @@ -237,52 +258,60 @@ public synchronized void saveHandlers(boolean force) { try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); Map priorityMap = mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen(); mainMap.clear(); - Path dir = directory.resolve("handlers"); - constructDirectory(dir); + Path serverDir = directory.resolve("handlers"); + constructDirectory(serverDir); FGManager.getInstance().getHandlers().forEach(fgObject -> { + String name = fgObject.getName(); + UUID owner = fgObject.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; if (fgObject.autoSave()) { - String name = fgObject.getName(); - Path singleDir = dir.resolve(name.toLowerCase()); + Path singleDir = serverDir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving handler \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving handler " + logName + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving handler \"" + name + "\"!", e); + logger.error("There was an error while saving handler " + logName + "!", e); } - logger.info("Saving metadata for handler \"" + name + "\""); + logger.info("Saving metadata for handler " + logName); try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); + Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); Atomic.Integer metaPriority = metaDB.atomicInteger("priority").createOrOpen(); metaName.set(name); metaCategory.set(FGUtil.getCategory(fgObject)); metaType.set(fgObject.getUniqueTypeString()); + metaOwner.set(owner); metaEnabled.set(fgObject.isEnabled()); metaPriority.set(fgObject.getPriority()); } } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); + logger.info("Region " + logName + " is already up to date. Skipping..."); } mainMap.put(name, FGUtil.getCategory(fgObject)); typeMap.put(name, fgObject.getUniqueTypeString()); + ownerMap.put(name, owner); enabledMap.put(name, fgObject.isEnabled()); priorityMap.put(name, fgObject.getPriority()); defaultModifiedMap.put(fgObject, false); } else { - logger.info("Handler " + fgObject.getName() + " does not need saving. Skipping..."); + logger.info("Handler " + logName + " does not need saving. Skipping..."); } }); } catch (DBException.DataCorruption e) { @@ -308,50 +337,58 @@ public synchronized void saveRegion(IRegion fgObject, boolean force) { try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - Path dir = directory.resolve("regions"); - constructDirectory(dir); + Path serverDir = directory.resolve("regions"); + constructDirectory(serverDir); String name = fgObject.getName(); + UUID owner = fgObject.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; if (fgObject.autoSave()) { - Path singleDir = dir.resolve(name.toLowerCase()); + Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving region \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving region " + logName + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving region \"" + name + "\"!", e); + logger.error("There was an error while saving region " + logName + "!", e); } - logger.info("Saving metadata for region \"" + name + "\""); + logger.info("Saving metadata for region " + logName); try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); + Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); metaName.set(name); metaCategory.set(FGUtil.getCategory(fgObject)); metaType.set(fgObject.getUniqueTypeString()); + metaOwner.set(owner); metaEnabled.set(fgObject.isEnabled()); } } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); + logger.info("Region " + logName + " is already up to date. Skipping..."); } mainMap.put(name, FGUtil.getCategory(fgObject)); typeMap.put(name, fgObject.getUniqueTypeString()); + ownerMap.put(name, owner); enabledMap.put(name, fgObject.isEnabled()); defaultModifiedMap.put(fgObject, false); } else { - logger.info("Region " + fgObject.getName() + " does not need saving. Skipping..."); + logger.info("Region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); } else { - logger.info("Region " + fgObject.getName() + " does not need its links saved. Skipping..."); + logger.info("Region " + logName + " does not need its links saved. Skipping..."); } } catch (DBException.DataCorruption e) { try { @@ -376,51 +413,59 @@ public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - Path dir = worldDirectories.get(world.getName()).resolve("wregions"); - constructDirectory(dir); + Path serverDir = worldDirectories.get(world.getName()).resolve("wregions"); + constructDirectory(serverDir); String name = fgObject.getName(); + UUID owner = fgObject.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; if (fgObject.autoSave()) { - Path singleDir = dir.resolve(name.toLowerCase()); + Path singleDir = serverDir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving world region \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving world region " + logName + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving world region \"" + name + "\" in world \"" + world.getName() + "\"!", e); + logger.error("There was an error while saving world region " + logName + " in world " + world.getName() + "!", e); } - logger.info("Saving metadata for world region \"" + name + "\""); + logger.info("Saving metadata for world region " + logName); try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); + Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); metaName.set(name); metaCategory.set(FGUtil.getCategory(fgObject)); metaType.set(fgObject.getUniqueTypeString()); + metaOwner.set(owner); metaEnabled.set(fgObject.isEnabled()); } } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); + logger.info("Region " + name + " is already up to date. Skipping..."); } mainMap.put(name, FGUtil.getCategory(fgObject)); typeMap.put(name, fgObject.getUniqueTypeString()); + ownerMap.put(name, owner); enabledMap.put(name, fgObject.isEnabled()); defaultModifiedMap.put(fgObject, false); } else { - logger.info("World region " + fgObject.getName() + " does not need saving. Skipping..."); + logger.info("World region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); } else { - logger.info("World region " + fgObject.getName() + " does not need its links saved. Skipping..."); + logger.info("World region " + logName + " does not need its links saved. Skipping..."); } } catch (DBException.DataCorruption e) { try { @@ -882,15 +927,17 @@ public synchronized void loadRegionLinks() { try (DB mainDB = DBMaker.fileDB(directory.resolve("regions.foxdb").normalize().toString()).make()) { Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); linksMap.entrySet().forEach(entry -> { - IRegion region = FGManager.getInstance().getRegion(entry.getKey()); - if (region != null) { + Optional regionOpt = FGManager.getInstance().getRegion(entry.getKey()); + if (regionOpt.isPresent()) { + IRegion region = regionOpt.get(); logger.info("Loading links for region \"" + region.getName() + "\""); String handlersString = entry.getValue(); if (handlersString != null && !handlersString.isEmpty()) { String[] handlersNames = handlersString.split(","); Arrays.stream(handlersNames).forEach(handlerName -> { - IHandler handler = FGManager.getInstance().gethandler(handlerName); - if (handler != null) { + Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); + if (handlerOpt.isPresent()) { + IHandler handler = handlerOpt.get(); if (FGManager.getInstance().link(region, handler)) logger.info("Linked region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); } @@ -906,15 +953,17 @@ public synchronized void loadWorldRegionLinks(World world) { try (DB mainDB = DBMaker.fileDB(worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize().toString()).make()) { Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); linksMap.entrySet().forEach(entry -> { - IRegion region = FGManager.getInstance().getWorldRegion(world, entry.getKey()); - if (region != null) { + Optional regionOpt = FGManager.getInstance().getWorldRegion(world, entry.getKey()); + if (regionOpt.isPresent()) { + IWorldRegion region = regionOpt.get(); logger.info("Loading links for world region \"" + region.getName() + "\""); String handlersString = entry.getValue(); if (handlersString != null && !handlersString.isEmpty()) { String[] handlersNames = handlersString.split(","); Arrays.stream(handlersNames).forEach(handlerName -> { - IHandler handler = FGManager.getInstance().gethandler(handlerName); - if (handler != null) { + Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); + if (handlerOpt.isPresent()) { + IHandler handler = handlerOpt.get(); if (FGManager.getInstance().link(region, handler)) logger.info("Linked world region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); } @@ -1124,6 +1173,10 @@ private String serializeHandlerList(Collection handlers) { return builder.toString(); } + public enum Type { + REGION, WREGION, HANDLER + } + private final class LoadEntry { public final String name; public final Type type; @@ -1203,8 +1256,4 @@ public Path getPath() { return singleDirectory.resolve(this.name.toLowerCase()); } } - - public enum Type { - REGION, WREGION, HANDLER - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 682520a..251f4f6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -95,13 +95,11 @@ url = "https://github.com/FoxDenStudio/FoxGuard") public final class FoxGuardMain { - public final Cause pluginCause = Cause.builder().named("plugin", this).build(); - /** * FoxGuardMain instance object. */ private static FoxGuardMain instanceField; - + public final Cause pluginCause = Cause.builder().named("plugin", this).build(); @Inject private Logger logger; @@ -137,6 +135,10 @@ public static FoxGuardMain instance() { //my uuid - f275f223-1643-4fac-9fb8-44aaf5b4b371 + public static Cause getCause() { + return instance().pluginCause; + } + @Listener public void construct(GameConstructionEvent event) { instanceField = this; @@ -240,6 +242,7 @@ public void serverStopping(GameStoppingServerEvent event) { FGStorageManager.getInstance().saveHandlers(); logger.info("Saving configs"); FGConfigManager.getInstance().save(); + FGManager.getInstance().unloadServer(); } @Listener @@ -293,7 +296,6 @@ private void registerFactories() { manager.registerControllerFactory(new LogicController.Factory()); } - /** * A private method that registers the Listener class and the corresponding event class. */ @@ -348,10 +350,6 @@ public boolean isLoaded() { return loaded; } - public static Cause getCause() { - return instance().pluginCause; - } - public EconomyService getEconomyService() { return economyService; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index 7b0d719..9c8481e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -42,7 +42,6 @@ import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -56,6 +55,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -229,7 +229,7 @@ public List getSuggestions(@Nonnull CommandSource source, @Nonnull Strin .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "worldregion", "handler", "controller").stream() + return Stream.of("region", "worldregion", "handler", "controller") .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index == 1) { @@ -310,7 +310,7 @@ else if (parse.current.index == 1) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world", "priority").stream() + return Stream.of("world", "priority") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index 549ca26..a17f0af 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -37,13 +37,11 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -55,6 +53,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -86,7 +85,8 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } else if (isIn(REGIONS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - IRegion region = FGManager.getInstance().getRegion(parse.args[1]); + String regionName = parse.args[1]; + IRegion region = FGManager.getInstance().getRegion(regionName).orElse(null); boolean isWorldRegion = false; if (region == null) { String worldName = parse.flags.get("world"); @@ -102,12 +102,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); + region = FGManager.getInstance().getWorldRegion(world, regionName).orElse(null); isWorldRegion = true; } if (region == null) - throw new CommandException(Text.of("No region exists with the name \"" + parse.args[1] + "\"!")); - if (region instanceof GlobalWorldRegion) { + throw new CommandException(Text.of("No region exists with the name \"" + regionName + "\"!")); + if (region instanceof IGlobal) { throw new CommandException(Text.of("You may not delete the global region!")); } boolean success = FGManager.getInstance().removeRegion(region); @@ -119,9 +119,10 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.success(); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); - if (handler == null) + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + if (!handlerOpt.isPresent()) throw new ArgumentParseException(Text.of("No handler exists with that name!"), parse.args[1], 1); + IHandler handler = handlerOpt.get(); if (handler instanceof GlobalHandler) throw new CommandException(Text.of("You may not delete the global handler!")); boolean success = FGManager.getInstance().removeHandler(handler); @@ -142,7 +143,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "handler").stream() + return Stream.of("region", "handler") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -179,7 +180,7 @@ else if (parse.current.index == 1) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index ecdd18d..75996a7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -93,7 +93,8 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } else if (isIn(REGIONS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - IRegion region = FGManager.getInstance().getRegion(parse.args[1]); + IRegion region = null; + /*FGManager.getInstance().getRegion(parse.args[1]); if (region == null) { String worldName = parse.flags.get("world"); World world = null; @@ -111,7 +112,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); } if (region == null) - throw new CommandException(Text.of("No region exists with the name \"" + parse.args[1] + "\"!")); + throw new CommandException(Text.of("No region exists with the name \"" + parse.args[1] + "\"!"));*/ + + Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); if (parse.args.length < 3 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) { @@ -169,9 +172,10 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); - if (handler == null) + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); + IHandler handler = handlerOpt.get(); Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); if (parse.args.length <= 2 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) { @@ -372,7 +376,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "handler").stream() + return Stream.of("region", "handler") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -406,7 +410,7 @@ else if (parse.current.index == 1) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 72a14c2..3ed937d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -48,7 +48,6 @@ import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -62,6 +61,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -142,7 +142,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.getSelectedRegions(source).forEach(regions::add); if (parse.args.length > 1) { for (String name : Arrays.copyOfRange(parse.args, 1, parse.args.length)) { - IWorldRegion region = FGManager.getInstance().getWorldRegion(world, name); + IWorldRegion region = FGManager.getInstance().getWorldRegion(world, name).orElse(null); if (region == null) failures++; else { regions.add(region); @@ -180,7 +180,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm List handlers = new ArrayList<>(); FGUtil.getSelectedHandlers(source).forEach(handlers::add); for (String name : Arrays.copyOfRange(parse.args, 1, parse.args.length)) { - IHandler handler = FGManager.getInstance().gethandler(name); + IHandler handler = FGManager.getInstance().gethandler(name).orElse(null); if (handler == null) failures++; else { handlers.add(handler); @@ -223,7 +223,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "handler").stream() + return Stream.of("region", "handler") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -265,7 +265,7 @@ else if (parse.current.index > 0) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 3e229eb..5254c3b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -56,6 +56,7 @@ import javax.annotation.Nullable; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -260,12 +261,12 @@ public List getSuggestions(CommandSource source, String arguments, @Null if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT) && parse.current.index < 3 && parse.current.token.isEmpty()) { return ImmutableList.of(parse.current.prefix + "~"); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.SHORTFLAG)) { - return ImmutableList.of("r", "h", "p").stream() + return Stream.of("r", "h", "p") .filter(flag -> !parse.flags.containsKey(flag)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world", "regions", "handlers", "priority").stream() + return Stream.of("world", "regions", "handlers", "priority") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index 32b6dbb..9bcc653 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -43,7 +43,6 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -55,6 +54,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.WORLD_ALIASES; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; @@ -94,7 +94,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FCStateManager.instance().getStateMap().get(source).flush(RegionsStateField.ID, HandlersStateField.ID); return CommandResult.builder().successCount(successes[0]).build(); } else { - IRegion region = FGManager.getInstance().getRegion(parse.args[0]); + IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); World world = null; if (region == null) { String worldName = parse.flags.get("world"); @@ -109,14 +109,15 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); } if (region == null) throw new CommandException(Text.of("No region with name \"" + parse.args[0] + "\" in world \"" + world.getName() + "\"!")); if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); - if (handler == null) + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); + IHandler handler = handlerOpt.get(); if (region.getHandlers().contains(handler)) throw new CommandException(Text.of("Already linked!")); boolean success = FGManager.getInstance().link(region, handler); @@ -162,7 +163,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { - IRegion region = FGManager.getInstance().getRegion(parse.args[0]); + IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); World world = null; @@ -174,7 +175,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null } } if (world != null) { - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); } } @@ -196,7 +197,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index 4f333bb..530fbfa 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -54,6 +54,7 @@ import javax.annotation.Nullable; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -418,12 +419,12 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return Arrays.asList("regions", "handlers", "controllers").stream() + return Stream.of("regions", "handlers", "controllers") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index bed9b09..4fbe49f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -41,7 +41,6 @@ import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -53,6 +52,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -86,8 +86,8 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } else if (isIn(REGIONS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a region name!")); IRegion region = null; - if (!parse.flags.keySet().contains("world")) - region = FGManager.getInstance().getRegion(parse.args[1]); + if (!parse.flags.containsKey("world")) + region = FGManager.getInstance().getRegion(parse.args[1]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); World world = null; @@ -102,7 +102,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[1]).orElse(null); } if (region == null) throw new ArgumentParseException(Text.of("No region exists with that name!"), parse.args[1], 1); @@ -133,7 +133,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); + IHandler handler = FGManager.getInstance().gethandler(parse.args[1]).orElse(null); if (handler == null) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); ProcessResult result = handler.modify(source, parse.args.length < 3 ? "" : parse.args[2]); @@ -179,7 +179,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "handler").stream() + return Stream.of("region", "handler") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -216,7 +216,7 @@ else if (parse.current.index == 1) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -229,7 +229,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.FINAL)) { if (isIn(REGIONS_ALIASES, parse.args[0])) { - IRegion region = FGManager.getInstance().getRegion(parse.args[1]); + IRegion region = FGManager.getInstance().getRegion(parse.args[1]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); World world = null; @@ -241,7 +241,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF } else return ImmutableList.of(); } if (world == null) return ImmutableList.of(); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[1]).orElse(null); } if (region == null) return ImmutableList.of(); @@ -252,9 +252,9 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF .collect(GuavaCollectors.toImmutableList()); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) return ImmutableList.of(); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); - if (handler == null) return ImmutableList.of(); - List suggestions = handler.modifySuggestions(source, parse.current.token, null); + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + if (!handlerOpt.isPresent()) return ImmutableList.of(); + List suggestions = handlerOpt.get().modifySuggestions(source, parse.current.token, null); if (suggestions == null) return ImmutableList.of(); return suggestions.stream() .map(args -> parse.current.prefix + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index 0320d3e..97a7156 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -79,7 +79,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm PriorityMachine temp = new PriorityMachine(arg); if (machine == null) machine = temp; } catch (NumberFormatException ignored) { - IHandler handler = FGManager.getInstance().gethandler(arg); + IHandler handler = FGManager.getInstance().gethandler(arg).orElse(null); if (handler != null && !handlers.contains(handler)) { handlers.add(handler); } else { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java index efb5fff..73dab09 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java @@ -42,7 +42,6 @@ import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -55,6 +54,7 @@ import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -86,7 +86,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm IRegion region = null; World world = null; if (!parse.flags.keySet().contains("world")) - region = FGManager.getInstance().getRegion(parse.args[1]); + region = FGManager.getInstance().getRegion(parse.args[1]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); if (source instanceof Locatable) world = ((Locatable) source).getWorld(); @@ -100,7 +100,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[1]).orElse(null); } if (region == null) throw new CommandException(Text.of("No region exists with the name \"" + parse.args[1] + "\"!")); @@ -126,9 +126,10 @@ public CommandResult process(CommandSource source, String arguments) throws Comm source.sendMessage(Text.of(TextColors.GREEN, "Region \"" + oldName + "\" successfully renamed to \"" + parse.args[2] + "\"!")); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("You must specify a name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]); - if (handler == null) + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler exists with the name \"" + parse.args[1] + "\"!")); + IHandler handler = handlerOpt.get(); if (handler instanceof GlobalHandler) { throw new CommandException(Text.of("You may not rename the global handler!")); } @@ -160,7 +161,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) - return ImmutableList.of("region", "handler").stream() + return Stream.of("region", "handler") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -199,7 +200,7 @@ else if (parse.current.index == 1) { Tristate available = null; if (isIn(REGIONS_ALIASES, parse.args[0]) || isIn(WORLDREGIONS_ALIASES, parse.args[0])) { World world = null; - IRegion region = FGManager.getInstance().getRegion(parse.args[1]); + IRegion region = FGManager.getInstance().getRegion(parse.args[1]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); if (source instanceof Locatable) world = ((Locatable) source).getWorld(); @@ -210,7 +211,7 @@ else if (parse.current.index == 1) { } } if (world == null) return ImmutableList.of(); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[1]).orElse(null); } if (region == null || region instanceof IGlobal) return ImmutableList.of(); if (region instanceof IWorldRegion) { @@ -236,7 +237,7 @@ else if (parse.current.index == 1) { } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java index a486f94..9bdcdd9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java @@ -39,7 +39,6 @@ import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.world.Locatable; @@ -49,6 +48,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Created by Fox on 4/19/2016. @@ -60,6 +60,12 @@ public final class LinkageParser { private World currentWorld; + private LinkageParser(CommandSource source) { + if (source instanceof Locatable) { + currentWorld = ((Locatable) source).getWorld(); + } + } + public static Set parseLinkageExpression(String expression, CommandSource source) throws CommandException { return new LinkageParser(source).parse(expression, source); } @@ -116,7 +122,7 @@ else if (match.startsWith("%")) { .map(str -> endPart + str.substring(token.length() - 1)) .collect(Collectors.toList()); } else if (token.startsWith("$")) { - return ImmutableList.of("regions", "handlers", "controllers").stream() + return Stream.of("regions", "handlers", "controllers") .filter(new StartsWithPredicate(token.substring(1))) .map(str -> endPart + str.substring(token.length() - 1)) .collect(Collectors.toList()); @@ -147,10 +153,20 @@ else if (match.startsWith("%")) { return ImmutableList.of(); } - private LinkageParser(CommandSource source) { - if (source instanceof Locatable) { - currentWorld = ((Locatable) source).getWorld(); + private static boolean checkParentheses(String expression) { + Pattern leftPattern = Pattern.compile("\\("); + Matcher leftMatcher = leftPattern.matcher(expression); + int leftCount = 0; + while (leftMatcher.find()) { + leftCount++; + } + Pattern rightPattern = Pattern.compile("\\)"); + Matcher rightMatcher = rightPattern.matcher(expression); + int rightCount = 0; + while (rightMatcher.find()) { + rightCount++; } + return leftCount == rightCount; } private Set parse(String expressionString, CommandSource source) throws CommandException { @@ -166,20 +182,8 @@ private Set parse(String expressionString, CommandSource source) thro return ImmutableSet.copyOf(set); } - private static boolean checkParentheses(String expression) { - Pattern leftPattern = Pattern.compile("\\("); - Matcher leftMatcher = leftPattern.matcher(expression); - int leftCount = 0; - while (leftMatcher.find()) { - leftCount++; - } - Pattern rightPattern = Pattern.compile("\\)"); - Matcher rightMatcher = rightPattern.matcher(expression); - int rightCount = 0; - while (rightMatcher.find()) { - rightCount++; - } - return leftCount == rightCount; + private enum Stage { + START, REST } public class Expression implements IExpression { @@ -222,7 +226,7 @@ private Set parseSegment(String segmentString, CommandSource source if (!token.startsWith("-")) { if (token.startsWith("%")) { Optional worldOptional = Sponge.getServer().getWorld(token.substring(1)); - if (worldOptional.isPresent()) currentWorld = worldOptional.get(); + worldOptional.ifPresent(world -> currentWorld = world); } else if (token.startsWith("$")) { String name = token.substring(1); if (Aliases.isIn(Aliases.REGIONS_ALIASES, name)) { @@ -233,14 +237,14 @@ private Set parseSegment(String segmentString, CommandSource source set.add(new ExpressionStub(ImmutableSet.copyOf(FGUtil.getSelectedControllers(source)))); } } else if (token.startsWith("^")) { - IController controller = FGManager.getInstance().getController(token.substring(1)); - if (controller != null) stubObjects.add(controller); + Optional controllerOpt = FGManager.getInstance().getController(token.substring(1)); + controllerOpt.ifPresent(stubObjects::add); } else if (stage == Stage.START) { - IRegion region = FGManager.getInstance().getRegionFromWorld(currentWorld, token); - if (region != null) stubObjects.add(region); + Optional regionOpt = FGManager.getInstance().getRegionFromWorld(currentWorld, token); + regionOpt.ifPresent(stubObjects::add); } else { - IHandler handler = FGManager.getInstance().gethandler(token); - if (handler != null) stubObjects.add(handler); + Optional handlerOpt = FGManager.getInstance().gethandler(token); + handlerOpt.ifPresent(stubObjects::add); } } } @@ -320,8 +324,4 @@ public Set getLinks() { } } - - private enum Stage { - START, REST - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/compat/djxy/pm/FGCompat.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/compat/djxy/pm/FGCompat.java index c0ae8b8..6a94b39 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/compat/djxy/pm/FGCompat.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/compat/djxy/pm/FGCompat.java @@ -30,6 +30,8 @@ import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.world.World; +import java.util.Optional; + /** * Created by Fox on 8/21/2016. */ @@ -37,8 +39,8 @@ public class FGCompat { public static boolean isPlayerInRegion(Player player, String regionName) { World world = player.getWorld(); - IRegion region = FGManager.getInstance().getRegionFromWorld(world, regionName); - return region != null && region.contains(player.getLocation().getPosition(), world); + Optional regionOpt = FGManager.getInstance().getRegionFromWorld(world, regionName); + return regionOpt.isPresent() && regionOpt.get().contains(player.getLocation().getPosition(), world); } public static int getCompatVersion() { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index 3ed1e31..c749886 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -37,6 +37,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public abstract class ControllerBase extends HandlerBase implements IController { @@ -77,7 +78,8 @@ public void loadLinks(Path directory) { linksList.stream() .filter(name -> !this.name.equalsIgnoreCase(name)) .map(name -> FGManager.getInstance().gethandler(name)) - .filter(handler -> handler != null) + .filter(Optional::isPresent) + .map(Optional::get) .forEach(handlers::add); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java index 0f42f6c..837f830 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java @@ -58,6 +58,7 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.List; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; import static org.spongepowered.api.text.format.TextColors.*; @@ -200,7 +201,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type == AdvCmdParser.CurrentElement.ElementType.ARGUMENT) { if (parse.current.index == 0) { - return ImmutableList.of("operator", "mode", "short").stream() + return Stream.of("operator", "mode", "short") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -213,12 +214,12 @@ public List modifySuggestions(CommandSource source, String arguments, @N .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(MODE_ALIASES, parse.args[0])) { - return ImmutableList.of("allow", "deny", "pass").stream() + return Stream.of("allow", "deny", "pass") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(SHORT_ALIASES, parse.args[0])) { - return ImmutableList.of("true", "false").stream() + return Stream.of("true", "false") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -372,14 +373,14 @@ public Tristate operate(List handlers, Tristate mode, boolean shortCir this.color = color; } - public abstract Tristate operate(List handlers, Tristate mode, boolean shortCircuit, @Nullable User user, FlagBitSet flags, ExtraContext extra); - public static Operator from(String name) { for (Operator op : values()) { if (op.name().equalsIgnoreCase(name)) return op; } return null; } + + public abstract Tristate operate(List handlers, Tristate mode, boolean shortCircuit, @Nullable User user, FlagBitSet flags, ExtraContext extra); } public static final class Factory implements IControllerFactory { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 0d4fa9a..df9df00 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -73,6 +73,7 @@ import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; @@ -102,11 +103,10 @@ public class BasicHandler extends HandlerBase { private final Map, Map> groupSetPermCache; private final Map> userGroupCache; private final Map> userPermCache; - + private final Map passivePermCache; private PassiveSetting passiveSetting = PassiveSetting.PASSTHROUGH; private Group passiveGroup; private Map passiveGroupCacheRef; - private final Map passivePermCache; public BasicHandler(String name, int priority) { this(name, true, priority, @@ -234,6 +234,12 @@ public BasicHandler(String name, boolean isEnabled, int priority, }); } + public static boolean isNameValid(String name) { + return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && + !name.equalsIgnoreCase("default") && + !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); + } + public ProcessResult modify(CommandSource source, String arguments) throws CommandException { AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); @@ -560,7 +566,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify flags or an index to remove!")); List permissions = getGroupPermissions(group); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to remove in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to remove in this group!"); try { int index = Integer.parseInt(parse.args[3]); if (index < 0) index = 0; @@ -594,7 +601,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify an index or flags and then a tristate value!")); List permissions = getGroupPermissions(group); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to set in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to set in this group!"); try { int index = Integer.parseInt(parse.args[3]); if (index < 0) index = 0; @@ -688,7 +696,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma List permissions = getGroupPermissions(group); if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify flags or an index to move!")); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to move in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to move in this group!"); try { int from = Integer.parseInt(parse.args[3]); if (from < 0) from = 0; @@ -782,13 +791,13 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("groups", "users", "flags", "passive").stream() + return Stream.of("groups", "users", "flags", "passive") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { if (isIn(GROUPS_ALIASES, parse.args[0])) { - return ImmutableList.of("add", "remove", "modify", "rename", "move").stream() + return Stream.of("add", "remove", "modify", "rename", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -807,7 +816,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N list.add("default"); return ImmutableList.copyOf(list); } else if (isIn(PASSIVE_ALIASES, parse.args[0])) { - return ImmutableList.of("allow", "deny", "pass", "group", "default").stream() + return Stream.of("allow", "deny", "pass", "group", "default") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -847,12 +856,12 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } } else if (isIn(USERS_ALIASES, parse.args[0])) { - return ImmutableList.of("add", "remove", "set").stream() + return Stream.of("add", "remove", "set") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(FLAGS_ALIASES, parse.args[0])) { - return ImmutableList.of("add", "remove", "set", "move").stream() + return Stream.of("add", "remove", "set", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -883,7 +892,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N switch (parse.args[2].toLowerCase()) { case "add": { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass").stream() + return Stream.of("=allow", "=deny", "=pass") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -900,7 +909,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N case "set": { if (parse.current.index == 3) { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -913,14 +922,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.index == 4) try { Integer.parseInt(parse.args[3]); - return ImmutableList.of("allow", "deny", "pass", "clear").stream() + return Stream.of("allow", "deny", "pass", "clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } catch (NumberFormatException ignored) { } if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -994,12 +1003,12 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) { if (isIn(GROUPS_ALIASES, parse.args[0])) { - return ImmutableList.of("index", "color", "displayname").stream() + return Stream.of("index", "color", "displayname") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(FLAGS_ALIASES, parse.args[0])) { - ImmutableList.of("index").stream() + Stream.of("index") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -1487,12 +1496,6 @@ private List getGroupPermissions(Group group) { else return this.groupPermissions.get(group); } - public static boolean isNameValid(String name) { - return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && - !name.equalsIgnoreCase("default") && - !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); - } - public enum PassiveSetting { ALLOW, DENY, PASSTHROUGH, GROUP, DEFAULT; @@ -1515,10 +1518,10 @@ public String toString() { } public static class Group { + private final Set users; private String name; private String displayName; private TextColor color; - private final Set users; private Group(String name) { this(name, new HashSet<>()); @@ -1757,7 +1760,7 @@ public List createSuggestions(CommandSource source, String arguments, St .parse(); if (parse.current.type == AdvCmdParser.CurrentElement.ElementType.ARGUMENT && parse.current.index == 0) { - return ImmutableList.of("bare", "skeleton", "default", "easy", "plugandplay").stream() + return Stream.of("bare", "skeleton", "default", "easy", "plugandplay") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java index ae16a65..ff8787e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java @@ -59,6 +59,7 @@ import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -303,18 +304,18 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("members", "console", "color").stream() + return Stream.of("members", "console", "color") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { if (parse.args[0].equalsIgnoreCase("members")) { - return ImmutableList.of("add", "remove", "set").stream() + return Stream.of("add", "remove", "set") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.args[0].equalsIgnoreCase("console")) { - return ImmutableList.of("true", "false", "color").stream() + return Stream.of("true", "false") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index fae84ba..0d7187b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -68,6 +68,7 @@ import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; import static org.spongepowered.api.util.Tristate.UNDEFINED; @@ -181,6 +182,12 @@ public GroupHandler(String name, boolean isEnabled, int priority, }); } + public static boolean isNameValid(String name) { + return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && + !name.equalsIgnoreCase("default") && + !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); + } + public ProcessResult modify(CommandSource source, String arguments) throws CommandException { AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); @@ -433,7 +440,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify flags or an index to remove!")); List permissions = getGroupPermissions(group); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to remove in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to remove in this group!"); try { int index = Integer.parseInt(parse.args[3]); if (index < 0) index = 0; @@ -467,7 +475,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify an index or flags and then a tristate value!")); List permissions = getGroupPermissions(group); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to set in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to set in this group!"); try { int index = Integer.parseInt(parse.args[3]); if (index < 0) index = 0; @@ -561,7 +570,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma List permissions = getGroupPermissions(group); if (parse.args.length < 4) return ProcessResult.of(false, Text.of("Must specify flags or an index to move!")); - if(permissions.isEmpty()) return ProcessResult.of(false, "There are no entries to move in this group!"); + if (permissions.isEmpty()) + return ProcessResult.of(false, "There are no entries to move in this group!"); try { int from = Integer.parseInt(parse.args[3]); if (from < 0) from = 0; @@ -632,13 +642,13 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("groups", "flags").stream() + return Stream.of("groups", "flags") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { if (isIn(GROUPS_ALIASES, parse.args[0])) { - return ImmutableList.of("add", "remove", "modify", "rename", "move").stream() + return Stream.of("add", "remove", "modify", "rename", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -685,7 +695,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } } else if (isIn(FLAGS_ALIASES, parse.args[0])) { - return ImmutableList.of("add", "remove", "set", "move").stream() + return Stream.of("add", "remove", "set", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -708,7 +718,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N switch (parse.args[2].toLowerCase()) { case "add": { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass").stream() + return Stream.of("=allow", "=deny", "=pass") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -725,7 +735,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N case "set": { if (parse.current.index == 3) { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -738,14 +748,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.index == 4) try { Integer.parseInt(parse.args[3]); - return ImmutableList.of("allow", "deny", "pass", "clear").stream() + return Stream.of("allow", "deny", "pass", "clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } catch (NumberFormatException ignored) { } if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -774,12 +784,12 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) { if (isIn(GROUPS_ALIASES, parse.args[0])) { - return ImmutableList.of("index", "color", "displayname", "permission").stream() + return Stream.of("index", "color", "displayname", "permission") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(FLAGS_ALIASES, parse.args[0])) { - return ImmutableList.of("index").stream() + return Stream.of("index") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -1166,12 +1176,6 @@ private boolean userFilter(Operation op, boolean isPresent) { } } - public static boolean isNameValid(String name) { - return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && - !name.equalsIgnoreCase("default") && - !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); - } - public static class Group { private String name; private String displayName; @@ -1303,7 +1307,7 @@ public List createSuggestions(CommandSource source, String arguments, St .parse(); if (parse.current.type == AdvCmdParser.CurrentElement.ElementType.ARGUMENT && parse.current.index == 0) { - return ImmutableList.of("bare").stream() + return Stream.of("bare") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index 6bc7501..118636a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -33,7 +33,7 @@ public abstract class HandlerBase extends FGObjectBase implements IHandler { int priority; public HandlerBase(String name, int priority, boolean isEnabled) { - super(name, isEnabled); + super(name, null, isEnabled); setPriority(priority); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java index 96464bd..1b9ea76 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java @@ -57,6 +57,7 @@ import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -66,8 +67,8 @@ public class PermissionHandler extends HandlerBase { private final List entries; - private String defaultPermission; private final Map> permCache; + private String defaultPermission; public PermissionHandler(String name, int priority, boolean isEnabled) { this(name, priority, isEnabled, @@ -366,13 +367,13 @@ public List modifySuggestions(CommandSource source, String arguments, @N if (parse.current.type == AdvCmdParser.CurrentElement.ElementType.ARGUMENT) { if (parse.current.index == 0) { - return ImmutableList.of("entries", "default").stream() + return Stream.of("entries", "default") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(ENTRIES_ALIASES, parse.args[0]) || isIn(FLAGS_ALIASES, parse.args[0])) { if (parse.current.index == 1) { - return ImmutableList.of("add", "set", "remove", "move").stream() + return Stream.of("add", "set", "remove", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java index b199d20..72c88b7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java @@ -61,6 +61,7 @@ import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -187,7 +188,7 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma case "remove": { if (parse.args.length < 2) return ProcessResult.of(false, Text.of("Must specify flags or an index to remove!")); - if(this.entries.isEmpty()) return ProcessResult.of(false, "There are no entries to remove!"); + if (this.entries.isEmpty()) return ProcessResult.of(false, "There are no entries to remove!"); try { int index = Integer.parseInt(parse.args[1]); if (index < 0) index = 0; @@ -377,7 +378,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("add", "set", "remove", "move").stream() + return Stream.of("add", "set", "remove", "move") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -385,7 +386,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N switch (parse.args[0].toLowerCase()) { case "add": { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass").stream() + return Stream.of("=allow", "=deny", "=pass") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -402,7 +403,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N case "set": { if (parse.current.index == 1) { if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -415,14 +416,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.index == 2) try { Integer.parseInt(parse.args[1]); - return ImmutableList.of("allow", "deny", "pass", "clear").stream() + return Stream.of("allow", "deny", "pass", "clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } catch (NumberFormatException ignored) { } if (parse.current.token.startsWith("=")) { - return ImmutableList.of("=allow", "=deny", "=pass", "=clear").stream() + return Stream.of("=allow", "=deny", "=pass", "=clear") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java index 19abebd..5899279 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java @@ -30,6 +30,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; +import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import ninja.leaping.configurate.commented.CommentedConfigurationNode; import ninja.leaping.configurate.hocon.HoconConfigurationLoader; @@ -117,4 +118,37 @@ public void save(Path directory) { root.getNode("enter").setValue(enterTemplate); root.getNode("exit").setValue(exitTemplate); } + + public static class Factory implements IHandlerFactory { + + @Override + public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { + return null; + } + + @Override + public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + return null; + } + + @Override + public String[] getAliases() { + return new String[0]; + } + + @Override + public String getType() { + return null; + } + + @Override + public String getPrimaryAlias() { + return null; + } + + @Override + public List createSuggestions(CommandSource source, String arguments, String type, @Nullable Location targetPosition) throws CommandException { + return null; + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/Entry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/Entry.java index 661ed29..b146adb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/Entry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/Entry.java @@ -27,12 +27,8 @@ import com.google.common.collect.ImmutableSet; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; -import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; -import org.spongepowered.api.util.Tristate; -import java.util.HashSet; import java.util.Iterator; -import java.util.Optional; import java.util.Set; /** diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java index 0a23f38..ab9e47f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java @@ -50,12 +50,7 @@ public PermissionEntry(String permission, Flag... flags) { this.permission = permission.toLowerCase(); } - @Override - public String serializeValue() { - return permission; - } - - public static PermissionEntry deserialize(String string){ + public static PermissionEntry deserialize(String string) { FlagRegistry registry = FlagRegistry.getInstance(); String[] parts = string.split(":"); String[] flags = parts[0].split(",", 2); @@ -68,4 +63,9 @@ public static PermissionEntry deserialize(String string){ } return new PermissionEntry(flagSet, parts[1]); } + + @Override + public String serializeValue() { + return permission; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java index cd8b1bb..2e324e0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java @@ -43,7 +43,7 @@ public class TristateEntry extends Entry { public TristateEntry(Set set, Tristate tristate) { super(set); - if(tristate == null){ + if (tristate == null) { FoxGuardMain.instance().getLogger().warn("Tried to instantiate tristate entry with null tristate! Substituting default value UNDEFINED"); this.tristate = Tristate.UNDEFINED; } else this.tristate = tristate; @@ -51,16 +51,12 @@ public TristateEntry(Set set, Tristate tristate) { public TristateEntry(Tristate tristate, Flag... flags) { super(flags); - if(tristate == null){ + if (tristate == null) { FoxGuardMain.instance().getLogger().warn("Tried to instantiate tristate entry with null tristate! Substituting default value UNDEFINED"); this.tristate = Tristate.UNDEFINED; } else this.tristate = tristate; } - public String serializeValue() { - return tristate.name(); - } - public static TristateEntry deserialize(String string) { FlagRegistry registry = FlagRegistry.getInstance(); String[] parts = string.split(":"); @@ -80,4 +76,8 @@ public static TristateEntry deserialize(String string) { } return new TristateEntry(flagSet, tristate); } + + public String serializeValue() { + return tristate.name(); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index 73e04df..beaa1f4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -65,6 +65,7 @@ public void handle(ExplosionEvent event) throws Exception { } else if (event.getCause().containsType(User.class)) { user = event.getCause().first(User.class).get(); } else { + // Duct tape: Optional explosiveOptional = event.getExplosion().getSourceExplosive(); if (explosiveOptional.isPresent()) { Explosive explosive = explosiveOptional.get(); @@ -98,10 +99,15 @@ public void handle(ExplosionEvent event) throws Exception { flags.set(DETONATE); ExplosionEvent.Detonate detonateEvent = ((ExplosionEvent.Detonate) event); - FGManager.getInstance().getRegionsAtMultiLocI(detonateEvent.getAffectedLocations()) + + List> locations = detonateEvent.getAffectedLocations(); + if (locations.isEmpty()) return; + + FGManager.getInstance().getRegionsAtMultiLocI(locations) .forEach(region -> region.getHandlers().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); + } else if (event instanceof ExplosionEvent.Pre) { flags.set(PRE); Location loc = event.getExplosion().getLocation(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index 46bda50..75cf7c5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -58,6 +58,11 @@ public class InteractEntityListener implements EventListener strings = new ArrayList(); + + } + @Override public void handle(InteractEntityEvent event) throws Exception { if (event.isCancelled()) return; @@ -131,9 +136,4 @@ public void handle(InteractEntityEvent event) throws Exception { event.setCancelled(false); } } - - { - ArrayList strings = new ArrayList(); - - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 29cfdd1..da33471 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -91,6 +91,22 @@ public PlayerMoveListener(boolean full) { if (instance == null) instance = this; } + public static PlayerMoveListener getInstance() { + return instance; + } + + private static Set getPassengerStack(Entity e) { + Set set = new HashSet<>(); + set.add(e); + List po = e.getPassengers(); + if (!po.isEmpty()) { + for (Entity ent : po) { + set.add(ent); + } + } + return set; + } + @Override public void handle(MoveEntityEvent event) throws Exception { @@ -269,47 +285,10 @@ public void showScoreboard(Player player) { player.setScoreboard(this.scoreboardMap.get(player)); } - public static PlayerMoveListener getInstance() { - return instance; - } - - private static Set getPassengerStack(Entity e) { - Set set = new HashSet<>(); - set.add(e); - List po = e.getPassengers(); - if (!po.isEmpty()) { - for (Entity ent : po) { - set.add(ent); - } - } - return set; - } - private enum Type { FROM, TO } - private class HandlerWrapper implements Comparable { - public IHandler handler; - public Type type; - - public HandlerWrapper(IHandler handler, Type type) { - this.handler = handler; - this.type = type; - } - - @Override - public int compareTo(HandlerWrapper w) { - int val = handler.compareTo(w.handler); - return val != 0 ? val : type.compareTo(w.type); - } - - @Override - public String toString() { - return this.type + ":" + this.handler; - } - } - private static class LastWrapper { public List list; public Vector3d position; @@ -336,6 +315,27 @@ public HUDConfig(boolean regions, boolean handlers, boolean priority) { } } + private class HandlerWrapper implements Comparable { + public IHandler handler; + public Type type; + + public HandlerWrapper(IHandler handler, Type type) { + this.handler = handler; + this.type = type; + } + + @Override + public int compareTo(HandlerWrapper w) { + int val = handler.compareTo(w.handler); + return val != 0 ? val : type.compareTo(w.type); + } + + @Override + public String toString() { + return this.type + ":" + this.handler; + } + } + public class Listeners { @Listener public void onJoin(ClientConnectionEvent.Join event) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index 02b9098..05c99b2 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -83,6 +83,22 @@ public PlayerMoveListenerNew(boolean full) { if (instance == null) instance = this; } + public static PlayerMoveListenerNew getInstance() { + return instance; + } + + private static Set getPassengerStack(Entity e) { + Set set = new HashSet<>(); + if (e instanceof Player) set.add((Player) e); + List po = e.getPassengers(); + if (!po.isEmpty()) { + for (Entity ent : po) { + set.addAll(getPassengerStack(ent)); + } + } + return set; + } + @Override public void handle(MoveEntityEvent event) throws Exception { Entity entity = event.getTargetEntity(); @@ -212,24 +228,24 @@ public void showScoreboard(Player player) { player.setScoreboard(this.scoreboardMap.get(player)); } - public static PlayerMoveListenerNew getInstance() { - return instance; + private enum Direction { + FROM, TO } - private static Set getPassengerStack(Entity e) { - Set set = new HashSet<>(); - if (e instanceof Player) set.add((Player) e); - List po = e.getPassengers(); - if (!po.isEmpty()) { - for (Entity ent : po) { - set.addAll(getPassengerStack(ent)); - } + public static class HUDConfig { + public boolean regions; + public boolean handlers; + public boolean priority; + + public HUDConfig() { + this(true, true, false); } - return set; - } - private enum Direction { - FROM, TO + public HUDConfig(boolean regions, boolean handlers, boolean priority) { + this.regions = regions; + this.handlers = handlers; + this.priority = priority; + } } private class HandlerWrapper implements Comparable { @@ -252,20 +268,4 @@ public String toString() { return this.direction + ":" + this.handler; } } - - public static class HUDConfig { - public boolean regions; - public boolean handlers; - public boolean priority; - - public HUDConfig() { - this(true, true, false); - } - - public HUDConfig(boolean regions, boolean handlers, boolean priority) { - this.regions = regions; - this.handlers = handlers; - this.priority = priority; - } - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java index 33142e1..68caff0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EventResult.java @@ -38,7 +38,7 @@ public final class EventResult { private final boolean displayDefaultMessage; private EventResult(Tristate success, boolean displayDefaultMessage) { - if(success == null){ + if (success == null) { FoxGuardMain.instance().getLogger().warn("Tried to instantiate event result with null tristate! Substituting default value UNDEFINED"); this.state = Tristate.UNDEFINED; } else this.state = success; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java index e31050e..aec8d53 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java @@ -76,15 +76,16 @@ public boolean matches(Context context, Subject subject) { String[] parts = regionName.split(":"); Optional worldOptional = Sponge.getServer().getWorld(parts[0]); if (worldOptional.isPresent()) { - IWorldRegion region = fgManager.getWorldRegion(worldOptional.get(), parts[1]); - if (region != null) { - if (!region.contains(player.getLocation().getPosition())) return false; + Optional regionOpt = fgManager.getWorldRegion(worldOptional.get(), parts[1]); + if (regionOpt.isPresent()) { + if (!regionOpt.get().contains(player.getLocation().getPosition())) return false; } else return false; } else return false; } else { - IRegion region = fgManager.getRegion(regionName); - if (region != null) { - if (!region.contains(player.getLocation().getPosition(), player.getWorld())) return false; + Optional regionOpt = fgManager.getRegion(regionName); + if (regionOpt.isPresent()) { + if (!regionOpt.get().contains(player.getLocation().getPosition(), player.getWorld())) + return false; } else return false; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index af0d462..a8e8951 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -25,13 +25,18 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; +import javax.annotation.Nullable; +import java.util.UUID; + public abstract class FGObjectBase implements IFGObject { protected String name; + protected UUID owner; protected boolean isEnabled = true; - public FGObjectBase(String name, boolean isEnabled) { + public FGObjectBase(String name, @Nullable UUID owner, boolean isEnabled) { this.name = name; + this.owner = owner; this.isEnabled = isEnabled; } @@ -45,6 +50,16 @@ public void setName(String name) { this.name = name; } + @Override + public UUID getOwner() { + return owner; + } + + @Override + public void setOwner(UUID owner) { + this.owner = owner; + } + @Override public boolean isEnabled() { return isEnabled; @@ -59,8 +74,9 @@ public void setIsEnabled(boolean state) { @Override public String toString() { - return this.getClass().getSimpleName() + "{" + + return "FGObjectBase{" + "name='" + name + '\'' + + ", owner=" + owner + ", isEnabled=" + isEnabled + '}'; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index e7c359f..61079ad 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -41,6 +41,7 @@ import javax.annotation.Nullable; import java.nio.file.Path; import java.util.List; +import java.util.UUID; /** * Interface for all FoxGuard Objects. Inherited by {@link IRegion Regions}, {@link IWorldRegion World Regions}, @@ -63,6 +64,10 @@ public interface IFGObject extends IModifiable { */ void setName(String name); + UUID getOwner(); + + void setOwner(UUID owner); + /** * Gets the short direction name for this object. It should be around four letters. It should be human readable. * It is used in object lists, such as when using the list or detail commands. diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index 6fcc4de..d77392e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -41,7 +41,7 @@ public abstract class RegionBase extends FGObjectBase implements IRegion { private final Set handlers; protected RegionBase(String name, boolean isEnabled) { - super(name, isEnabled); + super(name, null, isEnabled); this.handlers = new HashSet<>(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java index 4a2e4b5..9de143c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java @@ -43,7 +43,6 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.world.Locatable; @@ -215,21 +214,6 @@ public CuboidSelection toSelection() { return new CuboidSelection(this.boundingBox); } - private class RegionIterator implements Iterator> { - - Iterator bbIterator = boundingBox.iterator(); - - @Override - public boolean hasNext() { - return bbIterator.hasNext(); - } - - @Override - public Location next() { - return new Location<>(world, bbIterator.next()); - } - } - public static class Factory implements IWorldRegionFactory { private static final String[] cuboidAliases = {"box", "cube", "cuboid", "cuboidal", "rectangularprism", "rectangleprism", "rectprism"}; @@ -292,4 +276,19 @@ public List createSuggestions(CommandSource source, String arguments, St return ImmutableList.of(parse.current.prefix + "~"); } } + + private class RegionIterator implements Iterator> { + + Iterator bbIterator = boundingBox.iterator(); + + @Override + public boolean hasNext() { + return bbIterator.hasNext(); + } + + @Override + public Location next() { + return new Location<>(world, bbIterator.next()); + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java index ed282b2..d22a3ee 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java @@ -42,7 +42,6 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.args.ArgumentParseException; -import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.world.Locatable; @@ -193,31 +192,6 @@ public Iterator> iterator() { return new RegionIterator(); } - private class RegionIterator implements Iterator> { - - Iterator bbIterator = boundingBox.iterator(); - Vector2i vec2 = bbIterator.next(); - int y = 0; - - @Override - public boolean hasNext() { - return vec2 != null; - } - - @Override - public Location next() { - if (hasNext()) { - Location loc = new Location<>(world, vec2.getX(), y, vec2.getY()); - y++; - if (y > 255) { - y = 0; - vec2 = bbIterator.next(); - } - return loc; - } else return null; - } - } - public static class Factory implements IWorldRegionFactory { private static final String[] rectAliases = {"square", "rectangular", "rectangle", "rect"}; @@ -278,4 +252,29 @@ public List createSuggestions(CommandSource source, String arguments, St } } + private class RegionIterator implements Iterator> { + + Iterator bbIterator = boundingBox.iterator(); + Vector2i vec2 = bbIterator.next(); + int y = 0; + + @Override + public boolean hasNext() { + return vec2 != null; + } + + @Override + public Location next() { + if (hasNext()) { + Location loc = new Location<>(world, vec2.getX(), y, vec2.getY()); + y++; + if (y > 255) { + y = 0; + vec2 = bbIterator.next(); + } + return loc; + } else return null; + } + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java index ae433f6..c18f111 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java @@ -51,6 +51,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; public class ControllersStateField extends ListStateFieldBase { @@ -113,7 +114,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("add", "remove").stream() + return Stream.of("add", "remove") .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { @@ -166,9 +167,10 @@ public ProcessResult add(CommandSource source, String arguments) throws CommandE AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).parse(); if (parse.args.length < 1) throw new CommandException(Text.of("Must specify a name!")); - IController controller = FGManager.getInstance().getController(parse.args[0]); - if (controller == null) + Optional controllerOpt = FGManager.getInstance().getController(parse.args[0]); + if (!controllerOpt.isPresent()) throw new ArgumentParseException(Text.of("No controllers with this name!"), parse.args[0], 1); + IController controller = controllerOpt.get(); if (this.list.contains(controller)) throw new ArgumentParseException(Text.of("Controller is already in your state buffer!"), parse.args[0], 1); this.list.add(controller); @@ -185,7 +187,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(parse.args[0]); controller = this.list.get(index - 1); } catch (NumberFormatException e) { - controller = FGManager.getInstance().getController(parse.args[0]); + controller = FGManager.getInstance().getController(parse.args[0]).orElse(null); } catch (IndexOutOfBoundsException e) { throw new ArgumentParseException(Text.of("Index out of bounds! (1 - " + this.list.size()), parse.args[0], 1); } @@ -203,7 +205,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(arg); controller = this.list.get(index - 1); } catch (NumberFormatException e) { - controller = FGManager.getInstance().getController(arg); + controller = FGManager.getInstance().getController(arg).orElse(null); } catch (IndexOutOfBoundsException e) { failures++; continue; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java index eae039b..f9a9ae7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java @@ -51,6 +51,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; public class HandlersStateField extends ListStateFieldBase { @@ -113,7 +114,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("add", "remove").stream() + return Stream.of("add", "remove") .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { @@ -167,9 +168,10 @@ public ProcessResult add(CommandSource source, String arguments) throws CommandE AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).parse(); if (parse.args.length < 1) throw new CommandException(Text.of("Must specify a name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[0]); - if (handler == null) + Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[0]); + if (!handlerOpt.isPresent()) throw new ArgumentParseException(Text.of("No handlers with this name!"), parse.args[0], 1); + IHandler handler = handlerOpt.get(); if (this.list.contains(handler)) throw new ArgumentParseException(Text.of("Handler is already in your state buffer!"), parse.args[0], 1); this.list.add(handler); @@ -186,7 +188,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(parse.args[0]); handler = this.list.get(index - 1); } catch (NumberFormatException e) { - handler = FGManager.getInstance().gethandler(parse.args[0]); + handler = FGManager.getInstance().gethandler(parse.args[0]).orElse(null); } catch (IndexOutOfBoundsException e) { throw new ArgumentParseException(Text.of("Index out of bounds! (1 - " + this.list.size()), parse.args[0], 1); } @@ -204,7 +206,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(arg); handler = this.list.get(index - 1); } catch (NumberFormatException e) { - handler = FGManager.getInstance().gethandler(arg); + handler = FGManager.getInstance().gethandler(arg).orElse(null); } catch (IndexOutOfBoundsException e) { failures++; continue; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java index a8d43b1..b93192d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java @@ -54,6 +54,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.WORLD_ALIASES; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; @@ -134,7 +135,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { - return ImmutableList.of("add", "remove").stream() + return Stream.of("add", "remove") .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.index == 1) { @@ -174,7 +175,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return ImmutableList.of("world").stream() + return Stream.of("world") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -219,7 +220,7 @@ public ProcessResult add(CommandSource source, String arguments) throws CommandE AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); if (parse.args.length < 1) throw new CommandException(Text.of("Must specify a name!")); - IRegion region = FGManager.getInstance().getRegion(parse.args[0]); + IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); if (region == null) { String worldName = parse.flags.get("world"); World world = null; @@ -231,7 +232,7 @@ public ProcessResult add(CommandSource source, String arguments) throws CommandE } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); } if (region == null) throw new CommandException(Text.of("No regions with the name\"" + parse.args[0] + "\"!")); @@ -271,7 +272,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma } } if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]); + region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); } } catch (IndexOutOfBoundsException e) { throw new CommandException(Text.of("Index " + parse.args[0] + " out of bounds! (1 - " diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index ad403c4..96fdc98 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -46,8 +46,10 @@ import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.Tristate; +import org.spongepowered.api.util.Tuple; import java.util.List; +import java.util.UUID; public final class FGUtil { @@ -118,4 +120,26 @@ public static void markHandlerDirty(IHandler handler) { Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); } + + public static Tuple getObjectDataFromUserInput(String input) { + if (input.startsWith(":")) input = input.substring(1); + String[] parts = input.split(":", 3); + String ownerString, nameString; + if (parts.length == 0) return Tuple.of(FGManager.SERVER_UUID, ""); + else if (parts.length == 1) { + if (input.startsWith(":")) { + return Tuple.of(FGManager.SERVER_UUID, parts[0]); + } else { + ownerString = parts[0]; + nameString = ""; + } + } else if (parts.length == 2) { + nameString = ""; + } else { + nameString = ""; + } + UUID owner = null; + + return Tuple.of(owner, nameString); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java index c64450f..51f7bd6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java @@ -27,16 +27,13 @@ import com.flowpowered.math.vector.Vector3i; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.world.World; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Created by Fox on 3/30/2016. @@ -44,12 +41,12 @@ public class RegionCache { - private final Map> worldRegions; - private final Set regions; + private final Map> worldRegions; + private final Multimap regions; private final Map> chunks; - public RegionCache(Set regions, Map> worldRegions) { + public RegionCache(Multimap regions, Map> worldRegions) { this.worldRegions = worldRegions; this.regions = regions; chunks = new CacheMap<>((world, worldDataMap) -> { @@ -89,6 +86,10 @@ public ChunkData getData(World world, Vector3i chunk) { return this.chunks.get(world).get(chunk); } + public enum DirtyType { + ADDED, MODIFIED, REMOVED + } + public class ChunkData { private final World world; @@ -105,23 +106,40 @@ public ChunkData(World world, Vector3i chunk) { this.chunk = chunk; this.dirty = new HashMap<>(); this.contains = new HashSet<>(); - worldRegions.get(world).stream() + this.disabled = new HashSet<>(); + + for (IWorldRegion region : worldRegions.get(world).values()) { + if (!region.isInChunk(chunk)) continue; + if (region.isEnabled()) { + contains.add(region); + } else { + disabled.add(region); + } + } + for (IRegion region : regions.values()) { + if (!region.isInChunk(chunk, world)) continue; + if (region.isEnabled()) { + contains.add(region); + } else { + disabled.add(region); + } + } + /*worldRegions.get(world).values().stream() .filter(IFGObject::isEnabled) .filter(r -> r.isInChunk(chunk)) .forEach(contains::add); - regions.stream() + regions.values().stream() .filter(IFGObject::isEnabled) .filter(r -> r.isInChunk(chunk, world)) .forEach(contains::add); - this.disabled = new HashSet<>(); - worldRegions.get(world).stream() + worldRegions.get(world).values().stream() .filter(r -> !r.isEnabled()) .filter(r -> r.isInChunk(chunk)) .forEach(disabled::add); - regions.stream() + regions.values().stream() .filter(IFGObject::isEnabled) .filter(r -> r.isInChunk(chunk, world)) - .forEach(disabled::add); + .forEach(disabled::add);*/ } public Set getRegions(boolean includeDisabled) { @@ -171,8 +189,4 @@ public void markDirty(IRegion region, DirtyType type) { } } - - public enum DirtyType { - ADDED, MODIFIED, REMOVED - } } From d5cb3f227b0acbaf6b604259c64775b0f4b75611 Mon Sep 17 00:00:00 2001 From: Waterpicker Date: Mon, 26 Dec 2016 02:33:47 -0600 Subject: [PATCH 05/30] First draft of Welcome Handler --- .../plugin/handler/WelcomeHandler.java | 74 ++++++++++++++++++- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java index 5899279..b575e13 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java @@ -26,9 +26,12 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; +import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; +import net.foxdenstudio.sponge.foxguard.plugin.flag.Flags; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; @@ -37,21 +40,59 @@ import ninja.leaping.configurate.loader.ConfigurationLoader; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.event.message.MessageEvent; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.TextTemplate; import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.text.format.TextStyles; +import org.spongepowered.api.text.serializer.FormattingCodeTextSerializer; +import org.spongepowered.api.text.serializer.TextSerializers; +import org.spongepowered.api.text.transform.SimpleTextTemplateApplier; +import org.spongepowered.api.text.transform.TextTemplateApplier; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; import javax.annotation.Nullable; import java.nio.file.Path; -import java.util.List; +import java.util.*; +import java.util.regex.Pattern; /** * Created by Fox on 11/5/2016. */ public class WelcomeHandler extends HandlerBase { + private static final Map matches; + private static final Pattern pattern; + + static { + pattern = Pattern.compile("&[0-9a-fk-or]|(?:\\.|&[^0-9a-fk-or]|[^&%])+"); + matches = new HashMap<>(); + matches.put("&0", TextColors.BLACK); + matches.put("&1", TextColors.DARK_BLUE); + matches.put("&2", TextColors.DARK_GREEN); + matches.put("&3", TextColors.DARK_AQUA); + matches.put("&4", TextColors.DARK_RED); + matches.put("&5", TextColors.DARK_PURPLE); + matches.put("&6", TextColors.GOLD); + matches.put("&7", TextColors.GRAY); + matches.put("&8", TextColors.DARK_GRAY); + matches.put("&9", TextColors.BLUE); + matches.put("&a", TextColors.GREEN); + matches.put("&b", TextColors.DARK_BLUE); + matches.put("&c", TextColors.DARK_BLUE); + matches.put("&d", TextColors.DARK_BLUE); + matches.put("&e", TextColors.DARK_BLUE); + matches.put("&f", TextColors.DARK_BLUE); + matches.put("&k", TextStyles.OBFUSCATED); + matches.put("&l", TextStyles.BOLD); + matches.put("&m", TextStyles.STRIKETHROUGH); + matches.put("&n", TextStyles.UNDERLINE); + matches.put("&o", TextStyles.ITALIC); + matches.put("&1", TextColors.RESET); + matches.put("player", TextTemplate.arg("player").build()); + } TextTemplate enterTemplate = TextTemplate.EMPTY; TextTemplate exitTemplate = TextTemplate.EMPTY; @@ -66,16 +107,33 @@ public WelcomeHandler(String name, boolean isEnabled, int priority) { @Override public ProcessResult modify(CommandSource source, String arguments) throws CommandException { - return null; + AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).limit(2).parse(); + + if (parse.args.length < 1) return ProcessResult.of(false, Text.of("Must specify a command!")); + + if(parse.args.length < 2) return ProcessResult.success(); + + if(parse.args[0].equals("enter")) enterTemplate = fromString(parse.args[1]); + else if(parse.args[0].equals("exit")) exitTemplate = fromString(parse.args[1]); + else ProcessResult.of(false, "Invalid Command."); + + return ProcessResult.success(); } @Override public List modifySuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { - return null; + return Lists.newArrayList("enter", "exit"); } @Override public EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra) { + Optional player = Optional.ofNullable((Player) user); + + if(player.isPresent()) { + if (flags.get(Flags.ENTER)) player.get().sendMessage(enterTemplate.toText()); + else if (flags.get(Flags.EXIT)) player.get().sendMessage(exitTemplate.toText()); + } + return EventResult.pass(); } @@ -119,6 +177,16 @@ public void save(Path directory) { root.getNode("exit").setValue(exitTemplate); } + private static TextTemplate fromString(String string) { + TextTemplate template = TextTemplate.of(); + + for(String object : pattern.split(string)) { + template.concat(TextTemplate.of(matches.getOrDefault(object, object))); + } + + return template; + } + public static class Factory implements IHandlerFactory { @Override From eb35b23dabb7216a9bb404ea05c84c101565633c Mon Sep 17 00:00:00 2001 From: gravityfox Date: Mon, 26 Dec 2016 05:21:35 -0800 Subject: [PATCH 06/30] Start work on owner prefixing and stuff. Also cleaned up Welcome Handler to work more or less. I can't test the new handler until i get owners done, so ima work on that now. --- .../sponge/foxguard/plugin/FoxGuardMain.java | 1 + .../plugin/handler/WelcomeHandler.java | 135 ++++++++++-------- .../plugin/object/owners/IOwnerProvider.java | 42 ++++++ .../object/owners/OwnerProviderRegistry.java | 32 +++++ .../sponge/foxguard/plugin/util/FGUtil.java | 6 +- 5 files changed, 151 insertions(+), 65 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 251f4f6..cdc4d2c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -291,6 +291,7 @@ private void registerFactories() { manager.registerHandlerFactory(new GroupHandler.Factory()); manager.registerHandlerFactory(new PermissionHandler.Factory()); manager.registerHandlerFactory(new DebugHandler.Factory()); + manager.registerHandlerFactory(new WelcomeHandler.Factory()); //manager.registerControllerFactory(new MessageController.Factory()); manager.registerControllerFactory(new LogicController.Factory()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java index b575e13..a283ef9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java @@ -26,7 +26,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; @@ -42,60 +41,34 @@ import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.event.message.MessageEvent; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.TextTemplate; +import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.text.format.TextStyles; -import org.spongepowered.api.text.serializer.FormattingCodeTextSerializer; -import org.spongepowered.api.text.serializer.TextSerializers; -import org.spongepowered.api.text.transform.SimpleTextTemplateApplier; -import org.spongepowered.api.text.transform.TextTemplateApplier; +import org.spongepowered.api.text.format.TextStyle; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; import javax.annotation.Nullable; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Stream; /** * Created by Fox on 11/5/2016. */ public class WelcomeHandler extends HandlerBase { - private static final Map matches; - private static final Pattern pattern; - - static { - pattern = Pattern.compile("&[0-9a-fk-or]|(?:\\.|&[^0-9a-fk-or]|[^&%])+"); - matches = new HashMap<>(); - matches.put("&0", TextColors.BLACK); - matches.put("&1", TextColors.DARK_BLUE); - matches.put("&2", TextColors.DARK_GREEN); - matches.put("&3", TextColors.DARK_AQUA); - matches.put("&4", TextColors.DARK_RED); - matches.put("&5", TextColors.DARK_PURPLE); - matches.put("&6", TextColors.GOLD); - matches.put("&7", TextColors.GRAY); - matches.put("&8", TextColors.DARK_GRAY); - matches.put("&9", TextColors.BLUE); - matches.put("&a", TextColors.GREEN); - matches.put("&b", TextColors.DARK_BLUE); - matches.put("&c", TextColors.DARK_BLUE); - matches.put("&d", TextColors.DARK_BLUE); - matches.put("&e", TextColors.DARK_BLUE); - matches.put("&f", TextColors.DARK_BLUE); - matches.put("&k", TextStyles.OBFUSCATED); - matches.put("&l", TextStyles.BOLD); - matches.put("&m", TextStyles.STRIKETHROUGH); - matches.put("&n", TextStyles.UNDERLINE); - matches.put("&o", TextStyles.ITALIC); - matches.put("&1", TextColors.RESET); - matches.put("player", TextTemplate.arg("player").build()); - } - TextTemplate enterTemplate = TextTemplate.EMPTY; - TextTemplate exitTemplate = TextTemplate.EMPTY; + private static final Pattern PATTERN = Pattern.compile("&[0-9a-fk-or]|%|(?:\\.|&(?![0-9a-fk-or%])|[^&%])+"); + + private TextTemplate enterTemplate = TextTemplate.EMPTY; + private TextTemplate exitTemplate = TextTemplate.EMPTY; public WelcomeHandler(String name, int priority) { this(name, true, priority); @@ -107,33 +80,53 @@ public WelcomeHandler(String name, boolean isEnabled, int priority) { @Override public ProcessResult modify(CommandSource source, String arguments) throws CommandException { - AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).limit(2).parse(); + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .limit(1) + .leaveFinalAsIs(true) + .parse(); if (parse.args.length < 1) return ProcessResult.of(false, Text.of("Must specify a command!")); - if(parse.args.length < 2) return ProcessResult.success(); + if (parse.args.length < 2) return ProcessResult.failure(); - if(parse.args[0].equals("enter")) enterTemplate = fromString(parse.args[1]); - else if(parse.args[0].equals("exit")) exitTemplate = fromString(parse.args[1]); - else ProcessResult.of(false, "Invalid Command."); + if (parse.args[0].equalsIgnoreCase("enter")) enterTemplate = fromString(parse.args[1]); + else if (parse.args[0].equalsIgnoreCase("exit")) exitTemplate = fromString(parse.args[1]); + else ProcessResult.of(false, "Invalid Command!"); - return ProcessResult.success(); + return ProcessResult.failure(); } @Override public List modifySuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { - return Lists.newArrayList("enter", "exit"); + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .limit(1) + .leaveFinalAsIs(true) + .autoCloseQuotes(true) + .excludeCurrent(true) + .parse(); + if (parse.current.type == AdvCmdParser.CurrentElement.ElementType.ARGUMENT) { + if (parse.current.index == 0) { + return Stream.of("enter", "exit") + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + } + } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.COMPLETE)) + return ImmutableList.of(parse.current.prefix + " "); + return ImmutableList.of(); } + @SuppressWarnings("ConstantConditions") @Override public EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra) { - Optional player = Optional.ofNullable((Player) user); + if (flags.get(Flags.MOVE)) { + Player player = (Player) user; - if(player.isPresent()) { - if (flags.get(Flags.ENTER)) player.get().sendMessage(enterTemplate.toText()); - else if (flags.get(Flags.EXIT)) player.get().sendMessage(exitTemplate.toText()); + if (flags.get(Flags.ENTER)) player.sendMessage(enterTemplate.toText()); + else if (flags.get(Flags.EXIT)) player.sendMessage(exitTemplate.toText()); } - return EventResult.pass(); } @@ -178,20 +171,38 @@ public void save(Path directory) { } private static TextTemplate fromString(String string) { - TextTemplate template = TextTemplate.of(); - - for(String object : pattern.split(string)) { - template.concat(TextTemplate.of(matches.getOrDefault(object, object))); + List elements = new ArrayList<>(); + Matcher matcher = PATTERN.matcher(string); + + while (matcher.find()) { + String str = matcher.group(); + + if (str.equals("%")) { + elements.add(TextTemplate.arg("player").build()); + } else if (str.matches("&[0-9a-fk-or]")) { + str = str.substring(1); + if (str.matches("[0-9a-f]")) { + Optional colorOpt = FCPUtil.textColorFromHex(str); + colorOpt.ifPresent(elements::add); + } else { + Optional styleOpt = FCPUtil.textStyleFromCode(str); + styleOpt.ifPresent(elements::add); + } + } else { + elements.add(str); + } } - return template; + return TextTemplate.of(elements.toArray()); } public static class Factory implements IHandlerFactory { + private static final String[] ALIASES = {"welcome"}; + @Override public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { - return null; + return new WelcomeHandler(name, priority); } @Override @@ -201,22 +212,22 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab @Override public String[] getAliases() { - return new String[0]; + return ALIASES; } @Override public String getType() { - return null; + return "welcome"; } @Override public String getPrimaryAlias() { - return null; + return "welcome"; } @Override public List createSuggestions(CommandSource source, String arguments, String type, @Nullable Location targetPosition) throws CommandException { - return null; + return ImmutableList.of(); } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java new file mode 100644 index 0000000..d97986e --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java @@ -0,0 +1,42 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +import net.minecraft.command.CommandException; + +import java.util.List; +import java.util.UUID; + +/** + * Created by Fox on 12/21/2016. + */ +public interface IOwnerProvider { + + List getOwnerKeywords(); + + UUID getOwnerUUID(String keyword) throws CommandException; + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java new file mode 100644 index 0000000..a37a1c2 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java @@ -0,0 +1,32 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +/** + * Created by Fox on 12/22/2016. + */ +public class OwnerProviderRegistry { +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 96fdc98..e38e988 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -127,11 +127,11 @@ public static Tuple getObjectDataFromUserInput(String input) { String ownerString, nameString; if (parts.length == 0) return Tuple.of(FGManager.SERVER_UUID, ""); else if (parts.length == 1) { - if (input.startsWith(":")) { - return Tuple.of(FGManager.SERVER_UUID, parts[0]); - } else { + if (input.endsWith(":")) { ownerString = parts[0]; nameString = ""; + } else { + return Tuple.of(FGManager.SERVER_UUID, parts[0]); } } else if (parts.length == 2) { nameString = ""; From dfe657af54247bc284e3006727d9c506784abde4 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Fri, 3 Mar 2017 03:26:44 -0800 Subject: [PATCH 07/30] OH MY GOD ANOTHER COMMIT. I've been cleaning stuff up. I just figured I'd push my changes. --- .../foxguard/plugin/FGConfigManager.java | 59 ++++++- .../sponge/foxguard/plugin/FGManager.java | 5 +- .../foxguard/plugin/FGStorageManager.java | 150 ++++++++++-------- .../plugin/controller/ControllerBase.java | 6 +- .../foxguard/plugin/handler/BasicHandler.java | 11 +- .../foxguard/plugin/handler/GroupHandler.java | 9 +- .../plugin/object/owners/IOwnerProvider.java | 11 +- .../object/owners/OfflineUserProvider.java | 47 ++++++ .../object/owners/OnlinePlayerProvider.java | 40 +++++ .../object/owners/OwnerProviderRegistry.java | 118 ++++++++++++++ 10 files changed, 371 insertions(+), 85 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java index 24c4c78..15f3828 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java @@ -29,6 +29,7 @@ import ninja.leaping.configurate.commented.CommentedConfigurationNode; import ninja.leaping.configurate.hocon.HoconConfigurationLoader; import ninja.leaping.configurate.loader.ConfigurationLoader; +import org.spongepowered.api.Sponge; import java.io.IOException; import java.nio.file.Files; @@ -44,6 +45,12 @@ public final class FGConfigManager { private boolean saveWorldRegionsInWorldFolders; private boolean saveInWorldFolder; private boolean useConfigFolder; + private boolean useCustomDirectory; + private Path customDirectory; + private boolean gcAndFinalize; + private boolean lockDatabaseFiles; + private boolean useMMappedFiles; + private boolean gcCleanerHack; private int nameLengthLimit; private Map modules = new EnumMap<>(Module.class); @@ -79,22 +86,42 @@ public void save() { "This is meant to keep the file store clean and free of clutter. It also improves load times.\n" + "The caveat is that objects that fail to load are deleted without warning. This normally isn't an issue, even in server crashes.\n" + "However, modifying databases and moving the files around can trigger the cleanup.\n" + - "If force loading is off or the plugin simply fails to load the database, it would just be discarded.\n" + + "If plugin simply fails to load the database, it would just be discarded.\n" + "Setting this option to false will prevent databases from being deleted.\n" + "However, they will still be overwritten if a new database is made with the same name.") .setValue(cleanupFiles); - root.getNode("storage", "saveInWorldFolder").setComment("Whether or not FoxGuard should save object information in the world folder.\n" + - "This includes super-regions, handlers, and controllers, but does not include world-regions.") + root.getNode("storage", "location", "saveInWorldFolder").setComment("Whether or not FoxGuard should save object information in the world folder.\n Default: true" + + "This includes super-regions, handlers, and controllers, but does not include world-regions.\n" + + "If set to false, files will be placed in a folder in the server root directory.") .setValue(saveInWorldFolder); - root.getNode("storage", "saveWorldRegionsInWorldFolders").setComment("Whether or not FoxGuard should save world-region information in the world folder.\n" + + root.getNode("storage", "location", "saveWorldRegionsInWorldFolders").setComment("Whether or not FoxGuard should save world-region information in the world folder.\n" + "In this case, the files are kept with their corresponding world/dimension.\n" + "This makes it easier to copy and paste world data without causing de-synchronization between the world data and FoxGuard data.") .setValue(saveWorldRegionsInWorldFolders); - root.getNode("storage", "useConfigFolder").setComment("Whether or not to place the foxguard folder inside the config folder.\n" + + root.getNode("storage", "location", "useConfigFolder").setComment("Whether or not to place the foxguard folder inside the config folder.\n" + "Only applies if files are not kept inside the world folder.") .setValue(useConfigFolder); + root.getNode("storage", "gcAndFinalize").setComment("Whether to run try running gc and finalization when deleting things.\n" + + "This may drastically slow down the deletion of objects.\n" + + "Use only if you are having trouble deleting things from in game.\n" + + "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems.") + .setValue(gcAndFinalize); + root.getNode("storage", "database", "lockDatabaseFiles").setComment("Whether to put a lock on database files while accessing them.\n" + + "Locking is known to cause Java to hang on Unix based operating systems running on a NFS (Networked File System) that does not properly support locking.\n" + + "This is often the case if you are using a server host, so be very cautious.\n" + + "If your server hangs and crashes from the Minecraft watchdog, try setting this to false.") + .setValue(lockDatabaseFiles); + root.getNode("storage", "database", "useMMappedFiles").setComment("Whether to enable memory mapping for database files.\n" + + "This has the potential to greatly speed up saving and loading from database files." + + "This is known to cause some issues on Windows.\n" + + "This may be correctable with gcCleanerHack.") + .setValue(useMMappedFiles); + root.getNode("storage", "database", "gcCleanerHack").setComment("Whether to enable MapDB's gcCleanerHack functionality.\n" + + "This is meant for fixing issues with databases being un-deletable on Windows when memory mapping is enabled.\n" + + "This only makes a difference if memory mapping is enabled, and can potentially decrease performance.") + .setValue(gcCleanerHack); root.getNode("general", "nameLengthLimit").setComment("The length limit for object names. Use 0 or lower for no limit.\n" + "Extremely long names can cause a variety of unfixable issues. You have been warned.") .setValue(nameLengthLimit); @@ -133,12 +160,18 @@ private void load() { saveInWorldFolder = root.getNode("storage", "saveInWorldFolder").getBoolean(true); saveWorldRegionsInWorldFolders = root.getNode("storage", "saveWorldRegionsInWorldFolders").getBoolean(true); useConfigFolder = root.getNode("storage", "useConfigFolder").getBoolean(false); + gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); + gcAndFinalize = root.getNode("storage", "database", "lockDatabaseFiles").getBoolean(false); + gcAndFinalize = root.getNode("storage", "database", "useMMappedFiles").getBoolean(false); + gcAndFinalize = root.getNode("storage", "database", "gcCleanerHack").getBoolean(false); nameLengthLimit = root.getNode("general", "nameLengthLimit").getInt(24); for (Module m : Module.values()) { this.modules.put(m, root.getNode("module", m.name).getBoolean(true)); } //-------------------------------------------------------------------------------------------------------------- + + Path path = Sponge.getGame().getSavesDirectory(); } @@ -158,6 +191,22 @@ public boolean useConfigFolder() { return useConfigFolder; } + public boolean gcAndFinalize() { + return gcAndFinalize; + } + + public boolean lockDatabaseFiles() { + return lockDatabaseFiles; + } + + public boolean useMMappedFiles() { + return useMMappedFiles; + } + + public boolean gcCleanerHack() { + return gcCleanerHack; + } + public int getNameLengthLimit() { return nameLengthLimit; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index e959703..368829d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -39,6 +39,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; @@ -569,13 +570,13 @@ public boolean removeWorldRegion(IWorldRegion region) { public boolean link(ILinkable linkable, IHandler handler) { if (linkable == null || handler == null || linkable.getHandlers().contains(handler)) return false; Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof GlobalHandler && !(linkable instanceof GlobalWorldRegion || linkable instanceof GlobalRegion)) && linkable.addHandler(handler); + return !(handler instanceof IGlobal) && linkable.addHandler(handler); } public boolean unlink(ILinkable linkable, IHandler handler) { if (linkable == null || handler == null || !linkable.getHandlers().contains(handler)) return false; Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof GlobalHandler) && linkable.removeHandler(handler); + return !(handler instanceof IGlobal) && linkable.removeHandler(handler); } public boolean rename(IFGObject object, String newName) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java index d6f060b..32bb5ab 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java @@ -55,8 +55,9 @@ */ public final class FGStorageManager { - public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", - "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; + public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", + "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", + "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; private static FGStorageManager instance; public final HashMap defaultModifiedMap; private final UserStorageService userStorageService; @@ -87,6 +88,24 @@ public static FGStorageManager getInstance() { return instance; } + public static DB openFoxDB(Path path) { + FGConfigManager c = FGConfigManager.getInstance(); + DBMaker.Maker maker = DBMaker.fileDB(path.normalize().toFile()); + if (!c.lockDatabaseFiles()) maker.fileLockDisable(); + if (c.useMMappedFiles()) maker.fileMmapEnableIfSupported(); + if (c.gcCleanerHack()) maker.cleanerHackEnable(); + return maker.make(); + } + + private static String serializeHandlerList(Collection handlers) { + StringBuilder builder = new StringBuilder(); + for (Iterator it = handlers.iterator(); it.hasNext(); ) { + builder.append(it.next().getName()); + if (it.hasNext()) builder.append(","); + } + return builder.toString(); + } + public void saveRegions() { saveRegions(false); } @@ -94,7 +113,7 @@ public void saveRegions() { public synchronized void saveRegions(boolean force) { logger.info("Saving regions" + (force ? " (forced save)" : "")); Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); @@ -125,7 +144,7 @@ public synchronized void saveRegions(boolean force) { } logger.info("Saving metadata for region " + logName); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -172,9 +191,9 @@ public void saveWorldRegions(World world) { } public synchronized void saveWorldRegions(World world, boolean force) { - logger.info("Saving world regions in world \"" + world.getName() + "\"" + (force ? " (forced save)" : "")); + logger.info("Saving world regions in world " + world.getName() + (force ? " (forced save)" : "")); Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); @@ -205,7 +224,7 @@ public synchronized void saveWorldRegions(World world, boolean force) { } logger.info("Saving metadata for world region " + logName); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -255,7 +274,7 @@ public void saveHandlers() { public synchronized void saveHandlers(boolean force) { logger.info("Saving handlers" + (force ? " (forced save)" : "")); Path dbFile = directory.resolve("handlers.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); @@ -285,7 +304,7 @@ public synchronized void saveHandlers(boolean force) { } logger.info("Saving metadata for handler " + logName); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -334,7 +353,7 @@ public synchronized void saveRegion(IRegion fgObject, boolean force) { if (fgObject instanceof IWorldRegion) saveWorldRegion((IWorldRegion) fgObject, force); else { Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); @@ -361,7 +380,7 @@ public synchronized void saveRegion(IRegion fgObject, boolean force) { } logger.info("Saving metadata for region " + logName); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -410,7 +429,7 @@ public void saveWorldRegion(IWorldRegion fgObject) { public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { World world = fgObject.getWorld(); Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); @@ -437,7 +456,7 @@ public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { } logger.info("Saving metadata for world region " + logName); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -463,6 +482,7 @@ public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { logger.info("World region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { + logger.info("Saving links for world region " + logName + ""); linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); } else { logger.info("World region " + logName + " does not need its links saved. Skipping..."); @@ -485,7 +505,7 @@ public void saveHandler(IHandler fgObject) { public synchronized void saveHandler(IHandler fgObject, boolean force) { Path dbFile = directory.resolve("handlers.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -498,16 +518,16 @@ public synchronized void saveHandler(IHandler fgObject, boolean force) { Path singleDir = dir.resolve(name.toLowerCase()); boolean shouldSave = fgObject.shouldSave(); if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving handler \"" + name + "\" in directory: " + singleDir); + logger.info((shouldSave ? "S" : "Force s") + "aving handler " + name + " in directory: " + singleDir); constructDirectory(singleDir); try { fgObject.save(singleDir); } catch (Exception e) { - logger.error("There was an error while saving handler \"" + name + "\"!", e); + logger.error("There was an error while saving handler " + name + "!", e); } - logger.info("Saving metadata for handler \"" + name + "\""); - try (DB metaDB = DBMaker.fileDB(singleDir.resolve("metadata.foxdb").normalize().toString()).make()) { + logger.info("Saving metadata for handler " + name); + try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); @@ -546,7 +566,7 @@ public synchronized void saveHandler(IHandler fgObject, boolean force) { public synchronized void removeRegion(IRegion fgObject) { if (fgObject instanceof IWorldRegion) removeWorldRegion((IWorldRegion) fgObject); - else try (DB mainDB = DBMaker.fileDB(directory.resolve("regions.foxdb").normalize().toString()).make()) { + else try (DB mainDB = openFoxDB(directory.resolve("regions.foxdb"))) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -568,15 +588,14 @@ else try (DB mainDB = DBMaker.fileDB(directory.resolve("regions.foxdb").normaliz Path singleDir = new LoadEntry(fgObject).getPath(); if (Files.exists(singleDir)) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } } public synchronized void removeWorldRegion(IWorldRegion fgObject) { - try (DB mainDB = DBMaker.fileDB(worldDirectories.get(fgObject.getWorld().getName()).resolve("wregions.foxdb").normalize().toString()).make()) { + try (DB mainDB = openFoxDB(worldDirectories.get(fgObject.getWorld().getName()).resolve("wregions.foxdb"))) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -588,7 +607,7 @@ public synchronized void removeWorldRegion(IWorldRegion fgObject) { linksMap.remove(fgObject.getName()); } catch (DBException.DataCorruption e) { try { - Files.deleteIfExists(directory.resolve("regions.foxdb")); + Files.deleteIfExists(directory.resolve("wregions.foxdb")); saveWorldRegions(fgObject.getWorld()); } catch (IOException e1) { e1.printStackTrace(); @@ -598,15 +617,14 @@ public synchronized void removeWorldRegion(IWorldRegion fgObject) { Path singleDir = new LoadEntry(fgObject).getPath(); if (Files.exists(singleDir)) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } } public synchronized void removeHandler(IHandler fgObject) { - try (DB mainDB = DBMaker.fileDB(directory.resolve("handlers.foxdb").normalize().toString()).make()) { + try (DB mainDB = openFoxDB(directory.resolve("handlers.foxdb"))) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -618,7 +636,7 @@ public synchronized void removeHandler(IHandler fgObject) { priorityMap.remove(fgObject.getName()); } catch (DBException.DataCorruption e) { try { - Files.deleteIfExists(directory.resolve("regions.foxdb")); + Files.deleteIfExists(directory.resolve("handlers.foxdb")); saveHandlers(); } catch (IOException e1) { e1.printStackTrace(); @@ -628,8 +646,7 @@ public synchronized void removeHandler(IHandler fgObject) { Path singleDir = new LoadEntry(fgObject).getPath(); if (Files.exists(singleDir)) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -637,7 +654,7 @@ public synchronized void removeHandler(IHandler fgObject) { public synchronized void loadRegions() { Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -652,7 +669,7 @@ public synchronized void loadRegions() { String category; String type; Boolean enabled; - try (DB metaDB = DBMaker.fileDB(metaDataFile.normalize().toString()).make()) { + try (DB metaDB = openFoxDB(metaDataFile)) { category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); @@ -669,8 +686,7 @@ public synchronized void loadRegions() { logger.error("Name conflict detected! \"" + name + "\" is already in use! A world region is likely already using that name."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -692,8 +708,7 @@ public synchronized void loadRegions() { logger.warn("A region was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -710,8 +725,7 @@ public synchronized void loadRegions() { } else { if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -731,7 +745,7 @@ public synchronized void loadRegions() { public synchronized void loadWorldRegions(World world) { Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = DBMaker.fileDB(dbFile.toString()).make()) { + try (DB mainDB = openFoxDB(dbFile)) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -746,7 +760,7 @@ public synchronized void loadWorldRegions(World world) { String category; String type; Boolean enabled; - try (DB metaDB = DBMaker.fileDB(metaDataFile.normalize().toString()).make()) { + try (DB metaDB = openFoxDB(metaDataFile)) { category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); @@ -765,8 +779,7 @@ public synchronized void loadWorldRegions(World world) { logger.error("Name conflict detected! \"" + name + "\" is already in use! A super region is likely already using that name."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -786,8 +799,7 @@ public synchronized void loadWorldRegions(World world) { logger.warn("A world region was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -804,8 +816,7 @@ public synchronized void loadWorldRegions(World world) { } else { if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -824,7 +835,7 @@ public synchronized void loadWorldRegions(World world) { } public synchronized void loadHandlers() { - try (DB mainDB = DBMaker.fileDB(directory.resolve("handlers.foxdb").normalize().toString()).make()) { + try (DB mainDB = openFoxDB(directory.resolve("handlers.foxdb"))) { Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); @@ -841,7 +852,7 @@ public synchronized void loadHandlers() { String type; Boolean enabled; Integer priority; - try (DB metaDB = DBMaker.fileDB(metaDataFile.normalize().toString()).make()) { + try (DB metaDB = openFoxDB(metaDataFile)) { category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); @@ -876,8 +887,7 @@ else if (category.equalsIgnoreCase("controller")) logger.warn("A handler was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -898,8 +908,7 @@ else if (category.equalsIgnoreCase("controller")) } else { if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDir); } } @@ -924,7 +933,7 @@ public void loadLinks() { public synchronized void loadRegionLinks() { logger.info("Loading region links"); - try (DB mainDB = DBMaker.fileDB(directory.resolve("regions.foxdb").normalize().toString()).make()) { + try (DB mainDB = openFoxDB(directory.resolve("regions.foxdb"))) { Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); linksMap.entrySet().forEach(entry -> { Optional regionOpt = FGManager.getInstance().getRegion(entry.getKey()); @@ -938,11 +947,20 @@ public synchronized void loadRegionLinks() { Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); if (handlerOpt.isPresent()) { IHandler handler = handlerOpt.get(); - if (FGManager.getInstance().link(region, handler)) + if (FGManager.getInstance().link(region, handler)) { logger.info("Linked region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); + } else { + logger.warn("Failed to link region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\" for some reason!"); + } + } else { + logger.error("Unable to link region \"" + region.getName() + "\" to handler \"" + handlerName + "\" because that handler doesn't exist!"); } }); + } else { + logger.info("No links to load for region \"" + region.getName() + "\"!"); } + } else { + logger.error("Unable to load links for region \"" + entry.getKey() + "\" because that region does not exist!"); } }); } @@ -950,7 +968,7 @@ public synchronized void loadRegionLinks() { public synchronized void loadWorldRegionLinks(World world) { logger.info("Loading world region links for world \"" + world.getName() + "\""); - try (DB mainDB = DBMaker.fileDB(worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize().toString()).make()) { + try (DB mainDB = openFoxDB(worldDirectories.get(world.getName()).resolve("wregions.foxdb"))) { Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); linksMap.entrySet().forEach(entry -> { Optional regionOpt = FGManager.getInstance().getWorldRegion(world, entry.getKey()); @@ -964,11 +982,20 @@ public synchronized void loadWorldRegionLinks(World world) { Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); if (handlerOpt.isPresent()) { IHandler handler = handlerOpt.get(); - if (FGManager.getInstance().link(region, handler)) + if (FGManager.getInstance().link(region, handler)) { logger.info("Linked world region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); + } else { + logger.warn("Failed to link world region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\" for some reason!"); + } + } else { + logger.error("Unable to link world region \"" + region.getName() + "\" to handler \"" + handlerName + "\" because that handler doesn't exist!"); } }); + } else { + logger.info("No links to load for world region \"" + region.getName() + "\"!"); } + } else { + logger.error("Unable to load links for world region \"" + entry.getKey() + "\" because that world region does not exist!"); } }); } @@ -989,8 +1016,7 @@ public synchronized void addObject(IFGObject object) { Path singleDirectory = entry.getPath(); if (Files.exists(singleDirectory)) { logger.info("Deleting directory \"" + singleDirectory + "\" to make room for new data."); - System.gc(); - System.runFinalization(); + gcCleanup(); deleteDirectory(singleDirectory, true); } loaded.add(entry); @@ -1164,13 +1190,11 @@ private boolean isEmptyDirectory(Path directory) { } } - private String serializeHandlerList(Collection handlers) { - StringBuilder builder = new StringBuilder(); - for (Iterator it = handlers.iterator(); it.hasNext(); ) { - builder.append(it.next().getName()); - if (it.hasNext()) builder.append(","); + private void gcCleanup() { + if (FGConfigManager.getInstance().gcAndFinalize()) { + System.gc(); + System.runFinalization(); } - return builder.toString(); } public enum Type { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index c749886..c93715e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -27,11 +27,11 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerBase; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import org.mapdb.DB; -import org.mapdb.DBMaker; import org.mapdb.Serializer; import java.nio.file.Path; @@ -72,7 +72,7 @@ public void clearHandlers() { @Override public void loadLinks(Path directory) { - try (DB linksDB = DBMaker.fileDB(directory.resolve("links.foxdb").normalize().toString()).make()) { + try (DB linksDB = FGStorageManager.openFoxDB(directory.resolve("links.foxdb"))) { List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); handlers.clear(); linksList.stream() @@ -86,7 +86,7 @@ public void loadLinks(Path directory) { } protected void saveLinks(Path directory) { - try (DB linksDB = DBMaker.fileDB(directory.resolve("links.foxdb").normalize().toString()).make()) { + try (DB linksDB = FGStorageManager.openFoxDB(directory.resolve("links.foxdb"))) { List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); linksList.clear(); handlers.stream().map(IFGObject::getName).forEach(linksList::add); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index df9df00..7b3abbb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -50,7 +50,6 @@ import ninja.leaping.configurate.hocon.HoconConfigurationLoader; import ninja.leaping.configurate.loader.ConfigurationLoader; import org.mapdb.DB; -import org.mapdb.DBMaker; import org.mapdb.Serializer; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; @@ -1150,12 +1149,12 @@ public List detailsSuggestions(CommandSource source, String arguments, @ public void save(Path directory) { FGStorageManager storageManager = FGStorageManager.getInstance(); UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("groups.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); } - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("flags.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : this.groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); stringEntries.clear(); @@ -1176,7 +1175,7 @@ public void save(Path directory) { for (UUID uuid : group.users) { Optional userOptional = userStorageService.get(uuid); Map map = new HashMap<>(); - if (userOptional.isPresent()) map.put("username", userOptional.get().getName()); + userOptional.ifPresent(user -> map.put("username", user.getName())); map.put("uuid", uuid.toString()); members.add(map); } @@ -1656,7 +1655,7 @@ public IHandler create(String name, int priority, String arguments, CommandSourc public IHandler create(Path directory, String name, int priority, boolean isEnabled) { FGStorageManager storageManager = FGStorageManager.getInstance(); List groupNames = new ArrayList<>(); - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("groups.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); } Path groupsDirectory = directory.resolve("groups"); @@ -1683,7 +1682,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab } Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("flags.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); groupPermissions.put(group, stringEntries.stream() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 0d7187b..2041f6e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -47,7 +47,6 @@ import ninja.leaping.configurate.hocon.HoconConfigurationLoader; import ninja.leaping.configurate.loader.ConfigurationLoader; import org.mapdb.DB; -import org.mapdb.DBMaker; import org.mapdb.Serializer; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; @@ -910,12 +909,12 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("groups.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); } - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("flags.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : this.groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); stringEntries.clear(); @@ -1243,7 +1242,7 @@ public IHandler create(String name, int priority, String arguments, CommandSourc @Override public IHandler create(Path directory, String name, int priority, boolean isEnabled) { List groupNames = new ArrayList<>(); - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("groups.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); } List groups = new ArrayList<>(); @@ -1265,7 +1264,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = DBMaker.fileDB(directory.resolve("flags.foxdb").normalize().toString()).make()) { + try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); groupPermissions.put(group, stringEntries.stream() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java index d97986e..187c878 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java @@ -28,6 +28,7 @@ import net.minecraft.command.CommandException; import java.util.List; +import java.util.Optional; import java.util.UUID; /** @@ -37,6 +38,14 @@ public interface IOwnerProvider { List getOwnerKeywords(); - UUID getOwnerUUID(String keyword) throws CommandException; + Optional getOwnerUUID(String keyword); + + Optional getKeyword(UUID uuid); + + default Optional getName(UUID uuid){ + return getKeyword(uuid); + } + + String[] getAliases(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java new file mode 100644 index 0000000..150df52 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java @@ -0,0 +1,47 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.api.service.user.UserStorageService; +import org.spongepowered.api.util.GuavaCollectors; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by Fox on 12/31/2016. + */ +public class OfflineUserProvider implements IOwnerProvider { + + private static final String[] ALIASES = {"offline", "off", "o"}; + + private final UserStorageService service = FoxGuardMain.instance().getUserStorage(); + + @Override + public List getOwnerKeywords() { + return service.getAll().stream() + .map(GameProfile::getName) + .filter(Optional::isPresent) + .map(Optional::get) + .distinct() + .sorted(String.CASE_INSENSITIVE_ORDER) + .collect(GuavaCollectors.toImmutableList()); + } + + @Override + public Optional getOwnerUUID(String keyword) { + return service.get(keyword).map(User::getUniqueId); + } + + @Override + public Optional getKeyword(UUID uuid) { + return service.get(uuid).map(User::getName); + } + + @Override + public String[] getAliases() { + return ALIASES; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java new file mode 100644 index 0000000..9125e00 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java @@ -0,0 +1,40 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.util.GuavaCollectors; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by Fox on 12/31/2016. + */ +public class OnlinePlayerProvider implements IOwnerProvider { + + private static final String[] ALIASES = {"online", "on"}; + + @Override + public List getOwnerKeywords() { + return Sponge.getServer().getOnlinePlayers().stream() + .map(Player::getName) + .sorted(String.CASE_INSENSITIVE_ORDER) + .collect(GuavaCollectors.toImmutableList()); + } + + @Override + public Optional getOwnerUUID(String keyword) { + return Sponge.getServer().getPlayer(keyword).map(Player::getUniqueId); + } + + @Override + public Optional getKeyword(UUID uuid) { + return Sponge.getServer().getPlayer(uuid).map(Player::getName); + } + + @Override + public String[] getAliases() { + return ALIASES; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java index a37a1c2..ca44950 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java @@ -25,8 +25,126 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.security.SecureRandom; +import java.util.*; + /** * Created by Fox on 12/22/2016. */ public class OwnerProviderRegistry { + + private static final SecureRandom sRandom = new SecureRandom(); + + private static OwnerProviderRegistry instance; + + public static OwnerProviderRegistry getInstance() { + if(instance == null) instance = new OwnerProviderRegistry(); + return instance; + } + + private Set inUse = new HashSet<>(); + private List ownerProviders; + + public OwnerProviderRegistry() { + ownerProviders = new ArrayList<>(); + ownerProviders.add(new OnlinePlayerProvider()); + ownerProviders.add(new OfflineUserProvider()); + } + + /** + * Registers a {@link UUID} for use as a virtual player owner. + * This ensures that this UUID will not be used elsewhere due to collisions. + * + * @param uuid the {@link UUID} to register. + * @return Whether the {@link UUID} was successfully registered. Returns false if it has already been registered. + */ + + public boolean registerUUID(UUID uuid) { + return !isPlayerUUID(uuid) && inUse.add(uuid); + } + + public boolean unregisterUUID(UUID uuid) { + return inUse.remove(uuid); + } + + /** + * Generates a random {@link UUID} that is NOT to RFC spec. + * The version for this {@link UUID} is zero, and the variant is random. + * By breaking RFC spec, we guarantee that there will not be a collision. + * + * @return + */ + + public UUID generateUUID() { + byte[] randomBytes = new byte[16]; + UUID uuid; + do { + sRandom.nextBytes(randomBytes); + randomBytes[0] = 0x00; /* leading zeros */ + randomBytes[6] &= 0x0f; /* clear version */ + uuid = uuidFromBytes(randomBytes); + } while (inUse.contains(uuid)); + + return uuid; + } + + /** + * Generates a {@link UUID} with {@link OwnerProviderRegistry#generateUUID()} and adds it. + * This is a convenience method. + * + * @return the generated {@link UUID} + */ + + public UUID generateAndRegisterUUID() { + UUID uuid = generateUUID(); + inUse.add(uuid); + return uuid; + } + + public boolean registerProvider(IOwnerProvider provider) { + return !ownerProviders.contains(provider) && ownerProviders.add(provider); + } + + public Optional getUUIDforOwner(@Nullable String type, @Nullable String qualifier) { + if (type == null || type.isEmpty()){ + if(qualifier == null || qualifier.isEmpty()){ + return Optional.of(FGManager.SERVER_UUID); + } + } else { + if(qualifier == null || qualifier.isEmpty()){ + + } + } + return Optional.empty(); + } + + /** + * This method checks if a {@link UUID} could potentially be a player {@link UUID}. + * It does this by checking if it's a v3 or v4 uuid. + * For our purposes, it really doesn't matter that we're breaking RFC spec, + * because all we care about is avoiding name conflicts. + * Beyond that, UUID is just a convinient method of keeping track of owners. + * + * @param uuid the {@link UUID} to check + * @return Whether this is a v3 or v4 {@link UUID}, meaning whether it could be a player {@link UUID}. + */ + public static boolean isPlayerUUID(UUID uuid) { + byte a = (byte) (uuid.getMostSignificantBits() >>> 12 & 0xf); + byte b = (byte) (uuid.getLeastSignificantBits() >>> 60 & 0xf); + return (a == 0x3 || a == 0x4) && b >= 0x8 && b <= 0xb; + } + + private static UUID uuidFromBytes(byte[] data) { + long msb = 0; + long lsb = 0; + for (int i = 0; i < 8; i++) + msb = (msb << 8) | (data[i] & 0xff); + for (int i = 8; i < 16; i++) + lsb = (lsb << 8) | (data[i] & 0xff); + return new UUID(msb, lsb); + } } From c880e21042991b1fb9ddabc3885579a8fd3795e3 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Sun, 23 Jul 2017 19:03:47 -0700 Subject: [PATCH 08/30] Why are there so many changes what did i do to deserve this...? --- FoxCore | 2 +- .../sponge/foxguard/plugin/FGManager.java | 14 +- .../foxguard/plugin/FGStorageManager.java | 10 +- .../sponge/foxguard/plugin/FoxGuardMain.java | 10 +- .../plugin/command/CommandDetail.java | 8 +- .../foxguard/plugin/command/CommandHere.java | 2 +- .../foxguard/plugin/command/CommandLink.java | 4 +- .../foxguard/plugin/command/CommandLink2.java | 4 +- .../foxguard/plugin/command/CommandSave.java | 2 + .../plugin/command/CommandUnlink.java | 4 +- .../plugin/controller/ControllerBase.java | 10 +- .../plugin/controller/IController.java | 7 +- .../controller/message/MessageController.java | 14 +- .../plugin/listener/BlockChangeListener.java | 4 +- .../plugin/listener/DamageListener.java | 2 +- .../plugin/listener/ExplosionListener.java | 6 +- .../listener/InteractBlockListener.java | 2 +- .../listener/InteractEntityListener.java | 2 +- .../plugin/listener/PlayerMoveListener.java | 4 +- .../listener/PlayerMoveListenerNew.java | 4 +- .../plugin/listener/SpawnEntityListener.java | 2 +- .../foxguard/plugin/object/FGObjectBase.java | 4 +- .../foxguard/plugin/object/ILinkable.java | 9 +- .../foxguard/plugin/region/IRegion.java | 1 + .../foxguard/plugin/region/RegionBase.java | 8 +- .../plugin/storage/FGObjectIndex.java | 64 ++++ .../foxguard/plugin/storage/FGObjectMeta.java | 60 ++++ .../plugin/storage/FGStorageManagerNew.java | 326 ++++++++++++++++++ 28 files changed, 527 insertions(+), 62 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java diff --git a/FoxCore b/FoxCore index fa2c35b..e336a46 160000 --- a/FoxCore +++ b/FoxCore @@ -1 +1 @@ -Subproject commit fa2c35bb47d31163437901e93cc7aa8e4356f9bd +Subproject commit e336a46fbdffe5c4cc7378270fd49707dd252463 diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index 368829d..c33220e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -84,7 +84,7 @@ private FGManager() { globalHandler = new GlobalHandler(); regions.put(SERVER_UUID, globalRegion); handlers.put(SERVER_UUID, globalHandler); - globalRegion.addHandler(globalHandler); + globalRegion.addLink(globalHandler); this.regionCache = new RegionCache(regions, worldRegions); } @@ -517,8 +517,8 @@ public Optional getController(String name, UUID uuid) { public boolean removeHandler(IHandler handler) { if (handler == null || handler instanceof GlobalHandler) return false; this.worldRegions.forEach((world, set) -> set.values().stream() - .filter(region -> region.getHandlers().contains(handler)) - .forEach(region -> region.removeHandler(handler))); + .filter(region -> region.getLinks().contains(handler)) + .forEach(region -> region.removeLink(handler))); if (!this.handlers.values().contains(handler)) { return false; } @@ -568,15 +568,15 @@ public boolean removeWorldRegion(IWorldRegion region) { } public boolean link(ILinkable linkable, IHandler handler) { - if (linkable == null || handler == null || linkable.getHandlers().contains(handler)) return false; + if (linkable == null || handler == null || linkable.getLinks().contains(handler)) return false; Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof IGlobal) && linkable.addHandler(handler); + return !(handler instanceof IGlobal) && linkable.addLink(handler); } public boolean unlink(ILinkable linkable, IHandler handler) { - if (linkable == null || handler == null || !linkable.getHandlers().contains(handler)) return false; + if (linkable == null || handler == null || !linkable.getLinks().contains(handler)) return false; Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof IGlobal) && linkable.removeHandler(handler); + return !(handler instanceof IGlobal) && linkable.removeLink(handler); } public boolean rename(IFGObject object, String newName) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java index 32bb5ab..3314fc1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java @@ -169,7 +169,7 @@ public synchronized void saveRegions(boolean force) { logger.info("Region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); + linksMap.put(name, serializeHandlerList(fgObject.getLinks())); } else { logger.info("Region " + logName + " does not need its links saved. Skipping..."); } @@ -250,7 +250,7 @@ public synchronized void saveWorldRegions(World world, boolean force) { logger.info("World region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); + linksMap.put(name, serializeHandlerList(fgObject.getLinks())); } else { logger.info("World region " + logName + " does not need its links saved. Skipping..."); } @@ -405,7 +405,7 @@ public synchronized void saveRegion(IRegion fgObject, boolean force) { logger.info("Region " + logName + " does not need saving. Skipping..."); } if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); + linksMap.put(name, serializeHandlerList(fgObject.getLinks())); } else { logger.info("Region " + logName + " does not need its links saved. Skipping..."); } @@ -483,7 +483,7 @@ public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { } if (fgObject.saveLinks()) { logger.info("Saving links for world region " + logName + ""); - linksMap.put(name, serializeHandlerList(fgObject.getHandlers())); + linksMap.put(name, serializeHandlerList(fgObject.getLinks())); } else { logger.info("World region " + logName + " does not need its links saved. Skipping..."); } @@ -1006,7 +1006,7 @@ public synchronized void loadControllerLinks() { Path dir = directory.resolve("handlers"); for (IController controller : FGManager.getInstance().getControllers()) { logger.info("Loading links for controller \"" + controller.getName() + "\""); - controller.loadLinks(dir.resolve(controller.getName().toLowerCase())); + controller.loadLinks(dir.resolve(controller.getName().toLowerCase()), null); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index cdc4d2c..19bd6df 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -47,6 +47,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.factory.ControllersStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.state.factory.HandlersStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.state.factory.RegionsStateFieldFactory; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.minecrell.mcstats.SpongeStatsLite; import org.slf4j.Logger; import org.spongepowered.api.Game; @@ -238,8 +239,10 @@ public void serverStarting(GameStartingServerEvent event) { @Listener public void serverStopping(GameStoppingServerEvent event) { - FGStorageManager.getInstance().saveRegions(); - FGStorageManager.getInstance().saveHandlers(); + //FGStorageManager.getInstance().saveRegions(); + //FGStorageManager.getInstance().saveHandlers(); + FGStorageManagerNew.getInstance().saveRegionIndex(); + FGStorageManagerNew.getInstance().saveHandlerIndex(); logger.info("Saving configs"); FGConfigManager.getInstance().save(); FGManager.getInstance().unloadServer(); @@ -248,7 +251,8 @@ public void serverStopping(GameStoppingServerEvent event) { @Listener public void worldUnload(UnloadWorldEvent event) { logger.info("Unloading world \"" + event.getTargetWorld().getName() + "\""); - FGStorageManager.getInstance().saveWorldRegions(event.getTargetWorld()); + //FGStorageManager.getInstance().saveWorldRegions(event.getTargetWorld()); + FGStorageManagerNew.getInstance().saveWorldRegionIndex(event.getTargetWorld()); FGManager.getInstance().unloadWorld(event.getTargetWorld()); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 75996a7..16c6f0c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -211,11 +211,11 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } builder.append(Text.of(TextColors.GREEN, "\n------- Inbound Links -------")); List controllerList = FGManager.getInstance().getControllers().stream() - .filter(controller -> controller.getHandlers().contains(handler)) + .filter(controller -> controller.getLinks().contains(handler)) .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) .collect(GuavaCollectors.toImmutableList()); List regionList = FGManager.getInstance().getAllRegions().stream() - .filter(region -> region.getHandlers().contains(handler)) + .filter(region -> region.getLinks().contains(handler)) .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) .collect(GuavaCollectors.toImmutableList()); if (controllerList.size() == 0 && regionList.size() == 0) @@ -313,9 +313,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm private void outboundLinks(Text.Builder builder, ILinkable linkable, CommandSource source) { builder.append(Text.of(TextColors.GREEN, "\n------- Outbound Links -------")); - if (linkable.getHandlers().size() == 0) + if (linkable.getLinks().size() == 0) builder.append(Text.of(TextStyles.ITALIC, "\nNo outbound links!")); - Stream handlerStream = linkable.getHandlers().stream(); + Stream handlerStream = linkable.getLinks().stream(); if (!(linkable instanceof IController)) handlerStream = handlerStream.sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); handlerStream.forEach(handler -> { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 5254c3b..26d2413 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -179,7 +179,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (!parse.flags.containsKey("region") || parse.flags.containsKey("handler")) { if (flag) output.append(Text.NEW_LINE); - regionList.forEach(region -> region.getHandlers().stream() + regionList.forEach(region -> region.getLinks().stream() .filter(handler -> !handlerList.contains(handler)) .forEach(handlerList::add)); output.append(Text.of(TextColors.GREEN, "------- Handlers Located Here -------\n")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index 9bcc653..3cfd5e4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -118,7 +118,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); IHandler handler = handlerOpt.get(); - if (region.getHandlers().contains(handler)) + if (region.getLinks().contains(handler)) throw new CommandException(Text.of("Already linked!")); boolean success = FGManager.getInstance().link(region, handler); if (success) { @@ -182,7 +182,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null if (region != null) { IRegion finalRegion = region; return FGManager.getInstance().getHandlers().stream() - .filter(handler -> !finalRegion.getHandlers().contains(handler) && !(handler instanceof IGlobal)) + .filter(handler -> !finalRegion.getLinks().contains(handler) && !(handler instanceof IGlobal)) .map(IFGObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink2.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink2.java index da8046b..3bf5a72 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink2.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink2.java @@ -66,9 +66,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int[] successes = {0}; set.forEach(entry -> { if (link) { - if (entry.linkable.addHandler(entry.handler)) successes[0]++; + if (entry.linkable.addLink(entry.handler)) successes[0]++; } else { - if (entry.linkable.removeHandler(entry.handler)) successes[0]++; + if (entry.linkable.removeLink(entry.handler)) successes[0]++; } }); if (successes[0] > 0) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java index cbe8d7c..49c91f1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java @@ -31,6 +31,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; @@ -72,6 +73,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGStorageManager.getInstance().saveRegions(force); Sponge.getServer().getWorlds().forEach(world -> FGStorageManager.getInstance().saveWorldRegions(world, force)); FGStorageManager.getInstance().saveHandlers(force); + FGStorageManagerNew.getInstance().saveHandlerIndex(); source.sendMessage(Text.of(TextColors.GREEN, "Successfully saved!")); return CommandResult.success(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandUnlink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandUnlink.java index 8afe867..f2f59b0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandUnlink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandUnlink.java @@ -81,7 +81,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.getSelectedRegions(source).forEach( region -> { List handlers = new ArrayList<>(); - region.getHandlers().stream() + region.getLinks().stream() .filter(handler -> !(handler instanceof GlobalHandler)) .forEach(handlers::add); handlers.forEach(handler -> count[0] += FGManager.getInstance().unlink(region, handler) ? 1 : 0); @@ -98,7 +98,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGManager.getInstance().getAllRegions().forEach( region -> { List handlers = new ArrayList<>(); - region.getHandlers().stream() + region.getLinks().stream() .filter(handler -> !(handler instanceof GlobalHandler)) .forEach(handlers::add); handlers.stream().forEach(handler -> count[0] += FGManager.getInstance().unlink(region, handler) ? 1 : 0); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index c93715e..e0217c3 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -49,29 +49,29 @@ public ControllerBase(String name, boolean isEnabled, int priority) { } @Override - public List getHandlers() { + public List getLinks() { return ImmutableList.copyOf(this.handlers); } @Override - public boolean addHandler(IHandler handler) { + public boolean addLink(IHandler handler) { if (!FGManager.getInstance().isRegistered(handler)) return false; int maxLinks = this.maxLinks(); return !(maxLinks >= 0 && this.handlers.size() >= maxLinks) && this.handlers.add(handler); } @Override - public boolean removeHandler(IHandler handler) { + public boolean removeLink(IHandler handler) { return this.handlers.remove(handler); } @Override - public void clearHandlers() { + public void clearLinks() { this.handlers.clear(); } @Override - public void loadLinks(Path directory) { + public void loadLinks(Path directory, List savedList) { try (DB linksDB = FGStorageManager.openFoxDB(directory.resolve("links.foxdb"))) { List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); handlers.clear(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java index 370dde3..37d1da8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java @@ -29,10 +29,11 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import java.nio.file.Path; +import java.util.List; public interface IController extends IHandler, ILinkable { - void loadLinks(Path directory); + void loadLinks(Path directory, List savedList); /** * Method to get the maximum number of links the controller allows in a given configuration. @@ -49,4 +50,8 @@ default boolean canLinkToItself() { return false; } + @Override + default boolean saveLinks(){ + return false; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java index 1fe4eba..126db5f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java @@ -92,7 +92,7 @@ public void save(Path directory) { } @Override - public void loadLinks(Path directory) { + public void loadLinks(Path directory, List savedList) { } @@ -103,23 +103,23 @@ public int maxLinks() { @Override - public boolean addHandler(IHandler handler) { + public boolean addLink(IHandler handler) { if (this.handlers.size() < 1) { slot = new HandlerWrapper(handler); - return super.addHandler(handler); + return super.addLink(handler); } else return false; } @Override - public boolean removeHandler(IHandler handler) { + public boolean removeLink(IHandler handler) { if (slot != null && slot.handler == handler) slot = HandlerWrapper.PASSTHROUGH; - return super.removeHandler(handler); + return super.removeLink(handler); } @Override - public void clearHandlers() { + public void clearLinks() { slot = HandlerWrapper.PASSTHROUGH; - super.clearHandlers(); + super.clearLinks(); } public IHandler getHandler() { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index 513a1a1..ecf1064 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -105,7 +105,7 @@ public void handle(ChangeBlockEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } else { @@ -113,7 +113,7 @@ public void handle(ChangeBlockEvent event) throws Exception { transactions.stream() .map(trans -> trans.getOriginal().getLocation().get()) .collect(Collectors.toList()) - ).forEach(region -> region.getHandlers().stream() + ).forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index ecf238f..ab5a181 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -99,7 +99,7 @@ public void handle(DamageEntityEvent event) throws Exception { Set handlerSet = new HashSet<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); Tristate flagState = UNDEFINED; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index beaa1f4..7a8b439 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -92,7 +92,7 @@ public void handle(ExplosionEvent event) throws Exception { postEvent.getTransactions().stream() .map(trans -> trans.getOriginal().getLocation().get()) .collect(Collectors.toList()) - ).forEach(region -> region.getHandlers().stream() + ).forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } else if (event instanceof ExplosionEvent.Detonate) { @@ -104,7 +104,7 @@ public void handle(ExplosionEvent event) throws Exception { if (locations.isEmpty()) return; FGManager.getInstance().getRegionsAtMultiLocI(locations) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); @@ -115,7 +115,7 @@ public void handle(ExplosionEvent event) throws Exception { World world = loc.getExtent(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java index 2bc3095..b3c124f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java @@ -85,7 +85,7 @@ public void handle(InteractBlockEvent event) throws Exception { List handlerList = new ArrayList<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .filter(handler -> !handlerList.contains(handler)) .forEach(handlerList::add)); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index 75cf7c5..aaeb31a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -110,7 +110,7 @@ public void handle(InteractEntityEvent event) throws Exception { List handlerList = new ArrayList<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .filter(handler -> !handlerList.contains(handler)) .forEach(handlerList::add)); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index da33471..5220c2c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -132,7 +132,7 @@ public void handle(MoveEntityEvent event) throws Exception { Vector3d from = event.getFromTransform().getPosition().add(0, 0.1, 0); FGManager.getInstance().getRegionsInChunkAtPos(world, from).stream() .filter(region -> region.contains(from, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .filter(handler -> !temp.contains(handler)) .forEach(temp::add)); @@ -143,7 +143,7 @@ public void handle(MoveEntityEvent event) throws Exception { .filter(region -> region.contains(to, world)) .forEach(region -> { if (regionHUD) regionList.add(region); - region.getHandlers().stream() + region.getLinks().stream() .filter(IFGObject::isEnabled) .filter(handler -> !toList.contains(handler)) .forEach(toList::add); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index 05c99b2..c9182be 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -126,7 +126,7 @@ public void handle(MoveEntityEvent event) throws Exception { Set fromHandlers, toHandlers = new HashSet<>(), finalHandlers; fromRegions = manager.getRegionsAtPos(world, from); - fromHandlers = fromRegions.stream().flatMap(region -> region.getHandlers().stream()).collect(Collectors.toSet()); + fromHandlers = fromRegions.stream().flatMap(region -> region.getLinks().stream()).collect(Collectors.toSet()); manager.getRegionsInChunkAtPos(world, to).stream() .filter(region -> region.contains(to, world)) @@ -134,7 +134,7 @@ public void handle(MoveEntityEvent event) throws Exception { finalRegions.add(region); if (!fromRegions.remove(region)) toRegions.add(region); }); - finalHandlers = finalRegions.stream().flatMap(region -> region.getHandlers().stream()).collect(Collectors.toSet()); + finalHandlers = finalRegions.stream().flatMap(region -> region.getLinks().stream()).collect(Collectors.toSet()); finalHandlers.forEach(handler -> { if (!fromHandlers.remove(handler)) toHandlers.add(handler); }); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index 6ea38bc..451ef67 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -114,7 +114,7 @@ public void handle(SpawnEntityEvent event) throws Exception { World world = loc.getExtent(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) - .forEach(region -> region.getHandlers().stream() + .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) .forEach(handlerSet::add)); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index a8e8951..27281ea 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -25,6 +25,8 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; + import javax.annotation.Nullable; import java.util.UUID; @@ -36,7 +38,7 @@ public abstract class FGObjectBase implements IFGObject { public FGObjectBase(String name, @Nullable UUID owner, boolean isEnabled) { this.name = name; - this.owner = owner; + this.owner = owner == null ? FGManager.SERVER_UUID : owner; this.isEnabled = isEnabled; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ILinkable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ILinkable.java index e405d9a..9d85af9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ILinkable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ILinkable.java @@ -31,12 +31,13 @@ public interface ILinkable { - Collection getHandlers(); + Collection getLinks(); - boolean addHandler(IHandler handler); + boolean addLink(IHandler handler); - boolean removeHandler(IHandler handler); + boolean removeLink(IHandler handler); - void clearHandlers(); + void clearLinks(); + boolean saveLinks(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java index a5652b0..5bf854f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java @@ -34,6 +34,7 @@ */ public interface IRegion extends IFGObject, ILinkable, IBounded { + @Override default boolean saveLinks() { return true; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index d77392e..ce68b24 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -52,22 +52,22 @@ public void setIsEnabled(boolean state) { } @Override - public List getHandlers() { + public List getLinks() { return ImmutableList.copyOf(this.handlers); } @Override - public boolean addHandler(IHandler handler) { + public boolean addLink(IHandler handler) { return FGManager.getInstance().isRegistered(handler) && this.handlers.add(handler); } @Override - public boolean removeHandler(IHandler handler) { + public boolean removeLink(IHandler handler) { return this.handlers.remove(handler); } @Override - public void clearHandlers() { + public void clearLinks() { this.handlers.clear(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java new file mode 100644 index 0000000..cd35c66 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java @@ -0,0 +1,64 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * Created by Fox on 7/9/2017. + * Project: SpongeForge + */ +public class FGObjectIndex extends FGObjectMeta { + + boolean enabled; + UUID owner; + List links; + + public FGObjectIndex(String name, String category, String type, boolean enabled, UUID owner, List links) { + super(name, category, type); + this.enabled = enabled; + this.owner = owner; + this.links = links; + } + + public FGObjectIndex() { + } + + public FGObjectIndex(IFGObject object) { + super(object); + this.enabled = object.isEnabled(); + this.owner = object.getOwner(); + if (object instanceof ILinkable && ((ILinkable) object).saveLinks()) { + this.links = ((ILinkable) object).getLinks().stream().map(IHandler::getName).collect(Collectors.toList()); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java new file mode 100644 index 0000000..c897fe6 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java @@ -0,0 +1,60 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; + +/** + * Created by Fox on 7/9/2017. + * Project: SpongeForge + */ +public class FGObjectMeta { + + String name; + String category; + String type; + + transient IFGObject object; + + public FGObjectMeta(String name, String category, String type) { + this.name = name; + this.category = category; + this.type = type; + } + + public FGObjectMeta() { + } + + public FGObjectMeta(IFGObject object) { + this( + object.getName(), + FGUtil.getCategory(object), + object.getUniqueTypeString() + ); + this.object = object; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java new file mode 100644 index 0000000..c1bc71e --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -0,0 +1,326 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; +import net.foxdenstudio.sponge.foxguard.plugin.FGConfigManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; +import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import org.slf4j.Logger; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.service.user.UserStorageService; +import org.spongepowered.api.world.World; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; +import java.util.stream.Collectors; + +import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; + +/** + * Created by Fox on 7/8/2017. + * Project: SpongeForge + */ +public class FGStorageManagerNew { + + public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", + "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", + "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; + public static final Charset CHARSET = StandardCharsets.UTF_8; + public static final Gson GSON = new Gson(); + private static FGStorageManagerNew instance; + public final HashMap defaultModifiedMap; + private final UserStorageService userStorageService; + private final Logger logger = FoxGuardMain.instance().getLogger(); + private final FGManager manager = FGManager.getInstance(); + private final Path foxguardDirectory = getFoxguardDirectory(); + private final Map worldDirectories; + + private boolean handlersLoaded = false; + + private FGStorageManagerNew() { + userStorageService = FoxGuardMain.instance().getUserStorage(); + defaultModifiedMap = new CacheMap<>((k, m) -> { + if (k instanceof IFGObject) { + m.put((IFGObject) k, true); + return true; + } else return null; + }); + worldDirectories = new CacheMap<>((k, m) -> { + if (k instanceof World) { + Path dir = getWorldDirectory((World) k); + m.put((World) k, dir); + return dir; + } else return null; + }); + } + + public static FGStorageManagerNew getInstance() { + if (instance == null) instance = new FGStorageManagerNew(); + return instance; + } + + public void saveHandlerIndex() { + logger.info("Saving handler index"); + Path file = foxguardDirectory.resolve(FGTypes.HANDLER.getIndexFile()); + Set handlers = manager.getHandlers(); + saveIndex(handlers, file); + } + + public void saveRegionIndex() { + logger.info("Saving region index"); + Path file = foxguardDirectory.resolve(FGTypes.REGION.getIndexFile()); + Set regions = manager.getRegions(); + saveIndex(regions, file); + } + + public void saveWorldRegionIndex(World world) { + logger.info("Saving worldregion index"); + Path file = worldDirectories.get(world).resolve(FGTypes.WORLDREGION.getIndexFile()); + Set worldRegions = manager.getWorldRegions(world); + saveIndex(worldRegions, file); + } + + private void saveIndex(Set objects, Path file) { + List indexList = objects.stream().map(FGObjectIndex::new).collect(Collectors.toList()); + try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(file, CHARSET))) { + jsonWriter.setIndent(" "); + GSON.toJson(indexList, List.class, jsonWriter); + } catch (IOException e) { + logger.error("Failed to open index for writing: " + file, e); + } + } + + public void saveObjects(Set objects, boolean force) { + objects.forEach(object -> { + String name = object.getName(); + UUID owner = object.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = userStorageService.get(owner); + String logName = (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + name; + if (object.autoSave()) { + Path directory = getObjectDirectory(object); + + } else { + logger.info("Region " + logName + " does not need saving. Skipping..."); + } + }); + } + + + public void constructDirectory(Path directory) { + if (Files.exists(directory)) { + if (Files.isDirectory(directory)) return; + else { + logger.warn("There is a file at " + directory + " where a directory was expected. Deleting and replacing with a directory..."); + try { + Files.delete(directory); + } catch (IOException e) { + logger.error("Error deleting the file: " + directory, e); + return; + } + } + } + + try { + int counter = 1; + float time = 0.25f; + while (true) { + try { + Files.createDirectories(directory); + break; + } catch (AccessDeniedException e) { + if (counter > 5) throw e; + else { + logger.error("Unable to create directory: " + directory + " Trying again in " + time + " second(s)", e); + try { + Thread.sleep((long) (1000 * time)); + } catch (InterruptedException e1) { + logger.warn("Thread sleep was interrupted: ", e); + } + } + } + counter++; + time *= 2; + } + logger.info("Created directory: " + directory); + } catch (IOException e) { + logger.error("There was an error creating the directory: " + directory, e); + } + } + + private Path getFoxguardDirectory() { + Path path = Sponge.getGame().getSavesDirectory(); + if (FGConfigManager.getInstance().saveInWorldFolder()) { + path = path.resolve(Sponge.getServer().getDefaultWorldName()); + } else if (FGConfigManager.getInstance().useConfigFolder()) { + path = FoxGuardMain.instance().getConfigDirectory(); + } + path = path.resolve("foxguard"); + constructDirectory(path); + return path; + } + + private Path getWorldDirectory(World world) { + Path path = Sponge.getGame().getSavesDirectory(); + if (FGConfigManager.getInstance().saveWorldRegionsInWorldFolders()) { + path = world.getDirectory(); + path = path.resolve("foxguard"); + } else { + if (FGConfigManager.getInstance().useConfigFolder()) { + path = FoxGuardMain.instance().getConfigDirectory(); + } + path = path.resolve("foxguard").resolve("worlds").resolve(world.getName()); + } + constructDirectory(path); + return path; + } + + private void deleteDirectory(Path directory) { + deleteDirectory(directory, false); + } + + private void deleteDirectory(Path directory, boolean innerOnly) { + FoxGuardMain.instance().getLogger().info("Deleting directory: " + directory); + if (Files.exists(directory) && Files.isDirectory(directory)) + try { + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + try { + Files.delete(file); + logger.info("Deleted file: " + file); + } catch (IOException e) { + logger.error("There was an error deleting the file: " + file, e); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + if (exc == null && !(innerOnly && Files.isSameFile(dir, directory))) { + try { + Files.delete(dir); + logger.info("Deleted directory: " + dir); + } catch (IOException e) { + logger.error("There was an error deleting the directory: " + dir, e); + } + } + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + logger.error("There was an error while trying to recursively delete the directory: " + directory, e); + } + else if (Files.exists(directory)) { + logger.warn(directory + "is a file. A directory was expected. Deleting..."); + try { + Files.delete(directory); + } catch (IOException e) { + logger.error("There was an error deleting the file: " + directory, e); + } + } + } + + private boolean isEmptyDirectory(Path directory) { + if (Files.notExists(directory)) return true; + if (!Files.isDirectory(directory)) return false; + try { + DirectoryStream stream = Files.newDirectoryStream(directory); + return !stream.iterator().hasNext(); + } catch (IOException e) { + logger.error("Could not read contents of directory: " + directory, e); + return false; + } + } + + private Path getObjectDirectory(IFGObject object) { + Path dir; + if(object instanceof IWorldBound){ + dir = worldDirectories.get(((IWorldBound) object).getWorld()); + } else { + dir = foxguardDirectory; + } + FGTypes type = getObjectType(object); + dir.resolve(type.fileName); + + UUID owner = object.getOwner(); + if (!owner.equals(SERVER_UUID)) { + dir.resolve("users").resolve(owner.toString()); + } + dir.resolve(object.getName().toLowerCase()); + constructDirectory(dir); + return dir; + } + + private FGTypes getObjectType(IFGObject object){ + if(object instanceof IRegion){ + if(object instanceof IWorldRegion){ + return FGTypes.WORLDREGION; + } + return FGTypes.REGION; + } else if (object instanceof IHandler){ + if(object instanceof IController){ + return FGTypes.CONTROLLER; + } + return FGTypes.HANDLER; + } + return FGTypes.OBJECT; + } + + private enum FGTypes { + REGION("Region", "regions"), + WORLDREGION("World region", "wregions"), + HANDLER("Handler", "handlers"), + CONTROLLER("Controller", "handlers"), + OBJECT("Object", "objects"); + + String nameUppercase; + String fileName; + + FGTypes(String nameUppercase, String directoryName) { + this.nameUppercase = nameUppercase; + this.fileName = directoryName; + } + + public String getIndexFile(){ + return fileName + ".foxcf"; + } + } +} From 378ee1fa8b433b96ac263eece08decd21eecc1fa Mon Sep 17 00:00:00 2001 From: gravityfox Date: Thu, 27 Jul 2017 22:16:00 -0700 Subject: [PATCH 09/30] I honestly have no idea what i did but a lot of things got renamed or something. --- build.gradle | 1 + .../foxguard/plugin/FGStorageManager.java | 11 ++-- .../plugin/command/CommandEnableDisable.java | 6 +- .../plugin/controller/ControllerBase.java | 5 +- .../plugin/controller/LogicController.java | 17 ++--- .../controller/message/MessageController.java | 9 +-- .../foxguard/plugin/handler/BasicHandler.java | 23 ++++--- .../foxguard/plugin/handler/DebugHandler.java | 16 ++--- .../plugin/handler/EconomyHandler.java | 8 +-- .../plugin/handler/GlobalHandler.java | 8 ++- .../foxguard/plugin/handler/GroupHandler.java | 24 ++++--- .../foxguard/plugin/handler/HandlerBase.java | 8 +-- .../foxguard/plugin/handler/HandlerData.java | 59 +++++++++++++++++ .../plugin/handler/PermissionHandler.java | 16 ++--- .../plugin/handler/StaticHandler.java | 19 +++--- .../plugin/handler/WelcomeHandler.java | 13 ++-- .../foxguard/plugin/object/FGObjectBase.java | 19 +++--- .../foxguard/plugin/object/FGObjectData.java | 64 +++++++++++++++++++ .../foxguard/plugin/object/IFGObject.java | 2 +- .../object/factory/FGFactoryManager.java | 22 ++++--- .../object/factory/IControllerFactory.java | 5 +- .../plugin/object/factory/IFGFactory.java | 3 + .../object/factory/IHandlerFactory.java | 6 +- .../plugin/object/factory/IRegionFactory.java | 4 +- .../object/factory/IWorldRegionFactory.java | 5 +- .../foxguard/plugin/region/GlobalRegion.java | 11 +++- .../foxguard/plugin/region/RegionBase.java | 9 +-- .../plugin/region/world/CuboidRegion.java | 16 ++--- .../plugin/region/world/ElevationRegion.java | 15 +++-- .../plugin/region/world/EllipticalRegion.java | 5 +- .../region/world/GlobalWorldRegion.java | 11 +++- .../region/world/RectangularRegion.java | 15 +++-- .../plugin/region/world/WorldRegionBase.java | 7 +- ...FGObjectIndex.java => FGSObjectIndex.java} | 13 ++-- .../{FGObjectMeta.java => FGSObjectMeta.java} | 8 +-- .../plugin/storage/FGStorageManagerNew.java | 2 +- .../foxguard/plugin/util/RegionCache.java | 8 +-- 37 files changed, 337 insertions(+), 156 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/{FGObjectIndex.java => FGSObjectIndex.java} (83%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/{FGObjectMeta.java => FGSObjectMeta.java} (91%) diff --git a/build.gradle b/build.gradle index a3913cb..8e06945 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ buildscript { apply plugin: 'org.spongepowered.plugin' apply plugin: 'net.minecraftforge.gradle.forge' +apply plugin: 'idea' group 'net.foxdenstudio.sponge' version 'api6-SNAPSHOT' diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java index 3314fc1..9dee517 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java @@ -28,7 +28,9 @@ import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; @@ -695,7 +697,7 @@ public synchronized void loadRegions() { IRegion object = null; try { if (category.equalsIgnoreCase("region")) - object = FGFactoryManager.getInstance().createRegion(singleDir, name, type, enabled); + object = FGFactoryManager.getInstance().createRegion(singleDir,type, new FGObjectData().setName(name).setEnabled(enabled)); else logger.warn("Category \"" + category + "\" is invalid!"); } catch (Exception e) { logger.error("There was an error creating the region!", e); @@ -786,7 +788,7 @@ public synchronized void loadWorldRegions(World world) { IWorldRegion object = null; try { if (category.equalsIgnoreCase("worldregion")) - object = FGFactoryManager.getInstance().createWorldRegion(singleDir, name, type, enabled); + object = FGFactoryManager.getInstance().createWorldRegion(singleDir, type, new FGObjectData().setName(name).setEnabled(enabled)); else logger.warn("Category \"" + category + "\" is invalid!"); } catch (Exception e) { logger.error("There was an error creating the world region!", e); @@ -871,10 +873,11 @@ public synchronized void loadHandlers() { if (type == null) type = ""; IHandler object = null; try { + final HandlerData data = new HandlerData().setName(name).setEnabled(enabled).setPriority(priority); if (category.equalsIgnoreCase("handler")) - object = FGFactoryManager.getInstance().createHandler(singleDir, name, type, enabled, priority); + object = FGFactoryManager.getInstance().createHandler(singleDir, type, data); else if (category.equalsIgnoreCase("controller")) - object = FGFactoryManager.getInstance().createController(singleDir, name, type, enabled, priority); + object = FGFactoryManager.getInstance().createController(singleDir, type, data); else logger.warn("Category \"" + category + "\" is invalid!"); } catch (Exception e) { logger.error("There was an error creating the handler!", e); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 3ed937d..72e0427 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -105,7 +105,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (object instanceof GlobalWorldRegion || object instanceof GlobalHandler || object.isEnabled() == this.enableState) failures++; else { - object.setIsEnabled(this.enableState); + object.setEnabled(this.enableState); successes++; } } @@ -153,7 +153,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm for (IRegion region : regions) { if (region instanceof IGlobal || region.isEnabled() == this.enableState) failures++; else { - region.setIsEnabled(this.enableState); + region.setEnabled(this.enableState); successes++; } } @@ -190,7 +190,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm for (IHandler handler : handlers) { if (handler instanceof IGlobal || handler.isEnabled() == this.enableState) failures++; else { - handler.setIsEnabled(this.enableState); + handler.setEnabled(this.enableState); successes++; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index e0217c3..fda473e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -29,6 +29,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerBase; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import org.mapdb.DB; @@ -43,8 +44,8 @@ public abstract class ControllerBase extends HandlerBase implements IController protected final List handlers; - public ControllerBase(String name, boolean isEnabled, int priority) { - super(name, priority, isEnabled); + public ControllerBase(HandlerData data) { + super(data); this.handlers = new ArrayList<>(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java index 837f830..3abd1ea 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java @@ -30,6 +30,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IControllerFactory; @@ -77,12 +78,12 @@ public class LogicController extends ControllerBase { private Tristate mode = UNDEFINED; private boolean shortCircuit = false; - public LogicController(String name, int priority) { - super(name, true, priority); + public LogicController(String name) { + super(new HandlerData().setName(name)); } - public LogicController(String name, boolean isEnabled, int priority, Operator operator, Tristate mode, boolean shortCircuit) { - super(name, isEnabled, priority); + public LogicController(HandlerData data, Operator operator, Tristate mode, boolean shortCircuit) { + super(data); this.operator = operator; this.mode = mode; this.shortCircuit = shortCircuit; @@ -388,8 +389,8 @@ public static final class Factory implements IControllerFactory { public static final String[] LOGIC_ALIASES = {"logic", "logical"}; @Override - public IController create(String name, int priority, String arguments, CommandSource source) throws CommandException { - return new LogicController(name, priority); + public IController create(String name, String arguments, CommandSource source) throws CommandException { + return new LogicController(name); } @Override @@ -398,7 +399,7 @@ public List createSuggestions(CommandSource source, String arguments, St } @Override - public IController create(Path directory, String name, int priority, boolean isEnabled) { + public IController create(Path directory, HandlerData data) { Path configFile = directory.resolve("settings.cfg"); CommentedConfigurationNode root; ConfigurationLoader loader = @@ -420,7 +421,7 @@ public IController create(Path directory, String name, int priority, boolean isE else if (isIn(FALSE_ALIASES, modeName)) mode = FALSE; else mode = UNDEFINED; boolean shortCircuit = root.getNode("shortCircuit").getBoolean(false); - return new LogicController(name, isEnabled, priority, operator, mode, shortCircuit); + return new LogicController(data, operator, mode, shortCircuit); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java index 126db5f..76bc5d5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java @@ -31,6 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.controller.ControllerBase; import net.foxdenstudio.sponge.foxguard.plugin.controller.util.HandlerWrapper; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; @@ -54,8 +55,8 @@ public class MessageController extends ControllerBase { private Map messages; - public MessageController(String name, boolean isEnabled, int priority) { - super(name, isEnabled, priority); + public MessageController(HandlerData data) { + super(data); slot = HandlerWrapper.PASSTHROUGH; messages = new HashMap<>(); } @@ -176,12 +177,12 @@ public static class Factory implements IHandlerFactory { private static final String[] messageAliases = {"message", "mess", "msg"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) { + public IHandler create(String name, String arguments, CommandSource source) { return null; } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { return null; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 7b3abbb..3bb7664 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -107,20 +107,27 @@ public class BasicHandler extends HandlerBase { private Group passiveGroup; private Map passiveGroupCacheRef; - public BasicHandler(String name, int priority) { - this(name, true, priority, + public BasicHandler(String name){ + this(new HandlerData() + .setName(name) + .setEnabled(true) + .setPriority(0)); + } + + public BasicHandler(HandlerData data) { + this(data, new ArrayList<>(), new HashMap<>(), new Group("default", EverythingSet.get(), TextColors.RED, "Default"), new ArrayList<>()); } - public BasicHandler(String name, boolean isEnabled, int priority, + public BasicHandler(HandlerData data, List groups, Map> groupPermissions, Group defaultGroup, List defaultPermissions) { - super(name, priority, isEnabled); + super(data); this.groups = groups; this.defaultGroup = defaultGroup; @@ -1567,9 +1574,9 @@ public static class Factory implements IHandlerFactory { private static final String[] ALIASES = {"basic", "base"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).parse(); - BasicHandler handler = new BasicHandler(name, priority); + BasicHandler handler = new BasicHandler(name); if (parse.args.length > 0) { if (parse.args[0].equalsIgnoreCase("bare")) { return handler; @@ -1652,7 +1659,7 @@ public IHandler create(String name, int priority, String arguments, CommandSourc } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { FGStorageManager storageManager = FGStorageManager.getInstance(); List groupNames = new ArrayList<>(); try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { @@ -1707,7 +1714,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab String defaultDisplayName = defaultNode.getNode("displayname").getString("Default"); TextColor defaultColor = Sponge.getRegistry().getType(TextColor.class, defaultNode.getNode("color").getString("red")).orElse(TextColors.RED); - BasicHandler handler = new BasicHandler(name, isEnabled, priority, + BasicHandler handler = new BasicHandler(data, groups, groupPermissions, new Group("default", EverythingSet.get(), defaultColor, defaultDisplayName), diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java index ff8787e..32133ae 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/DebugHandler.java @@ -72,12 +72,12 @@ public class DebugHandler extends HandlerBase { public boolean console; private TextColor color = TextColors.WHITE; - public DebugHandler(String name, int priority) { - this(name, true, priority, new HashSet<>(), false, TextColors.WHITE); + public DebugHandler(HandlerData data) { + this(data, new HashSet<>(), false, TextColors.WHITE); } - public DebugHandler(String name, boolean isEnabled, int priority, Set members, boolean console, TextColor color) { - super(name, priority, isEnabled); + public DebugHandler(HandlerData data, Set members, boolean console, TextColor color) { + super(data); this.members = members; this.console = console; this.color = color; @@ -391,15 +391,15 @@ public static class Factory implements IHandlerFactory { private static final String[] ALIASES = {"debug", "debugger", "info"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { - DebugHandler handler = new DebugHandler(name, priority); + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { + DebugHandler handler = new DebugHandler(new HandlerData().setName(name)); if (source instanceof Player) handler.members.add(((Player) source).getUniqueId()); else if (source instanceof ConsoleSource) handler.console = true; return handler; } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); Path configFile = directory.resolve("config.cfg"); ConfigurationLoader loader = @@ -417,7 +417,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab .collect(Collectors.toSet()); boolean console = root.getNode("console").getBoolean(false); TextColor color = Sponge.getRegistry().getType(TextColor.class, root.getNode("color").getString("white")).orElse(TextColors.WHITE); - return new DebugHandler(name, isEnabled, priority, members, console, color); + return new DebugHandler(data, members, console, color); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/EconomyHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/EconomyHandler.java index fb84317..c2035e1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/EconomyHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/EconomyHandler.java @@ -47,8 +47,8 @@ public class EconomyHandler extends HandlerBase { - public EconomyHandler(String name, boolean isEnabled, int priority) { - super(name, priority, isEnabled); + public EconomyHandler(HandlerData data) { + super(data); } @Override @@ -99,12 +99,12 @@ public List modifySuggestions(CommandSource source, String arguments, @N public static class Factory implements IHandlerFactory { @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { return null; } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { return null; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GlobalHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GlobalHandler.java index f48b56e..774a4d2 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GlobalHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GlobalHandler.java @@ -31,8 +31,10 @@ public class GlobalHandler extends StaticHandler implements IGlobal { public static final String NAME = "_global"; + private static final HandlerData DATA = new HandlerData().setName(NAME).setPriority(Integer.MIN_VALUE / 2).setEnabled(true); + public GlobalHandler() { - super(NAME, Integer.MIN_VALUE / 2, true); + super(DATA); } @Override @@ -67,8 +69,8 @@ public boolean isEnabled() { } @Override - public void setIsEnabled(boolean state) { - this.isEnabled = true; + public void setEnabled(boolean state) { + this.enabled = true; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 2041f6e..285ab69 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -64,6 +64,7 @@ import javax.annotation.Nullable; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -99,20 +100,20 @@ public class GroupHandler extends HandlerBase { private final Map defaultPermCache; private final Map, Map> groupSetPermCache; - public GroupHandler(String name, int priority) { - this(name, true, priority, + public GroupHandler(HandlerData data) { + this(data, new ArrayList<>(), new HashMap<>(), new Group("default", "", TextColors.RED, "Default"), new ArrayList<>()); } - public GroupHandler(String name, boolean isEnabled, int priority, + public GroupHandler(HandlerData data, List groups, Map> groupPermissions, Group defaultGroup, List defaultPermissions) { - super(name, priority, isEnabled); + super(data); this.groups = groups; this.defaultGroup = defaultGroup; @@ -1228,9 +1229,9 @@ public static class Factory implements IHandlerFactory { private static final String[] ALIASES = {"group", "permgroup"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).parse(); - GroupHandler handler = new GroupHandler(name, priority); + GroupHandler handler = new GroupHandler(new HandlerData().setName(name)); if (parse.args.length < 1 || !parse.args[0].equalsIgnoreCase("bare")) { Group members = handler.createGroup("members").get(); members.displayName = "Members"; @@ -1240,7 +1241,14 @@ public IHandler create(String name, int priority, String arguments, CommandSourc } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { + if(Files.exists(directory.resolve("groups.foxdb")) || Files.exists(directory.resolve("flags.foxdb"))){ + return createOld(directory, data); + } + return null; + } + + public IHandler createOld(Path directory, HandlerData data) { List groupNames = new ArrayList<>(); try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); @@ -1275,7 +1283,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab defaultPermissions = stringEntries.stream().map(TristateEntry::deserialize).collect(Collectors.toList()); } - return new GroupHandler(name, isEnabled, priority, + return new GroupHandler(data, groups, groupPermissions, new Group("default", "", defaultColor, defaultDisplayName), diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index 118636a..225f0e8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -32,9 +32,9 @@ public abstract class HandlerBase extends FGObjectBase implements IHandler { int priority; - public HandlerBase(String name, int priority, boolean isEnabled) { - super(name, null, isEnabled); - setPriority(priority); + public HandlerBase(HandlerData data) { + super(data); + setPriority(data.getPriority()); } @Override @@ -62,7 +62,7 @@ public void markDirty() { public String toString() { return this.getClass().getSimpleName() + "{" + "name='" + name + '\'' + - ", isEnabled=" + isEnabled + + ", enabled=" + enabled + ", priority=" + priority + '}'; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java new file mode 100644 index 0000000..37c75f1 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java @@ -0,0 +1,59 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.handler; + +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; + +import java.util.UUID; + +public class HandlerData extends FGObjectData { + + protected int priority = 0; + + public int getPriority() { + return priority; + } + + public HandlerData setPriority(int priority) { + this.priority = priority; + return this; + } + + @Override + public HandlerData setName(String name) { + return (HandlerData) super.setName(name); + } + + @Override + public HandlerData setOwner(UUID owner) { + return (HandlerData) super.setOwner(owner); + } + + @Override + public HandlerData setEnabled(boolean enabled) { + return (HandlerData) super.setEnabled(enabled); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java index 1b9ea76..b8310b0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java @@ -70,13 +70,13 @@ public class PermissionHandler extends HandlerBase { private final Map> permCache; private String defaultPermission; - public PermissionHandler(String name, int priority, boolean isEnabled) { - this(name, priority, isEnabled, + public PermissionHandler(HandlerData data) { + this(data, new ArrayList<>(), ""); } - public PermissionHandler(String name, int priority, boolean isEnabled, List entries, String defaultPermission) { - super(name, priority, isEnabled); + public PermissionHandler(HandlerData data, List entries, String defaultPermission) { + super(data); this.entries = entries; this.defaultPermission = defaultPermission; this.permCache = new CacheMap<>((k, m) -> { @@ -674,12 +674,12 @@ public static class Factory implements IHandlerFactory { public static final String[] ALIASES = {"perm", "perms", "permission", "permissions"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { - return new PermissionHandler(name, priority, true); + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { + return new PermissionHandler(new HandlerData().setName(name)); } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { Path permissionsFile = directory.resolve("permissions.cfg"); ConfigurationLoader loader = HoconConfigurationLoader.builder().setPath(permissionsFile).build(); @@ -695,7 +695,7 @@ public IHandler create(Path directory, String name, int priority, boolean isEnab .map(PermissionEntry::deserialize) .collect(Collectors.toList()); String defaultPermission = root.getNode("default").getString(""); - return new PermissionHandler(name, priority, isEnabled, entries, defaultPermission); + return new PermissionHandler(data, entries, defaultPermission); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java index 72c88b7..544ff11 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java @@ -78,12 +78,15 @@ public class StaticHandler extends HandlerBase { private final List entries; private final Map permCache; - public StaticHandler(String name, int priority) { - this(name, priority, true); + public StaticHandler(String name) { + this(new HandlerData() + .setName(name) + .setEnabled(true) + .setPriority(0)); } - public StaticHandler(String name, int priority, boolean isEnabled) { - super(name, priority, isEnabled); + public StaticHandler(HandlerData data) { + super(data); this.entries = new ArrayList<>(); this.permCache = new CacheMap<>((k, m) -> { if (k instanceof FlagBitSet) { @@ -613,13 +616,13 @@ public static class Factory implements IHandlerFactory { public static final String[] ALIASES = {"static", "stub", "blind"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { - return new StaticHandler(name, priority); + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { + return new StaticHandler(name); } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { - StaticHandler handler = new StaticHandler(name, priority, isEnabled); + public IHandler create(Path directory, HandlerData data) { + StaticHandler handler = new StaticHandler(data); handler.load(directory); return handler; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java index a283ef9..660096a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java @@ -70,12 +70,9 @@ public class WelcomeHandler extends HandlerBase { private TextTemplate enterTemplate = TextTemplate.EMPTY; private TextTemplate exitTemplate = TextTemplate.EMPTY; - public WelcomeHandler(String name, int priority) { - this(name, true, priority); - } - public WelcomeHandler(String name, boolean isEnabled, int priority) { - super(name, priority, isEnabled); + public WelcomeHandler(HandlerData data) { + super(data); } @Override @@ -201,12 +198,12 @@ public static class Factory implements IHandlerFactory { private static final String[] ALIASES = {"welcome"}; @Override - public IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException { - return new WelcomeHandler(name, priority); + public IHandler create(String name, String arguments, CommandSource source) throws CommandException { + return new WelcomeHandler(new HandlerData().setName(name)); } @Override - public IHandler create(Path directory, String name, int priority, boolean isEnabled) { + public IHandler create(Path directory, HandlerData data) { return null; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index 27281ea..68232ab 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -27,19 +27,20 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import javax.annotation.Nullable; import java.util.UUID; public abstract class FGObjectBase implements IFGObject { protected String name; protected UUID owner; - protected boolean isEnabled = true; + protected boolean enabled = true; - public FGObjectBase(String name, @Nullable UUID owner, boolean isEnabled) { - this.name = name; + public FGObjectBase(FGObjectData data) { + String name = data.getName(); + this.name = name == null ? "" : name; + UUID owner = data.getOwner(); this.owner = owner == null ? FGManager.SERVER_UUID : owner; - this.isEnabled = isEnabled; + this.enabled = data.isEnabled(); } @Override @@ -64,12 +65,12 @@ public void setOwner(UUID owner) { @Override public boolean isEnabled() { - return isEnabled; + return enabled; } @Override - public void setIsEnabled(boolean state) { - this.isEnabled = state; + public void setEnabled(boolean state) { + this.enabled = state; } public abstract void markDirty(); @@ -79,7 +80,7 @@ public String toString() { return "FGObjectBase{" + "name='" + name + '\'' + ", owner=" + owner + - ", isEnabled=" + isEnabled + + ", enabled=" + enabled + '}'; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java new file mode 100644 index 0000000..c7a3fea --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java @@ -0,0 +1,64 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object; + +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; + +import java.util.UUID; + +public class FGObjectData { + + protected String name = ""; + protected UUID owner = FGManager.SERVER_UUID; + protected boolean enabled = true; + + public String getName() { + return name; + } + + public FGObjectData setName(String name) { + this.name = name; + return this; + } + + public UUID getOwner() { + return owner; + } + + public FGObjectData setOwner(UUID owner) { + this.owner = owner; + return this; + } + + public boolean isEnabled() { + return enabled; + } + + public FGObjectData setEnabled(boolean enabled) { + this.enabled = enabled; + return this; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 61079ad..3d5b8e9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -104,7 +104,7 @@ public interface IFGObject extends IModifiable { * * @param state */ - void setIsEnabled(boolean state); + void setEnabled(boolean state); /** * Gets the details for the object as a SpongeAPI {@link Text} Object. Used in the {@link CommandDetail Detail} command. diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java index 8234183..b26fa0c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java @@ -27,7 +27,9 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.command.CommandException; @@ -70,10 +72,10 @@ public IRegion createRegion(String name, String type, String arguments, CommandS return null; } - public IRegion createRegion(Path directory, String name, String type, boolean isEnabled) { + public IRegion createRegion(Path directory, String type, FGObjectData data) { for (IRegionFactory rf : regionFactories) { if (rf.getType().equalsIgnoreCase(type)) { - IRegion region = rf.create(directory, name, isEnabled); + IRegion region = rf.create(directory, data); if (region != null) return region; } } @@ -90,10 +92,10 @@ public IWorldRegion createWorldRegion(String name, String type, String arguments return null; } - public IWorldRegion createWorldRegion(Path directory, String name, String type, boolean isEnabled) { + public IWorldRegion createWorldRegion(Path directory, String type, FGObjectData data) { for (IWorldRegionFactory wrf : worldRegionFactories) { if (wrf.getType().equalsIgnoreCase(type)) { - IWorldRegion region = wrf.create(directory, name, isEnabled); + IWorldRegion region = wrf.create(directory, data); if (region != null) return region; } } @@ -104,17 +106,17 @@ public IWorldRegion createWorldRegion(Path directory, String name, String type, public IHandler createHandler(String name, String type, int priority, String args, CommandSource source) throws CommandException { for (IHandlerFactory hf : handlerFactories) { if (isIn(hf.getAliases(), type)) { - IHandler handler = hf.create(name, priority, args, source); + IHandler handler = hf.create(name, args, source); if (handler != null) return handler; } } return null; } - public IHandler createHandler(Path directory, String name, String type, boolean isEnabled, int priority) { + public IHandler createHandler(Path directory, String type, HandlerData data) { for (IHandlerFactory hf : handlerFactories) { if (hf.getType().equalsIgnoreCase(type)) { - IHandler handler = hf.create(directory, name, priority, isEnabled); + IHandler handler = hf.create(directory, data); if (handler != null) return handler; } } @@ -124,17 +126,17 @@ public IHandler createHandler(Path directory, String name, String type, boolean public IController createController(String name, String type, int priority, String args, CommandSource source) throws CommandException { for (IControllerFactory cf : controllerFactories) { if (isIn(cf.getAliases(), type)) { - IController controller = cf.create(name, priority, args, source); + IController controller = cf.create(name, args, source); if (controller != null) return controller; } } return null; } - public IController createController(Path directory, String name, String type, boolean isEnabled, int priority) { + public IController createController(Path directory, String type, HandlerData data) { for (IControllerFactory cf : controllerFactories) { if (cf.getType().equalsIgnoreCase(type)) { - IController controller = cf.create(directory, name, priority, isEnabled); + IController controller = cf.create(directory, data); if (controller != null) return controller; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IControllerFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IControllerFactory.java index 8b06186..9f70b24 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IControllerFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IControllerFactory.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -37,8 +38,8 @@ public interface IControllerFactory extends IHandlerFactory { @Override - IController create(String name, int priority, String arguments, CommandSource source) throws CommandException; + IController create(String name, String arguments, CommandSource source) throws CommandException; @Override - IController create(Path directory, String name, int priority, boolean isEnabled); + IController create(Path directory, HandlerData data); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java index 62039c8..735937c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.world.Location; @@ -35,6 +36,8 @@ public interface IFGFactory { + IFGObject create(String name, String arguments, CommandSource source) throws CommandException; + String[] getAliases(); String getType(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IHandlerFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IHandlerFactory.java index 6fbc1d9..5e042ca 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IHandlerFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IHandlerFactory.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -34,8 +35,9 @@ public interface IHandlerFactory extends IFGFactory { - IHandler create(String name, int priority, String arguments, CommandSource source) throws CommandException; + @Override + IHandler create(String name, String arguments, CommandSource source) throws CommandException; - IHandler create(Path directory, String name, int priority, boolean isEnabled); + IHandler create(Path directory, HandlerData data); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IRegionFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IRegionFactory.java index bea6928..b31781f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IRegionFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IRegionFactory.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -36,7 +37,8 @@ */ public interface IRegionFactory extends IFGFactory { + @Override IRegion create(String name, String arguments, CommandSource source) throws CommandException; - IRegion create(Path directory, String name, boolean isEnabled); + IRegion create(Path directory, FGObjectData data); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IWorldRegionFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IWorldRegionFactory.java index 7359df6..e308d87 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IWorldRegionFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IWorldRegionFactory.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -33,8 +34,10 @@ public interface IWorldRegionFactory extends IRegionFactory { + @Override IWorldRegion create(String name, String arguments, CommandSource source) throws CommandException; - IWorldRegion create(Path directory, String name, boolean isEnabled); + @Override + IWorldRegion create(Path directory, FGObjectData data); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/GlobalRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/GlobalRegion.java index b4cc93f..7b00150 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/GlobalRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/GlobalRegion.java @@ -29,6 +29,7 @@ import com.flowpowered.math.vector.Vector3i; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -40,14 +41,18 @@ import java.nio.file.Path; import java.util.List; +import static java.lang.Boolean.TRUE; + /** * Created by Fox on 4/2/2016. */ public class GlobalRegion extends RegionBase implements IGlobal { public static final String NAME = "_sglobal"; + private static final FGObjectData DATA = new FGObjectData().setName(NAME).setEnabled(true); + public GlobalRegion() { - super(NAME, true); + super(DATA); } @Override @@ -101,8 +106,8 @@ public boolean isEnabled() { } @Override - public void setIsEnabled(boolean state) { - this.isEnabled = true; + public void setEnabled(boolean state) { + this.enabled = true; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index ce68b24..c9009b1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -29,6 +29,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectBase; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; @@ -40,14 +41,14 @@ public abstract class RegionBase extends FGObjectBase implements IRegion { private final Set handlers; - protected RegionBase(String name, boolean isEnabled) { - super(name, null, isEnabled); + protected RegionBase(FGObjectData data) { + super(data); this.handlers = new HashSet<>(); } @Override - public void setIsEnabled(boolean state) { - super.setIsEnabled(state); + public void setEnabled(boolean state) { + super.setEnabled(state); FGManager.getInstance().markDirty(this, RegionCache.DirtyType.MODIFIED); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java index 9de143c..2227cf8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/CuboidRegion.java @@ -33,6 +33,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.selection.CuboidSelection; import net.foxdenstudio.sponge.foxcore.plugin.util.BoundingBox3; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IWorldRegionFactory; import net.foxdenstudio.sponge.foxguard.plugin.region.IIterableRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.ISelectableRegion; @@ -62,14 +63,14 @@ public class CuboidRegion extends WorldRegionBase implements IIterableRegion, IS private BoundingBox3 boundingBox; - public CuboidRegion(String name, boolean isEnabled, BoundingBox3 boundingBox) { - super(name, isEnabled); + public CuboidRegion(FGObjectData data, BoundingBox3 boundingBox) { + super(data); this.boundingBox = boundingBox; } - public CuboidRegion(String name, List positions, String[] args, CommandSource source) + public CuboidRegion(FGObjectData data, List positions, String[] args, CommandSource source) throws CommandException { - super(name, true); + super(data); List allPositions = new ArrayList<>(positions); Vector3i sourcePos = source instanceof Locatable ? ((Locatable) source).getLocation().getBlockPosition() : Vector3i.ZERO; for (int i = 0; i < args.length - 2; i += 3) { @@ -223,11 +224,11 @@ public IWorldRegion create(String name, String arguments, CommandSource source) AdvCmdParser.ParseResult parse = AdvCmdParser.builder() .arguments(arguments) .parse(); - return new CuboidRegion(name, FCPUtil.getPositions(source), parse.args, source); + return new CuboidRegion(new FGObjectData().setName(name), FCPUtil.getPositions(source), parse.args, source); } @Override - public IWorldRegion create(Path directory, String name, boolean isEnabled) { + public IWorldRegion create(Path directory, FGObjectData data) { Path boundsFile = directory.resolve("bounds.cfg"); CommentedConfigurationNode root; ConfigurationLoader loader = @@ -247,8 +248,7 @@ public IWorldRegion create(Path directory, String name, boolean isEnabled) { int x2 = root.getNode("upperX").getInt(0); int y2 = root.getNode("upperY").getInt(0); int z2 = root.getNode("upperZ").getInt(0); - return new CuboidRegion(name, isEnabled, new BoundingBox3(new Vector3i(x1, y1, z1), new Vector3i(x2, y2, z2))); - + return new CuboidRegion(data, new BoundingBox3(new Vector3i(x1, y1, z1), new Vector3i(x2, y2, z2))); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/ElevationRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/ElevationRegion.java index b8d9edc..cd2e841 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/ElevationRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/ElevationRegion.java @@ -31,6 +31,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IWorldRegionFactory; import ninja.leaping.configurate.ConfigurationOptions; import ninja.leaping.configurate.commented.CommentedConfigurationNode; @@ -57,15 +58,15 @@ public class ElevationRegion extends WorldRegionBase { private int upperBound; private int lowerBound; - public ElevationRegion(String name, boolean isEnabled, int lowerBound, int upperBound) { - super(name, isEnabled); + public ElevationRegion(FGObjectData data, int lowerBound, int upperBound) { + super(data); this.upperBound = upperBound; this.lowerBound = lowerBound; } - public ElevationRegion(String name, List positions, String[] args, CommandSource source) + public ElevationRegion(FGObjectData data, List positions, String[] args, CommandSource source) throws CommandException { - super(name, true); + super(data); List allPositions = new ArrayList<>(positions); int sourceY = source instanceof Locatable ? ((Locatable) source).getLocation().getBlockY() : 0; for (String arg : args) { @@ -195,11 +196,11 @@ public IWorldRegion create(String name, String arguments, CommandSource source) AdvCmdParser.ParseResult parse = AdvCmdParser.builder() .arguments(arguments) .parse(); - return new ElevationRegion(name, FCPUtil.getPositions(source), parse.args, source); + return new ElevationRegion(new FGObjectData().setName(name), FCPUtil.getPositions(source), parse.args, source); } @Override - public IWorldRegion create(Path directory, String name, boolean isEnabled) { + public IWorldRegion create(Path directory, FGObjectData data) { Path boundsFile = directory.resolve("bounds.cfg"); CommentedConfigurationNode root; ConfigurationLoader loader = @@ -215,7 +216,7 @@ public IWorldRegion create(Path directory, String name, boolean isEnabled) { } int lower = root.getNode("lower").getInt(0); int upper = root.getNode("upper").getInt(0); - return new ElevationRegion(name, isEnabled, lower, upper); + return new ElevationRegion(data, lower, upper); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/EllipticalRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/EllipticalRegion.java index 808fec2..220a635 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/EllipticalRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/EllipticalRegion.java @@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.BoundingBox2; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; @@ -50,8 +51,8 @@ public class EllipticalRegion extends WorldRegionBase { private final double centerX, centerY, width, height; private final double widthSq, heightSq; - public EllipticalRegion(String name, boolean isEnabled, double centerX, double centerY, double height, double width) { - super(name, isEnabled); + public EllipticalRegion(FGObjectData data, double centerX, double centerY, double height, double width) { + super(data); this.centerX = centerX; this.centerY = centerY; this.width = width; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/GlobalWorldRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/GlobalWorldRegion.java index c31033a..8e69459 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/GlobalWorldRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/GlobalWorldRegion.java @@ -29,6 +29,7 @@ import com.flowpowered.math.vector.Vector3i; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; @@ -39,13 +40,17 @@ import java.nio.file.Path; import java.util.List; +import static java.lang.Boolean.TRUE; + public class GlobalWorldRegion extends WorldRegionBase implements IGlobal { public static final String NAME = "_wglobal"; public static final String TYPE = "wglobal"; + private static final FGObjectData DATA = new FGObjectData().setName(NAME).setEnabled(true); + public GlobalWorldRegion() { - super(NAME, true); + super(DATA); } @Override @@ -89,8 +94,8 @@ public boolean isEnabled() { } @Override - public void setIsEnabled(boolean state) { - this.isEnabled = true; + public void setEnabled(boolean state) { + this.enabled = true; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java index d22a3ee..3f943e8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/RectangularRegion.java @@ -33,6 +33,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.BoundingBox2; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IWorldRegionFactory; import net.foxdenstudio.sponge.foxguard.plugin.region.IIterableRegion; import ninja.leaping.configurate.ConfigurationOptions; @@ -61,14 +62,14 @@ public class RectangularRegion extends WorldRegionBase implements IIterableRegio private BoundingBox2 boundingBox; - public RectangularRegion(String name, boolean isEnabled, BoundingBox2 boundingBox) { - super(name, isEnabled); + public RectangularRegion(FGObjectData data, BoundingBox2 boundingBox) { + super(data); this.boundingBox = boundingBox; } - public RectangularRegion(String name, List positions, String[] args, CommandSource source) + public RectangularRegion(FGObjectData data, List positions, String[] args, CommandSource source) throws CommandException { - super(name, true); + super(data); List allPositions = new ArrayList<>(positions); Vector3i sourcePos = source instanceof Locatable ? ((Locatable) source).getLocation().getBlockPosition() : Vector3i.ZERO; for (int i = 0; i < args.length - 1; i += 2) { @@ -201,11 +202,11 @@ public IWorldRegion create(String name, String arguments, CommandSource source) AdvCmdParser.ParseResult parse = AdvCmdParser.builder() .arguments(arguments) .parse(); - return new RectangularRegion(name, FCPUtil.getPositions(source), parse.args, source); + return new RectangularRegion(new FGObjectData().setName(name), FCPUtil.getPositions(source), parse.args, source); } @Override - public IWorldRegion create(Path directory, String name, boolean isEnabled) { + public IWorldRegion create(Path directory, FGObjectData data) { Path boundsFile = directory.resolve("bounds.cfg"); CommentedConfigurationNode root; ConfigurationLoader loader = @@ -223,7 +224,7 @@ public IWorldRegion create(Path directory, String name, boolean isEnabled) { int z1 = root.getNode("lowerZ").getInt(0); int x2 = root.getNode("upperX").getInt(0); int z2 = root.getNode("upperZ").getInt(0); - return new RectangularRegion(name, isEnabled, new BoundingBox2(new Vector2i(x1, z1), new Vector2i(x2, z2))); + return new RectangularRegion(data, new BoundingBox2(new Vector2i(x1, z1), new Vector2i(x2, z2))); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java index 340df3e..fa6a43a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.region.world; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.region.RegionBase; import org.spongepowered.api.world.World; @@ -32,8 +33,8 @@ public abstract class WorldRegionBase extends RegionBase implements IWorldRegion protected World world; - protected WorldRegionBase(String name, boolean isEnabled) { - super(name, isEnabled); + protected WorldRegionBase(FGObjectData data) { + super(data); } @Override @@ -52,7 +53,7 @@ public void setWorld(World world) { public String toString() { return this.getClass().getSimpleName() + "{" + "name='" + name + '\'' + - ", isEnabled=" + isEnabled + + ", enabled=" + enabled + ", world=" + world.getName() + '}'; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java similarity index 83% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java index cd35c66..b21480d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectIndex.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java @@ -37,26 +37,31 @@ * Created by Fox on 7/9/2017. * Project: SpongeForge */ -public class FGObjectIndex extends FGObjectMeta { +public class FGSObjectIndex extends FGSObjectMeta { boolean enabled; + Integer priority; UUID owner; List links; - public FGObjectIndex(String name, String category, String type, boolean enabled, UUID owner, List links) { + public FGSObjectIndex(String name, String category, String type, boolean enabled, Integer priority, UUID owner, List links) { super(name, category, type); this.enabled = enabled; + this.priority = priority; this.owner = owner; this.links = links; } - public FGObjectIndex() { + public FGSObjectIndex() { } - public FGObjectIndex(IFGObject object) { + public FGSObjectIndex(IFGObject object) { super(object); this.enabled = object.isEnabled(); this.owner = object.getOwner(); + if (object instanceof IHandler) { + this.priority = ((IHandler) object).getPriority(); + } if (object instanceof ILinkable && ((ILinkable) object).saveLinks()) { this.links = ((ILinkable) object).getLinks().stream().map(IHandler::getName).collect(Collectors.toList()); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java similarity index 91% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java index c897fe6..f8c8c30 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGObjectMeta.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java @@ -32,7 +32,7 @@ * Created by Fox on 7/9/2017. * Project: SpongeForge */ -public class FGObjectMeta { +public class FGSObjectMeta { String name; String category; @@ -40,16 +40,16 @@ public class FGObjectMeta { transient IFGObject object; - public FGObjectMeta(String name, String category, String type) { + public FGSObjectMeta(String name, String category, String type) { this.name = name; this.category = category; this.type = type; } - public FGObjectMeta() { + public FGSObjectMeta() { } - public FGObjectMeta(IFGObject object) { + public FGSObjectMeta(IFGObject object) { this( object.getName(), FGUtil.getCategory(object), diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index c1bc71e..b7a0efb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -118,7 +118,7 @@ public void saveWorldRegionIndex(World world) { } private void saveIndex(Set objects, Path file) { - List indexList = objects.stream().map(FGObjectIndex::new).collect(Collectors.toList()); + List indexList = objects.stream().map(FGSObjectIndex::new).collect(Collectors.toList()); try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(file, CHARSET))) { jsonWriter.setIndent(" "); GSON.toJson(indexList, List.class, jsonWriter); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java index 51f7bd6..a442ec9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java @@ -125,19 +125,19 @@ public ChunkData(World world, Vector3i chunk) { } } /*worldRegions.get(world).values().stream() - .filter(IFGObject::isEnabled) + .filter(IFGObject::enabled) .filter(r -> r.isInChunk(chunk)) .forEach(contains::add); regions.values().stream() - .filter(IFGObject::isEnabled) + .filter(IFGObject::enabled) .filter(r -> r.isInChunk(chunk, world)) .forEach(contains::add); worldRegions.get(world).values().stream() - .filter(r -> !r.isEnabled()) + .filter(r -> !r.enabled()) .filter(r -> r.isInChunk(chunk)) .forEach(disabled::add); regions.values().stream() - .filter(IFGObject::isEnabled) + .filter(IFGObject::enabled) .filter(r -> r.isInChunk(chunk, world)) .forEach(disabled::add);*/ } From 59f3b3a412b8a8ee89470607d8401f5fb38d79f0 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Sat, 2 Sep 2017 19:15:09 -0700 Subject: [PATCH 10/30] I'm not sure what all has been done. But here. Have some code. There's a lot of changes... I think. --- .../foxguard/plugin/FGConfigManager.java | 159 ++-- .../sponge/foxguard/plugin/FGManager.java | 542 +++++++------ ...eManager.java => FGStorageManagerOld.java} | 18 +- .../sponge/foxguard/plugin/FoxGuardMain.java | 59 +- .../plugin/command/CommandCreate.java | 481 +++++++++--- .../plugin/command/CommandDelete.java | 2 +- .../plugin/command/CommandDetail.java | 74 +- .../plugin/command/CommandEnableDisable.java | 2 +- .../foxguard/plugin/command/CommandHere.java | 2 +- .../foxguard/plugin/command/CommandLink.java | 2 +- .../foxguard/plugin/command/CommandList.java | 14 +- .../plugin/command/CommandModify.java | 4 +- .../plugin/command/CommandPriority.java | 2 +- .../plugin/command/CommandRename.java | 6 +- .../foxguard/plugin/command/CommandSave.java | 31 +- .../foxguard/plugin/command/CommandTest.java | 75 +- .../plugin/command/link/LinkageParser.java | 2 +- .../plugin/controller/ControllerBase.java | 8 +- .../plugin/controller/IController.java | 4 + .../foxguard/plugin/handler/BasicHandler.java | 17 +- .../foxguard/plugin/handler/GroupHandler.java | 18 +- .../foxguard/plugin/handler/HandlerData.java | 11 + .../plugin/listener/BlockChangeListener.java | 37 +- .../plugin/listener/DamageListener.java | 176 ++--- .../plugin/listener/ExplosionListener.java | 38 +- .../listener/InteractBlockListener.java | 19 +- .../listener/InteractEntityListener.java | 19 +- .../plugin/listener/PlayerMoveListener.java | 4 +- .../listener/PlayerMoveListenerNew.java | 4 +- .../plugin/listener/SpawnEntityListener.java | 35 +- .../foxguard/plugin/object/FGObjectBase.java | 2 +- .../foxguard/plugin/object/FGObjectData.java | 20 +- .../foxguard/plugin/object/IFGObject.java | 4 +- .../object/factory/FGFactoryManager.java | 8 +- .../owners/IDisplayableOwnerProvider.java | 57 ++ .../plugin/object/owners/IOwnerProvider.java | 10 +- .../object/owners/OfflineUserProvider.java | 11 +- .../object/owners/OnlinePlayerProvider.java | 9 +- .../object/owners/OwnerProviderRegistry.java | 156 +++- .../plugin/object/owners/UUIDProvider.java | 82 ++ .../foxguard/plugin/region/IRegion.java | 6 + .../foxguard/plugin/region/RegionBase.java | 7 +- .../plugin/state/HandlersStateField.java | 6 +- .../plugin/state/RegionsStateField.java | 4 +- .../plugin/storage/FGSObjectIndex.java | 39 +- .../plugin/storage/FGSObjectMeta.java | 47 +- .../plugin/storage/FGSObjectPath.java | 72 ++ .../plugin/storage/FGStorageManagerNew.java | 716 +++++++++++++++--- .../sponge/foxguard/plugin/util/FGUtil.java | 127 +++- 49 files changed, 2385 insertions(+), 863 deletions(-) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/{FGStorageManager.java => FGStorageManagerOld.java} (99%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java index 15f3828..c2afe9f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java @@ -29,11 +29,11 @@ import ninja.leaping.configurate.commented.CommentedConfigurationNode; import ninja.leaping.configurate.hocon.HoconConfigurationLoader; import ninja.leaping.configurate.loader.ConfigurationLoader; -import org.spongepowered.api.Sponge; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.EnumMap; import java.util.Map; @@ -42,11 +42,13 @@ public final class FGConfigManager { private static FGConfigManager instance; private boolean cleanupFiles; - private boolean saveWorldRegionsInWorldFolders; - private boolean saveInWorldFolder; - private boolean useConfigFolder; + private boolean saveWorldRegionsInWorldDirectories; + private boolean saveInWorldDirectory; + private boolean ownerFirst; + private boolean useConfigDirectory; private boolean useCustomDirectory; private Path customDirectory; + private boolean gcAndFinalize; private boolean lockDatabaseFiles; private boolean useMMappedFiles; @@ -82,49 +84,78 @@ public void save() { } //-------------------------------------------------------------------------------------------------------------- - root.getNode("storage", "cleanupFiles").setComment("Sets whether to aggressively delete files that are no longer used. Default: true\n" + - "This is meant to keep the file store clean and free of clutter. It also improves load times.\n" + - "The caveat is that objects that fail to load are deleted without warning. This normally isn't an issue, even in server crashes.\n" + - "However, modifying databases and moving the files around can trigger the cleanup.\n" + - "If plugin simply fails to load the database, it would just be discarded.\n" + - "Setting this option to false will prevent databases from being deleted.\n" + - "However, they will still be overwritten if a new database is made with the same name.") - .setValue(cleanupFiles); - - root.getNode("storage", "location", "saveInWorldFolder").setComment("Whether or not FoxGuard should save object information in the world folder.\n Default: true" + - "This includes super-regions, handlers, and controllers, but does not include world-regions.\n" + - "If set to false, files will be placed in a folder in the server root directory.") - .setValue(saveInWorldFolder); - - root.getNode("storage", "location", "saveWorldRegionsInWorldFolders").setComment("Whether or not FoxGuard should save world-region information in the world folder.\n" + - "In this case, the files are kept with their corresponding world/dimension.\n" + - "This makes it easier to copy and paste world data without causing de-synchronization between the world data and FoxGuard data.") - .setValue(saveWorldRegionsInWorldFolders); - root.getNode("storage", "location", "useConfigFolder").setComment("Whether or not to place the foxguard folder inside the config folder.\n" + - "Only applies if files are not kept inside the world folder.") - .setValue(useConfigFolder); - root.getNode("storage", "gcAndFinalize").setComment("Whether to run try running gc and finalization when deleting things.\n" + - "This may drastically slow down the deletion of objects.\n" + - "Use only if you are having trouble deleting things from in game.\n" + - "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems.") - .setValue(gcAndFinalize); - root.getNode("storage", "database", "lockDatabaseFiles").setComment("Whether to put a lock on database files while accessing them.\n" + - "Locking is known to cause Java to hang on Unix based operating systems running on a NFS (Networked File System) that does not properly support locking.\n" + - "This is often the case if you are using a server host, so be very cautious.\n" + - "If your server hangs and crashes from the Minecraft watchdog, try setting this to false.") - .setValue(lockDatabaseFiles); - root.getNode("storage", "database", "useMMappedFiles").setComment("Whether to enable memory mapping for database files.\n" + - "This has the potential to greatly speed up saving and loading from database files." + - "This is known to cause some issues on Windows.\n" + - "This may be correctable with gcCleanerHack.") - .setValue(useMMappedFiles); - root.getNode("storage", "database", "gcCleanerHack").setComment("Whether to enable MapDB's gcCleanerHack functionality.\n" + - "This is meant for fixing issues with databases being un-deletable on Windows when memory mapping is enabled.\n" + - "This only makes a difference if memory mapping is enabled, and can potentially decrease performance.") - .setValue(gcCleanerHack); - root.getNode("general", "nameLengthLimit").setComment("The length limit for object names. Use 0 or lower for no limit.\n" + - "Extremely long names can cause a variety of unfixable issues. You have been warned.") - .setValue(nameLengthLimit); + root.getNode("storage", "cleanupFiles") + .setValue(cleanupFiles) + .setComment("Sets whether to aggressively delete files that are no longer used. Default: true\n" + + "This is meant to keep the file store clean and free of clutter. It also improves load times.\n" + + "The caveat is that objects that fail to load are deleted without warning. This normally isn't an issue, even in server crashes.\n" + + "However, modifying databases and moving the files around can trigger the cleanup.\n" + + "If plugin simply fails to load the database, it would just be discarded.\n" + + "Setting this option to false will prevent databases from being deleted.\n" + + "However, they will still be overwritten if a new database is made with the same name."); + + root.getNode("storage", "location") + .setComment("These options control where FoxGuard objects are stored.\n" + + "BE WARNED that changing these settings will not automatically move files to a new location.\n" + + "YOU MUST do that move yourself. It is advised that you"); + + root.getNode("storage", "location", "saveInWorldDirectory") + .setValue(saveInWorldDirectory) + .setComment("Whether or not FoxGuard should save object information in the world directory. Default: true\n" + + "This includes super-regions, handlers, and controllers, but does not include world-regions.\n" + + "If set to false, files will be placed in a directory in the server root directory."); + + root.getNode("storage", "location", "saveWorldRegionsInWorldDirectories") + .setValue(saveWorldRegionsInWorldDirectories) + .setComment("Whether or not FoxGuard should save world-region information in the world directory. Default: true\n" + + "In this case, the files are kept with their corresponding world/dimension.\n" + + "This makes it easier to copy and paste world data without causing de-synchronization between the world data and FoxGuard data."); + root.getNode("storage", "location", "ownerFirst") + .setValue(ownerFirst) + .setComment("Whether to sort by owners first and then category. Default: true\n" + + "When set to true, object will be stored like \"foxguard/owners/uuid/handlers/myhandler\".\n" + + "When set to false, objects will instead be stored like \"foxguard/handlers/owners/uuid/myhandler\".\n" + + "This does not affect objects without an owner, which are still stored like \"foxguard/handlers/myhandler\"."); + root.getNode("storage", "location", "useConfigDirectory") + .setValue(useConfigDirectory) + .setComment("Whether or not to place the foxguard directory inside the config directory. Default: false\n" + + "Only applies if files are not kept inside the world directory."); + root.getNode("storage", "location", "useCustomDirectory") + .setValue(useCustomDirectory) + .setComment("Whether or not to set the foxguard directory to a custom path. Default false:\n" + + "Only applies if files are not kept inside the world folder.\n" + + "This setting overrides the other location settings.\n" + + "The working directory is the saves directory, which is the root directory on a Minecraft server."); + root.getNode("storage", "location", "customDirectory") + .setValue(customDirectory.normalize().toString()) + .setComment("The custom foxguard directory path."); + root.getNode("storage", "gcAndFinalize") + .setValue(gcAndFinalize) + .setComment("Whether to run try running gc and finalization when deleting things.\n" + + "This may drastically slow down the deletion of objects.\n" + + "Use only if you are having trouble deleting things from in game.\n" + + "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems."); + root.getNode("storage", "database", "lockDatabaseFiles") + .setValue(lockDatabaseFiles) + .setComment("Whether to put a lock on database files while accessing them.\n" + + "Locking is known to cause Java to hang on Unix based operating systems running on a NFS (Networked File System) that does not properly support locking.\n" + + "This is often the case if you are using a server host, so be very cautious.\n" + + "If your server hangs and crashes from the Minecraft watchdog, try setting this to false."); + root.getNode("storage", "database", "useMMappedFiles") + .setValue(useMMappedFiles) + .setComment("Whether to enable memory mapping for database files.\n" + + "This has the potential to greatly speed up saving and loading from database files." + + "This is known to cause some issues on Windows.\n" + + "This may be correctable with gcCleanerHack."); + root.getNode("storage", "database", "gcCleanerHack") + .setValue(gcCleanerHack) + .setComment("Whether to enable MapDB's gcCleanerHack functionality.\n" + + "This is meant for fixing issues with databases being un-deletable on Windows when memory mapping is enabled.\n" + + "This only makes a difference if memory mapping is enabled, and can potentially decrease performance."); + root.getNode("general", "nameLengthLimit") + .setValue(nameLengthLimit) + .setComment("The length limit for object names. Use 0 or lower for no limit.\n" + + "Extremely long names can cause a variety of unfixable issues. You have been warned."); for (Module m : Module.values()) { root.getNode("module", m.name).setValue(this.modules.get(m)); @@ -157,13 +188,23 @@ private void load() { //-------------------------------------------------------------------------------------------------------------- cleanupFiles = root.getNode("storage", "cleanupFiles").getBoolean(true); - saveInWorldFolder = root.getNode("storage", "saveInWorldFolder").getBoolean(true); - saveWorldRegionsInWorldFolders = root.getNode("storage", "saveWorldRegionsInWorldFolders").getBoolean(true); - useConfigFolder = root.getNode("storage", "useConfigFolder").getBoolean(false); + saveInWorldDirectory = root.getNode("storage", "location", "saveInWorldDirectory").getBoolean(true); + saveWorldRegionsInWorldDirectories = root.getNode("storage", "location", "saveWorldRegionsInWorldDirectories").getBoolean(true); + ownerFirst = root.getNode("storage", "location", "ownerFirst").getBoolean(true); + useConfigDirectory = root.getNode("storage", "location", "useConfigDirectory").getBoolean(false); + useCustomDirectory = root.getNode("storage", "location", "useCustomDirectory").getBoolean(false); + customDirectory = root.getNode("storage", "location", "customDirectory").getValue(o -> { + Path path = null; + if (o instanceof Path) path = (Path) o; + else if (o instanceof String) path = Paths.get((String) o); + if (path == null) return null; + if (Files.notExists(path) || Files.isDirectory(path)) return path; + else return null; + }, Paths.get("foxguard")); gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); - gcAndFinalize = root.getNode("storage", "database", "lockDatabaseFiles").getBoolean(false); - gcAndFinalize = root.getNode("storage", "database", "useMMappedFiles").getBoolean(false); - gcAndFinalize = root.getNode("storage", "database", "gcCleanerHack").getBoolean(false); + lockDatabaseFiles = root.getNode("storage", "database", "lockDatabaseFiles").getBoolean(false); + useMMappedFiles = root.getNode("storage", "database", "useMMappedFiles").getBoolean(false); + gcCleanerHack = root.getNode("storage", "database", "gcCleanerHack").getBoolean(false); nameLengthLimit = root.getNode("general", "nameLengthLimit").getInt(24); for (Module m : Module.values()) { this.modules.put(m, root.getNode("module", m.name).getBoolean(true)); @@ -171,7 +212,7 @@ private void load() { //-------------------------------------------------------------------------------------------------------------- - Path path = Sponge.getGame().getSavesDirectory(); + //Path path = Sponge.getGame().getSavesDirectory(); } @@ -180,15 +221,19 @@ public boolean cleanupFiles() { } public boolean saveWorldRegionsInWorldFolders() { - return saveWorldRegionsInWorldFolders; + return saveWorldRegionsInWorldDirectories; + } + + public boolean ownerFirst() { + return ownerFirst; } public boolean saveInWorldFolder() { - return saveInWorldFolder; + return saveInWorldDirectory; } public boolean useConfigFolder() { - return useConfigFolder; + return useConfigDirectory; } public boolean gcAndFinalize() { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index c33220e..d5a40c9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -45,6 +45,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; import org.spongepowered.api.Sponge; import org.spongepowered.api.util.GuavaCollectors; @@ -55,10 +56,12 @@ import java.util.*; import java.util.stream.Collectors; +import javax.annotation.Nullable; + public final class FGManager { public static final UUID SERVER_UUID = new UUID(0, 0); - public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything"}; + public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users"}; private static FGManager instance; private final Map> worldRegions; @@ -89,235 +92,241 @@ private FGManager() { this.regionCache = new RegionCache(regions, worldRegions); } + public static FGManager getInstance() { + return instance; + } + public static void init() { if (instance == null) instance = new FGManager(); if (instance.regions.isEmpty()) instance.regions.put(SERVER_UUID, instance.globalRegion); if (instance.handlers.isEmpty()) instance.handlers.put(SERVER_UUID, instance.globalHandler); } - public static FGManager getInstance() { - return instance; - } - public static boolean isNameValid(String name) { return !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && - !Aliases.isIn(FGStorageManager.FS_ILLEGAL_NAMES, name) && + !Aliases.isIn(FGStorageManagerNew.FS_ILLEGAL_NAMES, name) && !Aliases.isIn(ILLEGAL_NAMES, name); } - public boolean isRegistered(IHandler handler) { - return handlers.containsValue(handler); + public boolean addHandler(IHandler handler) { + UUID owner = handler.getOwner(); + if (owner == null) owner = SERVER_UUID; + return addHandler(handler, owner); } - public boolean isRegionNameAvailable(String name) { - if (getRegion(name).isPresent()) return false; - for (World world : worldRegions.keySet()) { - if (getWorldRegion(world, name).isPresent()) return false; - } + public boolean addHandler(IHandler handler, UUID owner) { + if (handler == null || getHandler(handler.getName()).isPresent() || !isNameValid(handler.getName())) + return false; + handler.setOwner(owner); + handlers.put(owner, handler); + //FGStorageManager.getInstance().addObject(handler); + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); return true; } - public boolean isWorldRegionNameAvailable(String name, World world) { - return !(getWorldRegion(world, name).isPresent() || getRegion(name).isPresent()); + public boolean addRegion(IRegion region) { + UUID owner = region.getOwner(); + if (owner == null) owner = SERVER_UUID; + return addRegion(region, owner); + } + + public boolean addRegion(IRegion region, UUID owner) { + if (region == null + || !isRegionNameAvailable(region.getName(), owner) + || !isNameValid(region.getName()) + || region instanceof IWorldRegion) return false; + region.setOwner(owner); + this.regions.put(owner, region); + this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); + //FGStorageManager.getInstance().addObject(region); + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); + return true; } - public Tristate isWorldRegionNameAvailable(String name) { - Tristate available = null; - for (World world : worldRegions.keySet()) { - if (!getWorldRegion(world, name).isPresent()) { - if (available == null) { - available = Tristate.TRUE; - } else if (available == Tristate.FALSE) { - available = Tristate.UNDEFINED; - } - } else { - if (available == null) { - available = Tristate.FALSE; - } else if (available == Tristate.TRUE) { - available = Tristate.UNDEFINED; - } - } - } - return available; + public boolean addRegion(IRegion region, @Nullable World world) { + UUID owner = region.getOwner(); + if (owner == null) owner = SERVER_UUID; + return addRegion(region, owner, world); + } + + public boolean addRegion(IRegion region, UUID owner, @Nullable World world) { + if (region instanceof IWorldRegion) { + return world != null && addWorldRegion((IWorldRegion) region, owner, world); + } else return addRegion(region, owner); } - public boolean addWorldRegion(World world, IWorldRegion region) { - return addWorldRegion(world, region, SERVER_UUID); + public boolean addWorldRegion(IWorldRegion region, World world) { + UUID owner = region.getOwner(); + if (owner == null) owner = SERVER_UUID; + return addWorldRegion(region, owner, world); } - public boolean addWorldRegion(World world, IWorldRegion region, UUID uuid) { - if (region == null || region.getWorld() != null || + public boolean addWorldRegion(IWorldRegion region, UUID owner, World world) { + if (region == null || world == null || region.getWorld() != null || !isWorldRegionNameAvailable(region.getName(), world) || !isNameValid(region.getName())) return false; region.setWorld(world); - this.worldRegions.get(world).put(uuid, region); + region.setOwner(owner); + this.worldRegions.get(world).put(owner, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); - FGStorageManager.getInstance().addObject(region); + //FGStorageManager.getInstance().addObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); return true; } - public boolean addRegion(IRegion region) { - return addRegion(region, SERVER_UUID); + public void clearRegionCache() { + this.regionCache.clearCaches(); } - public boolean addRegion(IRegion region, UUID uuid) { - if (region == null || !isRegionNameAvailable(region.getName()) || !isNameValid(region.getName())) return false; - this.regions.put(uuid, region); - this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); - FGStorageManager.getInstance().addObject(region); - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); - return true; + public Set getAllRegions() { + Set set = new HashSet<>(); + this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.values().forEach(set::add)); + this.regions.values().forEach(set::add); + return ImmutableSet.copyOf(set); } - public boolean addRegion(IRegion region, World world) { - return addRegion(region, world, SERVER_UUID); + public Set getAllRegions(UUID owner) { + Set set = new HashSet<>(); + this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.get(owner).forEach(set::add)); + this.regions.get(owner).forEach(set::add); + return ImmutableSet.copyOf(set); } - public boolean addRegion(IRegion region, World world, UUID uuid) { - if (region instanceof IWorldRegion) { - return world != null && addWorldRegion(world, (IWorldRegion) region, uuid); - } else return addRegion(region, uuid); + public Set getAllRegions(World world) { + if (world == null) return getRegions(); + Set set = new HashSet<>(); + this.worldRegions.get(world).values().forEach(set::add); + this.regions.values().forEach(set::add); + return ImmutableSet.copyOf(set); } - public Optional getWorldRegion(World world, String name) { - return getWorldRegion(world, name, SERVER_UUID); + public Set getAllRegions(World world, UUID owner) { + if (world == null) return getRegions(); + Set set = new HashSet<>(); + this.worldRegions.get(world).get(owner).forEach(set::add); + this.regions.get(owner).forEach(set::add); + return ImmutableSet.copyOf(set); } - public Optional getWorldRegion(World world, String name, UUID uuid) { - for (IWorldRegion region : this.worldRegions.get(world).get(uuid)) { - if (region.getName().equalsIgnoreCase(name)) { - return Optional.of(region); - } - } - return Optional.empty(); + public Set getAllServerRegions() { + return getAllRegions(SERVER_UUID); } - public Optional getRegion(String name) { - return getRegion(name, SERVER_UUID); + public Set getAllServerRegions(World world) { + return getAllRegions(world, SERVER_UUID); } - public Optional getRegion(String name, UUID uuid) { - for (IRegion region : this.regions.get(uuid)) { - if (region.getName().equalsIgnoreCase(name)) { - return Optional.of(region); + public Optional getController(String name) { + return getController(name, SERVER_UUID); + } + + public Optional getController(String name, UUID owner) { + for (IHandler handler : handlers.get(owner)) { + if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { + return Optional.of((IController) handler); } } return Optional.empty(); } - public Optional getRegionFromWorld(World world, String name) { - return getRegionFromWorld(world, name, SERVER_UUID); - } - - public Optional getRegionFromWorld(World world, String name, UUID uuid) { - Optional region = getWorldRegion(world, name, uuid); - if (!region.isPresent()) { - return getRegion(name, uuid); - } else return Optional.of(region.get()); - } - - public Set getRegions() { - return ImmutableSet.copyOf(this.regions.values()); - } - - public Set getServerRegions() { - return getRegions(SERVER_UUID); - } - - public Set getRegions(UUID uuid) { - return ImmutableSet.copyOf(this.regions.get(uuid)); + public Set getControllers() { + return this.handlers.values().stream() + .filter(handler -> handler instanceof IController) + .map(handler -> ((IController) handler)) + .collect(GuavaCollectors.toImmutableSet()); } - public Set getWorldRegions(World world) { - return ImmutableSet.copyOf(this.worldRegions.get(world).values()); + public Set getControllers(UUID owner) { + return this.handlers.get(owner).stream() + .filter(handler -> handler instanceof IController) + .map(handler -> ((IController) handler)) + .collect(GuavaCollectors.toImmutableSet()); } - public Set getServerWorldRegions(World world) { - return getWorldRegions(world, SERVER_UUID); + public GlobalHandler getGlobalHandler() { + return globalHandler; } - public Set getWorldRegions(World world, UUID uuid) { - return ImmutableSet.copyOf(this.worldRegions.get(world).get(uuid)); + public Optional getHandler(String name) { + return getHandler(name, SERVER_UUID); } - public Set getAllRegions() { - Set set = new HashSet<>(); - this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.values().forEach(set::add)); - this.regions.values().forEach(set::add); - return ImmutableSet.copyOf(set); - } - - public Set getAllServerRegions() { - return getAllRegions(SERVER_UUID); + public Optional getHandler(String name, UUID owner) { + for (IHandler handler : handlers.get(owner)) { + if (handler.getName().equalsIgnoreCase(name)) { + return Optional.of(handler); + } + } + return Optional.empty(); } - public Set getAllRegions(UUID uuid) { - Set set = new HashSet<>(); - this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.get(uuid).forEach(set::add)); - this.regions.get(uuid).forEach(set::add); - return ImmutableSet.copyOf(set); + public Set getHandlers() { + return ImmutableSet.copyOf(this.handlers.values()); } - public Set getAllServerRegions(World world) { - return getAllRegions(world, SERVER_UUID); + public Set getHandlers(UUID owner) { + return ImmutableSet.copyOf(this.handlers.get(owner)); } - public Set getAllRegions(World world) { - if (world == null) return getRegions(); - Set set = new HashSet<>(); - this.worldRegions.get(world).values().forEach(set::add); - this.regions.values().forEach(set::add); - return ImmutableSet.copyOf(set); + public Set getHandlers(boolean includeControllers) { + if (includeControllers) { + return getHandlers(); + } else { + return this.handlers.values().stream() + .filter(handler -> !(handler instanceof IController)) + .collect(GuavaCollectors.toImmutableSet()); + } } - public Set getAllRegions(World world, UUID uuid) { - if (world == null) return getRegions(); - Set set = new HashSet<>(); - this.worldRegions.get(world).get(uuid).forEach(set::add); - this.regions.get(uuid).forEach(set::add); - return ImmutableSet.copyOf(set); + public Set getHandlers(boolean includeControllers, UUID owner) { + if (includeControllers) { + return getHandlers(owner); + } else { + return this.handlers.get(owner).stream() + .filter(handler -> !(handler instanceof IController)) + .collect(GuavaCollectors.toImmutableSet()); + } } - public Set getRegionsInChunk(World world, Vector3i chunk) { - return getRegionsInChunk(world, chunk, false); + public Optional getRegion(String name) { + return getRegion(name, SERVER_UUID); } - public Set getRegionsInChunk(World world, Vector3i chunk, boolean includeDisabled) { - return this.regionCache.getData(world, chunk).getRegions(includeDisabled); + public Optional getRegion(String name, UUID owner) { + for (IRegion region : this.regions.get(owner)) { + if (region.getName().equalsIgnoreCase(name)) { + return Optional.of(region); + } + } + return Optional.empty(); } - public Set getRegionsAtPos(World world, Vector3i position) { - return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() - .filter(region -> region.contains(position, world)) - .collect(Collectors.toSet()); + public Optional getRegionFromWorld(World world, String name) { + return getRegionFromWorld(world, name, SERVER_UUID); } - public Set getRegionsAtPos(World world, Vector3i position, boolean includeDisabled) { - return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() - .filter(region -> region.contains(position, world)) - .collect(Collectors.toSet()); + public Optional getRegionFromWorld(World world, String name, UUID owner) { + Optional region = getWorldRegion(world, name, owner); + if (!region.isPresent()) { + return getRegion(name, owner); + } else return Optional.of(region.get()); } - public Set getRegionsAtPos(World world, Vector3d position) { - return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() - .filter(region -> region.contains(position, world)) - .collect(Collectors.toSet()); + public Set getRegions() { + return ImmutableSet.copyOf(this.regions.values()); } - public Set getRegionsAtPos(World world, Vector3d position, boolean includeDisabled) { - return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() - .filter(region -> region.contains(position, world)) - .collect(Collectors.toSet()); + public Set getRegions(UUID owner) { + return ImmutableSet.copyOf(this.regions.get(owner)); } - public Set getRegionsAtMultiLocI(Iterable> locations) { - return getRegionsAtMultiLocI(locations, false); + public Set getRegionsAtMultiLocD(Iterable> locations) { + return getRegionsAtMultiLocD(locations, false); } - public Set getRegionsAtMultiLocI(Iterable> locations, boolean includeDisabled) { + public Set getRegionsAtMultiLocD(Iterable> locations, boolean includeDisabled) { Set set = new HashSet<>(); - SetMultimap chunkPosMap = HashMultimap.create(); + SetMultimap chunkPosMap = HashMultimap.create(); for (Location loc : locations) { Vector3i pos = loc.getBlockPosition(); chunkPosMap.put( @@ -329,15 +338,15 @@ public Set getRegionsAtMultiLocI(Iterable> locations, b ), loc.getExtent() ), - loc.getBlockPosition() + loc.getPosition() ); } - for (Map.Entry> entry : chunkPosMap.asMap().entrySet()) { + for (Map.Entry> entry : chunkPosMap.asMap().entrySet()) { Chunk chunk = entry.getKey(); RegionCache.ChunkData data = this.regionCache.getData(chunk.world, chunk.chunk); Set candidates = new HashSet<>(data.getRegions(includeDisabled)); candidates.removeAll(set); - for (Vector3i pos : entry.getValue()) { + for (Vector3d pos : entry.getValue()) { if (candidates.isEmpty()) break; Iterator regionIterator = candidates.iterator(); do { @@ -353,13 +362,13 @@ public Set getRegionsAtMultiLocI(Iterable> locations, b return set; } - public Set getRegionsAtMultiLocD(Iterable> locations) { - return getRegionsAtMultiLocD(locations, false); + public Set getRegionsAtMultiLocI(Iterable> locations) { + return getRegionsAtMultiLocI(locations, false); } - public Set getRegionsAtMultiLocD(Iterable> locations, boolean includeDisabled) { + public Set getRegionsAtMultiLocI(Iterable> locations, boolean includeDisabled) { Set set = new HashSet<>(); - SetMultimap chunkPosMap = HashMultimap.create(); + SetMultimap chunkPosMap = HashMultimap.create(); for (Location loc : locations) { Vector3i pos = loc.getBlockPosition(); chunkPosMap.put( @@ -371,15 +380,15 @@ public Set getRegionsAtMultiLocD(Iterable> locations, b ), loc.getExtent() ), - loc.getPosition() + loc.getBlockPosition() ); } - for (Map.Entry> entry : chunkPosMap.asMap().entrySet()) { + for (Map.Entry> entry : chunkPosMap.asMap().entrySet()) { Chunk chunk = entry.getKey(); RegionCache.ChunkData data = this.regionCache.getData(chunk.world, chunk.chunk); Set candidates = new HashSet<>(data.getRegions(includeDisabled)); candidates.removeAll(set); - for (Vector3d pos : entry.getValue()) { + for (Vector3i pos : entry.getValue()) { if (candidates.isEmpty()) break; Iterator regionIterator = candidates.iterator(); do { @@ -395,6 +404,38 @@ public Set getRegionsAtMultiLocD(Iterable> locations, b return set; } + public Set getRegionsAtPos(World world, Vector3i position) { + return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() + .filter(region -> region.contains(position, world)) + .collect(Collectors.toSet()); + } + + public Set getRegionsAtPos(World world, Vector3i position, boolean includeDisabled) { + return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() + .filter(region -> region.contains(position, world)) + .collect(Collectors.toSet()); + } + + public Set getRegionsAtPos(World world, Vector3d position) { + return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() + .filter(region -> region.contains(position, world)) + .collect(Collectors.toSet()); + } + + public Set getRegionsAtPos(World world, Vector3d position, boolean includeDisabled) { + return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() + .filter(region -> region.contains(position, world)) + .collect(Collectors.toSet()); + } + + public Set getRegionsInChunk(World world, Vector3i chunk) { + return getRegionsInChunk(world, chunk, false); + } + + public Set getRegionsInChunk(World world, Vector3i chunk, boolean includeDisabled) { + return this.regionCache.getData(world, chunk).getRegions(includeDisabled); + } + public Set getRegionsInChunkAtPos(World world, Vector3i pos) { return getRegionsInChunkAtPos(world, pos, false); } @@ -421,97 +462,119 @@ public Set getRegionsInChunkAtPos(World world, Vector3d pos, boolean in ).getRegions(includeDisabled); } - public Set getHandlers() { - return ImmutableSet.copyOf(this.handlers.values()); + public Set getServerControllers() { + return getControllers(SERVER_UUID); } public Set getServerHandlers() { return getHandlers(SERVER_UUID); } - public Set getHandlers(UUID uuid) { - return ImmutableSet.copyOf(this.handlers.get(uuid)); + public Set getServerHandlers(boolean includeControllers) { + return getHandlers(includeControllers, SERVER_UUID); } - public Set getHandlers(boolean includeControllers) { - if (includeControllers) { - return getHandlers(); - } else { - return this.handlers.values().stream() - .filter(handler -> !(handler instanceof IController)) - .collect(GuavaCollectors.toImmutableSet()); - } + public Set getServerRegions() { + return getRegions(SERVER_UUID); } - public Set getServerHandlers(boolean includeControllers) { - return getHandlers(includeControllers, SERVER_UUID); + public Set getServerWorldRegions(World world) { + return getWorldRegions(world, SERVER_UUID); } - public Set getHandlers(boolean includeControllers, UUID uuid) { - if (includeControllers) { - return getHandlers(uuid); - } else { - return this.handlers.get(uuid).stream() - .filter(handler -> !(handler instanceof IController)) - .collect(GuavaCollectors.toImmutableSet()); + public Optional getWorldRegion(World world, String name) { + return getWorldRegion(world, name, SERVER_UUID); + } + + public Optional getWorldRegion(World world, String name, UUID owner) { + for (IWorldRegion region : this.worldRegions.get(world).get(owner)) { + if (region.getName().equalsIgnoreCase(name)) { + return Optional.of(region); + } } + return Optional.empty(); } - public Set getControllers() { - return this.handlers.values().stream() - .filter(handler -> handler instanceof IController) - .map(handler -> ((IController) handler)) - .collect(GuavaCollectors.toImmutableSet()); + public Set getWorldRegions(World world) { + return ImmutableSet.copyOf(this.worldRegions.get(world).values()); } - public Set getServerControllers() { - return getControllers(SERVER_UUID); + public Set getWorldRegions(World world, UUID owner) { + return ImmutableSet.copyOf(this.worldRegions.get(world).get(owner)); } - public Set getControllers(UUID uuid) { - return this.handlers.get(uuid).stream() - .filter(handler -> handler instanceof IController) - .map(handler -> ((IController) handler)) - .collect(GuavaCollectors.toImmutableSet()); + public void initWorld(World world) { + GlobalWorldRegion gwr = new GlobalWorldRegion(); + gwr.setWorld(world); + this.worldRegions.get(world).put(SERVER_UUID, gwr); + this.regionCache.markDirty(gwr, RegionCache.DirtyType.ADDED); } - public boolean addHandler(IHandler handler) { - return addHandler(handler, SERVER_UUID); + public boolean isHandlerNameAvailable(String name) { + return isHandlerNameAvailable(name, SERVER_UUID); } - public boolean addHandler(IHandler handler, UUID uuid) { - if (handler == null) return false; - if (gethandler(handler.getName()).isPresent()) return false; - handlers.put(uuid, handler); - FGStorageManager.getInstance().addObject(handler); - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); - return true; + public boolean isHandlerNameAvailable(String name, UUID owner) { + return !getHandler(name, owner).isPresent(); } - public Optional gethandler(String name) { - return gethandler(name, SERVER_UUID); + public boolean isRegionNameAvailable(String name) { + return isRegionNameAvailable(name, SERVER_UUID); } - public Optional gethandler(String name, UUID uuid) { - for (IHandler handler : handlers.get(uuid)) { - if (handler.getName().equalsIgnoreCase(name)) { - return Optional.of(handler); - } + public boolean isRegionNameAvailable(String name, UUID owner) { + if (getRegion(name).isPresent()) return false; + for (World world : worldRegions.keySet()) { + if (getWorldRegion(world, name, owner).isPresent()) return false; } - return Optional.empty(); + return true; } - public Optional getController(String name) { - return getController(name, SERVER_UUID); + public boolean isRegistered(IHandler handler) { + return handlers.containsValue(handler); } - public Optional getController(String name, UUID uuid) { - for (IHandler handler : handlers.get(uuid)) { - if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { - return Optional.of((IController) handler); + public boolean isWorldRegionNameAvailable(String name, World world) { + return isWorldRegionNameAvailable(name, SERVER_UUID, world); + } + + public boolean isWorldRegionNameAvailable(String name, UUID owner, World world) { + return !(getWorldRegion(world, name, owner).isPresent() || getRegion(name, owner).isPresent()); + } + + public Tristate isWorldRegionNameAvailable(String name) { + return isWorldRegionNameAvailable(name, SERVER_UUID); + } + + public Tristate isWorldRegionNameAvailable(String name, UUID owner) { + if (getRegion(name, owner).isPresent()) return Tristate.FALSE; + Tristate available = null; + for (World world : worldRegions.keySet()) { + if (getWorldRegion(world, name, owner).isPresent()) { + if (available == null) { + available = Tristate.FALSE; + } else if (available == Tristate.TRUE) { + available = Tristate.UNDEFINED; + } + } else { + if (available == null) { + available = Tristate.TRUE; + } else if (available == Tristate.FALSE) { + available = Tristate.UNDEFINED; + } } } - return Optional.empty(); + return available; + } + + public boolean link(ILinkable linkable, IHandler handler) { + if (linkable == null || handler == null || linkable.getLinks().contains(handler)) return false; + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); + return !(handler instanceof IGlobal) && linkable.addLink(handler); + } + + public void markDirty(IRegion region, RegionCache.DirtyType type) { + regionCache.markDirty(region, type); } public boolean removeHandler(IHandler handler) { @@ -522,7 +585,7 @@ public boolean removeHandler(IHandler handler) { if (!this.handlers.values().contains(handler)) { return false; } - FGStorageManager.getInstance().removeObject(handler); + //FGStorageManager.getInstance().removeObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); handlers.values().remove(handler); return true; @@ -535,7 +598,7 @@ public boolean removeRegion(IRegion region) { if (region == null) return false; if (!this.regions.values().contains(region)) return false; this.regions.values().remove(region); - FGStorageManager.getInstance().removeObject(region); + //FGStorageManager.getInstance().removeObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); this.regionCache.markDirty(region, RegionCache.DirtyType.REMOVED); return true; @@ -560,25 +623,13 @@ public boolean removeWorldRegion(IWorldRegion region) { } } if (removed) { - FGStorageManager.getInstance().removeObject(region); + //FGStorageManager.getInstance().removeObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); this.regionCache.markDirty(region, RegionCache.DirtyType.REMOVED); } return removed; } - public boolean link(ILinkable linkable, IHandler handler) { - if (linkable == null || handler == null || linkable.getLinks().contains(handler)) return false; - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof IGlobal) && linkable.addLink(handler); - } - - public boolean unlink(ILinkable linkable, IHandler handler) { - if (linkable == null || handler == null || !linkable.getLinks().contains(handler)) return false; - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); - return !(handler instanceof IGlobal) && linkable.removeLink(handler); - } - public boolean rename(IFGObject object, String newName) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) { @@ -588,23 +639,18 @@ public boolean rename(IFGObject object, String newName) { if (this.getRegion(newName).isPresent()) return false; } } else if (object instanceof IHandler) { - if (this.gethandler(newName).isPresent()) return false; + if (this.getHandler(newName).isPresent()) return false; } - FGStorageManager.getInstance().removeObject(object); + //FGStorageManager.getInstance().removeObject(object); object.setName(newName); - FGStorageManager.getInstance().addObject(object); + //FGStorageManager.getInstance().addObject(object); return true; } - public void initWorld(World world) { - GlobalWorldRegion gwr = new GlobalWorldRegion(); - gwr.setWorld(world); - this.worldRegions.get(world).put(SERVER_UUID, gwr); - this.regionCache.markDirty(gwr, RegionCache.DirtyType.ADDED); - } - - public void unloadWorld(World world) { - this.worldRegions.remove(world); + public boolean unlink(ILinkable linkable, IHandler handler) { + if (linkable == null || handler == null || !linkable.getLinks().contains(handler)) return false; + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); + return !(handler instanceof IGlobal) && linkable.removeLink(handler); } public void unloadServer() { @@ -613,16 +659,8 @@ public void unloadServer() { this.regionCache.clearCaches(); } - public GlobalHandler getGlobalHandler() { - return globalHandler; - } - - public void markDirty(IRegion region, RegionCache.DirtyType type) { - regionCache.markDirty(region, type); - } - - public void clearRegionCache() { - this.regionCache.clearCaches(); + public void unloadWorld(World world) { + this.worldRegions.remove(world); } private static class Chunk { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java similarity index 99% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java index 9dee517..373ba40 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java @@ -55,20 +55,20 @@ /** * Created by Fox on 4/6/2016. */ -public final class FGStorageManager { +public final class FGStorageManagerOld { public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; - private static FGStorageManager instance; - public final HashMap defaultModifiedMap; + private static FGStorageManagerOld instance; + private final HashMap defaultModifiedMap; private final UserStorageService userStorageService; private final Logger logger = FoxGuardMain.instance().getLogger(); private final Set loaded = new HashSet<>(); private final Path directory = getDirectory(); private final Map worldDirectories; - private FGStorageManager() { + private FGStorageManagerOld() { userStorageService = FoxGuardMain.instance().getUserStorage(); defaultModifiedMap = new CacheMap<>((k, m) -> { if (k instanceof IFGObject) { @@ -85,8 +85,8 @@ private FGStorageManager() { }); } - public static FGStorageManager getInstance() { - if (instance == null) instance = new FGStorageManager(); + public static FGStorageManagerOld getInstance() { + if (instance == null) instance = new FGStorageManagerOld(); return instance; } @@ -795,7 +795,7 @@ public synchronized void loadWorldRegions(World world) { } if (object != null) { loaded.add(new LoadEntry(object, world.getName())); - FGManager.getInstance().addWorldRegion(world, object); + FGManager.getInstance().addWorldRegion(object, world); logger.info("Successfully created and added world region \"" + name + "\"!"); } else { logger.warn("A world region was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); @@ -947,7 +947,7 @@ public synchronized void loadRegionLinks() { if (handlersString != null && !handlersString.isEmpty()) { String[] handlersNames = handlersString.split(","); Arrays.stream(handlersNames).forEach(handlerName -> { - Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); + Optional handlerOpt = FGManager.getInstance().getHandler(handlerName); if (handlerOpt.isPresent()) { IHandler handler = handlerOpt.get(); if (FGManager.getInstance().link(region, handler)) { @@ -982,7 +982,7 @@ public synchronized void loadWorldRegionLinks(World world) { if (handlersString != null && !handlersString.isEmpty()) { String[] handlersNames = handlersString.split(","); Arrays.stream(handlersNames).forEach(handlerName -> { - Optional handlerOpt = FGManager.getInstance().gethandler(handlerName); + Optional handlerOpt = FGManager.getInstance().getHandler(handlerName); if (handlerOpt.isPresent()) { IHandler handler = handlerOpt.get(); if (FGManager.getInstance().link(region, handler)) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 19bd6df..3828f7c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -79,6 +79,7 @@ import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.Tristate; +import org.spongepowered.api.world.World; import java.nio.file.Path; import java.util.ArrayList; @@ -101,6 +102,7 @@ public final class FoxGuardMain { */ private static FoxGuardMain instanceField; public final Cause pluginCause = Cause.builder().named("plugin", this).build(); + @Inject private Logger logger; @@ -219,30 +221,24 @@ public void setupEconomy(GamePostInitializationEvent event) { public void configurePermissions(GamePostInitializationEvent event) { logger.info("Configuring permissions"); PermissionService service = game.getServiceManager().provide(PermissionService.class).get(); - service.getDefaults().getTransientSubjectData().setPermission(SubjectData.GLOBAL_CONTEXT, "foxguard.override", Tristate.FALSE); + //service.getDefaults().getTransientSubjectData().setPermission(SubjectData.GLOBAL_CONTEXT, "foxguard.override", Tristate.FALSE); service.registerContextCalculator(new FGContextCalculator()); } - @Listener - public void serverStarting(GameStartingServerEvent event) { - logger.info("Loading regions"); - FGStorageManager.getInstance().loadRegions(); - logger.info("Loading global handler"); - FGStorageManager.getInstance().loadGlobalHandler(); - logger.info("Loading handlers"); - FGStorageManager.getInstance().loadHandlers(); - logger.info("Loading linkages"); - FGStorageManager.getInstance().loadLinks(); - loaded = true; - logger.info("Finished loading FoxGuard!"); - } - @Listener public void serverStopping(GameStoppingServerEvent event) { //FGStorageManager.getInstance().saveRegions(); //FGStorageManager.getInstance().saveHandlers(); - FGStorageManagerNew.getInstance().saveRegionIndex(); - FGStorageManagerNew.getInstance().saveHandlerIndex(); + FGStorageManagerNew storage = FGStorageManagerNew.getInstance(); + storage.saveRegionIndex(); + storage.saveHandlerIndex(); + + FGManager manager = FGManager.getInstance(); + logger.info("Saving regions"); + storage.saveObjects(manager.getRegions()); + logger.info("Saving handlers"); + storage.saveObjects(manager.getHandlers()); + logger.info("Saving configs"); FGConfigManager.getInstance().save(); FGManager.getInstance().unloadServer(); @@ -250,22 +246,27 @@ public void serverStopping(GameStoppingServerEvent event) { @Listener public void worldUnload(UnloadWorldEvent event) { - logger.info("Unloading world \"" + event.getTargetWorld().getName() + "\""); - //FGStorageManager.getInstance().saveWorldRegions(event.getTargetWorld()); - FGStorageManagerNew.getInstance().saveWorldRegionIndex(event.getTargetWorld()); - FGManager.getInstance().unloadWorld(event.getTargetWorld()); + World world = event.getTargetWorld(); + logger.info("Unloading world \"" + world.getName() + "\""); + FGStorageManagerNew storage = FGStorageManagerNew.getInstance(); + storage.saveWorldRegionIndex(event.getTargetWorld()); + + FGManager manager = FGManager.getInstance(); + logger.info("Saving worldregions for world: " + world.getName()); + storage.saveObjects(manager.getWorldRegions(world)); + manager.unloadWorld(event.getTargetWorld()); } @Listener public void worldLoad(LoadWorldEvent event) { - logger.info("Initializing global worldregion for world: \"" + event.getTargetWorld().getName() + "\""); - FGManager.getInstance().initWorld(event.getTargetWorld()); - logger.info("Loading worldregions for world: \"" + event.getTargetWorld().getName() + "\""); - FGStorageManager.getInstance().loadWorldRegions(event.getTargetWorld()); - if (loaded) { - logger.info("Loading links for world : \"" + event.getTargetWorld().getName() + "\""); - FGStorageManager.getInstance().loadWorldRegionLinks(event.getTargetWorld()); - } + World world = event.getTargetWorld(); + FGStorageManagerNew storage = FGStorageManagerNew.getInstance(); + storage.loadServer(); + + logger.info("Initializing global worldregion for world: \"" + world.getName() + "\""); + FGManager.getInstance().initWorld(world); + + storage.loadWorld(world); } private void registerCoreCommands(FCCommandDispatcher dispatcher) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index 9c8481e..b8049a5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; @@ -35,34 +36,45 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.owners.IOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.ArgumentParseException; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.Identifiable; import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.Locatable; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.UUID; +import java.util.function.Supplier; import java.util.stream.Stream; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public class CommandCreate extends FCCommandBase { private static final String[] PRIORITY_ALIASES = {"priority", "prio", "p", "order", "level", "rank"}; - private static final String[] STATE_ALIASES = {"state", "s", "buffer"}; + // private static final String[] STATE_ALIASES = {"state", "s", "buffer"}; + private static final String[] OWNER_ALIASES = {"owner", "own", "o"}; + + private static final String CHAR_REGEX = "^.*[^0-9a-zA-Z_$\\-].*$"; + private static final String START_REGEX = "^[0-9\\-].*$"; private static final FlagMapper MAPPER = map -> key -> value -> { map.put(key, value); @@ -70,8 +82,10 @@ public class CommandCreate extends FCCommandBase { map.put("world", value); } else if (isIn(PRIORITY_ALIASES, key) && !map.containsKey("priority")) { map.put("priority", value); - } else if (isIn(STATE_ALIASES, key) && !map.containsKey("state")) { + } /*else if (isIn(STATE_ALIASES, key) && !map.containsKey("state")) { map.put("state", value); + }*/ else if (isIn(OWNER_ALIASES, key) && !map.containsKey("owner")) { + map.put("owner", value); } return true; }; @@ -85,6 +99,162 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).limit(3).flagMapper(MAPPER).parse(); + int num = parse.args.length; + + if (num < 1) { + source.sendMessage(Text.builder() + .append(Text.of(TextColors.GREEN, "Usage: ")) + .append(getUsage(source)) + .build()); + return CommandResult.empty(); + } + + String category = parse.args[0]; + FGCat fgCat = FGCat.from(category); + if (fgCat == null) throw new CommandException(Text.of("\"" + category + "\" is not a valid category!")); + String lCatName = fgCat.name().toLowerCase(); + String uCatName = FCCUtil.toCapitalCase(fgCat.name()); + + if (num < 2) throw new CommandException(Text.of("Must specify a name!")); + String name = parse.args[1]; + + if (name.matches(CHAR_REGEX)) + throw new CommandException(Text.of("Name must be alphanumeric!")); + if (name.matches(START_REGEX)) + throw new CommandException(Text.of("Name can't start with a number or hyphen!")); + if (!FGManager.isNameValid(name)) + throw new CommandException(Text.of("You may not use \"" + name + "\" as a name!")); + int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); + if (lengthLimit > 0 && name.length() > lengthLimit) + throw new CommandException(Text.of("Name is too long! Max " + lengthLimit + " characters.")); + + if (num < 3) throw new CommandException(Text.of("Must specify a type!")); + String type = parse.args[2]; + + List typeAliases = fgCat.typeAliases.get(); + if (!isIn(typeAliases.toArray(new String[typeAliases.size()]), type)) { + throw new CommandException(Text.of("The type \"" + type + "\" is invalid!")); + } + + World world = null; + if (fgCat == FGCat.WORLDREGION) { + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + String worldName = parse.flags.get("world"); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + if (world == null) + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } + if (world == null) throw new CommandException(Text.of("Must specify a world!")); + } + + UUID owner = FGManager.SERVER_UUID; + if (parse.flags.containsKey("owner")) { + String ownerString = parse.flags.get("owner"); + if (ownerString.isEmpty()) { + if (source instanceof Identifiable) { + owner = ((Identifiable) source).getUniqueId(); + } + } else { + String[] parts = ownerString.split(":", 2); + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + Optional ownerOpt; + if (parts.length == 1) { + ownerOpt = registry.getUUIDForOwner(null, parts[0]); + } else if (parts.length == 2) { + ownerOpt = registry.getUUIDForOwner(parts[0], parts[1]); + } else ownerOpt = Optional.empty(); + if (ownerOpt.isPresent()) { + owner = ownerOpt.get(); + } else { + throw new CommandException(Text.of("\"" + ownerString + "\" is not a valid owner!")); + } + } + } + + String finalBlock = num < 4 ? "" : parse.args[3]; + IFGObject object; + try { + object = fgCat.create(name, type, finalBlock, source); + } catch (CommandException e) { + throw e; + } catch (Exception e) { + throw new CommandException(Text.of("There was an exception creating the " + lCatName + "!", e)); + } + if (object == null) + throw new CommandException(Text.of("Failed to construct " + lCatName + " for an unknown reason!")); + + if (object instanceof IHandler) { + int priority = 0; + try { + priority = Integer.parseInt(parse.flags.get("priority")); + if (priority < Integer.MIN_VALUE / 2 + 1) priority = Integer.MIN_VALUE / 2 + 1; + else if (priority > Integer.MAX_VALUE / 2) priority = Integer.MAX_VALUE / 2; + } catch (NumberFormatException ignored) { + } + ((IHandler) object).setPriority(priority); + } + + boolean success = fgCat.add(object, owner, world); + if (!success) + throw new CommandException(Text.of("Successfully constructed but failed to add " + lCatName + "for an unknown reason!")); + + if (object instanceof IRegion) { + FCStateManager.instance().getStateMap().get(source).flush(PositionStateField.ID); + } + + source.sendMessage(Text.of(TextColors.GREEN, uCatName + " created successfully")); + + StringBuilder logMessage = new StringBuilder(); + logMessage.append(source.getName()).append(" created a ").append(lCatName).append(": ") + .append("Name: ").append(object.getName()).append(" ") + .append("Owner: ").append(OwnerProviderRegistry.getInstance().getKeyword(owner, null)) + .append(" (").append(owner).append(")"); + + if (object instanceof IWorldRegion) { + logMessage.append(" World: ").append(((IWorldRegion) object).getWorld().getName()); + } + + FoxGuardMain.instance().getLogger().info(logMessage.toString()); + + return CommandResult.empty(); + } + + /* @Nonnull + @Override + public CommandResult processOld(@Nonnull CommandSource source, @Nonnull String arguments) throws CommandException { + if (!testPermission(source)) { + source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); + return CommandResult.empty(); + } + AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).limit(3).flagMapper(MAPPER).parse(); + + UUID owner = FGManager.SERVER_UUID; + if (parse.flags.containsKey("owner")) { + String ownerString = parse.flags.get("owner"); + if (ownerString.isEmpty()) { + if (source instanceof Identifiable) { + owner = ((Identifiable) source).getUniqueId(); + } + } else { + String[] parts = ownerString.split(":", 2); + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + Optional ownerOpt; + if (parts.length == 1) { + ownerOpt = registry.getUUIDForOwner(null, parts[0]); + } else if (parts.length == 2) { + ownerOpt = registry.getUUIDForOwner(parts[0], parts[1]); + } else ownerOpt = Optional.empty(); + if (ownerOpt.isPresent()) { + owner = ownerOpt.get(); + } + } + } + if (parse.args.length == 0) { source.sendMessage(Text.builder() .append(Text.of(TextColors.GREEN, "Usage: ")) @@ -110,10 +280,10 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } if (world == null) throw new CommandException(Text.of("Must specify a world!")); } - if (parse.args[1].matches("^.*[^0-9a-zA-Z_$].*$")) + if (parse.args[1].matches(CHAR_REGEX)) throw new CommandException(Text.of("Name must be alphanumeric!")); - if (parse.args[1].matches("^[0-9].*$")) - throw new CommandException(Text.of("Name can't start with a number!")); + if (parse.args[1].matches(START_REGEX)) + throw new CommandException(Text.of("Name can't start with a number or hyphen!")); if (!FGManager.isNameValid(parse.args[1])) throw new CommandException(Text.of("You may not use \"" + parse.args[1] + "\" as a name!")); int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); @@ -122,11 +292,10 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu if (isWorldRegion) { if (!FGManager.getInstance().isWorldRegionNameAvailable(parse.args[1], world)) throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); - } else { - if (!FGManager.getInstance().isRegionNameAvailable(parse.args[1])) - throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); - } + } else if (!FGManager.getInstance().isRegionNameAvailable(parse.args[1])) + throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); if (parse.args.length < 3) throw new CommandException(Text.of("Must specify a type!")); + IRegion newRegion; if (isWorldRegion) { List aliases = FGFactoryManager.getInstance().getWorldRegionTypeAliases(); @@ -149,6 +318,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } if (newRegion == null) throw new CommandException(Text.of("Failed to create region! Perhaps the type is invalid?")); + newRegion.setOwner(owner); boolean success = FGManager.getInstance().addRegion(newRegion, world); if (!success) throw new CommandException(Text.of("There was an error trying to create the " + (isWorldRegion ? "World" : "") + "Region!")); @@ -163,9 +333,9 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { boolean isController = isIn(CONTROLLERS_ALIASES, parse.args[0]); if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - if (parse.args[1].matches("^.*[^0-9a-zA-Z_$].*$")) + if (parse.args[1].matches(CHAR_REGEX)) throw new ArgumentParseException(Text.of("Name must be alphanumeric!"), parse.args[1], 1); - if (parse.args[1].matches("^[0-9].*$")) + if (parse.args[1].matches(START_REGEX)) throw new ArgumentParseException(Text.of("Name can't start with a number!"), parse.args[1], 1); if (!FGManager.isNameValid(parse.args[1])) throw new CommandException(Text.of("You may not use \"" + parse.args[1] + "\" as a name!")); @@ -188,7 +358,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); } newHandler = FGFactoryManager.getInstance().createController( - parse.args[1], parse.args[2], priority, + parse.args[1], parse.args[2], parse.args.length < 4 ? "" : parse.args[3], source); } else { @@ -197,12 +367,13 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); } newHandler = FGFactoryManager.getInstance().createHandler( - parse.args[1], parse.args[2], priority, + parse.args[1], parse.args[2], parse.args.length < 4 ? "" : parse.args[3], source); } if (newHandler == null) throw new CommandException(Text.of("Failed to create " + (isController ? "controller" : "handler") + "! Perhaps the type is invalid?")); + newHandler.setOwner(owner); boolean success = FGManager.getInstance().addHandler(newHandler); if (!success) throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); @@ -213,11 +384,13 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu return CommandResult.success(); //---------------------------------------------------------------------------------------------------------------------- } else throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); - } + }*/ @Nonnull @Override - public List getSuggestions(@Nonnull CommandSource source, @Nonnull String arguments, @Nullable Location targetPosition) throws CommandException { + public List getSuggestions(@Nonnull CommandSource source, + @Nonnull String arguments, + @Nullable Location targetPosition) throws CommandException { if (!testPermission(source)) return ImmutableList.of(); AdvCmdParser.ParseResult parse = AdvCmdParser.builder() .arguments(arguments) @@ -232,97 +405,133 @@ public List getSuggestions(@Nonnull CommandSource source, @Nonnull Strin return Stream.of("region", "worldregion", "handler", "controller") .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); - else if (parse.current.index == 1) { - if (parse.current.token == null || parse.current.token.isEmpty()) return ImmutableList.of(); - if (parse.current.token.matches("^.*[^0-9a-zA-Z_$].*$")) { - source.sendMessage(Text.of(TextColors.RED, "Name must be alphanumeric!")); - return ImmutableList.of(); - } - if (parse.current.token.matches("^[0-9].*$")) { - source.sendMessage(Text.of(TextColors.RED, "Name can't start with a number!")); - return ImmutableList.of(); - } - if (!FGManager.isNameValid(parse.current.token)) { - source.sendMessage(Text.of(TextColors.RED, "You may not use \"" + parse.current.token + "\" as a name!")); - return ImmutableList.of(); - } - int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); - if (lengthLimit > 0 && parse.current.token.length() > lengthLimit) { - source.sendMessage(Text.of(TextColors.RED, "Name is too long!")); - return ImmutableList.of(); - } + else { + FGCat fgCat = FGCat.from(parse.args[0]); + if (parse.current.index == 1) { + if (parse.current.token == null || parse.current.token.isEmpty()) return ImmutableList.of(); + if (parse.current.token.matches(CHAR_REGEX)) { + source.sendMessage(Text.of(TextColors.RED, "Name must be alphanumeric!")); + return ImmutableList.of(); + } + if (parse.current.token.matches(START_REGEX)) { + source.sendMessage(Text.of(TextColors.RED, "Name can't start with a number!")); + return ImmutableList.of(); + } + if (!FGManager.isNameValid(parse.current.token)) { + source.sendMessage(Text.of(TextColors.RED, "You may not use \"" + parse.current.token + "\" as a name!")); + return ImmutableList.of(); + } + int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); + if (lengthLimit > 0 && parse.current.token.length() > lengthLimit) { + source.sendMessage(Text.of(TextColors.RED, "Name is too long!")); + return ImmutableList.of(); + } - Tristate available = null; - if (isIn(REGIONS_ALIASES, parse.args[0])) { - available = Tristate.fromBoolean(FGManager.getInstance().isRegionNameAvailable(parse.current.token)); - } else if (isIn(WORLDREGIONS_ALIASES, parse.args[0])) { - String worldName = parse.flags.get("world"); - World world = null; - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); + Tristate available; + if (fgCat == FGCat.REGION) { + available = Tristate.fromBoolean(FGManager.getInstance().isRegionNameAvailable(parse.current.token)); + } else if (fgCat == FGCat.WORLDREGION) { + String worldName = parse.flags.get("world"); + World world = null; + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } } - } - if (world == null) { - available = FGManager.getInstance().isWorldRegionNameAvailable(parse.current.token); + if (world == null) { + available = FGManager.getInstance().isWorldRegionNameAvailable(parse.current.token); + } else { + available = Tristate.fromBoolean(FGManager.getInstance().isWorldRegionNameAvailable(parse.current.token, world)); + } + } else if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { + available = Tristate.fromBoolean(FGManager.getInstance().getHandler(parse.current.token) == null); } else { - available = Tristate.fromBoolean(FGManager.getInstance().isWorldRegionNameAvailable(parse.current.token, world)); + return ImmutableList.of(); } - } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { - available = Tristate.fromBoolean(FGManager.getInstance().gethandler(parse.current.token) == null); - } - if (available != null) { - switch (available) { - case TRUE: - source.sendMessage(Text.of(TextColors.GREEN, "Name is available!")); - break; - case FALSE: - source.sendMessage(Text.of(TextColors.RED, "Name is already taken!")); - break; - case UNDEFINED: - source.sendMessage(Text.of(TextColors.YELLOW, "Name might be available. Must specify a world to confirm.")); + if (available != null) { + switch (available) { + case TRUE: + source.sendMessage(Text.of(TextColors.GREEN, "Name is available!")); + break; + case FALSE: + source.sendMessage(Text.of(TextColors.RED, "Name is already taken!")); + break; + case UNDEFINED: + source.sendMessage(Text.of(TextColors.YELLOW, "Name might be available. Must specify a world to confirm.")); + } + } + } else if (parse.current.index == 2) { + if (fgCat == null) return ImmutableList.of(); + switch (fgCat) { + + case REGION: + return FGFactoryManager.getInstance().getPrimaryRegionTypeAliases().stream() + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + + case WORLDREGION: + return FGFactoryManager.getInstance().getPrimaryWorldRegionTypeAliases().stream() + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + + case HANDLER: + return FGFactoryManager.getInstance().getPrimaryHandlerTypeAliases().stream() + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + case CONTROLLER: + return FGFactoryManager.getInstance().getPrimaryControllerTypeAliases().stream() + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); } - } - } else if (parse.current.index == 2) { - if (isIn(REGIONS_ALIASES, parse.args[0])) { - return FGFactoryManager.getInstance().getPrimaryRegionTypeAliases().stream() - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - } else if (isIn(WORLDREGIONS_ALIASES, parse.args[0])) { - return FGFactoryManager.getInstance().getPrimaryWorldRegionTypeAliases().stream() - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGFactoryManager.getInstance().getPrimaryHandlerTypeAliases().stream() - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - } else if (isIn(CONTROLLERS_ALIASES, parse.args[0])) { - return FGFactoryManager.getInstance().getPrimaryControllerTypeAliases().stream() - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); } } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGKEY)) - return Stream.of("world", "priority") + return Stream.of("world", "priority", "owner") .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGFLAGVALUE)) { - if (isIn(WORLD_ALIASES, parse.current.key)) + if (isIn(WORLD_ALIASES, parse.current.key)) { return Sponge.getGame().getServer().getWorlds().stream() .map(World::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); + } else if (isIn(OWNER_ALIASES, parse.current.key)) { + String[] parts = parse.current.token.split(":", 2); + if (parts.length == 1) { + return OwnerProviderRegistry.getInstance().getProviders().stream() + .map(provider -> provider.getAliases()[0]) + .filter(new StartsWithPredicate(parse.current.token)) + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + + } else if (parts.length == 2) { + Optional providerOpt = OwnerProviderRegistry.getInstance().getProvider(parts[0]); + if (providerOpt.isPresent()) { + IOwnerProvider provider = providerOpt.get(); + System.out.println(provider.getOwnerKeywords()); + return provider.getOwnerKeywords().stream() + .filter(new StartsWithPredicate(parts[1])) + .map(args -> parse.current.prefix + parts[0] + ":" + args) + .collect(GuavaCollectors.toImmutableList()); + } + } + } } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.FINAL)) { if (isIn(REGIONS_ALIASES, parse.args[0])) { + return FGFactoryManager.getInstance().regionSuggestions(source, parse.current.token, parse.args[2]) + .stream() + .map(args -> parse.current.prefix + args) + .collect(GuavaCollectors.toImmutableList()); + } else if (isIn(WORLDREGIONS_ALIASES, parse.args[0])) { return FGFactoryManager.getInstance().worldRegionSuggestions(source, parse.current.token, parse.args[2]) .stream() .map(args -> parse.current.prefix + args) @@ -365,4 +574,98 @@ public Optional getHelp(@Nonnull CommandSource source) { public Text getUsage(@Nonnull CommandSource source) { return Text.of("create ] | handler> [--priority:] [args...]"); } + + private enum FGCat { + REGION(REGIONS_ALIASES, FGFactoryManager.getInstance()::getRegionTypeAliases) { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return FGManager.getInstance().isRegionNameAvailable(name, owner); + } + + @Override + public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + return FGFactoryManager.getInstance().createRegion(name, type, arguments, source); + } + + @Override + public boolean add(IFGObject object, UUID owner, @Nullable World world) { + return object instanceof IRegion + && FGManager.getInstance().addRegion(((IRegion) object), owner, world); + } + }, + WORLDREGION(WORLDREGIONS_ALIASES, FGFactoryManager.getInstance()::getWorldRegionTypeAliases) { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + if (world == null) + return FGManager.getInstance().isWorldRegionNameAvailable(name, owner) == Tristate.TRUE; + else return FGManager.getInstance().isWorldRegionNameAvailable(name, owner, world); + } + + @Override + public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + return FGFactoryManager.getInstance().createWorldRegion(name, type, arguments, source); + } + + @Override + public boolean add(IFGObject object, UUID owner, @Nullable World world) { + return world != null + && object instanceof IWorldRegion + && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), owner, world); + } + }, + HANDLER(HANDLERS_ALIASES, FGFactoryManager.getInstance()::getHandlerTypeAliases) { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return FGManager.getInstance().isHandlerNameAvailable(name, owner); + } + + @Override + public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + return FGFactoryManager.getInstance().createHandler(name, type, arguments, source); + } + + @Override + public boolean add(IFGObject object, UUID owner, @Nullable World world) { + return object instanceof IHandler + && FGManager.getInstance().addHandler(((IHandler) object), owner); + } + }, + CONTROLLER(CONTROLLERS_ALIASES, FGFactoryManager.getInstance()::getControllerTypeAliases) { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return HANDLER.isNameAvailable(name, owner, world); + } + + @Override + public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + return FGFactoryManager.getInstance().createController(name, type, arguments, source); + } + + @Override + public boolean add(IFGObject object, UUID owner, @Nullable World world) { + return HANDLER.add(object, owner, world); + } + }; + + String[] catAliases; + Supplier> typeAliases; + + FGCat(String[] catAliases, Supplier> typeAliases) { + this.catAliases = catAliases; + this.typeAliases = typeAliases; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + + public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); + + public abstract IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException; + + public abstract boolean add(IFGObject object, UUID owner, @Nullable World world); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index a17f0af..c8b6c95 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -119,7 +119,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.success(); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); if (!handlerOpt.isPresent()) throw new ArgumentParseException(Text.of("No handler exists with that name!"), parse.args[1], 1); IHandler handler = handlerOpt.get(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 16c6f0c..b3a3b6c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -35,6 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; +import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -54,12 +55,15 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; +import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; public class CommandDetail extends FCCommandBase { @@ -93,27 +97,11 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } else if (isIn(REGIONS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - IRegion region = null; - /*FGManager.getInstance().getRegion(parse.args[1]); - if (region == null) { - String worldName = parse.flags.get("world"); - World world = null; - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]); - } - if (region == null) - throw new CommandException(Text.of("No region exists with the name \"" + parse.args[1] + "\"!"));*/ + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); + String worldName = parse.flags.get("world"); + + IRegion region = FGUtil.getRegionFromCommand(source, ownerResult, worldName); Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); @@ -125,11 +113,22 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(TextColors.GOLD, "Type: "), Text.of(TextColors.RESET, region.getLongTypeName() + "\n")); builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "Enabled: ")) - .append(Text.of(TextColors.RESET, (region.isEnabled() ? "True" : "False") + "\n")) + .append(Text.of((region.isEnabled() ? TextColors.GREEN : TextColors.RED), (region.isEnabled() ? "True" : "False") + "\n")) .onClick(TextActions.runCommand("/foxguard " + (region.isEnabled() ? "disable" : "enable") + " r " + FGUtil.genWorldFlag(region) + region.getName())) .onHover(TextActions.showText(Text.of("Click to " + (region.isEnabled() ? "disable" : "enable")))) .build()); + UUID owner = region.getOwner(); + if (owner != null && owner != FGManager.SERVER_UUID) { + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + builder.append(Text.builder() + .append(Text.of(TextColors.GOLD, "Owner: ")) + .append(registry.getDisplayText(owner, null, source)) + .append(Text.NEW_LINE) + .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) + .build() + ); + } if (region instanceof IWorldRegion) builder.append(Text.of(TextColors.GOLD, "World: "), Text.of(TextColors.RESET, ((IWorldRegion) region).getWorld().getName() + "\n")); builder.append(Text.of(TextActions.suggestCommand("/foxguard modify region " + FGUtil.genWorldFlag(region) + region.getName() + " "), @@ -169,13 +168,21 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } source.sendMessage(builder.build()); return CommandResult.empty(); + //-------------------------------------------------------------------------------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------------------------------------------------------------------------------- } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); + + Optional handlerOpt = FGManager.getInstance().getHandler(ownerResult.getName(), ownerResult.getOwner()); if (!handlerOpt.isPresent()) - throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); + throw new CommandException(Text.of("No handler exists with the name \"" + ownerResult.getName() + "\"" + + (ownerResult.getOwner() != SERVER_UUID ? " and owner \"" + ownerResult.getOwnerName() + "\"" : "") + + "!")); IHandler handler = handlerOpt.get(); + Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); if (parse.args.length <= 2 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) { @@ -184,12 +191,26 @@ public CommandResult process(CommandSource source, String arguments) throws Comm TextColors.GREEN, "------- General -------\n", TextColors.GOLD, "Name: ", TextColors.RESET, handler.getName() + "\n")); builder.append(Text.of(TextColors.GOLD, "Type: "), Text.of(TextColors.RESET, handler.getLongTypeName() + "\n")); + builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "Enabled: ")) - .append(Text.of(TextColors.RESET, (handler.isEnabled() ? "True" : "False") + "\n")) + .append(Text.of((handler.isEnabled() ? TextColors.GREEN : TextColors.RED), (handler.isEnabled() ? "True" : "False") + "\n")) .onClick(TextActions.runCommand("/foxguard " + (handler.isEnabled() ? "disable" : "enable") + " h " + handler.getName())) .onHover(TextActions.showText(Text.of("Click to " + (handler.isEnabled() ? "disable" : "enable")))) .build()); + + UUID owner = handler.getOwner(); + if (owner != null && owner != FGManager.SERVER_UUID) { + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + builder.append(Text.builder() + .append(Text.of(TextColors.GOLD, "Owner: ")) + .append(registry.getDisplayText(owner, null, source)) + .append(Text.NEW_LINE) + .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) + .build() + ); + } + builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "Priority: ")) .append(Text.of(TextColors.RESET, handler.getPriority() + "\n")) @@ -285,7 +306,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(FGUtil.getColorForObject(region), TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), - FGUtil.getRegionName(region, true) + FGUtil.getRegionDisplayName(region, true) )); }); if (handler instanceof IController) { @@ -446,4 +467,5 @@ public Optional getHelp(CommandSource source) { public Text getUsage(CommandSource source) { return Text.of("detail ] | handler> [args...]"); } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 72e0427..3abb74c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -180,7 +180,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm List handlers = new ArrayList<>(); FGUtil.getSelectedHandlers(source).forEach(handlers::add); for (String name : Arrays.copyOfRange(parse.args, 1, parse.args.length)) { - IHandler handler = FGManager.getInstance().gethandler(name).orElse(null); + IHandler handler = FGManager.getInstance().getHandler(name).orElse(null); if (handler == null) failures++; else { handlers.add(handler); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 26d2413..3956d42 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -170,7 +170,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm output.append(Text.of(FGUtil.getColorForObject(region), TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), TextActions.showText(Text.of("View details")), - FGUtil.getRegionName(region, false))); + FGUtil.getRegionDisplayName(region, false))); if (regionListIterator.hasNext()) output.append(Text.NEW_LINE); } flag = true; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index 3cfd5e4..34c4044 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -114,7 +114,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (region == null) throw new CommandException(Text.of("No region with name \"" + parse.args[0] + "\" in world \"" + world.getName() + "\"!")); if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler!")); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); IHandler handler = handlerOpt.get(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index 530fbfa..64d131b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -99,15 +99,15 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (!worldName.isEmpty()) { Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); if (optWorld.isPresent()) { - FGManager.getInstance().getWorldRegions(optWorld.get()).forEach(regionList::add); + regionList.addAll(FGManager.getInstance().getWorldRegions(optWorld.get())); if (parse.flags.containsKey("super")) - FGManager.getInstance().getRegions().forEach(regionList::add); + regionList.addAll(FGManager.getInstance().getRegions()); allFlag = false; } } if (allFlag) { - if (parse.flags.containsKey("super")) FGManager.getInstance().getRegions().forEach(regionList::add); - else FGManager.getInstance().getAllRegions().forEach(regionList::add); + if (parse.flags.containsKey("super")) regionList.addAll(FGManager.getInstance().getRegions()); + else regionList.addAll(FGManager.getInstance().getAllRegions()); } if (parse.flags.containsKey("query")) { String query = parse.flags.get("query"); @@ -183,7 +183,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(FGUtil.getColorForObject(region), TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + region.getName()), TextActions.showText(Text.of("View details")), - FGUtil.getRegionName(region, allFlag))); + FGUtil.getRegionDisplayName(region, allFlag))); count++; if (regionIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); } @@ -194,7 +194,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm //---------------------------------------------------------------------------------------------------------- } else if (isIn(Aliases.HANDLERS_ALIASES, parse.args[0])) { boolean controllers = parse.flags.containsKey("all"); - List handlerList = FGManager.getInstance().getHandlers(controllers).stream().collect(Collectors.toList()); + List handlerList = new ArrayList<>(FGManager.getInstance().getHandlers(controllers)); if (parse.flags.containsKey("query")) { String query = parse.flags.get("query"); if (query.startsWith("/")) { @@ -309,7 +309,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm //---------------------------------------------------------------------------------------------------------- } else if (isIn(Aliases.CONTROLLERS_ALIASES, parse.args[0])) { - List controllerList = FGManager.getInstance().getControllers().stream().collect(Collectors.toList()); + List controllerList = new ArrayList<>(FGManager.getInstance().getControllers()); if (parse.flags.containsKey("query")) { String query = parse.flags.get("query"); if (query.startsWith("/")) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index 4fbe49f..fe88adc 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -133,7 +133,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler name!")); - IHandler handler = FGManager.getInstance().gethandler(parse.args[1]).orElse(null); + IHandler handler = FGManager.getInstance().getHandler(parse.args[1]).orElse(null); if (handler == null) throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); ProcessResult result = handler.modify(source, parse.args.length < 3 ? "" : parse.args[2]); @@ -252,7 +252,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF .collect(GuavaCollectors.toImmutableList()); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) return ImmutableList.of(); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); if (!handlerOpt.isPresent()) return ImmutableList.of(); List suggestions = handlerOpt.get().modifySuggestions(source, parse.current.token, null); if (suggestions == null) return ImmutableList.of(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index 97a7156..45ac7c7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -79,7 +79,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm PriorityMachine temp = new PriorityMachine(arg); if (machine == null) machine = temp; } catch (NumberFormatException ignored) { - IHandler handler = FGManager.getInstance().gethandler(arg).orElse(null); + IHandler handler = FGManager.getInstance().getHandler(arg).orElse(null); if (handler != null && !handlers.contains(handler)) { handlers.add(handler); } else { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java index 73dab09..e162976 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java @@ -126,7 +126,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm source.sendMessage(Text.of(TextColors.GREEN, "Region \"" + oldName + "\" successfully renamed to \"" + parse.args[2] + "\"!")); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("You must specify a name!")); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[1]); + Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); if (!handlerOpt.isPresent()) throw new CommandException(Text.of("No handler exists with the name \"" + parse.args[1] + "\"!")); IHandler handler = handlerOpt.get(); @@ -140,7 +140,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm throw new ArgumentParseException(Text.of("New name (\"" + parse.args[2] + "\") can't start with a number!"), parse.args[2], 1); if (handler.getName().equalsIgnoreCase(parse.args[2])) throw new CommandException(Text.of("You cannot rename a handler to its own name.")); - if (FGManager.getInstance().gethandler(parse.args[2]) != null) + if (FGManager.getInstance().getHandler(parse.args[2]) != null) throw new CommandException(Text.of("There is already a handler with the name \"" + parse.args[2] + "\"!")); String oldName = handler.getName(); FGManager.getInstance().rename(handler, parse.args[2]); @@ -220,7 +220,7 @@ else if (parse.current.index == 1) { available = Tristate.fromBoolean(FGManager.getInstance().isRegionNameAvailable(parse.current.token)); } } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { - available = Tristate.fromBoolean(FGManager.getInstance().gethandler(parse.current.token) == null); + available = Tristate.fromBoolean(FGManager.getInstance().getHandler(parse.current.token) == null); } if (available != null) { switch (available) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java index 49c91f1..f5561ed 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandSave.java @@ -29,9 +29,10 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; +import org.slf4j.Logger; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; @@ -41,10 +42,11 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.FORCE_ALIASES; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; @@ -70,10 +72,27 @@ public CommandResult process(CommandSource source, String arguments) throws Comm boolean force = parse.flags.containsKey("force"); FoxGuardMain.instance().getLogger().info(force ? "Force saving objects" : "Saving objects"); - FGStorageManager.getInstance().saveRegions(force); - Sponge.getServer().getWorlds().forEach(world -> FGStorageManager.getInstance().saveWorldRegions(world, force)); - FGStorageManager.getInstance().saveHandlers(force); - FGStorageManagerNew.getInstance().saveHandlerIndex(); + //FGStorageManager.getInstance().saveRegions(force); + //Sponge.getServer().getWorlds().forEach(world -> FGStorageManager.getInstance().saveWorldRegions(world, force)); + //FGStorageManager.getInstance().saveHandlers(force); + + Logger logger = FoxGuardMain.instance().getLogger(); + + FGStorageManagerNew storage = FGStorageManagerNew.getInstance(); + storage.saveRegionIndex(); + Sponge.getServer().getWorlds().forEach(storage::saveWorldRegionIndex); + storage.saveHandlerIndex(); + + FGManager manager = FGManager.getInstance(); + logger.info("Saving regions"); + storage.saveObjects(manager.getRegions(), force); + Sponge.getServer().getWorlds().forEach(world -> { + logger.info("Saving worldregions for world: " + world.getName()); + storage.saveObjects(manager.getWorldRegions(world), force); + }); + logger.info("Saving handlers"); + storage.saveObjects(manager.getHandlers(), force); + source.sendMessage(Text.of(TextColors.GREEN, "Successfully saved!")); return CommandResult.success(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java index a5885a7..4428cba 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java @@ -26,20 +26,34 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; +import com.flowpowered.math.vector.Vector2i; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; +import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; +import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; +import net.foxdenstudio.sponge.foxcore.plugin.util.BoundingBox2; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.RectangularRegion; +import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.world.Locatable; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import javax.annotation.Nullable; + +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.WORLD_ALIASES; +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; + public class CommandTest extends FCCommandBase { /* @@ -115,6 +129,14 @@ public Text getUsage(CommandSource source) { return Text.of("test [mystery args]..."); } + private static final FlagMapper MAPPER = map -> key -> value -> { + map.put(key, value); + if (isIn(WORLD_ALIASES, key) && !map.containsKey("world")) { + map.put("world", value); + } + return true; + }; + @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { @@ -122,7 +144,56 @@ public CommandResult process(CommandSource source, String arguments) throws Comm "command!")); return CommandResult.empty(); } - return CommandResult.empty(); + + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .flagMapper(MAPPER) + .parse(); + + String worldName = parse.flags.get("world"); + World world = null; + + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + if (world == null) + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } + if (world == null) throw new CommandException(Text.of("Must specify a world!")); + + if (parse.args.length == 0) return CommandResult.empty(); + int amount; + try { + amount = Integer.parseInt(parse.args[0]); + } catch (NumberFormatException e) { + return CommandResult.empty(); + } + int counter = 1; + String name; + if (parse.args.length > 1) { + name = parse.args[1]; + } else name = "region"; + + FGManager manager = FGManager.getInstance(); + + for (int i = 1; i <= amount; ) { + String numberName = name + counter; + if (manager.isWorldRegionNameAvailable(numberName, world)) { + FGObjectData data = new FGObjectData(); + data.setName(numberName); + IWorldRegion region = new RectangularRegion(data, new BoundingBox2(new Vector2i(-i, -i), new Vector2i(i, i))); + manager.addWorldRegion(region, world); + i++; + } + counter++; + } + + source.sendMessage(Text.of(TextColors.GREEN, "Successfully created " + amount + " regions!")); + return CommandResult.success(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java index 9bdcdd9..53e2b8d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java @@ -243,7 +243,7 @@ private Set parseSegment(String segmentString, CommandSource source Optional regionOpt = FGManager.getInstance().getRegionFromWorld(currentWorld, token); regionOpt.ifPresent(stubObjects::add); } else { - Optional handlerOpt = FGManager.getInstance().gethandler(token); + Optional handlerOpt = FGManager.getInstance().getHandler(token); handlerOpt.ifPresent(stubObjects::add); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index fda473e..0e2c1b4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -27,7 +27,7 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerBase; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; @@ -73,12 +73,12 @@ public void clearLinks() { @Override public void loadLinks(Path directory, List savedList) { - try (DB linksDB = FGStorageManager.openFoxDB(directory.resolve("links.foxdb"))) { + try (DB linksDB = FGStorageManagerOld.openFoxDB(directory.resolve("links.foxdb"))) { List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); handlers.clear(); linksList.stream() .filter(name -> !this.name.equalsIgnoreCase(name)) - .map(name -> FGManager.getInstance().gethandler(name)) + .map(name -> FGManager.getInstance().getHandler(name)) .filter(Optional::isPresent) .map(Optional::get) .forEach(handlers::add); @@ -87,7 +87,7 @@ public void loadLinks(Path directory, List savedList) { } protected void saveLinks(Path directory) { - try (DB linksDB = FGStorageManager.openFoxDB(directory.resolve("links.foxdb"))) { + try (DB linksDB = FGStorageManagerOld.openFoxDB(directory.resolve("links.foxdb"))) { List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); linksList.clear(); handlers.stream().map(IFGObject::getName).forEach(linksList::add); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java index 37d1da8..dc4af2d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java @@ -29,10 +29,14 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import java.nio.file.Path; +import java.util.Collection; import java.util.List; public interface IController extends IHandler, ILinkable { + @Override + List getLinks(); + void loadLinks(Path directory, List savedList); /** diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 3bb7664..51b7f65 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -34,7 +34,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; @@ -43,6 +43,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.util.TristateEntry; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.foxdenstudio.sponge.foxguard.plugin.util.EverythingSet; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -243,7 +244,7 @@ public BasicHandler(HandlerData data, public static boolean isNameValid(String name) { return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && !name.equalsIgnoreCase("default") && - !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); + !isIn(FGStorageManagerNew.FS_ILLEGAL_NAMES, name); } public ProcessResult modify(CommandSource source, String arguments) throws CommandException { @@ -1154,14 +1155,14 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { - FGStorageManager storageManager = FGStorageManager.getInstance(); + FGStorageManagerOld storageManager = FGStorageManagerOld.getInstance(); UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); } - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : this.groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); stringEntries.clear(); @@ -1660,9 +1661,9 @@ public IHandler create(String name, String arguments, CommandSource source) thro @Override public IHandler create(Path directory, HandlerData data) { - FGStorageManager storageManager = FGStorageManager.getInstance(); + FGStorageManagerOld storageManager = FGStorageManagerOld.getInstance(); List groupNames = new ArrayList<>(); - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); } Path groupsDirectory = directory.resolve("groups"); @@ -1689,7 +1690,7 @@ public IHandler create(Path directory, HandlerData data) { } Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); groupPermissions.put(group, stringEntries.stream() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 285ab69..78493c5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -33,7 +33,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; @@ -41,6 +41,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.util.TristateEntry; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import ninja.leaping.configurate.commented.CommentedConfigurationNode; @@ -62,7 +63,6 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -70,6 +70,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; import static org.spongepowered.api.util.Tristate.UNDEFINED; @@ -185,7 +187,7 @@ public GroupHandler(HandlerData data, public static boolean isNameValid(String name) { return !name.matches("^.*[ :\\.=;\"\'\\\\/\\{\\}\\(\\)\\[\\]<>#@\\|\\?\\*].*$") && !name.equalsIgnoreCase("default") && - !isIn(FGStorageManager.FS_ILLEGAL_NAMES, name); + !isIn(FGStorageManagerNew.FS_ILLEGAL_NAMES, name); } public ProcessResult modify(CommandSource source, String arguments) throws CommandException { @@ -910,12 +912,12 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); } - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : this.groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); stringEntries.clear(); @@ -1242,7 +1244,7 @@ public IHandler create(String name, String arguments, CommandSource source) thro @Override public IHandler create(Path directory, HandlerData data) { - if(Files.exists(directory.resolve("groups.foxdb")) || Files.exists(directory.resolve("flags.foxdb"))){ + if (Files.exists(directory.resolve("groups.foxdb")) || Files.exists(directory.resolve("flags.foxdb"))) { return createOld(directory, data); } return null; @@ -1250,7 +1252,7 @@ public IHandler create(Path directory, HandlerData data) { public IHandler createOld(Path directory, HandlerData data) { List groupNames = new ArrayList<>(); - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("groups.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); } List groups = new ArrayList<>(); @@ -1272,7 +1274,7 @@ public IHandler createOld(Path directory, HandlerData data) { Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = FGStorageManager.openFoxDB(directory.resolve("flags.foxdb"))) { + try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); groupPermissions.put(group, stringEntries.stream() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java index 37c75f1..5dd8f14 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java @@ -33,6 +33,17 @@ public class HandlerData extends FGObjectData { protected int priority = 0; + public HandlerData() { + super(); + } + + public HandlerData(FGObjectData data, int priority) { + this.name = data.getName(); + this.owner = data.getOwner(); + this.enabled = data.isEnabled(); + this.priority = priority; + } + public int getPriority() { return priority; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index ecf1064..8b611e5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -118,26 +118,29 @@ public void handle(ChangeBlockEvent event) throws Exception { .forEach(handlerSet::add)); } Tristate flagState = UNDEFINED; - if (!handlerSet.isEmpty()) { - List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); - int currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; - } - EventResult result = handler.handle(user, flags, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); - } - currPriority = handler.getPriority(); - } - } else { + + if (handlerSet.isEmpty()) { FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + return; } + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); + } + + if (flagState == FALSE) { if (user instanceof Player) { if (CommandDebug.instance().getDebug().get(user)) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index ab5a181..d9b1726 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -104,111 +104,111 @@ public void handle(DamageEntityEvent event) throws Exception { .forEach(handlerSet::add)); Tristate flagState = UNDEFINED; boolean invincible = false; - if (!handlerSet.isEmpty()) { - List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); - int currPriority; - if (entity instanceof Player) { - currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; - } - EventResult result = handler.handle(player, INVINCIBLE_FLAG_SET, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); - } - currPriority = handler.getPriority(); + if (handlerSet.isEmpty()) { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + } + + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + + int currPriority; + if (entity instanceof Player) { + currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, INVINCIBLE_FLAG_SET, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); } + currPriority = handler.getPriority(); + } - if (flagState == TRUE) { - invincible = true; - flagState = FALSE; + if (flagState == TRUE) { + invincible = true; + flagState = FALSE; + } + } + if (!invincible) { + currPriority = handlerList.get(0).getPriority(); + flagState = UNDEFINED; + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); } + currPriority = handler.getPriority(); + } +// if(flagState == UNDEFINED) flagState = TRUE; + } + if (flagState == FALSE) { + if (player != null && player.isOnline() && !invincible) { + player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); } - if (!invincible) { - currPriority = handlerList.get(0).getPriority(); + event.setCancelled(true); + } else { + if (event.willCauseDeath()) { + flags.set(KILL); flagState = UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; + invincible = false; + if (entity instanceof Player) { + currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; + } + EventResult result = handler.handle(player, UNDYING_FLAG_SET, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); } - EventResult result = handler.handle(player, flags, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); +// if(flagState == UNDEFINED) flagState = FALSE; + if (flagState == TRUE) { + invincible = true; + flagState = FALSE; } - currPriority = handler.getPriority(); - } -// if(flagState == UNDEFINED) flagState = TRUE; - } - if (flagState == FALSE) { - if (player != null && player.isOnline() && !invincible) { - player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); } - event.setCancelled(true); - } else { - if (event.willCauseDeath()) { - flags.set(KILL); + if (!invincible) { + currPriority = handlerList.get(0).getPriority(); flagState = UNDEFINED; - invincible = false; - if (entity instanceof Player) { - currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; - } - EventResult result = handler.handle(player, UNDYING_FLAG_SET, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); - } - currPriority = handler.getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != UNDEFINED) { + break; } -// if(flagState == UNDEFINED) flagState = FALSE; - if (flagState == TRUE) { - invincible = true; - flagState = FALSE; + EventResult result = handler.handle(player, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); } + currPriority = handler.getPriority(); } - if (!invincible) { - currPriority = handlerList.get(0).getPriority(); - flagState = UNDEFINED; - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != UNDEFINED) { - break; - } - EventResult result = handler.handle(player, flags, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); - } - currPriority = handler.getPriority(); - } // if(flagState == UNDEFINED) flagState = TRUE; - } - if (flagState == FALSE) { - DamageModifier.Builder builder = DamageModifier.builder(); - builder.type(DamageModifierTypes.ABSORPTION); - builder.cause(FoxGuardMain.getCause()); - event.setDamage(builder.build(), damage -> ((Living) event.getTargetEntity()).getHealthData().health().get() - damage - 1); - if (player != null && player.isOnline() && !invincible) - player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission to kill!")); - } } - //makes sure that handlers are unable to cancel the event directly. - event.setCancelled(false); + if (flagState == FALSE) { + DamageModifier.Builder builder = DamageModifier.builder(); + builder.type(DamageModifierTypes.ABSORPTION); + builder.cause(FoxGuardMain.getCause()); + event.setDamage(builder.build(), damage -> ((Living) event.getTargetEntity()).getHealthData().health().get() - damage - 1); + if (player != null && player.isOnline() && !invincible) + player.sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission to kill!")); + } } - } else { - FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + //makes sure that handlers are unable to cancel the event directly. + event.setCancelled(false); } - } private Player getPlayerCause(Cause cause) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index 7a8b439..9a070b9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -121,27 +121,29 @@ public void handle(ExplosionEvent event) throws Exception { } Tristate flagState = Tristate.UNDEFINED; - if (!handlerSet.isEmpty()) { - List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); - - int currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { - break; - } - EventResult result = handler.handle(user, flags, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); - } - currPriority = handler.getPriority(); - } - } else { + if (handlerSet.isEmpty()) { FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + return; + } + + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" of type \"" + handler.getUniqueTypeString() + "\" returned null!"); + } + currPriority = handler.getPriority(); } + if (flagState == Tristate.FALSE) { if (user instanceof Player) ((Player) user).sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java index b3c124f..30bc67b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java @@ -27,6 +27,7 @@ import com.flowpowered.math.vector.Vector3i; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; @@ -42,9 +43,7 @@ import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.World; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; import static org.spongepowered.api.util.Tristate.FALSE; @@ -82,14 +81,20 @@ public void handle(InteractBlockEvent event) throws Exception { } - List handlerList = new ArrayList<>(); + Set handlerSet = new HashSet<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) - .filter(handler -> !handlerList.contains(handler)) - .forEach(handlerList::add)); + .filter(handler -> !handlerSet.contains(handler)) + .forEach(handlerSet::add)); + if (handlerSet.isEmpty()) { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + return; + } + + List handlerList = new ArrayList<>(handlerSet); Collections.sort(handlerList); int currPriority = handlerList.get(0).getPriority(); Tristate flagState = UNDEFINED; @@ -97,11 +102,9 @@ public void handle(InteractBlockEvent event) throws Exception { if (handler.getPriority() < currPriority && flagState != UNDEFINED) { break; } - //flagState = flagState.and(handler.handle(user, typeFlag, Optional.of(event)).getState()); flagState = flagState.and(handler.handle(user, flags, ExtraContext.of(event)).getState()); currPriority = handler.getPriority(); } -// if (flagState == UNDEFINED) flagState = TRUE; if (flagState == FALSE) { if (user instanceof Player) ((Player) user).sendMessage(ChatTypes.ACTION_BAR, Text.of("You don't have permission!")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index aaeb31a..429eee8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -27,6 +27,7 @@ import com.flowpowered.math.vector.Vector3d; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; @@ -46,9 +47,7 @@ import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.World; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; import static org.spongepowered.api.util.Tristate.FALSE; @@ -107,18 +106,24 @@ public void handle(InteractEntityEvent event) throws Exception { flags.set(HANGING); } - List handlerList = new ArrayList<>(); + Set handlerSet = new HashSet<>(); FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() .filter(IFGObject::isEnabled) - .filter(handler -> !handlerList.contains(handler)) - .forEach(handlerList::add)); + .filter(handler -> !handlerSet.contains(handler)) + .forEach(handlerSet::add)); + if (handlerSet.isEmpty()) { + FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + return; + } + + List handlerList = new ArrayList<>(handlerSet); Collections.sort(handlerList); int currPriority = handlerList.get(0).getPriority(); Tristate flagState = UNDEFINED; - for (IHandler handler : handlerList) { + for (IHandler handler : handlerSet) { if (handler.getPriority() < currPriority && flagState != UNDEFINED) { break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 5220c2c..26d0e38 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -232,7 +232,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionName(region, false))); + " " + FGUtil.getRegionDisplayName(region, false))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -250,7 +250,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionName(region, false))); + " " + FGUtil.getRegionDisplayName(region, false))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index c9182be..c3db642 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -175,7 +175,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionName(region, false))); + " " + FGUtil.getRegionDisplayName(region, false))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -193,7 +193,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionName(region, false))); + " " + FGUtil.getRegionDisplayName(region, false))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index 451ef67..dd012fb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -119,25 +119,26 @@ public void handle(SpawnEntityEvent event) throws Exception { .forEach(handlerSet::add)); } Tristate flagState = Tristate.UNDEFINED; - if (!handlerSet.isEmpty()) { - List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); - int currPriority = handlerList.get(0).getPriority(); - for (IHandler handler : handlerList) { - if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { - break; - } - EventResult result = handler.handle(user, flags, ExtraContext.of(event)); - if (result != null) { - flagState = flagState.and(result.getState()); - } else { - FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" returned null!"); - } - currPriority = handler.getPriority(); - } - } else { + if (handlerSet.isEmpty()) { FoxGuardMain.instance().getLogger().error("Handlers list is empty for event: " + event); + return; } + List handlerList = new ArrayList<>(handlerSet); + Collections.sort(handlerList); + int currPriority = handlerList.get(0).getPriority(); + for (IHandler handler : handlerList) { + if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { + break; + } + EventResult result = handler.handle(user, flags, ExtraContext.of(event)); + if (result != null) { + flagState = flagState.and(result.getState()); + } else { + FoxGuardMain.instance().getLogger().error("Handler \"" + handler.getName() + "\" returned null!"); + } + currPriority = handler.getPriority(); + } + if (flagState == Tristate.FALSE) { if (user instanceof Player) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index 68232ab..80dad78 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -37,7 +37,7 @@ public abstract class FGObjectBase implements IFGObject { public FGObjectBase(FGObjectData data) { String name = data.getName(); - this.name = name == null ? "" : name; + this.name = (name == null || name.isEmpty()) ? "null" : name; UUID owner = data.getOwner(); this.owner = owner == null ? FGManager.SERVER_UUID : owner; this.enabled = data.isEnabled(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java index c7a3fea..9a4a28a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java @@ -31,9 +31,23 @@ public class FGObjectData { - protected String name = ""; - protected UUID owner = FGManager.SERVER_UUID; - protected boolean enabled = true; + protected String name; + protected UUID owner; + protected boolean enabled; + + public FGObjectData(String name, UUID owner, boolean enabled) { + if (name == null) this.name = ""; + else this.name = name; + + if(owner == null) this.owner = FGManager.SERVER_UUID; + else this.owner = owner; + + this.enabled = enabled; + } + + public FGObjectData() { + this("", FGManager.SERVER_UUID, true); + } public String getName() { return name; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 3d5b8e9..a22e79d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -27,11 +27,11 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.IModifiable; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; import net.foxdenstudio.sponge.foxguard.plugin.command.CommandDetail; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; @@ -168,7 +168,7 @@ default boolean autoSave() { ProcessResult modify(CommandSource source, String arguments) throws CommandException; default boolean shouldSave() { - return FGStorageManager.getInstance().defaultModifiedMap.get(this); + return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java index b26fa0c..9b4eaae 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/FGFactoryManager.java @@ -103,10 +103,10 @@ public IWorldRegion createWorldRegion(Path directory, String type, FGObjectData } - public IHandler createHandler(String name, String type, int priority, String args, CommandSource source) throws CommandException { + public IHandler createHandler(String name, String type, String arguments, CommandSource source) throws CommandException { for (IHandlerFactory hf : handlerFactories) { if (isIn(hf.getAliases(), type)) { - IHandler handler = hf.create(name, args, source); + IHandler handler = hf.create(name, arguments, source); if (handler != null) return handler; } } @@ -123,10 +123,10 @@ public IHandler createHandler(Path directory, String type, HandlerData data) { return null; } - public IController createController(String name, String type, int priority, String args, CommandSource source) throws CommandException { + public IController createController(String name, String type, String arguments, CommandSource source) throws CommandException { for (IControllerFactory cf : controllerFactories) { if (isIn(cf.getAliases(), type)) { - IController controller = cf.create(name, args, source); + IController controller = cf.create(name, arguments, source); if (controller != null) return controller; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java new file mode 100644 index 0000000..4f489e3 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java @@ -0,0 +1,57 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.Text; + +import java.util.Optional; +import java.util.UUID; + +import javax.annotation.Nullable; + +/** + * Created by Fox on 8/28/2017. + * Project: SpongeForge + */ +public interface IDisplayableOwnerProvider extends IOwnerProvider { + + default Optional getDisplayName(UUID owner, @Nullable CommandSource viewer) { + if (viewer instanceof Player) + return getKeyword(owner); + else return getKeyword(owner).map(str->str + "(" + owner.toString() + ")"); + } + + default Optional getDisplayText(UUID owner, @Nullable CommandSource viewer) { + return getDisplayName(owner, viewer).map(Text::of); + } + + default Optional getHoverText(UUID owner, @Nullable CommandSource viewer) { + return Optional.of(Text.of(owner.toString())); + } + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java index 187c878..6b69a7b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java @@ -31,6 +31,8 @@ import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; + /** * Created by Fox on 12/21/2016. */ @@ -38,13 +40,9 @@ public interface IOwnerProvider { List getOwnerKeywords(); - Optional getOwnerUUID(String keyword); - - Optional getKeyword(UUID uuid); + Optional getOwnerUUID(@Nullable String keyword); - default Optional getName(UUID uuid){ - return getKeyword(uuid); - } + Optional getKeyword(UUID owner); String[] getAliases(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java index 150df52..10dc9fb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java @@ -10,10 +10,12 @@ import java.util.Optional; import java.util.UUID; +import javax.annotation.Nullable; + /** * Created by Fox on 12/31/2016. */ -public class OfflineUserProvider implements IOwnerProvider { +public class OfflineUserProvider implements IDisplayableOwnerProvider { private static final String[] ALIASES = {"offline", "off", "o"}; @@ -31,13 +33,14 @@ public List getOwnerKeywords() { } @Override - public Optional getOwnerUUID(String keyword) { + public Optional getOwnerUUID(@Nullable String keyword) { + if(keyword == null || keyword.isEmpty()) return Optional.empty(); return service.get(keyword).map(User::getUniqueId); } @Override - public Optional getKeyword(UUID uuid) { - return service.get(uuid).map(User::getName); + public Optional getKeyword(UUID owner) { + return service.get(owner).map(User::getName); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java index 9125e00..bdf73ad 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java @@ -11,9 +11,9 @@ /** * Created by Fox on 12/31/2016. */ -public class OnlinePlayerProvider implements IOwnerProvider { +public class OnlinePlayerProvider implements IDisplayableOwnerProvider { - private static final String[] ALIASES = {"online", "on"}; + private static final String[] ALIASES = {"player", "p"}; @Override public List getOwnerKeywords() { @@ -25,12 +25,13 @@ public List getOwnerKeywords() { @Override public Optional getOwnerUUID(String keyword) { + if (keyword == null || keyword.isEmpty()) return Optional.empty(); return Sponge.getServer().getPlayer(keyword).map(Player::getUniqueId); } @Override - public Optional getKeyword(UUID uuid) { - return Sponge.getServer().getPlayer(uuid).map(Player::getName); + public Optional getKeyword(UUID owner) { + return Sponge.getServer().getPlayer(owner).map(Player::getName); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java index ca44950..312e4b8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java @@ -25,12 +25,18 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.text.Text; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.security.SecureRandom; import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; + +import javax.annotation.Nullable; /** * Created by Fox on 12/22/2016. @@ -40,21 +46,47 @@ public class OwnerProviderRegistry { private static final SecureRandom sRandom = new SecureRandom(); private static OwnerProviderRegistry instance; - - public static OwnerProviderRegistry getInstance() { - if(instance == null) instance = new OwnerProviderRegistry(); - return instance; - } - private Set inUse = new HashSet<>(); private List ownerProviders; public OwnerProviderRegistry() { ownerProviders = new ArrayList<>(); + ownerProviders.add(UUIDProvider.getInstance()); ownerProviders.add(new OnlinePlayerProvider()); ownerProviders.add(new OfflineUserProvider()); } + public static OwnerProviderRegistry getInstance() { + if (instance == null) instance = new OwnerProviderRegistry(); + return instance; + } + + /** + * This method checks if a {@link UUID} could potentially be a player {@link UUID}. + * It does this by checking if it's a v3 or v4 uuid. + * For our purposes, it really doesn't matter that we're breaking RFC spec, + * because all we care about is avoiding name conflicts. + * Beyond that, UUID is just a convenient method of keeping track of owners. + * + * @param uuid the {@link UUID} to check + * @return Whether this is a v3 or v4 {@link UUID}, meaning whether it could be a player {@link UUID}. + */ + public static boolean isPlayerUUID(UUID uuid) { + byte a = (byte) (uuid.getMostSignificantBits() >>> 12 & 0xf); + byte b = (byte) (uuid.getLeastSignificantBits() >>> 60 & 0xf); + return (a == 0x3 || a == 0x4) && b >= 0x8 && b <= 0xb; + } + + private static UUID uuidFromBytes(byte[] data) { + long msb = 0; + long lsb = 0; + for (int i = 0; i < 8; i++) + msb = (msb << 8) | (data[i] & 0xff); + for (int i = 8; i < 16; i++) + lsb = (lsb << 8) | (data[i] & 0xff); + return new UUID(msb, lsb); + } + /** * Registers a {@link UUID} for use as a virtual player owner. * This ensures that this UUID will not be used elsewhere due to collisions. @@ -67,6 +99,10 @@ public boolean registerUUID(UUID uuid) { return !isPlayerUUID(uuid) && inUse.add(uuid); } + public boolean isRegistered(UUID uuid) { + return inUse.contains(uuid); + } + public boolean unregisterUUID(UUID uuid) { return inUse.remove(uuid); } @@ -109,42 +145,90 @@ public boolean registerProvider(IOwnerProvider provider) { return !ownerProviders.contains(provider) && ownerProviders.add(provider); } - public Optional getUUIDforOwner(@Nullable String type, @Nullable String qualifier) { - if (type == null || type.isEmpty()){ - if(qualifier == null || qualifier.isEmpty()){ + public Optional getProvider(String type) { + for (IOwnerProvider provider : ownerProviders) { + if (Aliases.isIn(provider.getAliases(), type)) { + return Optional.of(provider); + } + } + return Optional.empty(); + } + + public List getProviders() { + return ImmutableList.copyOf(this.ownerProviders); + } + + public Optional getUUIDForOwner(@Nullable String providerType, @Nullable String qualifier) { + if (providerType == null || providerType.isEmpty()) { + if (qualifier == null || qualifier.isEmpty()) { return Optional.of(FGManager.SERVER_UUID); + } else { + for (IOwnerProvider provider : ownerProviders) { + Optional ownerOpt = provider.getOwnerUUID(qualifier); + if (ownerOpt.isPresent()) return ownerOpt; + } + return Optional.empty(); } } else { - if(qualifier == null || qualifier.isEmpty()){ + Optional providerOpt = getProvider(providerType); + return providerOpt.flatMap(provider -> provider.getOwnerUUID(qualifier)); + } + } + + public String getDisplayName(UUID owner, @Nullable String providerType, @Nullable CommandSource viewer) { + return getDisplayable(provider -> provider::getDisplayName, + owner.toString(), + owner, providerType, viewer); + } + + public Text getDisplayText(UUID owner, @Nullable String providerType, @Nullable CommandSource viewer) { + return getDisplayable(provider -> provider::getDisplayText, + Text.of(owner.toString()), + owner, providerType, viewer); + } + + public Text getHoverText(UUID owner, @Nullable String providerType, @Nullable CommandSource viewer) { + return getDisplayable(provider -> provider::getHoverText, + Text.of(owner.toString()), + owner, providerType, viewer); + } + public String getKeyword(UUID owner, @Nullable String providerType) { + Optional keywordOpt = Optional.empty(); + if (providerType == null || providerType.isEmpty()) { + for (IOwnerProvider provider : ownerProviders) { + if (provider == UUIDProvider.getInstance()) continue; + keywordOpt = provider.getKeyword(owner); + if (keywordOpt.isPresent()) break; } + } else { + keywordOpt = getProvider(providerType) + .flatMap(provider -> provider.getKeyword(owner)); } - return Optional.empty(); + return keywordOpt.orElse(owner.toString()); } - /** - * This method checks if a {@link UUID} could potentially be a player {@link UUID}. - * It does this by checking if it's a v3 or v4 uuid. - * For our purposes, it really doesn't matter that we're breaking RFC spec, - * because all we care about is avoiding name conflicts. - * Beyond that, UUID is just a convinient method of keeping track of owners. - * - * @param uuid the {@link UUID} to check - * @return Whether this is a v3 or v4 {@link UUID}, meaning whether it could be a player {@link UUID}. - */ - public static boolean isPlayerUUID(UUID uuid) { - byte a = (byte) (uuid.getMostSignificantBits() >>> 12 & 0xf); - byte b = (byte) (uuid.getLeastSignificantBits() >>> 60 & 0xf); - return (a == 0x3 || a == 0x4) && b >= 0x8 && b <= 0xb; + private R getDisplayable(Function>> function, + R def, + UUID owner, + @Nullable String providerType, + @Nullable CommandSource viewer) { + Optional returnOpt = Optional.empty(); + if (providerType == null || providerType.isEmpty()) { + for (IOwnerProvider provider : ownerProviders) { + if (provider instanceof IDisplayableOwnerProvider) { + IDisplayableOwnerProvider displayableProvider = (IDisplayableOwnerProvider) provider; + returnOpt = function.apply(displayableProvider).apply(owner, viewer); + if (returnOpt.isPresent()) break; + } + } + } else { + returnOpt = getProvider(providerType) + .filter(provider -> provider instanceof IDisplayableOwnerProvider) + .map(provider -> (IDisplayableOwnerProvider) provider) + .flatMap(provider -> function.apply(provider).apply(owner, viewer)); + } + return returnOpt.orElse(def); } - private static UUID uuidFromBytes(byte[] data) { - long msb = 0; - long lsb = 0; - for (int i = 0; i < 8; i++) - msb = (msb << 8) | (data[i] & 0xff); - for (int i = 8; i < 16; i++) - lsb = (lsb << 8) | (data[i] & 0xff); - return new UUID(msb, lsb); - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java new file mode 100644 index 0000000..4b5d1c2 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java @@ -0,0 +1,82 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object.owners; + +import com.google.common.collect.ImmutableList; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +/** + * Created by Fox on 8/28/2017. + * Project: SpongeForge + */ +public class UUIDProvider implements IOwnerProvider { + + public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; + public static final UUIDProvider INSTANCE = new UUIDProvider(); + private static final String[] ALIASES = {"uuid", "id"}; + + private UUIDProvider() { + } + + public static UUIDProvider getInstance() { + return INSTANCE; + } + + @Override + public List getOwnerKeywords() { + return ImmutableList.of(); + } + + @Override + public Optional getOwnerUUID(String keyword) { + if (keyword == null || keyword.isEmpty()) return Optional.empty(); + if (keyword.matches(UUID_REGEX)) { + return Optional.of(UUID.fromString(keyword)); + } else { + keyword = keyword.replace("-", ""); + if (!keyword.matches("[\\da-f]{32}")) return Optional.empty(); + keyword = keyword.substring(0, 8) + "-" + + keyword.substring(8, 12) + "-" + + keyword.substring(12, 16) + "-" + + keyword.substring(16, 20) + "-" + + keyword.substring(20, 32); + return Optional.of(UUID.fromString(keyword)); + } + } + + @Override + public Optional getKeyword(UUID owner) { + return Optional.of(owner.toString()); + } + + @Override + public String[] getAliases() { + return ALIASES; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java index 5bf854f..7d2bce3 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java @@ -26,14 +26,20 @@ package net.foxdenstudio.sponge.foxguard.plugin.region; import net.foxdenstudio.sponge.foxcore.plugin.util.IBounded; +import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; +import java.util.Set; + /** * Created by Fox on 3/29/2016. */ public interface IRegion extends IFGObject, ILinkable, IBounded { + @Override + Set getLinks(); + @Override default boolean saveLinks() { return true; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index c9009b1..13fa52e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -25,7 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.region; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectBase; @@ -34,7 +34,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; import java.util.HashSet; -import java.util.List; import java.util.Set; public abstract class RegionBase extends FGObjectBase implements IRegion { @@ -53,8 +52,8 @@ public void setEnabled(boolean state) { } @Override - public List getLinks() { - return ImmutableList.copyOf(this.handlers); + public Set getLinks() { + return ImmutableSet.copyOf(this.handlers); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java index f9a9ae7..6910905 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java @@ -168,7 +168,7 @@ public ProcessResult add(CommandSource source, String arguments) throws CommandE AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).parse(); if (parse.args.length < 1) throw new CommandException(Text.of("Must specify a name!")); - Optional handlerOpt = FGManager.getInstance().gethandler(parse.args[0]); + Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[0]); if (!handlerOpt.isPresent()) throw new ArgumentParseException(Text.of("No handlers with this name!"), parse.args[0], 1); IHandler handler = handlerOpt.get(); @@ -188,7 +188,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(parse.args[0]); handler = this.list.get(index - 1); } catch (NumberFormatException e) { - handler = FGManager.getInstance().gethandler(parse.args[0]).orElse(null); + handler = FGManager.getInstance().getHandler(parse.args[0]).orElse(null); } catch (IndexOutOfBoundsException e) { throw new ArgumentParseException(Text.of("Index out of bounds! (1 - " + this.list.size()), parse.args[0], 1); } @@ -206,7 +206,7 @@ public ProcessResult remove(CommandSource source, String arguments) throws Comma int index = Integer.parseInt(arg); handler = this.list.get(index - 1); } catch (NumberFormatException e) { - handler = FGManager.getInstance().gethandler(arg).orElse(null); + handler = FGManager.getInstance().getHandler(arg).orElse(null); } catch (IndexOutOfBoundsException e) { failures++; continue; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java index b93192d..4b3ced0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java @@ -91,7 +91,7 @@ public Text currentState(CommandSource source) { " [-] ")); } builder.append(Text.of(FGUtil.getColorForObject(region), - (index++) + ": " + FGUtil.getRegionName(region, true))); + (index++) + ": " + FGUtil.getRegionDisplayName(region, true))); if (regionIterator.hasNext()) builder.append(Text.NEW_LINE); } return builder.build(); @@ -202,7 +202,7 @@ public List getScoreboardText() { int[] index = {1}; return this.list.stream() .map(region -> Text.of(FGUtil.getColorForObject(region), - " " + index[0]++ + ": " + FGUtil.getRegionName(region, true))) + " " + index[0]++ + ": " + FGUtil.getRegionDisplayName(region, true))) .collect(Collectors.toList()); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java index b21480d..4ee6831 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java @@ -39,16 +39,14 @@ */ public class FGSObjectIndex extends FGSObjectMeta { - boolean enabled; + Boolean enabled; Integer priority; - UUID owner; - List links; + List links; - public FGSObjectIndex(String name, String category, String type, boolean enabled, Integer priority, UUID owner, List links) { - super(name, category, type); + public FGSObjectIndex(String name, UUID owner, String category, String type, Boolean enabled, Integer priority, List links) { + super(name, owner, category, type); this.enabled = enabled; this.priority = priority; - this.owner = owner; this.links = links; } @@ -58,12 +56,37 @@ public FGSObjectIndex() { public FGSObjectIndex(IFGObject object) { super(object); this.enabled = object.isEnabled(); - this.owner = object.getOwner(); if (object instanceof IHandler) { this.priority = ((IHandler) object).getPriority(); } if (object instanceof ILinkable && ((ILinkable) object).saveLinks()) { - this.links = ((ILinkable) object).getLinks().stream().map(IHandler::getName).collect(Collectors.toList()); + this.links = ((ILinkable) object).getLinks().stream() + .map(FGSObjectPath::new) + .collect(Collectors.toList()); } } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public List getLinks() { + return links; + } + + public void setLinks(List links) { + this.links = links; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java index f8c8c30..35bfe73 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java @@ -28,20 +28,19 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; +import java.util.UUID; + /** * Created by Fox on 7/9/2017. * Project: SpongeForge */ -public class FGSObjectMeta { +public class FGSObjectMeta extends FGSObjectPath { - String name; String category; String type; - transient IFGObject object; - - public FGSObjectMeta(String name, String category, String type) { - this.name = name; + public FGSObjectMeta(String name, UUID owner, String category, String type) { + super(name, owner); this.category = category; this.type = type; } @@ -50,11 +49,37 @@ public FGSObjectMeta() { } public FGSObjectMeta(IFGObject object) { - this( - object.getName(), - FGUtil.getCategory(object), - object.getUniqueTypeString() - ); + super(object); + this.category = FGUtil.getCategory(object); + this.type = object.getUniqueTypeString(); this.object = object; } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("FGSObjectMeta{"); + sb.append("category='").append(category).append("', "); + sb.append("type='").append(type).append("', "); + sb.append("name='").append(name).append("', "); + sb.append("owner='").append(owner).append("', "); + if (object != null) sb.append(", object=").append(object); + sb.append('}'); + return sb.toString(); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java new file mode 100644 index 0000000..2c494ad --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java @@ -0,0 +1,72 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; + +import java.util.UUID; + +/** + * Created by Fox on 8/28/2017. + * Project: SpongeForge + */ +public class FGSObjectPath { + String name; + UUID owner; + transient IFGObject object; + + public FGSObjectPath() { + } + + public FGSObjectPath(String name, UUID owner) { + this.name = name; + this.owner = owner; + } + + public FGSObjectPath(IFGObject object) { + this( + object.getName(), + object.getOwner() + ); + this.object = object; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public UUID getOwner() { + return owner; + } + + public void setOwner(UUID owner) { + this.owner = owner; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index b7a0efb..41726b4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -25,7 +25,11 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; +import com.google.common.collect.ImmutableList; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; @@ -33,17 +37,28 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; +import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; +import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; +import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.slf4j.Logger; +import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.service.user.UserStorageService; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.World; +import org.spongepowered.api.world.storage.WorldProperties; import java.io.IOException; +import java.lang.reflect.Type; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.*; @@ -51,6 +66,8 @@ import java.util.*; import java.util.stream.Collectors; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; /** @@ -62,17 +79,20 @@ public class FGStorageManagerNew { public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; + public static final String METADATA_FILE_NAME = "metadata.foxcf"; public static final Charset CHARSET = StandardCharsets.UTF_8; - public static final Gson GSON = new Gson(); + private static final Type INDEX_LIST_TYPE = new TypeToken>() { + }.getType(); private static FGStorageManagerNew instance; + public final Gson GSON; public final HashMap defaultModifiedMap; private final UserStorageService userStorageService; private final Logger logger = FoxGuardMain.instance().getLogger(); private final FGManager manager = FGManager.getInstance(); - private final Path foxguardDirectory = getFoxguardDirectory(); private final Map worldDirectories; - - private boolean handlersLoaded = false; + private Path fgDirectory; + private boolean serverLoaded = false; + private boolean reentry = false; private FGStorageManagerNew() { userStorageService = FoxGuardMain.instance().getUserStorage(); @@ -82,13 +102,9 @@ private FGStorageManagerNew() { return true; } else return null; }); - worldDirectories = new CacheMap<>((k, m) -> { - if (k instanceof World) { - Path dir = getWorldDirectory((World) k); - m.put((World) k, dir); - return dir; - } else return null; - }); + worldDirectories = new HashMap<>(); + GsonBuilder gsonBuilder = new GsonBuilder(); + GSON = gsonBuilder.create(); } public static FGStorageManagerNew getInstance() { @@ -98,51 +114,458 @@ public static FGStorageManagerNew getInstance() { public void saveHandlerIndex() { logger.info("Saving handler index"); - Path file = foxguardDirectory.resolve(FGTypes.HANDLER.getIndexFile()); + Path file = getFGDirectory().resolve(FGCat.HANDLER.getIndexFile()); Set handlers = manager.getHandlers(); saveIndex(handlers, file); } public void saveRegionIndex() { logger.info("Saving region index"); - Path file = foxguardDirectory.resolve(FGTypes.REGION.getIndexFile()); + Path file = getFGDirectory().resolve(FGCat.REGION.getIndexFile()); Set regions = manager.getRegions(); saveIndex(regions, file); } public void saveWorldRegionIndex(World world) { - logger.info("Saving worldregion index"); - Path file = worldDirectories.get(world).resolve(FGTypes.WORLDREGION.getIndexFile()); + logger.info("Saving worldregion index for world: " + world.getName()); + Path file = getWorldDirectory(world).resolve(FGCat.WORLDREGION.getIndexFile()); Set worldRegions = manager.getWorldRegions(world); saveIndex(worldRegions, file); } private void saveIndex(Set objects, Path file) { - List indexList = objects.stream().map(FGSObjectIndex::new).collect(Collectors.toList()); + List indexList = new ArrayList<>(); + + for (IFGObject object : objects) { + boolean saveLinks = (object instanceof ILinkable && ((ILinkable) object).saveLinks()); + boolean autoSave = object.autoSave(); + if (autoSave || saveLinks) { + FGSObjectIndex index = new FGSObjectIndex(object); + if (!autoSave) { + index.type = null; + index.enabled = null; + index.priority = null; + } + indexList.add(index); + } + } + try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(file, CHARSET))) { - jsonWriter.setIndent(" "); + //jsonWriter.setIndent(" "); GSON.toJson(indexList, List.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open index for writing: " + file, e); } } - public void saveObjects(Set objects, boolean force) { - objects.forEach(object -> { - String name = object.getName(); - UUID owner = object.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + name; - if (object.autoSave()) { + public void saveObject(IFGObject object) { + saveObject(object, false); + } + + public void saveObject(IFGObject object, boolean force) { + if (reentry) return; + FGCat type = getObjectType(object); + String logName = FGUtil.getLogName(object); + + //System.out.println(name +", " + owner + ", " + isOwned + ", " + userOwner + ", " + logName); + + if (object.autoSave()) { + + boolean shouldSave = object.shouldSave(); + if (force || shouldSave) { Path directory = getObjectDirectory(object); + String category = FGUtil.getCategory(object); + logger.info((shouldSave ? "S" : "Force s") + "aving " + category + " " + logName + " in directory: " + directory); + try { + object.save(directory); + } catch (Exception e) { + logger.error("There was an error while saving " + FGUtil.getCategory(object) + " " + logName + "!", e); + } + logger.info("Saving metadata for " + category + " " + logName); + FGSObjectMeta metadata = new FGSObjectMeta(object); + Path metadataFile = directory.resolve(METADATA_FILE_NAME); + try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(metadataFile, CHARSET))) { + //jsonWriter.setIndent(" "); + GSON.toJson(metadata, FGSObjectMeta.class, jsonWriter); + } catch (IOException e) { + logger.error("Failed to open metadata for writing: " + metadataFile, e); + } } else { - logger.info("Region " + logName + " does not need saving. Skipping..."); + logger.info(type.nameUppercase + " " + logName + " is already up to date. Skipping..."); } - }); + + defaultModifiedMap.put(object, false); + } else { + logger.info(type.nameUppercase + " " + logName + " does not need saving. Skipping..."); + } + } + + public void saveObjects(Set objects) { + saveObjects(objects, false); + } + + public void saveObjects(Set objects, boolean force) { + if (reentry) return; + objects.forEach(object -> saveObject(object, force)); + } + + public void loadServer() { + if (serverLoaded) return; + boolean oldReentry = reentry; + reentry = true; + + FGManager manager = FGManager.getInstance(); + + logger.info("Loading regions"); + Path regionIndexFile = getFGDirectory().resolve(FGCat.REGION.getIndexFile()); + Optional> regionIndexOpt = loadIndex(regionIndexFile); + class RegionEntry { + IRegion region; + FGSObjectIndex index; + + public RegionEntry(IRegion region, FGSObjectIndex index) { + this.region = region; + this.index = index; + } + } + List loadedRegions = new ArrayList<>(); + List extraRegionLinks = new ArrayList<>(); + if (regionIndexOpt.isPresent()) { + List regionIndex = regionIndexOpt.get(); + for (FGSObjectIndex index : regionIndex) { + FGCat fgCat = FGCat.from(index.category); + if (fgCat == FGCat.REGION) { + Path directory = getObjectDirectory(index, null); + Optional fgObjectOptional = loadObject(directory, index, null); + if (fgObjectOptional.isPresent()) { + IFGObject fgObject = fgObjectOptional.get(); + if (fgObject instanceof IRegion) { + IRegion region = (IRegion) fgObject; + manager.addRegion(region); + loadedRegions.add(new RegionEntry(region, index)); + } + } else if (index.links != null && !index.links.isEmpty()) { + extraRegionLinks.add(index); + } + } else { + logger.warn("Found an entry of incorrect category. Expected region, found: " + index.category); + } + } + } + + logger.info("Loading handlers"); + Path handlerIndexFile = getFGDirectory().resolve(FGCat.HANDLER.getIndexFile()); + Optional> handlerIndexOpt = loadIndex(handlerIndexFile); + class ControllerEntry { + IController controller; + FGSObjectIndex index; + Path directory; + + public ControllerEntry(IController controller, FGSObjectIndex index, Path directory) { + this.controller = controller; + this.index = index; + this.directory = directory; + } + } + List loadedControllers = new ArrayList<>(); + if (handlerIndexOpt.isPresent()) { + List handlerIndex = handlerIndexOpt.get(); + for (FGSObjectIndex index : handlerIndex) { + FGCat fgCat = FGCat.from(index.category); + if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { + Path directory = getObjectDirectory(index, null); + Optional fgObjectOptional = loadObject(directory, index, null); + if (fgObjectOptional.isPresent()) { + IFGObject fgObject = fgObjectOptional.get(); + if (fgObject instanceof IHandler) { + IHandler handler = (IHandler) fgObject; + manager.addHandler(handler); + if (handler instanceof IController) { + loadedControllers.add(new ControllerEntry(((IController) handler), index, directory)); + } + } + } + } else { + logger.warn("Found an entry of incorrect category. Expected handler or controller, found: " + index.category); + } + } + } + + logger.info("Loading global handler"); + manager.getGlobalHandler().load( + getFGDirectory() + .resolve(FGCat.HANDLER.pathName) + .resolve(GlobalHandler.NAME.toLowerCase()) + ); + + logger.info("Loading region links"); + for (RegionEntry entry : loadedRegions) { + if (entry.index.links != null) { + Set handlers = entry.index.links.stream() + .map(path -> manager.getHandler(path.name, path.owner)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + handlers.forEach(entry.region::addLink); + StringBuilder logMessage = new StringBuilder("Linked region "); + logMessage.append(FGUtil.getLogName(entry.region)); + logMessage.append(" to handlers: "); + for (Iterator handlerIterator = handlers.iterator(); handlerIterator.hasNext(); ) { + IHandler handler = handlerIterator.next(); + logMessage.append(FGUtil.getLogName(handler)); + if (handlerIterator.hasNext()) { + logMessage.append(", "); + } + } + + logger.info(logMessage.toString()); + } + } + + logger.info("Loading controller links"); + for (ControllerEntry entry : loadedControllers) { + List handlers; + if (entry.index.links != null) { + handlers = entry.index.links.stream() + .map(path -> manager.getHandler(path.name, path.owner)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(GuavaCollectors.toImmutableList()); + } else handlers = ImmutableList.of(); + + entry.controller.loadLinks(entry.directory, handlers); + } + + + reentry = oldReentry; + serverLoaded = true; + } + + public void loadWorld(World world) { + boolean oldReentry = reentry; + reentry = true; + + FGManager manager = FGManager.getInstance(); + + logger.info("Loading worldregions for world: " + world.getName()); + Path regionIndexFile = getWorldDirectory(world).resolve(FGCat.WORLDREGION.getIndexFile()); + Optional> worldRegionIndexOpt = loadIndex(regionIndexFile); + if (worldRegionIndexOpt.isPresent()) { + List worldRegionIndex = worldRegionIndexOpt.get(); + for (FGSObjectIndex index : worldRegionIndex) { + FGCat fgCat = FGCat.from(index.category); + if (fgCat == FGCat.WORLDREGION) { + Path directory = getObjectDirectory(index, world); + Optional fgObjectOptional = loadObject(directory, index, world); + if (fgObjectOptional.isPresent()) { + IFGObject fgObject = fgObjectOptional.get(); + if (fgObject instanceof IWorldRegion) { + IWorldRegion worldRegion = (IWorldRegion) fgObject; + manager.addWorldRegion(worldRegion, world); + if (index.links != null) { + Set handlers = index.links.stream() + .map(path -> manager.getHandler(path.name, path.owner)) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + handlers.forEach(worldRegion::addLink); + StringBuilder logMessage = new StringBuilder("Linked worldregion "); + logMessage.append(FGUtil.getLogName(worldRegion)); + logMessage.append(" to handlers: "); + for (Iterator handlerIterator = handlers.iterator(); handlerIterator.hasNext(); ) { + IHandler handler = handlerIterator.next(); + logMessage.append(FGUtil.getLogName(handler)); + if (handlerIterator.hasNext()) { + logMessage.append(", "); + } + } + + logger.info(logMessage.toString()); + } + } + } + } else { + logger.warn("Found an entry of incorrect category. Expected worldregion, found: " + index.category); + } + } + } + + reentry = oldReentry; + } + + public Optional> loadIndex(Path indexFile) { + List index = null; + if (Files.exists(indexFile) && !Files.isDirectory(indexFile)) { + try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(indexFile))) { + index = GSON.fromJson(jsonReader, INDEX_LIST_TYPE); + } catch (IOException e) { + logger.error("Failed to open index for reading: " + indexFile, e); + } + } else { + logger.error("Index file does not exist: " + indexFile); + } + return Optional.ofNullable(index); + } + + public Optional loadObject(Path directory, @Nullable FGSObjectIndex index, @Nullable World world) { + if (!Files.exists(directory) || !Files.isDirectory(directory)) return Optional.empty(); + + FGSObjectMeta metadata = null; + Path metadataFile = directory.resolve(METADATA_FILE_NAME); + if (Files.exists(metadataFile) && !Files.isDirectory(metadataFile)) { + try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(metadataFile))) { + metadata = GSON.fromJson(jsonReader, FGSObjectMeta.class); + } catch (IOException e) { + logger.error("Failed to open metadata for reading: " + metadataFile, e); + } + } + + String name = null; + String category = null; + String type = null; + if (index != null) { + name = index.name; + category = index.category; + type = index.type; + } + if (metadata != null) { + if (name == null || name.isEmpty()) name = metadata.name; + if (category == null || category.isEmpty()) category = metadata.category; + if (type == null || type.isEmpty()) type = metadata.type; + } + + if (category == null || category.isEmpty() || type == null || type.isEmpty()) return Optional.empty(); + + + FGCat fgCat = FGCat.from(category); + if (fgCat == null || fgCat == FGCat.OBJECT) return Optional.empty(); + + if (isGlobal(fgCat, type, name)) { + logger.info("Found global " + fgCat.name + ". Skipping..."); + return Optional.empty(); + } + + UUID owner = null; + if (index != null) owner = index.owner; + if (owner == null) owner = SERVER_UUID; + + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = isOwned ? userStorageService.get(owner) : Optional.empty(); + UUID finalOwner = owner; + String ownerName = (userOwner.map(user -> user.getName() + ":" + finalOwner).orElse("None")); + + + if (name == null || name.isEmpty()) { + name = category + "-" + type; + logger.warn("No name for loaded " + fgCat.name + ". Using generated name: " + name); + } + if (!fgCat.isNameAvailable(name, owner, world)) { + String oldName = name; + String nameBase = name + "-"; + int id = 1; + do { + name = nameBase + id; + id++; + } while (!fgCat.isNameAvailable(name, owner, world)); + logger.warn("Name " + oldName + " for " + fgCat.name + " already in use. Changed to: " + name); + } + + FGObjectData data; + if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { + HandlerData handlerData = new HandlerData(); + if (index != null && index.priority != null) + handlerData.setPriority(index.priority); + data = handlerData; + } else data = new FGObjectData(); + data.setName(name); + data.setOwner(owner); + if (index != null && index.enabled != null) + data.setEnabled(index.enabled); + + StringBuilder infoMessage = new StringBuilder(); + infoMessage.append("Foxguard object info loaded! Category: \"").append(category).append("\", "); + infoMessage.append("Type: \"").append(type).append("\", "); + infoMessage.append("Name: \"").append(name).append("\", "); + if (isOwned) infoMessage.append("Owner: \"").append(ownerName).append("\", "); + infoMessage.append("Enabled: \"").append(data.isEnabled()).append("\""); + logger.info(infoMessage.toString()); + + IFGObject fgObject = null; + try { + fgObject = fgCat.loadInstance(directory, type, data); + } catch (Exception e) { + logger.error("There was an error creating the " + fgCat.name, e); + } + + if (fgObject == null) { + logger.warn("The " + fgCat.name + " was unable to be created."); + if (FGConfigManager.getInstance().cleanupFiles()) { + logger.warn("Cleaning up unused files"); + deleteDirectory(directory); + } + } + + return Optional.ofNullable(fgObject); + } + + private Path getFGDirectory() { + if (fgDirectory != null) { + constructDirectories(fgDirectory); + return fgDirectory; + } + Path path = Sponge.getGame().getSavesDirectory(); + if (FGConfigManager.getInstance().saveInWorldFolder()) { + path = path.resolve(Sponge.getServer().getDefaultWorldName()); + } else if (FGConfigManager.getInstance().useConfigFolder()) { + path = FoxGuardMain.instance().getConfigDirectory(); + } + path = path.resolve("foxguard"); + constructDirectories(path); + fgDirectory = path; + return path; + } + + private Path getWorldDirectory(World world) { + if (worldDirectories.containsKey(world)) { + Path directory = worldDirectories.get(world); + constructDirectories(directory); + return directory; + } + Path path; + if (FGConfigManager.getInstance().saveWorldRegionsInWorldFolders()) { + path = world.getDirectory(); + path = path.resolve("foxguard"); + } else { + if(FGConfigManager.getInstance().) + path = getFGDirectory(); + path = path.resolve("worlds").resolve(world.getName()); + } + constructDirectories(path); + worldDirectories.put(world, path); + return path; } + public void constructDirectories(Path directory) { + LinkedList stack = new LinkedList<>(); + Path dir = directory.normalize(); + while (true) { + if (Files.notExists(dir) || !Files.isDirectory(dir)) { + stack.push(dir); + Path parent = dir.getParent(); + if (parent != null) { + dir = parent; + continue; + } + } + break; + } + + while (!stack.isEmpty()) { + Path path = stack.pop(); + constructDirectory(path); + } + } public void constructDirectory(Path directory) { if (Files.exists(directory)) { @@ -185,33 +608,6 @@ public void constructDirectory(Path directory) { } } - private Path getFoxguardDirectory() { - Path path = Sponge.getGame().getSavesDirectory(); - if (FGConfigManager.getInstance().saveInWorldFolder()) { - path = path.resolve(Sponge.getServer().getDefaultWorldName()); - } else if (FGConfigManager.getInstance().useConfigFolder()) { - path = FoxGuardMain.instance().getConfigDirectory(); - } - path = path.resolve("foxguard"); - constructDirectory(path); - return path; - } - - private Path getWorldDirectory(World world) { - Path path = Sponge.getGame().getSavesDirectory(); - if (FGConfigManager.getInstance().saveWorldRegionsInWorldFolders()) { - path = world.getDirectory(); - path = path.resolve("foxguard"); - } else { - if (FGConfigManager.getInstance().useConfigFolder()) { - path = FoxGuardMain.instance().getConfigDirectory(); - } - path = path.resolve("foxguard").resolve("worlds").resolve(world.getName()); - } - constructDirectory(path); - return path; - } - private void deleteDirectory(Path directory) { deleteDirectory(directory, false); } @@ -271,56 +667,206 @@ private boolean isEmptyDirectory(Path directory) { } private Path getObjectDirectory(IFGObject object) { + World world = null; + boolean flag = false; + if (object instanceof IWorldBound) { + world = ((IWorldBound) object).getWorld(); + flag = true; + } + return getObjectDirectory(getObjectType(object), + object.getOwner(), + object.getName(), + flag, + world); + } + + private Path getObjectDirectory(FGSObjectMeta meta, @Nullable World world) { + FGCat fgCat = FGCat.from(meta.category); + return getObjectDirectory(fgCat, + meta.owner, + meta.name, + fgCat == FGCat.WORLDREGION, + world); + } + + private Path getObjectDirectory(FGCat fgCat, UUID owner, String name, boolean inWorld, @Nullable World world) { + if (fgCat == null) fgCat = FGCat.OBJECT; Path dir; - if(object instanceof IWorldBound){ - dir = worldDirectories.get(((IWorldBound) object).getWorld()); + if (inWorld) { + if (world == null) + world = getDefaultWorld(); + dir = getWorldDirectory(world); } else { - dir = foxguardDirectory; + dir = getFGDirectory(); } - FGTypes type = getObjectType(object); - dir.resolve(type.fileName); - UUID owner = object.getOwner(); - if (!owner.equals(SERVER_UUID)) { - dir.resolve("users").resolve(owner.toString()); + boolean ownerFirst = FGConfigManager.getInstance().ownerFirst(); + + if (!ownerFirst) dir = dir.resolve(fgCat.pathName); + if (owner != null && !owner.equals(SERVER_UUID)) { + dir = dir.resolve("owners").resolve(owner.toString()); } - dir.resolve(object.getName().toLowerCase()); - constructDirectory(dir); + if (ownerFirst) dir = dir.resolve(fgCat.pathName); + + dir = dir.resolve(name.toLowerCase()); + + constructDirectories(dir); return dir; } - private FGTypes getObjectType(IFGObject object){ - if(object instanceof IRegion){ - if(object instanceof IWorldRegion){ - return FGTypes.WORLDREGION; + private World getDefaultWorld() { + Server server = Sponge.getServer(); + World world = null; + Optional worldPropertiesOpt = server.getDefaultWorld(); + if (worldPropertiesOpt.isPresent()) { + WorldProperties worldProperties = worldPropertiesOpt.get(); + Optional worldOpt = server.getWorld(worldProperties.getUniqueId()); + if (!worldOpt.isPresent()) + worldOpt = server.getWorld(worldProperties.getWorldName()); + if (worldOpt.isPresent()) + world = worldOpt.get(); + } + if (world == null) { + String worldName = server.getDefaultWorldName(); + Optional worldOpt = server.getWorld(worldName); + if (worldOpt.isPresent()) world = worldOpt.get(); + } + if (world == null) { + Collection worlds = server.getWorlds(); + Iterator worldIterator = worlds.iterator(); + if (worldIterator.hasNext()) { + world = worldIterator.next(); + } else { + logger.error("Could not find default world! There are no worlds loaded!"); } - return FGTypes.REGION; - } else if (object instanceof IHandler){ - if(object instanceof IController){ - return FGTypes.CONTROLLER; + } + return world; + } + + private boolean isGlobal(FGCat fgCat, String type, String name) { + switch (fgCat) { + case REGION: + if (type.equals("sglobal") || name.equals("_sglobal")) return true; + break; + case WORLDREGION: + if (type.equals("wglobal") || name.equals("_wglobal")) return true; + break; + case HANDLER: + if (type.equals("global") || name.equals("_global")) return true; + break; + } + return false; + } + + private FGCat getObjectType(IFGObject object) { + if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + return FGCat.WORLDREGION; } - return FGTypes.HANDLER; + return FGCat.REGION; + } else if (object instanceof IHandler) { + if (object instanceof IController) { + return FGCat.CONTROLLER; + } + return FGCat.HANDLER; } - return FGTypes.OBJECT; + return FGCat.OBJECT; } - private enum FGTypes { - REGION("Region", "regions"), - WORLDREGION("World region", "wregions"), - HANDLER("Handler", "handlers"), - CONTROLLER("Controller", "handlers"), - OBJECT("Object", "objects"); + private enum FGCat { + REGION("region", "Region", "regions") { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return FGManager.getInstance().isRegionNameAvailable(name, owner); + } + + @Override + public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + return FGFactoryManager.getInstance().createRegion(directory, type, data); + } + }, + WORLDREGION("worldregion", "World region", "wregions") { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + if (world == null) + return FGManager.getInstance().isWorldRegionNameAvailable(name, owner) == Tristate.TRUE; + else return FGManager.getInstance().isWorldRegionNameAvailable(name, owner, world); + } + + @Override + public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + return FGFactoryManager.getInstance().createWorldRegion(directory, type, data); + } + }, + HANDLER("handler", "Handler", "handlers") { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return FGManager.getInstance().isHandlerNameAvailable(name, owner); + } + + @Override + public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + HandlerData handlerData; + if (data instanceof HandlerData) { + handlerData = (HandlerData) data; + } else { + handlerData = new HandlerData(data, 0); + } + return FGFactoryManager.getInstance().createHandler(directory, type, handlerData); + } + }, + CONTROLLER("controller", "Controller", HANDLER.pathName) { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return HANDLER.isNameAvailable(name, owner, world); + } + + @Override + public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + HandlerData handlerData; + if (data instanceof HandlerData) { + handlerData = (HandlerData) data; + } else { + handlerData = new HandlerData(data, 0); + } + return FGFactoryManager.getInstance().createController(directory, type, handlerData); + } + }, + OBJECT("object", "Object", "objects") { + @Override + public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + return true; + } + + @Override + public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + return null; + } + }; + String name; String nameUppercase; - String fileName; + String pathName; - FGTypes(String nameUppercase, String directoryName) { + FGCat(String name, String nameUppercase, String pathName) { this.nameUppercase = nameUppercase; - this.fileName = directoryName; + this.name = name; + this.pathName = pathName; + } + + public static FGCat from(String name) { + for (FGCat type : values()) { + if (type.name.equals(name)) return type; + } + return null; } - public String getIndexFile(){ - return fileName + ".foxcf"; + public String getIndexFile() { + return pathName + ".foxcf"; } + + public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); + + public abstract IFGObject loadInstance(Path directory, String type, FGObjectData data); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index e38e988..e0dcfae 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -27,32 +27,43 @@ import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.state.ControllersStateField; import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; +import org.jetbrains.annotations.NotNull; import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.Tristate; -import org.spongepowered.api.util.Tuple; +import org.spongepowered.api.world.Locatable; +import org.spongepowered.api.world.World; import java.util.List; +import java.util.Optional; import java.util.UUID; +import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; + public final class FGUtil { + private static UserStorageService userStorageService; + public static TextColor getColorForObject(IFGObject object) { if (object instanceof GlobalRegion) return TextColors.LIGHT_PURPLE; else if (object instanceof IGlobal) return TextColors.YELLOW; @@ -62,7 +73,6 @@ public static TextColor getColorForObject(IFGObject object) { else return TextColors.WHITE; } - @SuppressWarnings("unchecked") public static List getSelectedRegions(CommandSource source) { return ((RegionsStateField) FCStateManager.instance().getStateMap().get(source).getOrCreate(RegionsStateField.ID).get()).getList(); @@ -78,10 +88,18 @@ public static List getSelectedControllers(CommandSource source) { return ((ControllersStateField) FCStateManager.instance().getStateMap().get(source).getOrCreate(ControllersStateField.ID).get()).getList(); } - public static String getRegionName(IRegion region, boolean dispWorld) { + public static String getRegionDisplayName(IRegion region, boolean dispWorld) { return region.getShortTypeName() + " : " + (dispWorld && region instanceof IWorldRegion ? ((IWorldRegion) region).getWorld().getName() + " : " : "") + region.getName(); } + public static String getLogName(IFGObject object) { + if (userStorageService == null) userStorageService = FoxGuardMain.instance().getUserStorage(); + UUID owner = object.getOwner(); + boolean isOwned = !owner.equals(SERVER_UUID); + Optional userOwner = isOwned ? userStorageService.get(owner) : Optional.empty(); + return (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + object.getName(); + } + public static String getCategory(IFGObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) return "worldregion"; @@ -111,35 +129,98 @@ public static Text readableTristateText(Tristate state) { public static void markRegionDirty(IRegion region) { FGManager.getInstance().markDirty(region, RegionCache.DirtyType.MODIFIED); - FGStorageManager.getInstance().defaultModifiedMap.put(region, true); + FGStorageManagerNew.getInstance().defaultModifiedMap.put(region, true); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); } public static void markHandlerDirty(IHandler handler) { - FGStorageManager.getInstance().defaultModifiedMap.put(handler, true); + FGStorageManagerNew.getInstance().defaultModifiedMap.put(handler, true); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); } + @NotNull + public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qualifier, String worldName) throws CommandException { + String name = qualifier.getName(); + UUID owner = qualifier.getOwner(); + + Optional regionOpt; + regionOpt = FGManager.getInstance().getRegion(name, owner); + if (!regionOpt.isPresent()) { + World world = null; + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + if (world == null) + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } + if (world == null) throw new CommandException(Text.of("Must specify a world!")); + regionOpt = FGManager.getInstance().getWorldRegion(world, name, owner); + } + + if (!regionOpt.isPresent()) + throw new CommandException(Text.of("No region exists with the name \"" + name + "\"" + + (owner != SERVER_UUID ? " and owner \"" + qualifier.getOwnerName() + "\"" : "") + + "!")); + return regionOpt.get(); + } - public static Tuple getObjectDataFromUserInput(String input) { - if (input.startsWith(":")) input = input.substring(1); + public static OwnerResult processUserInput(String input) throws CommandException { String[] parts = input.split(":", 3); - String ownerString, nameString; - if (parts.length == 0) return Tuple.of(FGManager.SERVER_UUID, ""); - else if (parts.length == 1) { - if (input.endsWith(":")) { - ownerString = parts[0]; - nameString = ""; - } else { - return Tuple.of(FGManager.SERVER_UUID, parts[0]); - } - } else if (parts.length == 2) { - nameString = ""; - } else { - nameString = ""; + + String name = null; + String ownerQualifier = null; + String provider = null; + switch (parts.length) { + case 1: + name = parts[0]; + break; + case 2: + ownerQualifier = parts[0]; + name = parts[1]; + break; + case 3: + provider = parts[0]; + ownerQualifier = parts[1]; + name = parts[2]; + break; } - UUID owner = null; - return Tuple.of(owner, nameString); + if (name == null || name.isEmpty()) + throw new CommandException(Text.of("Name must not be... blank?")); + + Optional ownerOpt = OwnerProviderRegistry.getInstance().getUUIDForOwner(provider, ownerQualifier); + if (!ownerOpt.isPresent()) { + String errorName = (provider != null ? provider + ":" : "") + ownerQualifier; + throw new CommandException(Text.of("\"" + errorName + "\" is not a valid owner!")); + } + return new OwnerResult(name, ownerOpt.get(), ownerQualifier); + } + + public static class OwnerResult { + private String name; + private UUID owner; + private String ownerName; + + private OwnerResult(String name, UUID owner, String ownerName) { + this.name = name; + this.owner = owner; + this.ownerName = ownerName; + } + + public String getName() { + return name; + } + + public UUID getOwner() { + return owner; + } + + public String getOwnerName() { + return ownerName; + } } } From 351d65a77c11dcac968ab31f700de14fecfbf073 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Sat, 30 Sep 2017 20:03:02 -0700 Subject: [PATCH 11/30] More changes and stuff. --- FoxCore | 2 +- .../foxguard/plugin/FGConfigManager.java | 12 +- .../sponge/foxguard/plugin/FGManager.java | 83 ++++-- .../plugin/command/CommandCreate.java | 241 ++++-------------- .../plugin/command/CommandDelete.java | 148 ++++++----- .../plugin/command/CommandDetail.java | 231 ++++++++++++++++- .../plugin/command/CommandEnableDisable.java | 8 +- .../foxguard/plugin/command/CommandHere.java | 6 +- .../foxguard/plugin/command/CommandList.java | 6 +- .../plugin/command/link/LinkageParser.java | 24 +- .../plugin/listener/SpawnEntityListener.java | 2 +- .../plugin/object/owners/IOwnerProvider.java | 9 +- .../plugin/storage/FGStorageManagerNew.java | 45 ++-- .../sponge/foxguard/plugin/util/FGUtil.java | 202 +++++++++++++-- 14 files changed, 686 insertions(+), 333 deletions(-) diff --git a/FoxCore b/FoxCore index e336a46..595e2b9 160000 --- a/FoxCore +++ b/FoxCore @@ -1 +1 @@ -Subproject commit e336a46fbdffe5c4cc7378270fd49707dd252463 +Subproject commit 595e2b9e2bee396bd2c074e2f79a9a2892e696e4 diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java index c2afe9f..0050695 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java @@ -97,7 +97,7 @@ public void save() { root.getNode("storage", "location") .setComment("These options control where FoxGuard objects are stored.\n" + "BE WARNED that changing these settings will not automatically move files to a new location.\n" + - "YOU MUST do that move yourself. It is advised that you"); + "YOU MUST do that move yourself. It is advised that you do the move at the same time you change these settings."); root.getNode("storage", "location", "saveInWorldDirectory") .setValue(saveInWorldDirectory) @@ -198,7 +198,7 @@ private void load() { if (o instanceof Path) path = (Path) o; else if (o instanceof String) path = Paths.get((String) o); if (path == null) return null; - if (Files.notExists(path) || Files.isDirectory(path)) return path; + if (Files.notExists(path) || Files.isDirectory(path)) return path.normalize(); else return null; }, Paths.get("foxguard")); gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); @@ -236,6 +236,14 @@ public boolean useConfigFolder() { return useConfigDirectory; } + public boolean useCustomDirectory() { + return useCustomDirectory; + } + + public Path customDirectory() { + return customDirectory; + } + public boolean gcAndFinalize() { return gcAndFinalize; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index d5a40c9..b073565 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -103,7 +103,8 @@ public static void init() { } public static boolean isNameValid(String name) { - return !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && + return !name.isEmpty() && + !name.matches("^.*[ :.=;\"\'\\\\/{}()\\[\\]<>#@|?*].*$") && !Aliases.isIn(FGStorageManagerNew.FS_ILLEGAL_NAMES, name) && !Aliases.isIn(ILLEGAL_NAMES, name); } @@ -115,7 +116,9 @@ public boolean addHandler(IHandler handler) { } public boolean addHandler(IHandler handler, UUID owner) { - if (handler == null || getHandler(handler.getName()).isPresent() || !isNameValid(handler.getName())) + if (handler == null + || !isNameValid(handler.getName()) + || !isHandlerNameAvailable(handler.getName(), owner)) return false; handler.setOwner(owner); handlers.put(owner, handler); @@ -132,8 +135,8 @@ public boolean addRegion(IRegion region) { public boolean addRegion(IRegion region, UUID owner) { if (region == null - || !isRegionNameAvailable(region.getName(), owner) || !isNameValid(region.getName()) + || !isRegionNameAvailable(region.getName(), owner) || region instanceof IWorldRegion) return false; region.setOwner(owner); this.regions.put(owner, region); @@ -162,8 +165,11 @@ public boolean addWorldRegion(IWorldRegion region, World world) { } public boolean addWorldRegion(IWorldRegion region, UUID owner, World world) { - if (region == null || world == null || region.getWorld() != null || - !isWorldRegionNameAvailable(region.getName(), world) || !isNameValid(region.getName())) + if (region == null + || world == null + || region.getWorld() != null + || !isNameValid(region.getName()) + || !isWorldRegionNameAvailable(region.getName(), owner, world)) return false; region.setWorld(world); region.setOwner(owner); @@ -180,34 +186,75 @@ public void clearRegionCache() { public Set getAllRegions() { Set set = new HashSet<>(); - this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.values().forEach(set::add)); - this.regions.values().forEach(set::add); + this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.values())); + set.addAll(this.regions.values()); return ImmutableSet.copyOf(set); } public Set getAllRegions(UUID owner) { Set set = new HashSet<>(); - this.worldRegions.forEach((world, worldMultimap) -> worldMultimap.get(owner).forEach(set::add)); - this.regions.get(owner).forEach(set::add); + this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.get(owner))); + set.addAll(this.regions.get(owner)); return ImmutableSet.copyOf(set); } public Set getAllRegions(World world) { if (world == null) return getRegions(); Set set = new HashSet<>(); - this.worldRegions.get(world).values().forEach(set::add); - this.regions.values().forEach(set::add); + set.addAll(this.worldRegions.get(world).values()); + set.addAll(this.regions.values()); + return ImmutableSet.copyOf(set); + } + + public Set getAllRegions(String name, UUID owner) { + Set set = new HashSet<>(); + for (IRegion region : this.regions.get(owner)) { + if (region.getName().equalsIgnoreCase(name)) set.add(region); + } + + for (Multimap map : this.worldRegions.values()) { + for (IWorldRegion region : map.get(owner)) { + if (region.getName().equalsIgnoreCase(name)) set.add(region); + } + } return ImmutableSet.copyOf(set); } public Set getAllRegions(World world, UUID owner) { if (world == null) return getRegions(); Set set = new HashSet<>(); - this.worldRegions.get(world).get(owner).forEach(set::add); - this.regions.get(owner).forEach(set::add); + set.addAll(this.worldRegions.get(world).get(owner)); + set.addAll(this.regions.get(owner)); return ImmutableSet.copyOf(set); } + public Set getAllRegionsWithUniqueNames(UUID owner) { + return getAllRegionsWithUniqueNames(owner, null); + } + + public Set getAllRegionsWithUniqueNames(UUID owner, @Nullable World world) { + Set returnSet = new HashSet<>(); + returnSet.addAll(this.regions.get(owner)); + Map duplicates = new HashMap<>(); + Map regions = new HashMap<>(); + this.worldRegions.forEach((wld, map) -> map.get(owner).forEach(region -> { + String name = region.getName(); + Boolean duplicate = duplicates.get(name); + if (wld == world) { + duplicates.put(name, true); + regions.put(name, region); + } else if (duplicate == null) { + duplicates.put(name, false); + regions.put(name, region); + } else if (!duplicate) { + duplicates.put(name, true); + regions.remove(name); + } + })); + returnSet.addAll(regions.values()); + return ImmutableSet.copyOf(returnSet); + } + public Set getAllServerRegions() { return getAllRegions(SERVER_UUID); } @@ -577,6 +624,11 @@ public void markDirty(IRegion region, RegionCache.DirtyType type) { regionCache.markDirty(region, type); } + public boolean removeObject(IFGObject object) { + if (object instanceof IRegion) return removeRegion(((IRegion) object)); + else return object instanceof IHandler && removeHandler(((IHandler) object)); + } + public boolean removeHandler(IHandler handler) { if (handler == null || handler instanceof GlobalHandler) return false; this.worldRegions.forEach((world, set) -> set.values().stream() @@ -609,10 +661,11 @@ public boolean removeWorldRegion(IWorldRegion region) { if (region == null || region instanceof GlobalWorldRegion) return false; boolean removed = false; if (region.getWorld() != null) { - if (!this.worldRegions.get(region.getWorld()).values().contains(region)) { + Collection regions = this.worldRegions.get(region.getWorld()).values(); + if (!regions.contains(region)) { return false; } - this.worldRegions.get(region.getWorld()).values().remove(region); + regions.remove(region); removed = true; } else { for (Multimap multimap : this.worldRegions.values()) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index b8049a5..f0f994d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -112,12 +112,12 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu String category = parse.args[0]; FGCat fgCat = FGCat.from(category); if (fgCat == null) throw new CommandException(Text.of("\"" + category + "\" is not a valid category!")); - String lCatName = fgCat.name().toLowerCase(); - String uCatName = FCCUtil.toCapitalCase(fgCat.name()); if (num < 2) throw new CommandException(Text.of("Must specify a name!")); String name = parse.args[1]; + if (name.isEmpty()) throw new CommandException(Text.of("Name must not be blank!")); + if (name.matches(CHAR_REGEX)) throw new CommandException(Text.of("Name must be alphanumeric!")); if (name.matches(START_REGEX)) @@ -128,30 +128,6 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu if (lengthLimit > 0 && name.length() > lengthLimit) throw new CommandException(Text.of("Name is too long! Max " + lengthLimit + " characters.")); - if (num < 3) throw new CommandException(Text.of("Must specify a type!")); - String type = parse.args[2]; - - List typeAliases = fgCat.typeAliases.get(); - if (!isIn(typeAliases.toArray(new String[typeAliases.size()]), type)) { - throw new CommandException(Text.of("The type \"" + type + "\" is invalid!")); - } - - World world = null; - if (fgCat == FGCat.WORLDREGION) { - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - String worldName = parse.flags.get("world"); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - } - UUID owner = FGManager.SERVER_UUID; if (parse.flags.containsKey("owner")) { String ownerString = parse.flags.get("owner"); @@ -176,6 +152,34 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } } + World world = null; + if (fgCat == FGCat.WORLDREGION) { + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + String worldName = parse.flags.get("world"); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + if (world == null) + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } + if (world == null) throw new CommandException(Text.of("Must specify a world!")); + } + + if (!fgCat.isNameAvailable(name, owner, world)) { + throw new CommandException(Text.of("That name is already in use!")); + } + + if (num < 3) throw new CommandException(Text.of("Must specify a type!")); + String type = parse.args[2]; + + List typeAliases = fgCat.typeAliases.get(); + if (!isIn(typeAliases.toArray(new String[typeAliases.size()]), type)) { + throw new CommandException(Text.of("The type \"" + type + "\" is invalid!")); + } + String finalBlock = num < 4 ? "" : parse.args[3]; IFGObject object; try { @@ -183,10 +187,10 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } catch (CommandException e) { throw e; } catch (Exception e) { - throw new CommandException(Text.of("There was an exception creating the " + lCatName + "!", e)); + throw new CommandException(Text.of("There was an exception creating the " + fgCat.lName + "!", e)); } if (object == null) - throw new CommandException(Text.of("Failed to construct " + lCatName + " for an unknown reason!")); + throw new CommandException(Text.of("Failed to construct " + fgCat.lName + " for an unknown reason!")); if (object instanceof IHandler) { int priority = 0; @@ -201,19 +205,22 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu boolean success = fgCat.add(object, owner, world); if (!success) - throw new CommandException(Text.of("Successfully constructed but failed to add " + lCatName + "for an unknown reason!")); + throw new CommandException(Text.of("Successfully constructed but failed to add " + fgCat.lName + " for an unknown reason!")); if (object instanceof IRegion) { FCStateManager.instance().getStateMap().get(source).flush(PositionStateField.ID); } - source.sendMessage(Text.of(TextColors.GREEN, uCatName + " created successfully")); + source.sendMessage(Text.of(TextColors.GREEN, fgCat.uName + " created successfully")); StringBuilder logMessage = new StringBuilder(); - logMessage.append(source.getName()).append(" created a ").append(lCatName).append(": ") - .append("Name: ").append(object.getName()).append(" ") - .append("Owner: ").append(OwnerProviderRegistry.getInstance().getKeyword(owner, null)) - .append(" (").append(owner).append(")"); + logMessage.append(source.getName()).append(" created a ").append(fgCat.lName).append(": ") + .append("Name: ").append(object.getName()).append(" "); + + if (owner != null && owner != FGManager.SERVER_UUID) { + logMessage.append("Owner: ").append(OwnerProviderRegistry.getInstance().getKeyword(owner, null)) + .append(" (").append(owner).append(")"); + } if (object instanceof IWorldRegion) { logMessage.append(" World: ").append(((IWorldRegion) object).getWorld().getName()); @@ -224,167 +231,6 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu return CommandResult.empty(); } - /* @Nonnull - @Override - public CommandResult processOld(@Nonnull CommandSource source, @Nonnull String arguments) throws CommandException { - if (!testPermission(source)) { - source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); - return CommandResult.empty(); - } - AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).limit(3).flagMapper(MAPPER).parse(); - - UUID owner = FGManager.SERVER_UUID; - if (parse.flags.containsKey("owner")) { - String ownerString = parse.flags.get("owner"); - if (ownerString.isEmpty()) { - if (source instanceof Identifiable) { - owner = ((Identifiable) source).getUniqueId(); - } - } else { - String[] parts = ownerString.split(":", 2); - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); - Optional ownerOpt; - if (parts.length == 1) { - ownerOpt = registry.getUUIDForOwner(null, parts[0]); - } else if (parts.length == 2) { - ownerOpt = registry.getUUIDForOwner(parts[0], parts[1]); - } else ownerOpt = Optional.empty(); - if (ownerOpt.isPresent()) { - owner = ownerOpt.get(); - } - } - } - - if (parse.args.length == 0) { - source.sendMessage(Text.builder() - .append(Text.of(TextColors.GREEN, "Usage: ")) - .append(getUsage(source)) - .build()); - return CommandResult.empty(); - //---------------------------------------------------------------------------------------------------------------------- - } else if (isIn(REGIONS_ALIASES, parse.args[0]) || isIn(WORLDREGIONS_ALIASES, parse.args[0])) { - boolean isWorldRegion = isIn(WORLDREGIONS_ALIASES, parse.args[0]); - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - String worldName = parse.flags.get("world"); - World world = null; - if (isWorldRegion) { - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - } - if (parse.args[1].matches(CHAR_REGEX)) - throw new CommandException(Text.of("Name must be alphanumeric!")); - if (parse.args[1].matches(START_REGEX)) - throw new CommandException(Text.of("Name can't start with a number or hyphen!")); - if (!FGManager.isNameValid(parse.args[1])) - throw new CommandException(Text.of("You may not use \"" + parse.args[1] + "\" as a name!")); - int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); - if (lengthLimit > 0 && parse.args[1].length() > lengthLimit) - throw new CommandException(Text.of("Name is too long!")); - if (isWorldRegion) { - if (!FGManager.getInstance().isWorldRegionNameAvailable(parse.args[1], world)) - throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); - } else if (!FGManager.getInstance().isRegionNameAvailable(parse.args[1])) - throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); - if (parse.args.length < 3) throw new CommandException(Text.of("Must specify a type!")); - - IRegion newRegion; - if (isWorldRegion) { - List aliases = FGFactoryManager.getInstance().getWorldRegionTypeAliases(); - if (!isIn(aliases.toArray(new String[aliases.size()]), parse.args[2])) { - throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); - } - newRegion = FGFactoryManager.getInstance().createWorldRegion( - parse.args[1], parse.args[2], - parse.args.length < 4 ? "" : parse.args[3], - source); - } else { - List aliases = FGFactoryManager.getInstance().getRegionTypeAliases(); - if (!isIn(aliases.toArray(new String[aliases.size()]), parse.args[2])) { - throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); - } - newRegion = FGFactoryManager.getInstance().createRegion( - parse.args[1], parse.args[2], - parse.args.length < 4 ? "" : parse.args[3], - source); - } - if (newRegion == null) - throw new CommandException(Text.of("Failed to create region! Perhaps the type is invalid?")); - newRegion.setOwner(owner); - boolean success = FGManager.getInstance().addRegion(newRegion, world); - if (!success) - throw new CommandException(Text.of("There was an error trying to create the " + (isWorldRegion ? "World" : "") + "Region!")); - FCStateManager.instance().getStateMap().get(source).flush(PositionStateField.ID); - source.sendMessage(Text.of(TextColors.GREEN, (isWorldRegion ? "Worldr" : "R") + "egion created successfully")); - FoxGuardMain.instance().getLogger().info( - source.getName() + " created a " + (isWorldRegion ? "world" : "") + "region with name \"" + newRegion.getName() + "\"" + - (isWorldRegion ? (" in world \"" + world.getName() + "\"") : "") - ); - return CommandResult.success(); - //---------------------------------------------------------------------------------------------------------------------- - } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { - boolean isController = isIn(CONTROLLERS_ALIASES, parse.args[0]); - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - if (parse.args[1].matches(CHAR_REGEX)) - throw new ArgumentParseException(Text.of("Name must be alphanumeric!"), parse.args[1], 1); - if (parse.args[1].matches(START_REGEX)) - throw new ArgumentParseException(Text.of("Name can't start with a number!"), parse.args[1], 1); - if (!FGManager.isNameValid(parse.args[1])) - throw new CommandException(Text.of("You may not use \"" + parse.args[1] + "\" as a name!")); - int lengthLimit = FGConfigManager.getInstance().getNameLengthLimit(); - if (lengthLimit > 0 && parse.args[1].length() > lengthLimit) - throw new CommandException(Text.of("Name is too long!")); - int priority = 0; - try { - priority = Integer.parseInt(parse.flags.get("priority")); - if (priority < Integer.MIN_VALUE / 2 + 1) priority = Integer.MIN_VALUE / 2 + 1; - else if (priority > Integer.MAX_VALUE / 2) priority = Integer.MAX_VALUE / 2; - } catch (NumberFormatException ignored) { - } - - if (parse.args.length < 3) throw new CommandException(Text.of("Must specify a type!")); - IHandler newHandler; - if (isController) { - List aliases = FGFactoryManager.getInstance().getControllerTypeAliases(); - if (!isIn(aliases.toArray(new String[aliases.size()]), parse.args[2])) { - throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); - } - newHandler = FGFactoryManager.getInstance().createController( - parse.args[1], parse.args[2], - parse.args.length < 4 ? "" : parse.args[3], - source); - } else { - List aliases = FGFactoryManager.getInstance().getHandlerTypeAliases(); - if (!isIn(aliases.toArray(new String[aliases.size()]), parse.args[2])) { - throw new CommandException(Text.of("The type \"" + parse.args[2] + "\" is invalid!")); - } - newHandler = FGFactoryManager.getInstance().createHandler( - parse.args[1], parse.args[2], - parse.args.length < 4 ? "" : parse.args[3], - source); - } - if (newHandler == null) - throw new CommandException(Text.of("Failed to create " + (isController ? "controller" : "handler") + "! Perhaps the type is invalid?")); - newHandler.setOwner(owner); - boolean success = FGManager.getInstance().addHandler(newHandler); - if (!success) - throw new ArgumentParseException(Text.of("That name is already taken!"), parse.args[1], 1); - source.sendMessage(Text.of(TextColors.GREEN, (isController ? "Controller" : "Handler") + " created successfully!")); - FoxGuardMain.instance().getLogger().info( - source.getName() + " created a " + (isController ? "controller" : "handler") + " with name \"" + newHandler.getName() + "\"" - ); - return CommandResult.success(); - //---------------------------------------------------------------------------------------------------------------------- - } else throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); - }*/ @Nonnull @Override @@ -508,7 +354,8 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF String[] parts = parse.current.token.split(":", 2); if (parts.length == 1) { return OwnerProviderRegistry.getInstance().getProviders().stream() - .map(provider -> provider.getAliases()[0]) + .map(IOwnerProvider::getPrimaryAlias) + .filter(string -> string != null && !string.isEmpty()) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -649,6 +496,8 @@ public boolean add(IFGObject object, UUID owner, @Nullable World world) { String[] catAliases; Supplier> typeAliases; + String lName = name().toLowerCase(); + String uName = FCCUtil.toCapitalCase(name()); FGCat(String[] catAliases, Supplier> typeAliases) { this.catAliases = catAliases; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index c8b6c95..587882c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -27,21 +27,20 @@ import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; -import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; -import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; -import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.ArgumentParseException; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -50,11 +49,12 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public class CommandDelete extends FCCommandBase { @@ -67,7 +67,7 @@ public class CommandDelete extends FCCommandBase { return true; }; - @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); @@ -83,53 +83,40 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(getUsage(source)) .build()); return CommandResult.empty(); - } else if (isIn(REGIONS_ALIASES, parse.args[0])) { + } else { + String category = parse.args[0]; + FGCat fgCat = FGCat.from(category); + if (fgCat == null) throw new CommandException(Text.of("\"" + category + "\" is not a valid category!")); + if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - String regionName = parse.args[1]; - IRegion region = FGManager.getInstance().getRegion(regionName).orElse(null); - boolean isWorldRegion = false; - if (region == null) { - String worldName = parse.flags.get("world"); - World world = null; - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, regionName).orElse(null); - isWorldRegion = true; + + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); + + IFGObject object; + FGManager fgManager = FGManager.getInstance(); + switch (fgCat) { + case REGION: + object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.get("world")); + if (object instanceof IWorldRegion) fgCat = FGCat.WORLDREGION; + break; + case HANDLER: + object = FGUtil.getHandlerFromCommand(ownerResult); + if (object instanceof IController) fgCat = FGCat.CONTROLLER; + break; + default: + throw new CommandException(Text.of("Something went horribly wrong.")); } - if (region == null) - throw new CommandException(Text.of("No region exists with the name \"" + regionName + "\"!")); - if (region instanceof IGlobal) { - throw new CommandException(Text.of("You may not delete the global region!")); + + if (object instanceof IGlobal) { + throw new CommandException(Text.of("You may not delete the global " + fgCat.lName + "!")); } - boolean success = FGManager.getInstance().removeRegion(region); - if (!success) throw new CommandException(Text.of("There was an error trying to delete the region!")); - source.sendMessage(Text.of(TextColors.GREEN, "Region deleted successfully!")); - FoxGuardMain.instance().getLogger().info( - source.getName() + " deleted " + (isWorldRegion ? "world" : "") + "region" - ); - return CommandResult.success(); - } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); - if (!handlerOpt.isPresent()) - throw new ArgumentParseException(Text.of("No handler exists with that name!"), parse.args[1], 1); - IHandler handler = handlerOpt.get(); - if (handler instanceof GlobalHandler) - throw new CommandException(Text.of("You may not delete the global handler!")); - boolean success = FGManager.getInstance().removeHandler(handler); - if (!success) throw new CommandException(Text.of("There was an error trying to delete the handler!")); - source.sendMessage(Text.of(TextColors.GREEN, "Handler deleted successfully!")); + + boolean success = fgManager.removeObject(object); + if (!success) + throw new CommandException(Text.of("There was an error trying to delete the " + fgCat.lName + "!")); + source.sendMessage(Text.of(TextColors.GREEN, fgCat.uName + " deleted successfully!")); return CommandResult.success(); - } else throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); + } } @Override @@ -148,8 +135,16 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index == 1) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix) + .collect(GuavaCollectors.toImmutableList()); + } + if (isIn(REGIONS_ALIASES, parse.args[0])) { String worldName = parse.flags.get("world"); + boolean key = parse.flags.containsKey("world"); World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); if (!worldName.isEmpty()) { @@ -158,24 +153,27 @@ else if (parse.current.index == 1) { world = optWorld.get(); } } - if (world == null) return FGManager.getInstance().getRegions().stream() - .filter(region -> !(region instanceof IGlobal)) - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - else return FGManager.getInstance().getAllRegions(world).stream() - .filter(region -> !(region instanceof IGlobal)) - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); + if (key && world != null) { + return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + .filter(region -> !(region instanceof IGlobal)) + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } else { + return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + .filter(region -> !(region instanceof IGlobal)) + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers().stream() .filter(handler -> !(handler instanceof IGlobal)) .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } @@ -215,4 +213,26 @@ public Optional getHelp(CommandSource source) { public Text getUsage(CommandSource source) { return Text.of("delete ] | handler> "); } + + private enum FGCat { + REGION(REGIONS_ALIASES), + WORLDREGION(null), + HANDLER(HANDLERS_ALIASES), + CONTROLLER(null); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + public final String uName = FCCUtil.toCapitalCase(name()); + + FGCat(String[] catAliases) { + this.catAliases = catAliases; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index b3a3b6c..9087308 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -26,9 +26,11 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; +import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; @@ -79,6 +81,209 @@ public class CommandDetail extends FCCommandBase { @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { + if (!testPermission(source)) { + source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); + return CommandResult.empty(); + } + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .limit(2) + .flagMapper(MAPPER) + .leaveFinalAsIs(true) + .parse(); + if (parse.args.length == 0) { + source.sendMessage(Text.builder() + .append(Text.of(TextColors.GREEN, "Usage: ")) + .append(getUsage(source)) + .build()); + return CommandResult.empty(); + } else { + String category = parse.args[0]; + FGCat fgCat = FGCat.from(category); + if (fgCat == null) throw new CommandException(Text.of("\"" + category + "\" is not a valid category!")); + + if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); + + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); + + IFGObject object; + switch (fgCat) { + case REGION: + object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.get("world")); + if (object instanceof IWorldRegion) fgCat = FGCat.WORLDREGION; + break; + case HANDLER: + object = FGUtil.getHandlerFromCommand(ownerResult); + if (object instanceof IController) fgCat = FGCat.CONTROLLER; + break; + default: + throw new CommandException(Text.of("Something went horribly wrong.")); + } + UUID owner = object.getOwner(); + String name = object.getName(); + String fullName = name; + boolean hasOwner = false; + if (owner != null && owner != FGManager.SERVER_UUID) { + fullName = owner + ":" + fullName; + hasOwner = true; + } + + boolean general = false; + if (parse.args.length < 3 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) general = true; + + Text.Builder builder = Text.builder(); + builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); + if (general) { + builder.append(Text.of(TextActions.runCommand("/foxguard det " + fgCat.sName + " " + FGUtil.genWorldFlag(object) + fullName), + TextActions.showText(Text.of("View details for " + fgCat.lName + " \"" + name + "\"")), + TextColors.GREEN, "------- General -------\n", + TextColors.GOLD, "Name: ", TextColors.RESET, name + "\n")); + if (hasOwner) { + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + builder.append(Text.builder() + .append(Text.of(TextColors.GOLD, "Owner: ")) + .append(registry.getDisplayText(owner, null, source)) + .append(Text.NEW_LINE) + .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) + .build() + ); + } + builder.append(Text.of(TextColors.GOLD, "Type: "), Text.of(TextColors.RESET, object.getLongTypeName() + "\n")); + builder.append(Text.builder() + .append(Text.of(TextColors.GOLD, "Enabled: ")) + .append(Text.of((object.isEnabled() ? TextColors.GREEN : TextColors.RED), (object.isEnabled() ? "True" : "False") + "\n")) + .onClick(TextActions.runCommand("/foxguard " + (object.isEnabled() ? "disable" : "enable") + + " " + fgCat.sName + " " + FGUtil.genWorldFlag(object) + fullName)) + .onHover(TextActions.showText(Text.of("Click to " + (object.isEnabled() ? "disable" : "enable")))) + .build()); + + if (object instanceof IWorldBound) + builder.append(Text.of(TextColors.GOLD, "World: "), Text.of(TextColors.RESET, ((IWorldBound) object).getWorld().getName() + "\n")); + + if (object instanceof IHandler) { + builder.append(Text.builder() + .append(Text.of(TextColors.GOLD, "Priority: ")) + .append(Text.of(TextColors.RESET, ((IHandler) object).getPriority() + "\n")) + .onClick(TextActions.suggestCommand("/foxguard prio " + fullName + " ")) + .onHover(TextActions.showText(Text.of("Click to change priority"))) + .build()); + } + + builder.append(Text.of(TextActions.suggestCommand("/foxguard modify " + fgCat.sName + " " + FGUtil.genWorldFlag(object) + fullName + " "), + TextActions.showText(Text.of("Click to modify " + fgCat.lName + " \"" + name + "\"")), + TextColors.GREEN, "------- Details -------\n")); + } else { + builder.append(Text.of(TextColors.GREEN, "------- Details for " + fgCat.lName + " \"" + name + "\"" + + (object instanceof IWorldBound ? (" in World \"" + ((IWorldBound) object).getWorld().getName() + "\"") : "") + + " -------\n")); + } + + try { + Text objectDetails = object.details(source, parse.args.length < 3 ? "" : parse.args[2]); + if (objectDetails == null) objectDetails = Text.of(); + builder.append(objectDetails); + } catch (Exception e) { + builder.append(Text.of(TextColors.RED, TextStyles.ITALIC, "There was an exception getting details for " + fgCat.lName + " \"" + name + "\".")); + FoxGuardMain.instance().getLogger().error( + fgCat.uName + "\"" + name + "\" of type \"" + object.getLongTypeName() + "\"" + + (object instanceof IWorldBound ? " in world \"" + ((IWorldBound) object).getWorld().getName() + "\"" : "") + + " threw an exception while getting details", e + ); + } + + if (general) { + if(object instanceof IHandler){ + IHandler handler = ((IHandler) object); + builder.append(Text.of(TextColors.GREEN, "\n------- Inbound Links -------")); + List controllerList = FGManager.getInstance().getControllers().stream() + .filter(controller -> controller.getLinks().contains(handler)) + .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) + .collect(GuavaCollectors.toImmutableList()); + List regionList = FGManager.getInstance().getAllRegions().stream() + .filter(region -> region.getLinks().contains(handler)) + .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) + .collect(GuavaCollectors.toImmutableList()); + if (controllerList.size() == 0 && regionList.size() == 0) + builder.append(Text.of(TextStyles.ITALIC, "\nNo inbound links!")); + controllerList.forEach(controller -> { + builder.append(Text.NEW_LINE); + if (source instanceof Player) { + List selectedHandlers = FGUtil.getSelectedHandlers(source); + List selectedControllers = FGUtil.getSelectedControllers(source); + if (selectedHandlers.contains(controller)) { + builder.append(Text.of(TextColors.GRAY, "[h+]")); + builder.append(Text.of(TextColors.RED, + TextActions.runCommand("/foxguard s h remove " + controller.getName()), + TextActions.showText(Text.of("Remove from handler state buffer")), + "[h-]")); + } else { + builder.append(Text.of(TextColors.GREEN, + TextActions.runCommand("/foxguard s h add " + controller.getName()), + TextActions.showText(Text.of("Add to handler state buffer")), + "[h+]")); + builder.append(Text.of(TextColors.GRAY, "[h-]")); + } + if (selectedControllers.contains(controller)) { + builder.append(Text.of(TextColors.GRAY, "[c+]")); + builder.append(Text.of(TextColors.RED, + TextActions.runCommand("/foxguard s c remove " + controller.getName()), + TextActions.showText(Text.of("Remove from controller state buffer")), + "[c-]")); + } else { + builder.append(Text.of(TextColors.GREEN, + TextActions.runCommand("/foxguard s c add " + controller.getName()), + TextActions.showText(Text.of("Add to controller state buffer")), + "[c+]")); + builder.append(Text.of(TextColors.GRAY, "[c-]")); + } + builder.append(Text.of(" ")); + } + builder.append(Text.of(FGUtil.getColorForObject(controller), + TextActions.runCommand("/foxguard det c " + controller.getName()), + TextActions.showText(Text.of("View details for controller \"" + controller.getName() + "\"")), + controller.getShortTypeName() + " : " + controller.getName())); + }); + + regionList.forEach(region -> { + builder.append(Text.NEW_LINE); + if (source instanceof Player) { + List selectedRegions = FGUtil.getSelectedRegions(source); + if (selectedRegions.contains(region)) { + builder.append(Text.of(TextColors.GRAY, "[+]")); + builder.append(Text.of(TextColors.RED, + TextActions.runCommand("/foxguard s r remove " + + FGUtil.genWorldFlag(region) + + region.getName()), + TextActions.showText(Text.of("Remove from state buffer")), + "[-]")); + } else { + builder.append(Text.of(TextColors.GREEN, + TextActions.runCommand("/foxguard s r add " + + FGUtil.genWorldFlag(region) + + region.getName()), + TextActions.showText(Text.of("Add to state buffer")), + "[+]")); + builder.append(Text.of(TextColors.GRAY, "[-]")); + } + builder.append(Text.of(" ")); + } + builder.append(Text.of(FGUtil.getColorForObject(region), + TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), + TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), + FGUtil.getRegionDisplayName(region, true) + )); + }); + } + if (object instanceof ILinkable) + outboundLinks(builder, (ILinkable) object, source); + } + + + return CommandResult.empty(); + } + } + + /*public CommandResult processOld(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); return CommandResult.empty(); @@ -330,7 +535,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } else { throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); } - } + }*/ private void outboundLinks(Text.Builder builder, ILinkable linkable, CommandSource source) { builder.append(Text.of(TextColors.GREEN, "\n------- Outbound Links -------")); @@ -468,4 +673,28 @@ public Text getUsage(CommandSource source) { return Text.of("detail ] | handler> [args...]"); } + private enum FGCat { + REGION(REGIONS_ALIASES, "r"), + WORLDREGION(null, REGION.sName), + HANDLER(HANDLERS_ALIASES, "h"), + CONTROLLER(null, HANDLER.sName); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + public final String uName = FCCUtil.toCapitalCase(name()); + public final String sName; + + FGCat(String[] catAliases, String sName) { + this.catAliases = catAliases; + this.sName = sName; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 3abb74c..0647a07 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -97,8 +97,8 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } else { List objects = new ArrayList<>(); - FGUtil.getSelectedRegions(source).forEach(objects::add); - FGUtil.getSelectedHandlers(source).forEach(objects::add); + objects.addAll(FGUtil.getSelectedRegions(source)); + objects.addAll(FGUtil.getSelectedHandlers(source)); int successes = 0; int failures = 0; for (IFGObject object : objects) { @@ -139,7 +139,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int successes = 0; int failures = 0; List regions = new ArrayList<>(); - FGUtil.getSelectedRegions(source).forEach(regions::add); + regions.addAll(FGUtil.getSelectedRegions(source)); if (parse.args.length > 1) { for (String name : Arrays.copyOfRange(parse.args, 1, parse.args.length)) { IWorldRegion region = FGManager.getInstance().getWorldRegion(world, name).orElse(null); @@ -178,7 +178,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int successes = 0; int failures = 0; List handlers = new ArrayList<>(); - FGUtil.getSelectedHandlers(source).forEach(handlers::add); + handlers.addAll(FGUtil.getSelectedHandlers(source)); for (String name : Arrays.copyOfRange(parse.args, 1, parse.args.length)) { IHandler handler = FGManager.getInstance().getHandler(name).orElse(null); if (handler == null) failures++; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 3956d42..0bae5d4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -146,7 +146,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm output.append(Text.of(TextColors.AQUA, "----- Position: (" + String.format("%.1f, %.1f, %.1f", x, y, z) + ") -----\n")); if (!parse.flags.containsKey("handler") || parse.flags.containsKey("region")) { output.append(Text.of(TextColors.GREEN, "------- Regions Located Here -------\n")); - Collections.sort(regionList, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + regionList.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); ListIterator regionListIterator = regionList.listIterator(); while (regionListIterator.hasNext()) { IRegion region = regionListIterator.next(); @@ -184,10 +184,10 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .forEach(handlerList::add)); output.append(Text.of(TextColors.GREEN, "------- Handlers Located Here -------\n")); if (parse.flags.containsKey("priority")) { - Collections.sort(handlerList, (o1, o2) -> o2.getPriority() - o1.getPriority()); + handlerList.sort((o1, o2) -> o2.getPriority() - o1.getPriority()); hudConfig.priority = true; } else { - Collections.sort(handlerList, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + handlerList.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); } ListIterator handlerListIterator = handlerList.listIterator(); while (handlerListIterator.hasNext()) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index 64d131b..3582090 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -159,6 +159,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int count = 0; while (regionIterator.hasNext() && count < number) { IRegion region = regionIterator.next(); + String fullName = region.getOwner().toString() + ":" + region.getName(); if (source instanceof Player) { List selectedRegions = FGUtil.getSelectedRegions(source); if (selectedRegions.contains(region)) { @@ -181,7 +182,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(" ")); } builder.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + region.getName()), + TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + fullName), TextActions.showText(Text.of("View details")), FGUtil.getRegionDisplayName(region, allFlag))); count++; @@ -245,6 +246,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int count = 0; while (handlerIterator.hasNext() && count < number) { IHandler handler = handlerIterator.next(); + String fullName = handler.getOwner().toString() + ":" + handler.getName(); if (source instanceof Player) { List selectedHandlers = FGUtil.getSelectedHandlers(source); if (controllers) { @@ -298,7 +300,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(" ")); } builder.append(Text.of(FGUtil.getColorForObject(handler), - TextActions.runCommand("/foxguard det h " + handler.getName()), + TextActions.runCommand("/foxguard det h " + fullName), TextActions.showText(Text.of("View details")), handler.getShortTypeName() + " : " + handler.getName())); if (handlerIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java index 53e2b8d..6fe071b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java @@ -237,14 +237,26 @@ private Set parseSegment(String segmentString, CommandSource source set.add(new ExpressionStub(ImmutableSet.copyOf(FGUtil.getSelectedControllers(source)))); } } else if (token.startsWith("^")) { - Optional controllerOpt = FGManager.getInstance().getController(token.substring(1)); - controllerOpt.ifPresent(stubObjects::add); + try { + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(token.substring(1)); + Optional controllerOpt = FGManager.getInstance().getController(ownerResult.getName(), ownerResult.getOwner()); + controllerOpt.ifPresent(stubObjects::add); + } catch (CommandException ignored) { + } } else if (stage == Stage.START) { - Optional regionOpt = FGManager.getInstance().getRegionFromWorld(currentWorld, token); - regionOpt.ifPresent(stubObjects::add); + try { + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(token); + Optional regionOpt = FGManager.getInstance().getRegionFromWorld(currentWorld, ownerResult.getName(), ownerResult.getOwner()); + regionOpt.ifPresent(stubObjects::add); + } catch (CommandException ignored) { + } } else { - Optional handlerOpt = FGManager.getInstance().getHandler(token); - handlerOpt.ifPresent(stubObjects::add); + try { + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(token); + Optional handlerOpt = FGManager.getInstance().getHandler(ownerResult.getName(), ownerResult.getOwner()); + handlerOpt.ifPresent(stubObjects::add); + } catch (CommandException ignored) { + } } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index dd012fb..c7cb13f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -53,7 +53,7 @@ import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; -public class SpawnEntityListener implements EventListener { +public class SpawnEntityListener implements EventListener { private static final FlagBitSet BASE_FLAG_SET = new FlagBitSet(ROOT, DEBUFF, SPAWN, ENTITY); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java index 6b69a7b..dd61b8d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java @@ -25,8 +25,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.owners; -import net.minecraft.command.CommandException; - import java.util.List; import java.util.Optional; import java.util.UUID; @@ -46,4 +44,11 @@ public interface IOwnerProvider { String[] getAliases(); + default String getPrimaryAlias() { + String[] aliases = getAliases(); + if (aliases.length > 0) { + return aliases[0]; + } else return ""; + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 41726b4..a48a97d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -32,6 +32,7 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; import net.foxdenstudio.sponge.foxguard.plugin.FGConfigManager; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; @@ -192,12 +193,12 @@ public void saveObject(IFGObject object, boolean force) { logger.error("Failed to open metadata for writing: " + metadataFile, e); } } else { - logger.info(type.nameUppercase + " " + logName + " is already up to date. Skipping..."); + logger.info(type.uName + " " + logName + " is already up to date. Skipping..."); } defaultModifiedMap.put(object, false); } else { - logger.info(type.nameUppercase + " " + logName + " does not need saving. Skipping..."); + logger.info(type.uName + " " + logName + " does not need saving. Skipping..."); } } @@ -442,7 +443,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i if (fgCat == null || fgCat == FGCat.OBJECT) return Optional.empty(); if (isGlobal(fgCat, type, name)) { - logger.info("Found global " + fgCat.name + ". Skipping..."); + logger.info("Found global " + fgCat.lName + ". Skipping..."); return Optional.empty(); } @@ -458,7 +459,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i if (name == null || name.isEmpty()) { name = category + "-" + type; - logger.warn("No name for loaded " + fgCat.name + ". Using generated name: " + name); + logger.warn("No name for loaded " + fgCat.lName + ". Using generated name: " + name); } if (!fgCat.isNameAvailable(name, owner, world)) { String oldName = name; @@ -468,7 +469,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i name = nameBase + id; id++; } while (!fgCat.isNameAvailable(name, owner, world)); - logger.warn("Name " + oldName + " for " + fgCat.name + " already in use. Changed to: " + name); + logger.warn("Name " + oldName + " for " + fgCat.lName + " already in use. Changed to: " + name); } FGObjectData data; @@ -495,11 +496,11 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i try { fgObject = fgCat.loadInstance(directory, type, data); } catch (Exception e) { - logger.error("There was an error creating the " + fgCat.name, e); + logger.error("There was an error creating the " + fgCat.lName, e); } if (fgObject == null) { - logger.warn("The " + fgCat.name + " was unable to be created."); + logger.warn("The " + fgCat.lName + " was unable to be created."); if (FGConfigManager.getInstance().cleanupFiles()) { logger.warn("Cleaning up unused files"); deleteDirectory(directory); @@ -532,13 +533,17 @@ private Path getWorldDirectory(World world) { constructDirectories(directory); return directory; } + FGConfigManager manager = FGConfigManager.getInstance(); Path path; - if (FGConfigManager.getInstance().saveWorldRegionsInWorldFolders()) { + if (manager.saveWorldRegionsInWorldFolders()) { path = world.getDirectory(); path = path.resolve("foxguard"); } else { - if(FGConfigManager.getInstance().) - path = getFGDirectory(); + if (manager.useCustomDirectory()) { + path = manager.customDirectory(); + } else { + path = getFGDirectory(); + } path = path.resolve("worlds").resolve(world.getName()); } constructDirectories(path); @@ -774,7 +779,7 @@ private FGCat getObjectType(IFGObject object) { } private enum FGCat { - REGION("region", "Region", "regions") { + REGION("regions") { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { return FGManager.getInstance().isRegionNameAvailable(name, owner); @@ -785,7 +790,7 @@ public IFGObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createRegion(directory, type, data); } }, - WORLDREGION("worldregion", "World region", "wregions") { + WORLDREGION("wregions") { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { if (world == null) @@ -798,7 +803,7 @@ public IFGObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createWorldRegion(directory, type, data); } }, - HANDLER("handler", "Handler", "handlers") { + HANDLER("handlers") { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { return FGManager.getInstance().isHandlerNameAvailable(name, owner); @@ -815,7 +820,7 @@ public IFGObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createHandler(directory, type, handlerData); } }, - CONTROLLER("controller", "Controller", HANDLER.pathName) { + CONTROLLER(HANDLER.pathName) { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { return HANDLER.isNameAvailable(name, owner, world); @@ -832,7 +837,7 @@ public IFGObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createController(directory, type, handlerData); } }, - OBJECT("object", "Object", "objects") { + OBJECT("objects") { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { return true; @@ -844,19 +849,17 @@ public IFGObject loadInstance(Path directory, String type, FGObjectData data) { } }; - String name; - String nameUppercase; + String lName = name().toLowerCase(); + String uName = FCCUtil.toCapitalCase(name()); String pathName; - FGCat(String name, String nameUppercase, String pathName) { - this.nameUppercase = nameUppercase; - this.name = name; + FGCat(String pathName) { this.pathName = pathName; } public static FGCat from(String name) { for (FGCat type : values()) { - if (type.name.equals(name)) return type; + if (type.lName.equals(name)) return type; } return null; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index e0dcfae..7dfa9e7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -25,7 +25,9 @@ package net.foxdenstudio.sponge.foxguard.plugin.util; +import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; +import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; @@ -33,6 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.owners.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; @@ -41,7 +44,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; -import org.jetbrains.annotations.NotNull; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -50,15 +52,19 @@ import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.Locatable; import org.spongepowered.api.world.World; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.UUID; -import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; public final class FGUtil { @@ -95,7 +101,7 @@ public static String getRegionDisplayName(IRegion region, boolean dispWorld) { public static String getLogName(IFGObject object) { if (userStorageService == null) userStorageService = FoxGuardMain.instance().getUserStorage(); UUID owner = object.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); + boolean isOwned = !owner.equals(FGManager.SERVER_UUID); Optional userOwner = isOwned ? userStorageService.get(owner) : Optional.empty(); return (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + object.getName(); } @@ -110,8 +116,8 @@ public static String getCategory(IFGObject object) { } else return "object"; } - public static String genWorldFlag(IRegion region) { - return region instanceof IWorldRegion ? "--w:" + ((IWorldRegion) region).getWorld().getName() + " " : ""; + public static String genWorldFlag(IFGObject object) { + return object instanceof IWorldBound ? "--w:" + ((IWorldBound) object).getWorld().getName() + " " : ""; } public static Text readableTristateText(Tristate state) { @@ -138,13 +144,34 @@ public static void markHandlerDirty(IHandler handler) { Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); } - @NotNull + @Nonnull + public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws CommandException { + String name = qualifier.getName(); + UUID owner = qualifier.getOwner(); + Optional handlerOpt; + + handlerOpt = FGManager.getInstance().getHandler(name, owner); + + if (!handlerOpt.isPresent()) { + StringBuilder builder = new StringBuilder(); + builder.append("No handler exists with the name \"").append(name).append("\""); + if (owner != FGManager.SERVER_UUID) { + builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); + } + builder.append("!"); + + throw new CommandException(Text.of(builder.toString())); + } + return handlerOpt.get(); + } + + @Nonnull public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qualifier, String worldName) throws CommandException { String name = qualifier.getName(); UUID owner = qualifier.getOwner(); - Optional regionOpt; - regionOpt = FGManager.getInstance().getRegion(name, owner); + IRegion returnRegion = null; + /*regionOpt = FGManager.getInstance().getRegion(name, owner); if (!regionOpt.isPresent()) { World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); @@ -159,16 +186,54 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua } if (world == null) throw new CommandException(Text.of("Must specify a world!")); regionOpt = FGManager.getInstance().getWorldRegion(world, name, owner); + }*/ + + Set regions = FGManager.getInstance().getAllRegions(qualifier.getName(), qualifier.getOwner()); + World world = null; + if (regions.size() == 1) { + returnRegion = regions.iterator().next(); + } else if (regions.size() > 1) { + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + if (world == null) + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } + for (IRegion region : regions) { + if (region instanceof IWorldRegion) { + if (world == null) continue; + if (((IWorldRegion) region).getWorld() == world) returnRegion = region; + } else { + returnRegion = region; + break; + } + } + if (returnRegion == null && world == null) throw new CommandException(Text.of("Must specify a world!")); } - if (!regionOpt.isPresent()) - throw new CommandException(Text.of("No region exists with the name \"" + name + "\"" - + (owner != SERVER_UUID ? " and owner \"" + qualifier.getOwnerName() + "\"" : "") - + "!")); - return regionOpt.get(); + if (returnRegion == null) { + StringBuilder builder = new StringBuilder(); + builder.append("No region exists with the name \"").append(name).append("\""); + if (owner != FGManager.SERVER_UUID) { + builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); + } + if (world != null && regions.size() > 0) { + builder.append(" in world \"").append(world.getName()).append("\""); + } + builder.append("!"); + + throw new CommandException(Text.of(builder.toString())); + } + return returnRegion; } + public static OwnerResult processUserInput(String input) throws CommandException { + if (input.startsWith(":")) input = input.substring(1); String[] parts = input.split(":", 3); String name = null; @@ -189,8 +254,10 @@ public static OwnerResult processUserInput(String input) throws CommandException break; } - if (name == null || name.isEmpty()) - throw new CommandException(Text.of("Name must not be... blank?")); + if (name == null) + throw new CommandException(Text.of("Name must not be... null?")); + else if (name.isEmpty()) + throw new CommandException(Text.of("Name must not be empty!")); Optional ownerOpt = OwnerProviderRegistry.getInstance().getUUIDForOwner(provider, ownerQualifier); if (!ownerOpt.isPresent()) { @@ -200,6 +267,111 @@ public static OwnerResult processUserInput(String input) throws CommandException return new OwnerResult(name, ownerOpt.get(), ownerQualifier); } + public static OwnerTabResult getOwnerSuggestions(String input) { + boolean prefixed = false; + if (input.startsWith(":")) { + input = input.substring(1); + prefixed = true; + } + String[] parts = input.split(":", 3); + if (parts.length == 1) { + if (prefixed) { + List list = OwnerProviderRegistry.getInstance().getProviders().stream() + .map(IOwnerProvider::getPrimaryAlias) + .filter(str -> str != null && !str.isEmpty()) + .filter(new StartsWithPredicate(parts[0])) + .map(str -> ":" + str) + .collect(GuavaCollectors.toImmutableList()); + if (list.size() == 1) { + list = ImmutableList.of(list.get(0).substring(1) + ":"); + } + return new OwnerTabResult(list); + } else { + return new OwnerTabResult("", parts[0], FGManager.SERVER_UUID); + } + } else if (parts.length == 2) { + OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + Optional providerOpt = registry.getProvider(parts[0]); + if (providerOpt.isPresent()) { + IOwnerProvider provider = providerOpt.get(); + List list = provider.getOwnerKeywords().stream() + .filter(str -> str != null && !str.isEmpty()) + .filter(new StartsWithPredicate(parts[1])) + .map(str -> parts[0] + ":" + str) + .collect(GuavaCollectors.toImmutableList()); + int size = list.size(); + if (size == 0) { + if (prefixed) { + list = ImmutableList.of(parts[0] + ":" + parts[1]); + } + } else if (size == 1) { + ImmutableList.of(list.get(0) + ":"); + } + return new OwnerTabResult(list); + } else { + Optional ownerOpt = registry.getUUIDForOwner(null, parts[0]); + return ownerOpt.map(uuid -> new OwnerTabResult(parts[0] + ":", parts[1], uuid)) + .orElseGet(OwnerTabResult::new); + + } + } else if (parts.length == 3) { + Optional providerOpt = OwnerProviderRegistry.getInstance().getProvider(parts[0]); + if (providerOpt.isPresent()) { + IOwnerProvider provider = providerOpt.get(); + Optional ownerOpt = provider.getOwnerUUID(parts[1]); + return ownerOpt.map(uuid -> new OwnerTabResult(parts[0] + ":" + parts[1] + ":", parts[2], uuid)) + .orElseGet(OwnerTabResult::new); + } + + } + return new OwnerTabResult(); + } + + public static class OwnerTabResult { + private boolean complete; + private List suggestions; + private String prefix; + private String token; + private UUID owner; + + public OwnerTabResult() { + this.complete = true; + this.suggestions = ImmutableList.of(); + } + + public OwnerTabResult(List suggestions) { + this.complete = true; + this.suggestions = suggestions; + } + + public OwnerTabResult(String prefix, String token, UUID owner) { + this.complete = false; + this.prefix = prefix; + this.token = token; + this.owner = owner; + } + + public boolean isComplete() { + return complete; + } + + public List getSuggestions() { + return suggestions; + } + + public String getPrefix() { + return prefix; + } + + public String getToken() { + return token; + } + + public UUID getOwner() { + return owner; + } + } + public static class OwnerResult { private String name; private UUID owner; From 7a67fa42d1d6ea7ab44aafafaae05939625962d8 Mon Sep 17 00:00:00 2001 From: gravityfox Date: Tue, 24 Oct 2017 16:09:56 -0700 Subject: [PATCH 12/30] More updated commands and stuff --- .../plugin/command/CommandDelete.java | 2 +- .../plugin/command/CommandDetail.java | 37 +++-- .../plugin/command/CommandEnableDisable.java | 60 +++++--- .../plugin/command/CommandModify.java | 141 +++++++++--------- .../plugin/command/CommandPriority.java | 2 +- .../sponge/foxguard/plugin/util/FGUtil.java | 57 +++---- 6 files changed, 163 insertions(+), 136 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index 587882c..f5515ca 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -96,7 +96,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGManager fgManager = FGManager.getInstance(); switch (fgCat) { case REGION: - object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.get("world")); + object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.containsKey("world"), parse.flags.get("world")); if (object instanceof IWorldRegion) fgCat = FGCat.WORLDREGION; break; case HANDLER: diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 9087308..aedaa2e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -109,7 +109,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm IFGObject object; switch (fgCat) { case REGION: - object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.get("world")); + object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.containsKey("world"), parse.flags.get("world")); if (object instanceof IWorldRegion) fgCat = FGCat.WORLDREGION; break; case HANDLER: @@ -607,8 +607,16 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index == 1) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix) + .collect(GuavaCollectors.toImmutableList()); + } + if (isIn(REGIONS_ALIASES, parse.args[0])) { String worldName = parse.flags.get("world"); + boolean key = parse.flags.containsKey("world"); World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); if (!worldName.isEmpty()) { @@ -617,21 +625,24 @@ else if (parse.current.index == 1) { world = optWorld.get(); } } - if (world == null) return FGManager.getInstance().getRegions().stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); + if (key && world != null) { + return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } else { + return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers().stream() .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 0647a07..1842707 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -56,13 +56,14 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public class CommandEnableDisable extends FCCommandBase { @@ -81,6 +82,17 @@ public CommandEnableDisable(boolean enableState) { this.enableState = enableState; } + public CommandResult process2(CommandSource source, String arguments) throws CommandException { + if (!testPermission(source)) { + source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); + return CommandResult.empty(); + } + AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); + + + return CommandResult.empty(); + } + @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { @@ -228,8 +240,16 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index > 0) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix) + .collect(GuavaCollectors.toImmutableList()); + } + if (isIn(REGIONS_ALIASES, parse.args[0])) { String worldName = parse.flags.get("world"); + boolean key = parse.flags.containsKey("world"); World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); if (!worldName.isEmpty()) { @@ -238,29 +258,27 @@ else if (parse.current.index > 0) { world = optWorld.get(); } } - String[] existing = Arrays.copyOfRange(parse.args, 1, parse.args.length); - if (world == null) return FGManager.getInstance().getRegions().stream() - .filter(region -> region.isEnabled() != this.enableState && !(region instanceof IGlobal)) - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .filter(alias -> !isIn(existing, alias)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - return FGManager.getInstance().getAllRegions(world).stream() - .filter(region -> region.isEnabled() != this.enableState && !(region instanceof IGlobal)) - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .filter(alias -> !isIn(existing, alias)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); + if (key && world != null) { + return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } else { + return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - String[] existing = Arrays.copyOfRange(parse.args, 1, parse.args.length); return FGManager.getInstance().getHandlers().stream() - .filter(handler -> handler.isEnabled() != this.enableState && !(handler instanceof IGlobal)) + .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .filter(alias -> !isIn(existing, alias)) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index fe88adc..e70f285 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -26,22 +26,25 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.ArgumentParseException; import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.StartsWithPredicate; @@ -49,11 +52,12 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; -import javax.annotation.Nullable; import java.util.List; import java.util.Optional; import java.util.stream.Stream; +import javax.annotation.Nullable; + import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public class CommandModify extends FCCommandBase { @@ -83,87 +87,54 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(getUsage(source)) .build()); return CommandResult.empty(); - } else if (isIn(REGIONS_ALIASES, parse.args[0])) { - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a region name!")); - IRegion region = null; - if (!parse.flags.containsKey("world")) - region = FGManager.getInstance().getRegion(parse.args[1]).orElse(null); - if (region == null) { - String worldName = parse.flags.get("world"); - World world = null; - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[1]).orElse(null); + } else { + String category = parse.args[0]; + FGCat fgCat = FGCat.from(category); + if (fgCat == null) throw new CommandException(Text.of("\"" + category + "\" is not a valid category!")); + + if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); + + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); + + IFGObject object; + switch (fgCat) { + case REGION: + object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.containsKey("world"), parse.flags.get("world")); + if (object instanceof IWorldRegion) fgCat = FGCat.WORLDREGION; + break; + case HANDLER: + object = FGUtil.getHandlerFromCommand(ownerResult); + if (object instanceof IController) fgCat = FGCat.CONTROLLER; + break; + default: + throw new CommandException(Text.of("Something went horribly wrong.")); } - if (region == null) - throw new ArgumentParseException(Text.of("No region exists with that name!"), parse.args[1], 1); - ProcessResult result = region.modify(source, parse.args.length < 3 ? "" : parse.args[2]); - Optional messageOptional = result.getMessage(); - if (result.isSuccess()) { - FGUtil.markRegionDirty(region); - if (messageOptional.isPresent()) { - if (!FCPUtil.hasColor(messageOptional.get())) { - source.sendMessage(messageOptional.get().toBuilder().color(TextColors.GREEN).build()); - } else { - source.sendMessage(messageOptional.get()); - } - } else { - source.sendMessage(Text.of(TextColors.GREEN, "Successfully modified region!")); - } + ProcessResult result = object.modify(source, parse.args.length < 3 ? "" : parse.args[2]); + Optional messageOptional = result.getMessage(); + boolean success = result.isSuccess(); + TextColor color; + if (success) { + color = TextColors.GREEN; + FGUtil.markDirty(object); } else { - if (messageOptional.isPresent()) { - if (!FCPUtil.hasColor(messageOptional.get())) { - source.sendMessage(messageOptional.get().toBuilder().color(TextColors.RED).build()); - } else { - source.sendMessage(messageOptional.get()); - } - } else { - source.sendMessage(Text.of(TextColors.RED, "Modification failed for region!")); - } + color = TextColors.RED; } - } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler name!")); - IHandler handler = FGManager.getInstance().getHandler(parse.args[1]).orElse(null); - if (handler == null) - throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); - ProcessResult result = handler.modify(source, parse.args.length < 3 ? "" : parse.args[2]); - Optional messageOptional = result.getMessage(); - if (result.isSuccess()) { - FGUtil.markHandlerDirty(handler); - if (messageOptional.isPresent()) { - if (!FCPUtil.hasColor(messageOptional.get())) { - source.sendMessage(messageOptional.get().toBuilder().color(TextColors.GREEN).build()); - } else { - source.sendMessage(messageOptional.get()); - } + + if (messageOptional.isPresent()) { + if (!FCPUtil.hasColor(messageOptional.get())) { + source.sendMessage(messageOptional.get().toBuilder().color(color).build()); } else { - source.sendMessage(Text.of(TextColors.GREEN, "Successfully modified handler!")); + source.sendMessage(messageOptional.get()); } } else { - if (messageOptional.isPresent()) { - if (!FCPUtil.hasColor(messageOptional.get())) { - source.sendMessage(messageOptional.get().toBuilder().color(TextColors.RED).build()); - } else { - source.sendMessage(messageOptional.get()); - } - } else { - source.sendMessage(Text.of(TextColors.RED, "Modification failed for handler!")); - } + source.sendMessage(Text.of(TextColors.GREEN, success ? + "Successfully modified " + fgCat.lName + "!" : + "Modification failed for " + fgCat.lName + "!")); } - } else { - throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); + + return CommandResult.empty(); } - return CommandResult.empty(); } @Override @@ -284,4 +255,26 @@ public Optional getHelp(CommandSource source) { public Text getUsage(CommandSource source) { return Text.of("modify ] | handler> [args...]"); } + + private enum FGCat { + REGION(REGIONS_ALIASES), + WORLDREGION(null), + HANDLER(HANDLERS_ALIASES), + CONTROLLER(null); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + + FGCat(String[] catAliases) { + this.catAliases = catAliases; + + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index 45ac7c7..dcb346a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -72,7 +72,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int successes = 0; int failures = 0; List handlers = new ArrayList<>(); - FGUtil.getSelectedHandlers(source).forEach(handlers::add); + handlers.addAll(FGUtil.getSelectedHandlers(source)); PriorityMachine machine = null; for (String arg : parse.args) { try { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 7dfa9e7..c6b6d65 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -133,15 +133,12 @@ public static Text readableTristateText(Tristate state) { } } - public static void markRegionDirty(IRegion region) { - FGManager.getInstance().markDirty(region, RegionCache.DirtyType.MODIFIED); - FGStorageManagerNew.getInstance().defaultModifiedMap.put(region, true); - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); - } - - public static void markHandlerDirty(IHandler handler) { - FGStorageManagerNew.getInstance().defaultModifiedMap.put(handler, true); - Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); + public static void markDirty(IFGObject object){ + if(object instanceof IRegion){ + FGManager.getInstance().markDirty(((IRegion) object), RegionCache.DirtyType.MODIFIED); + } + FGStorageManagerNew.getInstance().defaultModifiedMap.put(object, true); + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), object)); } @Nonnull @@ -166,7 +163,7 @@ public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws Comma } @Nonnull - public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qualifier, String worldName) throws CommandException { + public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qualifier, boolean worldFlag, @Nullable String worldName) throws CommandException { String name = qualifier.getName(); UUID owner = qualifier.getOwner(); @@ -190,31 +187,39 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua Set regions = FGManager.getInstance().getAllRegions(qualifier.getName(), qualifier.getOwner()); World world = null; - if (regions.size() == 1) { - returnRegion = regions.iterator().next(); - } else if (regions.size() > 1) { - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { + if (source instanceof Locatable) world = ((Locatable) source).getWorld(); + if (worldFlag) { + if (worldName != null && !worldName.isEmpty()) { Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); if (optWorld.isPresent()) { world = optWorld.get(); } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); } } - for (IRegion region : regions) { - if (region instanceof IWorldRegion) { - if (world == null) continue; - if (((IWorldRegion) region).getWorld() == world) returnRegion = region; - } else { - returnRegion = region; - break; + if (world == null) + throw new CommandException(Text.of("Must specify a world with the world flag!")); + Optional regionOpt = FGManager.getInstance().getWorldRegion(world, qualifier.getName(), qualifier.getOwner()); + if (regionOpt.isPresent()) { + returnRegion = regionOpt.get(); + } + } else { + if (regions.size() == 1) { + returnRegion = regions.iterator().next(); + } else if (regions.size() > 1) { + for (IRegion region : regions) { + if (region instanceof IWorldRegion) { + if (world == null) continue; + if (((IWorldRegion) region).getWorld() == world) returnRegion = region; + } else { + returnRegion = region; + break; + } } + if (returnRegion == null && world == null) + throw new CommandException(Text.of("Multiple regions exist !")); } - if (returnRegion == null && world == null) throw new CommandException(Text.of("Must specify a world!")); } - if (returnRegion == null) { StringBuilder builder = new StringBuilder(); builder.append("No region exists with the name \"").append(name).append("\""); From 8d4da0eb7d3a70c2d644e1df6ad51de289ecdba4 Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Thu, 23 Nov 2017 03:25:55 -0800 Subject: [PATCH 13/30] More Changes. --- .../foxguard/plugin/FGConfigManager.java | 122 ++++-- .../sponge/foxguard/plugin/FGManager.java | 53 +++ .../sponge/foxguard/plugin/FoxGuardMain.java | 4 +- .../plugin/command/CommandCreate.java | 29 +- .../plugin/command/CommandDelete.java | 5 +- .../plugin/command/CommandDetail.java | 379 ++---------------- .../plugin/command/CommandEnableDisable.java | 118 +++++- .../foxguard/plugin/command/CommandHere.java | 67 +--- .../foxguard/plugin/command/CommandLink.java | 97 ++--- .../foxguard/plugin/command/CommandList.java | 228 ++++++++++- .../plugin/command/CommandModify.java | 43 +- .../{CommandRename.java => CommandMove.java} | 4 +- .../plugin/command/CommandPriority.java | 18 +- .../foxguard/plugin/command/CommandTest.java | 10 +- .../plugin/controller/LogicController.java | 6 +- .../foxguard/plugin/handler/BasicHandler.java | 20 +- .../foxguard/plugin/handler/GroupHandler.java | 16 +- .../foxguard/plugin/handler/HandlerBase.java | 2 +- .../plugin/handler/PermissionHandler.java | 6 +- .../plugin/handler/StaticHandler.java | 4 +- .../plugin/listener/PlayerMoveListener.java | 4 +- .../listener/PlayerMoveListenerNew.java | 4 +- .../foxguard/plugin/object/FGObjectBase.java | 9 + .../foxguard/plugin/object/IFGObject.java | 5 + .../object/owners/OfflineUserProvider.java | 11 +- .../object/owners/OnlinePlayerProvider.java | 18 + .../foxguard/plugin/region/RegionBase.java | 2 +- .../plugin/state/ControllersStateField.java | 2 +- .../plugin/state/HandlersStateField.java | 2 +- .../plugin/state/RegionsStateField.java | 13 +- .../plugin/storage/FGStorageManagerNew.java | 45 ++- .../sponge/foxguard/plugin/util/FGUtil.java | 147 ++++++- 32 files changed, 886 insertions(+), 607 deletions(-) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/{CommandRename.java => CommandMove.java} (98%) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java index 0050695..f32695b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin; +import com.google.common.collect.ImmutableMap; import ninja.leaping.configurate.ConfigurationOptions; import ninja.leaping.configurate.commented.CommentedConfigurationNode; import ninja.leaping.configurate.hocon.HoconConfigurationLoader; @@ -41,7 +42,18 @@ public final class FGConfigManager { private static FGConfigManager instance; + // general + private int nameLengthLimit; + + // storage private boolean cleanupFiles; + private boolean gcAndFinalize; + + // storage/json + private boolean prettyPrint; + private int prettyPrintIndent; + + // storage/location private boolean saveWorldRegionsInWorldDirectories; private boolean saveInWorldDirectory; private boolean ownerFirst; @@ -49,12 +61,12 @@ public final class FGConfigManager { private boolean useCustomDirectory; private Path customDirectory; - private boolean gcAndFinalize; + // storage/database private boolean lockDatabaseFiles; private boolean useMMappedFiles; private boolean gcCleanerHack; - private int nameLengthLimit; + // modules private Map modules = new EnumMap<>(Module.class); public FGConfigManager() { @@ -84,16 +96,42 @@ public void save() { } //-------------------------------------------------------------------------------------------------------------- + // general + root.getNode("general", "nameLengthLimit") + .setValue(nameLengthLimit) + .setComment("The length limit for object names. Use 0 or lower for no limit.\n" + + "Extremely long names can cause a variety of un-fixable issues. You have been warned."); + + // storage root.getNode("storage", "cleanupFiles") .setValue(cleanupFiles) .setComment("Sets whether to aggressively delete files that are no longer used. Default: true\n" + - "This is meant to keep the file store clean and free of clutter. It also improves load times.\n" + - "The caveat is that objects that fail to load are deleted without warning. This normally isn't an issue, even in server crashes.\n" + + "This is meant to keep the file store clean and free of clutter.\n" + + "The caveat is that objects that fail to load are deleted without warning.\n" + "However, modifying databases and moving the files around can trigger the cleanup.\n" + "If plugin simply fails to load the database, it would just be discarded.\n" + "Setting this option to false will prevent databases from being deleted.\n" + "However, they will still be overwritten if a new database is made with the same name."); + root.getNode("storage", "gcAndFinalize") + .setValue(gcAndFinalize) + .setComment("Whether to run try running gc and finalization when deleting things.\n" + + "This may drastically slow down the deletion of objects.\n" + + "Use only if you are having trouble deleting things from in game.\n" + + "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems."); + + // storage/json + root.getNode("storage", "json", "prettyPrint") + .setValue(prettyPrint) + .setComment("Enables formatted json in .foxcf files when set to true. Otherwise leaves json minified when set to false." + + "Default: false"); + + root.getNode("storage", "json", "prettyPrintIndent") + .setValue(prettyPrintIndent) + .setComment("Sets the indent for pretty printing when applicable." + + "Default: 4"); + + // storage/location root.getNode("storage", "location") .setComment("These options control where FoxGuard objects are stored.\n" + "BE WARNED that changing these settings will not automatically move files to a new location.\n" + @@ -110,31 +148,31 @@ public void save() { .setComment("Whether or not FoxGuard should save world-region information in the world directory. Default: true\n" + "In this case, the files are kept with their corresponding world/dimension.\n" + "This makes it easier to copy and paste world data without causing de-synchronization between the world data and FoxGuard data."); + root.getNode("storage", "location", "ownerFirst") .setValue(ownerFirst) .setComment("Whether to sort by owners first and then category. Default: true\n" + "When set to true, object will be stored like \"foxguard/owners/uuid/handlers/myhandler\".\n" + "When set to false, objects will instead be stored like \"foxguard/handlers/owners/uuid/myhandler\".\n" + "This does not affect objects without an owner, which are still stored like \"foxguard/handlers/myhandler\"."); + root.getNode("storage", "location", "useConfigDirectory") .setValue(useConfigDirectory) .setComment("Whether or not to place the foxguard directory inside the config directory. Default: false\n" + "Only applies if files are not kept inside the world directory."); + root.getNode("storage", "location", "useCustomDirectory") .setValue(useCustomDirectory) .setComment("Whether or not to set the foxguard directory to a custom path. Default false:\n" + "Only applies if files are not kept inside the world folder.\n" + "This setting overrides the other location settings.\n" + "The working directory is the saves directory, which is the root directory on a Minecraft server."); + root.getNode("storage", "location", "customDirectory") .setValue(customDirectory.normalize().toString()) .setComment("The custom foxguard directory path."); - root.getNode("storage", "gcAndFinalize") - .setValue(gcAndFinalize) - .setComment("Whether to run try running gc and finalization when deleting things.\n" + - "This may drastically slow down the deletion of objects.\n" + - "Use only if you are having trouble deleting things from in game.\n" + - "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems."); + + // storage/database root.getNode("storage", "database", "lockDatabaseFiles") .setValue(lockDatabaseFiles) .setComment("Whether to put a lock on database files while accessing them.\n" + @@ -152,13 +190,11 @@ public void save() { .setComment("Whether to enable MapDB's gcCleanerHack functionality.\n" + "This is meant for fixing issues with databases being un-deletable on Windows when memory mapping is enabled.\n" + "This only makes a difference if memory mapping is enabled, and can potentially decrease performance."); - root.getNode("general", "nameLengthLimit") - .setValue(nameLengthLimit) - .setComment("The length limit for object names. Use 0 or lower for no limit.\n" + - "Extremely long names can cause a variety of unfixable issues. You have been warned."); + // modules for (Module m : Module.values()) { - root.getNode("module", m.name).setValue(this.modules.get(m)); + CommentedConfigurationNode node = root.getNode("modules", m.name).setValue(this.modules.get(m)); + if (m.comment != null && !m.comment.isEmpty()) node.setComment(m.comment); } @@ -187,7 +223,18 @@ private void load() { } //-------------------------------------------------------------------------------------------------------------- + // general + nameLengthLimit = root.getNode("general", "nameLengthLimit").getInt(24); + + // storage cleanupFiles = root.getNode("storage", "cleanupFiles").getBoolean(true); + gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); + + // storage/json + prettyPrint = root.getNode("storage", "json", "prettyPrint").getBoolean(false); + prettyPrintIndent = root.getNode("storage", "json", "prettyPrintIndent").getInt(4); + + // storage/location saveInWorldDirectory = root.getNode("storage", "location", "saveInWorldDirectory").getBoolean(true); saveWorldRegionsInWorldDirectories = root.getNode("storage", "location", "saveWorldRegionsInWorldDirectories").getBoolean(true); ownerFirst = root.getNode("storage", "location", "ownerFirst").getBoolean(true); @@ -201,13 +248,15 @@ private void load() { if (Files.notExists(path) || Files.isDirectory(path)) return path.normalize(); else return null; }, Paths.get("foxguard")); - gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); + + // storage/database lockDatabaseFiles = root.getNode("storage", "database", "lockDatabaseFiles").getBoolean(false); useMMappedFiles = root.getNode("storage", "database", "useMMappedFiles").getBoolean(false); gcCleanerHack = root.getNode("storage", "database", "gcCleanerHack").getBoolean(false); - nameLengthLimit = root.getNode("general", "nameLengthLimit").getInt(24); + + // modules for (Module m : Module.values()) { - this.modules.put(m, root.getNode("module", m.name).getBoolean(true)); + this.modules.put(m, root.getNode("modules", m.name).getBoolean(true)); } //-------------------------------------------------------------------------------------------------------------- @@ -215,11 +264,30 @@ private void load() { //Path path = Sponge.getGame().getSavesDirectory(); } + // general + public int getNameLengthLimit() { + return nameLengthLimit; + } + // storage public boolean cleanupFiles() { return cleanupFiles; } + public boolean gcAndFinalize() { + return gcAndFinalize; + } + + // storage/json + public boolean prettyPrint() { + return prettyPrint; + } + + public int prettyPrintIndent() { + return prettyPrintIndent; + } + + // storage/location public boolean saveWorldRegionsInWorldFolders() { return saveWorldRegionsInWorldDirectories; } @@ -244,10 +312,7 @@ public Path customDirectory() { return customDirectory; } - public boolean gcAndFinalize() { - return gcAndFinalize; - } - + // storage/database public boolean lockDatabaseFiles() { return lockDatabaseFiles; } @@ -260,21 +325,24 @@ public boolean gcCleanerHack() { return gcCleanerHack; } - public int getNameLengthLimit() { - return nameLengthLimit; - } - public Map getModules() { - return this.modules; + return ImmutableMap.copyOf(this.modules); } public enum Module { MOVEMENT("movement"); String name; + String comment; Module(String name) { this.name = name; + this.comment = null; + } + + Module(String name, String comment) { + this(name); + this.comment = comment; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index b073565..2ab8054 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -56,6 +56,7 @@ import java.util.*; import java.util.stream.Collectors; +import javax.annotation.Nonnull; import javax.annotation.Nullable; public final class FGManager { @@ -184,6 +185,7 @@ public void clearRegionCache() { this.regionCache.clearCaches(); } + @Nonnull public Set getAllRegions() { Set set = new HashSet<>(); this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.values())); @@ -191,6 +193,7 @@ public Set getAllRegions() { return ImmutableSet.copyOf(set); } + @Nonnull public Set getAllRegions(UUID owner) { Set set = new HashSet<>(); this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.get(owner))); @@ -198,6 +201,7 @@ public Set getAllRegions(UUID owner) { return ImmutableSet.copyOf(set); } + @Nonnull public Set getAllRegions(World world) { if (world == null) return getRegions(); Set set = new HashSet<>(); @@ -206,6 +210,7 @@ public Set getAllRegions(World world) { return ImmutableSet.copyOf(set); } + @Nonnull public Set getAllRegions(String name, UUID owner) { Set set = new HashSet<>(); for (IRegion region : this.regions.get(owner)) { @@ -220,6 +225,7 @@ public Set getAllRegions(String name, UUID owner) { return ImmutableSet.copyOf(set); } + @Nonnull public Set getAllRegions(World world, UUID owner) { if (world == null) return getRegions(); Set set = new HashSet<>(); @@ -228,10 +234,12 @@ public Set getAllRegions(World world, UUID owner) { return ImmutableSet.copyOf(set); } + @Nonnull public Set getAllRegionsWithUniqueNames(UUID owner) { return getAllRegionsWithUniqueNames(owner, null); } + @Nonnull public Set getAllRegionsWithUniqueNames(UUID owner, @Nullable World world) { Set returnSet = new HashSet<>(); returnSet.addAll(this.regions.get(owner)); @@ -255,18 +263,22 @@ public Set getAllRegionsWithUniqueNames(UUID owner, @Nullable World wor return ImmutableSet.copyOf(returnSet); } + @Nonnull public Set getAllServerRegions() { return getAllRegions(SERVER_UUID); } + @Nonnull public Set getAllServerRegions(World world) { return getAllRegions(world, SERVER_UUID); } + @Nonnull public Optional getController(String name) { return getController(name, SERVER_UUID); } + @Nonnull public Optional getController(String name, UUID owner) { for (IHandler handler : handlers.get(owner)) { if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { @@ -276,6 +288,7 @@ public Optional getController(String name, UUID owner) { return Optional.empty(); } + @Nonnull public Set getControllers() { return this.handlers.values().stream() .filter(handler -> handler instanceof IController) @@ -283,6 +296,7 @@ public Set getControllers() { .collect(GuavaCollectors.toImmutableSet()); } + @Nonnull public Set getControllers(UUID owner) { return this.handlers.get(owner).stream() .filter(handler -> handler instanceof IController) @@ -290,14 +304,17 @@ public Set getControllers(UUID owner) { .collect(GuavaCollectors.toImmutableSet()); } + @Nonnull public GlobalHandler getGlobalHandler() { return globalHandler; } + @Nonnull public Optional getHandler(String name) { return getHandler(name, SERVER_UUID); } + @Nonnull public Optional getHandler(String name, UUID owner) { for (IHandler handler : handlers.get(owner)) { if (handler.getName().equalsIgnoreCase(name)) { @@ -307,14 +324,17 @@ public Optional getHandler(String name, UUID owner) { return Optional.empty(); } + @Nonnull public Set getHandlers() { return ImmutableSet.copyOf(this.handlers.values()); } + @Nonnull public Set getHandlers(UUID owner) { return ImmutableSet.copyOf(this.handlers.get(owner)); } + @Nonnull public Set getHandlers(boolean includeControllers) { if (includeControllers) { return getHandlers(); @@ -325,6 +345,7 @@ public Set getHandlers(boolean includeControllers) { } } + @Nonnull public Set getHandlers(boolean includeControllers, UUID owner) { if (includeControllers) { return getHandlers(owner); @@ -335,10 +356,12 @@ public Set getHandlers(boolean includeControllers, UUID owner) { } } + @Nonnull public Optional getRegion(String name) { return getRegion(name, SERVER_UUID); } + @Nonnull public Optional getRegion(String name, UUID owner) { for (IRegion region : this.regions.get(owner)) { if (region.getName().equalsIgnoreCase(name)) { @@ -348,10 +371,12 @@ public Optional getRegion(String name, UUID owner) { return Optional.empty(); } + @Nonnull public Optional getRegionFromWorld(World world, String name) { return getRegionFromWorld(world, name, SERVER_UUID); } + @Nonnull public Optional getRegionFromWorld(World world, String name, UUID owner) { Optional region = getWorldRegion(world, name, owner); if (!region.isPresent()) { @@ -359,18 +384,22 @@ public Optional getRegionFromWorld(World world, String name, UUID owner } else return Optional.of(region.get()); } + @Nonnull public Set getRegions() { return ImmutableSet.copyOf(this.regions.values()); } + @Nonnull public Set getRegions(UUID owner) { return ImmutableSet.copyOf(this.regions.get(owner)); } + @Nonnull public Set getRegionsAtMultiLocD(Iterable> locations) { return getRegionsAtMultiLocD(locations, false); } + @Nonnull public Set getRegionsAtMultiLocD(Iterable> locations, boolean includeDisabled) { Set set = new HashSet<>(); SetMultimap chunkPosMap = HashMultimap.create(); @@ -409,10 +438,12 @@ public Set getRegionsAtMultiLocD(Iterable> locations, b return set; } + @Nonnull public Set getRegionsAtMultiLocI(Iterable> locations) { return getRegionsAtMultiLocI(locations, false); } + @Nonnull public Set getRegionsAtMultiLocI(Iterable> locations, boolean includeDisabled) { Set set = new HashSet<>(); SetMultimap chunkPosMap = HashMultimap.create(); @@ -451,42 +482,50 @@ public Set getRegionsAtMultiLocI(Iterable> locations, b return set; } + @Nonnull public Set getRegionsAtPos(World world, Vector3i position) { return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() .filter(region -> region.contains(position, world)) .collect(Collectors.toSet()); } + @Nonnull public Set getRegionsAtPos(World world, Vector3i position, boolean includeDisabled) { return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() .filter(region -> region.contains(position, world)) .collect(Collectors.toSet()); } + @Nonnull public Set getRegionsAtPos(World world, Vector3d position) { return FGManager.getInstance().getRegionsInChunkAtPos(world, position).stream() .filter(region -> region.contains(position, world)) .collect(Collectors.toSet()); } + @Nonnull public Set getRegionsAtPos(World world, Vector3d position, boolean includeDisabled) { return FGManager.getInstance().getRegionsInChunkAtPos(world, position, includeDisabled).stream() .filter(region -> region.contains(position, world)) .collect(Collectors.toSet()); } + @Nonnull public Set getRegionsInChunk(World world, Vector3i chunk) { return getRegionsInChunk(world, chunk, false); } + @Nonnull public Set getRegionsInChunk(World world, Vector3i chunk, boolean includeDisabled) { return this.regionCache.getData(world, chunk).getRegions(includeDisabled); } + @Nonnull public Set getRegionsInChunkAtPos(World world, Vector3i pos) { return getRegionsInChunkAtPos(world, pos, false); } + @Nonnull public Set getRegionsInChunkAtPos(World world, Vector3i pos, boolean includeDisabled) { return this.regionCache.getData(world, new Vector3i( @@ -496,10 +535,12 @@ public Set getRegionsInChunkAtPos(World world, Vector3i pos, boolean in ).getRegions(includeDisabled); } + @Nonnull public Set getRegionsInChunkAtPos(World world, Vector3d pos) { return getRegionsInChunkAtPos(world, pos, false); } + @Nonnull public Set getRegionsInChunkAtPos(World world, Vector3d pos, boolean includeDisabled) { return this.regionCache.getData(world, new Vector3i( @@ -509,30 +550,37 @@ public Set getRegionsInChunkAtPos(World world, Vector3d pos, boolean in ).getRegions(includeDisabled); } + @Nonnull public Set getServerControllers() { return getControllers(SERVER_UUID); } + @Nonnull public Set getServerHandlers() { return getHandlers(SERVER_UUID); } + @Nonnull public Set getServerHandlers(boolean includeControllers) { return getHandlers(includeControllers, SERVER_UUID); } + @Nonnull public Set getServerRegions() { return getRegions(SERVER_UUID); } + @Nonnull public Set getServerWorldRegions(World world) { return getWorldRegions(world, SERVER_UUID); } + @Nonnull public Optional getWorldRegion(World world, String name) { return getWorldRegion(world, name, SERVER_UUID); } + @Nonnull public Optional getWorldRegion(World world, String name, UUID owner) { for (IWorldRegion region : this.worldRegions.get(world).get(owner)) { if (region.getName().equalsIgnoreCase(name)) { @@ -542,10 +590,12 @@ public Optional getWorldRegion(World world, String name, UUID owne return Optional.empty(); } + @Nonnull public Set getWorldRegions(World world) { return ImmutableSet.copyOf(this.worldRegions.get(world).values()); } + @Nonnull public Set getWorldRegions(World world, UUID owner) { return ImmutableSet.copyOf(this.worldRegions.get(world).get(owner)); } @@ -589,10 +639,12 @@ public boolean isWorldRegionNameAvailable(String name, UUID owner, World world) return !(getWorldRegion(world, name, owner).isPresent() || getRegion(name, owner).isPresent()); } + @Nonnull public Tristate isWorldRegionNameAvailable(String name) { return isWorldRegionNameAvailable(name, SERVER_UUID); } + @Nonnull public Tristate isWorldRegionNameAvailable(String name, UUID owner) { if (getRegion(name, owner).isPresent()) return Tristate.FALSE; Tristate available = null; @@ -611,6 +663,7 @@ public Tristate isWorldRegionNameAvailable(String name, UUID owner) { } } } + if(available == null) available = Tristate.TRUE; return available; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 3828f7c..c32a001 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -74,11 +74,9 @@ import org.spongepowered.api.plugin.PluginContainer; import org.spongepowered.api.service.economy.EconomyService; import org.spongepowered.api.service.permission.PermissionService; -import org.spongepowered.api.service.permission.SubjectData; import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.World; import java.nio.file.Path; @@ -188,7 +186,7 @@ public void registerCommands(GameInitializationEvent event) { fgDispatcher.register(new CommandCreate(), "create", "construct", "new", "make", "define", "mk", "cr"); fgDispatcher.register(new CommandDelete(), "delete", "del", "remove", "rem", "rm", "destroy"); fgDispatcher.register(new CommandModify(), "modify", "mod", "change", "edit", "update", "md", "ch"); - fgDispatcher.register(new CommandRename(), "rename", "name", "rn"); + fgDispatcher.register(new CommandMove(), "move", "mv", "rename", "name", "rn"); fgDispatcher.register(new CommandLink(), "link", "connect", "attach"); fgDispatcher.register(new CommandUnlink(), "unlink", "disconnect", "detach"); fgDispatcher.register(new CommandEnableDisable(true), "enable", "activate", "engage", "on"); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index f0f994d..b3e0d3e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -217,7 +217,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu logMessage.append(source.getName()).append(" created a ").append(fgCat.lName).append(": ") .append("Name: ").append(object.getName()).append(" "); - if (owner != null && owner != FGManager.SERVER_UUID) { + if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { logMessage.append("Owner: ").append(OwnerProviderRegistry.getInstance().getKeyword(owner, null)) .append(" (").append(owner).append(")"); } @@ -292,22 +292,20 @@ public List getSuggestions(@Nonnull CommandSource source, available = Tristate.fromBoolean(FGManager.getInstance().isWorldRegionNameAvailable(parse.current.token, world)); } } else if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { - available = Tristate.fromBoolean(FGManager.getInstance().getHandler(parse.current.token) == null); + available = Tristate.fromBoolean(!FGManager.getInstance().getHandler(parse.current.token).isPresent()); } else { return ImmutableList.of(); } - if (available != null) { - switch (available) { - case TRUE: - source.sendMessage(Text.of(TextColors.GREEN, "Name is available!")); - break; - case FALSE: - source.sendMessage(Text.of(TextColors.RED, "Name is already taken!")); - break; - case UNDEFINED: - source.sendMessage(Text.of(TextColors.YELLOW, "Name might be available. Must specify a world to confirm.")); + switch (available) { + case TRUE: + source.sendMessage(Text.of(TextColors.GREEN, "Name is available!")); + break; + case FALSE: + source.sendMessage(Text.of(TextColors.RED, "Name is already taken!")); + break; + case UNDEFINED: + source.sendMessage(Text.of(TextColors.YELLOW, "Name might be available. Must specify a world to confirm.")); - } } } else if (parse.current.index == 2) { if (fgCat == null) return ImmutableList.of(); @@ -352,13 +350,16 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF .collect(GuavaCollectors.toImmutableList()); } else if (isIn(OWNER_ALIASES, parse.current.key)) { String[] parts = parse.current.token.split(":", 2); + System.out.println(parts.length ); if (parts.length == 1) { - return OwnerProviderRegistry.getInstance().getProviders().stream() + ImmutableList collect = OwnerProviderRegistry.getInstance().getProviders().stream() .map(IOwnerProvider::getPrimaryAlias) .filter(string -> string != null && !string.isEmpty()) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); + System.out.println(collect); + return collect; } else if (parts.length == 2) { Optional providerOpt = OwnerProviderRegistry.getInstance().getProvider(parts[0]); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index f5515ca..7f88002 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -135,10 +135,11 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index == 1) { + System.out.println(parse.current.token); FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); if (result.isComplete()) { return result.getSuggestions().stream() - .map(str -> parse.current.prefix) + .map(str -> parse.current.prefix + str) .collect(GuavaCollectors.toImmutableList()); } @@ -169,7 +170,7 @@ else if (parse.current.index == 1) { .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(handler -> !(handler instanceof IGlobal)) .map(IFGObject::getName) .filter(new StartsWithPredicate(result.getToken())) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index aedaa2e..4938834 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -57,6 +57,7 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -79,6 +80,7 @@ public class CommandDetail extends FCCommandBase { return true; }; + @SuppressWarnings("Duplicates") @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { @@ -123,7 +125,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm String name = object.getName(); String fullName = name; boolean hasOwner = false; - if (owner != null && owner != FGManager.SERVER_UUID) { + if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { fullName = owner + ":" + fullName; hasOwner = true; } @@ -145,6 +147,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(registry.getDisplayText(owner, null, source)) .append(Text.NEW_LINE) .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) + .onShiftClick(TextActions.insertText(owner.toString())) .build() ); } @@ -192,7 +195,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } if (general) { - if(object instanceof IHandler){ + if (object instanceof IHandler) { IHandler handler = ((IHandler) object); builder.append(Text.of(TextColors.GREEN, "\n------- Inbound Links -------")); List controllerList = FGManager.getInstance().getControllers().stream() @@ -208,74 +211,31 @@ public CommandResult process(CommandSource source, String arguments) throws Comm controllerList.forEach(controller -> { builder.append(Text.NEW_LINE); if (source instanceof Player) { - List selectedHandlers = FGUtil.getSelectedHandlers(source); - List selectedControllers = FGUtil.getSelectedControllers(source); - if (selectedHandlers.contains(controller)) { - builder.append(Text.of(TextColors.GRAY, "[h+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + controller.getName()), - TextActions.showText(Text.of("Remove from handler state buffer")), - "[h-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + controller.getName()), - TextActions.showText(Text.of("Add to handler state buffer")), - "[h+]")); - builder.append(Text.of(TextColors.GRAY, "[h-]")); - } - if (selectedControllers.contains(controller)) { - builder.append(Text.of(TextColors.GRAY, "[c+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), - TextActions.showText(Text.of("Remove from controller state buffer")), - "[c-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), - TextActions.showText(Text.of("Add to controller state buffer")), - "[c+]")); - builder.append(Text.of(TextColors.GRAY, "[c-]")); - } - builder.append(Text.of(" ")); + FGUtil.genStatePrefix(builder, controller, source); } builder.append(Text.of(FGUtil.getColorForObject(controller), - TextActions.runCommand("/foxguard det c " + controller.getName()), + TextActions.runCommand("/foxguard det c " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("View details for controller \"" + controller.getName() + "\"")), - controller.getShortTypeName() + " : " + controller.getName())); + FGUtil.getObjectDisplayName(controller, false, null, source) + )); }); regionList.forEach(region -> { builder.append(Text.NEW_LINE); if (source instanceof Player) { - List selectedRegions = FGUtil.getSelectedRegions(source); - if (selectedRegions.contains(region)) { - builder.append(Text.of(TextColors.GRAY, "[+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s r remove " + - FGUtil.genWorldFlag(region) + - region.getName()), - TextActions.showText(Text.of("Remove from state buffer")), - "[-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s r add " + - FGUtil.genWorldFlag(region) + - region.getName()), - TextActions.showText(Text.of("Add to state buffer")), - "[+]")); - builder.append(Text.of(TextColors.GRAY, "[-]")); - } - builder.append(Text.of(" ")); + FGUtil.genStatePrefix(builder, region, source); } builder.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), + TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + FGUtil.getFullName(region)), TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), - FGUtil.getRegionDisplayName(region, true) + FGUtil.getObjectDisplayName(region, true, null, source) )); }); } if (object instanceof ILinkable) outboundLinks(builder, (ILinkable) object, source); + + source.sendMessage(builder.build()); } @@ -283,313 +243,38 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } - /*public CommandResult processOld(CommandSource source, String arguments) throws CommandException { - if (!testPermission(source)) { - source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); - return CommandResult.empty(); - } - AdvCmdParser.ParseResult parse = AdvCmdParser.builder() - .arguments(arguments) - .limit(2) - .flagMapper(MAPPER) - .leaveFinalAsIs(true) - .parse(); - if (parse.args.length == 0) { - source.sendMessage(Text.builder() - .append(Text.of(TextColors.GREEN, "Usage: ")) - .append(getUsage(source)) - .build()); - return CommandResult.empty(); - } else if (isIn(REGIONS_ALIASES, parse.args[0])) { - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - - FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); - String worldName = parse.flags.get("world"); - - IRegion region = FGUtil.getRegionFromCommand(source, ownerResult, worldName); - - Text.Builder builder = Text.builder(); - builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); - if (parse.args.length < 3 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) { - builder.append(Text.of(TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), - TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), - TextColors.GREEN, "------- General -------\n", - TextColors.GOLD, "Name: ", TextColors.RESET, region.getName() + "\n")); - builder.append(Text.of(TextColors.GOLD, "Type: "), Text.of(TextColors.RESET, region.getLongTypeName() + "\n")); - builder.append(Text.builder() - .append(Text.of(TextColors.GOLD, "Enabled: ")) - .append(Text.of((region.isEnabled() ? TextColors.GREEN : TextColors.RED), (region.isEnabled() ? "True" : "False") + "\n")) - .onClick(TextActions.runCommand("/foxguard " + (region.isEnabled() ? "disable" : "enable") + - " r " + FGUtil.genWorldFlag(region) + region.getName())) - .onHover(TextActions.showText(Text.of("Click to " + (region.isEnabled() ? "disable" : "enable")))) - .build()); - UUID owner = region.getOwner(); - if (owner != null && owner != FGManager.SERVER_UUID) { - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); - builder.append(Text.builder() - .append(Text.of(TextColors.GOLD, "Owner: ")) - .append(registry.getDisplayText(owner, null, source)) - .append(Text.NEW_LINE) - .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) - .build() - ); - } - if (region instanceof IWorldRegion) - builder.append(Text.of(TextColors.GOLD, "World: "), Text.of(TextColors.RESET, ((IWorldRegion) region).getWorld().getName() + "\n")); - builder.append(Text.of(TextActions.suggestCommand("/foxguard modify region " + FGUtil.genWorldFlag(region) + region.getName() + " "), - TextActions.showText(Text.of("Click to modify region \"" + region.getName() + "\"")), - TextColors.GREEN, "------- Details -------\n")); - try { - Text objectDetails = region.details(source, parse.args.length < 3 ? "" : parse.args[2]); - if (objectDetails == null) objectDetails = Text.of(); - builder.append(objectDetails); - } catch (Exception e) { - builder.append(Text.of(TextColors.RED, TextStyles.ITALIC, "There was an error getting details for region \"" + region.getName() + "\".")); - FoxGuardMain.instance().getLogger().error( - (region instanceof IWorldRegion ? "Worldregion \"" : "Region \"") - + region.getName() + "\" of type \"" + region.getLongTypeName() + "\"" - + (region instanceof IWorldRegion ? " in world \"" + ((IWorldRegion) region).getWorld().getName() + "\"" : "") - + " threw an exception while getting details", e - ); - } - outboundLinks(builder, region, source); - } else { - builder.append(Text.of(TextColors.GREEN, "------- Details for Region \"" + region.getName() + "\"" + - (region instanceof IWorldRegion ? (" in World \"" + ((IWorldRegion) region).getWorld().getName() + "\"") : "") + - " -------\n")); - try { - Text objectDetails = region.details(source, parse.args.length < 3 ? "" : parse.args[2]); - if (objectDetails == null) objectDetails = Text.of(); - builder.append(objectDetails); - } catch (Exception e) { - builder.append(Text.of(TextColors.RED, TextStyles.ITALIC, "There was an error getting details for region \"" + region.getName() + "\".")); - FoxGuardMain.instance().getLogger().error( - (region instanceof IWorldRegion ? "Worldregion \"" : "Region \"") - + region.getName() + "\" of type \"" + region.getLongTypeName() + "\"" - + (region instanceof IWorldRegion ? " in world \"" + ((IWorldRegion) region).getWorld().getName() + "\"" : "") - + " threw an exception while getting details", e - ); - } - } - source.sendMessage(builder.build()); - return CommandResult.empty(); - //-------------------------------------------------------------------------------------------------------------------------------------------------------- - //-------------------------------------------------------------------------------------------------------------------------------------------------------- - //-------------------------------------------------------------------------------------------------------------------------------------------------------- - } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a name!")); - - FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); - - Optional handlerOpt = FGManager.getInstance().getHandler(ownerResult.getName(), ownerResult.getOwner()); - if (!handlerOpt.isPresent()) - throw new CommandException(Text.of("No handler exists with the name \"" + ownerResult.getName() + "\"" - + (ownerResult.getOwner() != SERVER_UUID ? " and owner \"" + ownerResult.getOwnerName() + "\"" : "") - + "!")); - IHandler handler = handlerOpt.get(); - - Text.Builder builder = Text.builder(); - builder.append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")); - if (parse.args.length <= 2 || parse.args[2].isEmpty() || parse.flags.containsKey("all")) { - builder.append(Text.of(TextActions.runCommand("/foxguard detail handler " + handler.getName()), - TextActions.showText(Text.of("View details for handler \"" + handler.getName() + "\"")), - TextColors.GREEN, "------- General -------\n", - TextColors.GOLD, "Name: ", TextColors.RESET, handler.getName() + "\n")); - builder.append(Text.of(TextColors.GOLD, "Type: "), Text.of(TextColors.RESET, handler.getLongTypeName() + "\n")); - - builder.append(Text.builder() - .append(Text.of(TextColors.GOLD, "Enabled: ")) - .append(Text.of((handler.isEnabled() ? TextColors.GREEN : TextColors.RED), (handler.isEnabled() ? "True" : "False") + "\n")) - .onClick(TextActions.runCommand("/foxguard " + (handler.isEnabled() ? "disable" : "enable") + " h " + handler.getName())) - .onHover(TextActions.showText(Text.of("Click to " + (handler.isEnabled() ? "disable" : "enable")))) - .build()); - - UUID owner = handler.getOwner(); - if (owner != null && owner != FGManager.SERVER_UUID) { - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); - builder.append(Text.builder() - .append(Text.of(TextColors.GOLD, "Owner: ")) - .append(registry.getDisplayText(owner, null, source)) - .append(Text.NEW_LINE) - .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) - .build() - ); - } - - builder.append(Text.builder() - .append(Text.of(TextColors.GOLD, "Priority: ")) - .append(Text.of(TextColors.RESET, handler.getPriority() + "\n")) - .onClick(TextActions.suggestCommand("/foxguard prio " + handler.getName() + " ")) - .onHover(TextActions.showText(Text.of("Click to change priority"))) - .build()); - builder.append(Text.of(TextActions.suggestCommand("/foxguard modify handler " + handler.getName() + " "), - TextActions.showText(Text.of("Click to modify handler \"" + handler.getName() + "\"")), - TextColors.GREEN, "------- Details -------\n")); - try { - Text objectDetails = handler.details(source, parse.args.length < 3 ? "" : parse.args[2]); - if (objectDetails == null) objectDetails = Text.of(); - builder.append(objectDetails); - } catch (Exception e) { - builder.append(Text.of(TextColors.RED, TextStyles.ITALIC, "There was an error getting details for handler \"" + handler.getName() + "\".")); - FoxGuardMain.instance().getLogger().error( - "Handler \"" + handler.getName() + "\" of type \"" + handler.getLongTypeName() + "\" threw an exception while getting details", e - ); - } - builder.append(Text.of(TextColors.GREEN, "\n------- Inbound Links -------")); - List controllerList = FGManager.getInstance().getControllers().stream() - .filter(controller -> controller.getLinks().contains(handler)) - .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) - .collect(GuavaCollectors.toImmutableList()); - List regionList = FGManager.getInstance().getAllRegions().stream() - .filter(region -> region.getLinks().contains(handler)) - .sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())) - .collect(GuavaCollectors.toImmutableList()); - if (controllerList.size() == 0 && regionList.size() == 0) - builder.append(Text.of(TextStyles.ITALIC, "\nNo inbound links!")); - controllerList.forEach(controller -> { - builder.append(Text.NEW_LINE); - if (source instanceof Player) { - List selectedHandlers = FGUtil.getSelectedHandlers(source); - List selectedControllers = FGUtil.getSelectedControllers(source); - if (selectedHandlers.contains(controller)) { - builder.append(Text.of(TextColors.GRAY, "[h+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + controller.getName()), - TextActions.showText(Text.of("Remove from handler state buffer")), - "[h-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + controller.getName()), - TextActions.showText(Text.of("Add to handler state buffer")), - "[h+]")); - builder.append(Text.of(TextColors.GRAY, "[h-]")); - } - if (selectedControllers.contains(controller)) { - builder.append(Text.of(TextColors.GRAY, "[c+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), - TextActions.showText(Text.of("Remove from controller state buffer")), - "[c-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), - TextActions.showText(Text.of("Add to controller state buffer")), - "[c+]")); - builder.append(Text.of(TextColors.GRAY, "[c-]")); - } - builder.append(Text.of(" ")); - } - builder.append(Text.of(FGUtil.getColorForObject(controller), - TextActions.runCommand("/foxguard det c " + controller.getName()), - TextActions.showText(Text.of("View details for controller \"" + controller.getName() + "\"")), - controller.getShortTypeName() + " : " + controller.getName())); - }); - - regionList.forEach(region -> { - builder.append(Text.NEW_LINE); - if (source instanceof Player) { - List selectedRegions = FGUtil.getSelectedRegions(source); - if (selectedRegions.contains(region)) { - builder.append(Text.of(TextColors.GRAY, "[+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s r remove " + - FGUtil.genWorldFlag(region) + - region.getName()), - TextActions.showText(Text.of("Remove from state buffer")), - "[-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s r add " + - FGUtil.genWorldFlag(region) + - region.getName()), - TextActions.showText(Text.of("Add to state buffer")), - "[+]")); - builder.append(Text.of(TextColors.GRAY, "[-]")); - } - builder.append(Text.of(" ")); - } - builder.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), - TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), - FGUtil.getRegionDisplayName(region, true) - )); - }); + private void outboundLinks(Text.Builder builder, ILinkable linkable, CommandSource source) { + builder.append(Text.of(TextColors.GREEN, "\n------- Outbound Links -------")); + Collection links = linkable.getLinks(); + if (links.size() == 0) + builder.append(Text.of(TextStyles.ITALIC, "\nNo outbound links!")); + boolean hc = false; + if (source instanceof Player) { + for (IHandler handler : links) { if (handler instanceof IController) { - outboundLinks(builder, (IController) handler, source); - } - } else { - builder.append(Text.of(TextColors.GREEN, "------- Details for Handler \"" + handler.getName() + "\" -------\n")); - try { - Text objectDetails = handler.details(source, parse.args[2]); - if (objectDetails == null) objectDetails = Text.of(); - builder.append(objectDetails); - } catch (Exception e) { - builder.append(Text.of(TextColors.RED, TextStyles.ITALIC, "There was an error getting details for handler \"" + handler.getName() + "\".")); - FoxGuardMain.instance().getLogger().error( - "Handler \"" + handler.getName() + "\" of type \"" + handler.getLongTypeName() + "\" threw an exception while getting details", e - ); + hc = true; + break; } } - source.sendMessage(builder.build()); - return CommandResult.empty(); - } else { - throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); } - }*/ - - private void outboundLinks(Text.Builder builder, ILinkable linkable, CommandSource source) { - builder.append(Text.of(TextColors.GREEN, "\n------- Outbound Links -------")); - if (linkable.getLinks().size() == 0) - builder.append(Text.of(TextStyles.ITALIC, "\nNo outbound links!")); - Stream handlerStream = linkable.getLinks().stream(); + final boolean hasControllers = hc; + Stream handlerStream = links.stream(); if (!(linkable instanceof IController)) handlerStream = handlerStream.sorted((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); handlerStream.forEach(handler -> { builder.append(Text.NEW_LINE); if (source instanceof Player) { - List selectedHandlers = FGUtil.getSelectedHandlers(source); - List selectedControllers = FGUtil.getSelectedControllers(source); - if (selectedHandlers.contains(handler)) { - builder.append(Text.of(TextColors.GRAY, "[h+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + handler.getName()), - TextActions.showText(Text.of("Remove from handler state buffer")), - "[h-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + handler.getName()), - TextActions.showText(Text.of("Add to handler state buffer")), - "[h+]")); - builder.append(Text.of(TextColors.GRAY, "[h-]")); - } - if (handler instanceof IController) { - IController controller = ((IController) handler); - if (selectedControllers.contains(controller)) { - builder.append(Text.of(TextColors.GRAY, "[c+]")); - builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), - TextActions.showText(Text.of("Remove from controller state buffer")), - "[c-]")); - } else { - builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), - TextActions.showText(Text.of("Add to controller state buffer")), - "[c+]")); - builder.append(Text.of(TextColors.GRAY, "[c-]")); - } - } else { - builder.append(Text.of(TextColors.DARK_GRAY, "[c+][c-]")); - } - builder.append(Text.of(" ")); + FGUtil.genStatePrefix(builder, handler, source, hasControllers); } builder.append(Text.of(FGUtil.getColorForObject(handler), - TextActions.runCommand("/foxguard det h " + handler.getName()), + TextActions.runCommand("/foxguard det h " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("View details for " + (handler instanceof IController ? "controller" : "handler") + " \"" + handler.getName() + "\"")), - handler.getShortTypeName() + " : " + handler.getName() + FGUtil.getObjectDisplayName(handler, false, null, source) )); }); } + @SuppressWarnings("Duplicates") @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { if (!testPermission(source)) return ImmutableList.of(); @@ -610,7 +295,7 @@ else if (parse.current.index == 1) { FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); if (result.isComplete()) { return result.getSuggestions().stream() - .map(str -> parse.current.prefix) + .map(str -> parse.current.prefix + str) .collect(GuavaCollectors.toImmutableList()); } @@ -639,7 +324,7 @@ else if (parse.current.index == 1) { .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(result.getOwner()).stream() .map(IFGObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 1842707..d3dac2a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; @@ -82,18 +83,118 @@ public CommandEnableDisable(boolean enableState) { this.enableState = enableState; } - public CommandResult process2(CommandSource source, String arguments) throws CommandException { + @SuppressWarnings("Duplicates") + @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); return CommandResult.empty(); } - AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); - + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .flagMapper(MAPPER) + .parse(); - return CommandResult.empty(); + + List selectedRegions = FGUtil.getSelectedRegions(source); + List selectedHandlers = FGUtil.getSelectedHandlers(source); + if (parse.args.length == 0 && selectedRegions.isEmpty() && selectedHandlers.isEmpty()) { + source.sendMessage(Text.builder() + .append(Text.of(TextColors.GREEN, "Usage: ")) + .append(getUsage(source)) + .build()); + return CommandResult.empty(); + } + + List objects = new ArrayList<>(); + + FGCat cat = FGCat.OBJECT; + if (parse.args.length > 0) { + cat = FGCat.from(parse.args[0]); + if (cat == null) throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); + } + + switch (cat) { + case OBJECT: + objects.addAll(selectedHandlers); + FCStateManager.instance().getStateMap().get(source).flush(HandlersStateField.ID); + case REGION: + objects.addAll(selectedRegions); + FCStateManager.instance().getStateMap().get(source).flush(RegionsStateField.ID); + break; + case HANDLER: + objects.addAll(selectedHandlers); + FCStateManager.instance().getStateMap().get(source).flush(HandlersStateField.ID); + } + + boolean worldKey = parse.flags.containsKey("world"); + String worldValue = parse.flags.get("world"); + for (int i = 1; i < parse.args.length; i++) { + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[i]); + IFGObject object; + switch (cat) { + case REGION: + object = FGUtil.getRegionFromCommand(source, ownerResult, worldKey, worldValue); + break; + case HANDLER: + object = FGUtil.getHandlerFromCommand(ownerResult); + break; + default: + throw new CommandException(Text.of("Something went horribly wrong.")); + } + objects.add(object); + } + + int successes = 0; + int failures = 0; + for (IFGObject object : objects) { + if (object instanceof GlobalWorldRegion || object instanceof GlobalHandler || object.isEnabled() == this.enableState) + failures++; + else { + object.setEnabled(this.enableState); + successes++; + } + } + + if (successes == 1 && failures == 0) { + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); + source.sendMessage(Text.of(TextColors.GREEN, "Successfully " + (this.enableState ? "enabled" : "disabled") + " " + cat.lName + "!")); + return CommandResult.success(); + } else if (successes > 0) { + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateEvent(FoxGuardMain.getCause())); + source.sendMessage(Text.of(TextColors.GREEN, "Successfully " + (this.enableState ? "enabled" : "disabled") + " " + cat.lName + "s with " + + successes + " successes" + (failures > 0 ? " and " + failures + " failures!" : "!"))); + return CommandResult.builder().successCount(successes).build(); + } else { + throw new CommandException(Text.of(failures + " failures while trying to " + (this.enableState ? "enable" : "disable") + + " " + failures + (failures > 1 ? " " + cat.lName + "s" : " " + cat.lName) + + ". Check to make sure you spelled their names correctly and that they are not already " + + (this.enableState ? "enabled." : "disabled."))); + } } - @Override + private enum FGCat { + REGION(REGIONS_ALIASES), + HANDLER(HANDLERS_ALIASES), + OBJECT(null); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + public final String uName = FCCUtil.toCapitalCase(name()); + + FGCat(String[] catAliases) { + this.catAliases = catAliases; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + } + + /*@Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); @@ -222,8 +323,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm + (this.enableState ? "enabled." : "disabled."))); } } else throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); - } + }*/ + @SuppressWarnings("Duplicates") @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { if (!testPermission(source)) return ImmutableList.of(); @@ -243,7 +345,7 @@ else if (parse.current.index > 0) { FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); if (result.isComplete()) { return result.getSuggestions().stream() - .map(str -> parse.current.prefix) + .map(str -> parse.current.prefix + str) .collect(GuavaCollectors.toImmutableList()); } @@ -274,7 +376,7 @@ else if (parse.current.index > 0) { .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) .map(IFGObject::getName) .filter(new StartsWithPredicate(result.getToken())) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 0bae5d4..18aec7f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -151,26 +151,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm while (regionListIterator.hasNext()) { IRegion region = regionListIterator.next(); if (source instanceof Player) { - List selectedRegions = FGUtil.getSelectedRegions(source); - if (selectedRegions.contains(region)) { - output.append(Text.of(TextColors.GRAY, "[+]")); - output.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s r remove " + FGUtil.genWorldFlag(region) + region.getName()), - TextActions.showText(Text.of("Remove from state buffer")), - "[-]")); - } else { - output.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s r add " + FGUtil.genWorldFlag(region) + region.getName()), - TextActions.showText(Text.of("Add to state buffer")), - "[+]")); - output.append(Text.of(TextColors.GRAY, "[-]")); - } - output.append(Text.of(" ")); + FGUtil.genStatePrefix(output, region, source); } output.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard detail region " + FGUtil.genWorldFlag(region) + region.getName()), + TextActions.runCommand("/foxguard detail r " + FGUtil.genWorldFlag(region) + FGUtil.getFullName(region)), TextActions.showText(Text.of("View details")), - FGUtil.getRegionDisplayName(region, false))); + FGUtil.getObjectDisplayName(region, false, null, source))); if (regionListIterator.hasNext()) output.append(Text.NEW_LINE); } flag = true; @@ -182,6 +168,13 @@ public CommandResult process(CommandSource source, String arguments) throws Comm regionList.forEach(region -> region.getLinks().stream() .filter(handler -> !handlerList.contains(handler)) .forEach(handlerList::add)); + boolean hasControllers = false; + for(IHandler handler: handlerList){ + if(handler instanceof IController){ + hasControllers = true; + break; + } + } output.append(Text.of(TextColors.GREEN, "------- Handlers Located Here -------\n")); if (parse.flags.containsKey("priority")) { handlerList.sort((o1, o2) -> o2.getPriority() - o1.getPriority()); @@ -193,45 +186,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm while (handlerListIterator.hasNext()) { IHandler handler = handlerListIterator.next(); if (source instanceof Player) { - List selectedHandlers = FGUtil.getSelectedHandlers(source); - List selectedControllers = FGUtil.getSelectedControllers(source); - if (selectedHandlers.contains(handler)) { - output.append(Text.of(TextColors.GRAY, "[h+]")); - output.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + handler.getName()), - TextActions.showText(Text.of("Remove from handler state buffer")), - "[h-]")); - } else { - output.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + handler.getName()), - TextActions.showText(Text.of("Add to handler state buffer")), - "[h+]")); - output.append(Text.of(TextColors.GRAY, "[h-]")); - } - if (handler instanceof IController) { - IController controller = ((IController) handler); - if (selectedControllers.contains(controller)) { - output.append(Text.of(TextColors.GRAY, "[c+]")); - output.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), - TextActions.showText(Text.of("Remove from controller state buffer")), - "[c-]")); - } else { - output.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), - TextActions.showText(Text.of("Add to controller state buffer")), - "[c+]")); - output.append(Text.of(TextColors.GRAY, "[c-]")); - } - } else { - output.append(Text.of(TextColors.DARK_GRAY, "[c+][c-]")); - } - output.append(Text.of(" ")); + FGUtil.genStatePrefix(output, handler, source, hasControllers); } output.append(Text.of(FGUtil.getColorForObject(handler), - TextActions.runCommand("/foxguard detail handler " + handler.getName()), + TextActions.runCommand("/foxguard detail handler " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("View details")), - handler.getShortTypeName() + " : " + handler.getName())); + FGUtil.getObjectDisplayName(handler, false, null, source))); if (handlerListIterator.hasNext()) output.append(Text.NEW_LINE); } hudConfig.handlers = true; @@ -249,6 +209,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } + @SuppressWarnings("Duplicates") @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { if (!testPermission(source)) return ImmutableList.of(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index 34c4044..d5a8e3f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -94,30 +94,13 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FCStateManager.instance().getStateMap().get(source).flush(RegionsStateField.ID, HandlersStateField.ID); return CommandResult.builder().successCount(successes[0]).build(); } else { - IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); - World world = null; - if (region == null) { - String worldName = parse.flags.get("world"); - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } else { - if (world == null) - throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); - } - } - if (world == null) throw new CommandException(Text.of("Must specify a world!")); - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); - } - if (region == null) - throw new CommandException(Text.of("No region with name \"" + parse.args[0] + "\" in world \"" + world.getName() + "\"!")); + FGUtil.OwnerResult regionOwnerResult = FGUtil.processUserInput(parse.args[0]); + IRegion region = FGUtil.getRegionFromCommand(source, regionOwnerResult, parse.flags.containsKey("world"), parse.flags.get("world")); + if (parse.args.length < 2) throw new CommandException(Text.of("Must specify a handler!")); - Optional handlerOpt = FGManager.getInstance().getHandler(parse.args[1]); - if (!handlerOpt.isPresent()) - throw new CommandException(Text.of("No handler with name \"" + parse.args[1] + "\"!")); - IHandler handler = handlerOpt.get(); + FGUtil.OwnerResult handlerOwnerResult = FGUtil.processUserInput(parse.args[1]); + IHandler handler = FGUtil.getHandlerFromCommand(handlerOwnerResult); + if (region.getLinks().contains(handler)) throw new CommandException(Text.of("Already linked!")); boolean success = FGManager.getInstance().link(region, handler); @@ -143,7 +126,15 @@ public List getSuggestions(CommandSource source, String arguments, @Null .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix + str) + .collect(GuavaCollectors.toImmutableList()); + } + String worldName = parse.flags.get("world"); + boolean key = parse.flags.containsKey("world"); World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); if (!worldName.isEmpty()) { @@ -152,47 +143,47 @@ public List getSuggestions(CommandSource source, String arguments, @Null world = optWorld.get(); } } - if (world == null) return FGManager.getInstance().getRegions().stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - else return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); + if (key && world != null) { + return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } else { + return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } } else if (parse.current.index == 1) { - IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); - if (region == null) { - String worldName = parse.flags.get("world"); - World world = null; - if (source instanceof Locatable) world = ((Locatable) source).getWorld(); - if (!worldName.isEmpty()) { - Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); - if (optWorld.isPresent()) { - world = optWorld.get(); - } - } - if (world != null) { - region = FGManager.getInstance().getWorldRegion(world, parse.args[0]).orElse(null); - } + FGUtil.OwnerTabResult tabResult = FGUtil.getOwnerSuggestions(parse.current.token); + if (tabResult.isComplete()) { + return tabResult.getSuggestions().stream() + .map(str -> parse.current.prefix + str) + .collect(GuavaCollectors.toImmutableList()); } + IRegion region = null; + try { + FGUtil.OwnerResult regionOwnerResult = FGUtil.processUserInput(parse.args[0]); + region = FGUtil.getRegionFromCommand(source, regionOwnerResult, parse.flags.containsKey("world"), parse.flags.get("world")); + } catch (CommandException ignored) { + } if (region != null) { IRegion finalRegion = region; - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() .filter(handler -> !finalRegion.getLinks().contains(handler) && !(handler instanceof IGlobal)) .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(tabResult.getToken())) + .map(args -> parse.current.prefix + tabResult.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() .filter(handler -> !(handler instanceof IGlobal)) .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(tabResult.getToken())) + .map(args -> parse.current.prefix + tabResult.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index 3582090..d891281 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -35,6 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; @@ -46,8 +47,10 @@ import org.spongepowered.api.text.Text; import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.text.format.TextStyles; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.StartsWithPredicate; +import org.spongepowered.api.world.Locatable; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; @@ -78,6 +81,191 @@ public class CommandList extends FCCommandBase { return true; }; + @SuppressWarnings("Duplicates") + @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { + if (!testPermission(source)) { + source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); + return CommandResult.empty(); + } + AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); + + if (parse.args.length == 0) { + source.sendMessage(Text.builder() + .append(Text.of(TextColors.GREEN, "Usage: ")) + .append(getUsage(source)) + .build()); + return CommandResult.empty(); + } else { + List objects = new ArrayList<>(); + FGCat cat = FGCat.from(parse.args[0]); + if (cat == null) throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); + + String title = "Objects"; + boolean hasControllers = false; + boolean dispWorld = false; + + switch (cat) { + case REGION: { + if (parse.flags.containsKey("world")) { + World world; + String worldName = parse.flags.get("world"); + if (!worldName.isEmpty()) { + Optional optWorld = Sponge.getGame().getServer().getWorld(worldName); + if (optWorld.isPresent()) { + world = optWorld.get(); + } else { + throw new CommandException(Text.of("No world exists with name \"" + worldName + "\"!")); + } + } else if (source instanceof Locatable) { + world = ((Locatable) source).getWorld(); + } else { + throw new CommandException(Text.of("Must specify world name for flag!")); + } + objects.addAll(FGManager.getInstance().getWorldRegions(world)); + title = "Regions in World: " + world.getName(); + if (parse.flags.containsKey("super")) { + objects.addAll(FGManager.getInstance().getRegions()); + title = "All " + title; + } + } else { + if (parse.flags.containsKey("super")) { + objects.addAll(FGManager.getInstance().getRegions()); + title = "Super Regions"; + } else { + objects.addAll(FGManager.getInstance().getAllRegions()); + title = "All Regions"; + } + dispWorld = true; + } + } + break; + case HANDLER: { + boolean controllers = parse.flags.containsKey("all"); + Collection handlers = FGManager.getInstance().getHandlers(controllers); + objects.addAll(handlers); + title = "Handlers"; + if (controllers) { + title += " and Controllers"; + for (IHandler handler : handlers) { + if (handler instanceof IController) { + hasControllers = true; + break; + } + } + } + } + break; + case CONTROLLER: { + objects.addAll(FGManager.getInstance().getControllers()); + title = "Controllers"; + hasControllers = true; + } + break; + } + + if (parse.flags.containsKey("query")) { + String query = parse.flags.get("query"); + if (query.startsWith("/")) { + if (source.hasPermission("foxcore.danger.regex")) { + FCCUtil.FCPattern pattern = FCCUtil.parseUserRegex(query); + objects = objects.stream() + .filter(region -> pattern.matches(region.getName())) + .collect(Collectors.toList()); + } else { + throw new CommandException(Text.of("You don't have permission to use regular expressions!")); + } + } else { + objects = objects.stream() + .filter(region -> region.getName().toLowerCase().contains(query.toLowerCase())) + .collect(Collectors.toList()); + } + } + + int page, number; + if (parse.flags.containsKey("page")) { + try { + page = Integer.parseInt(parse.flags.get("page")); + } catch (NumberFormatException ignored) { + page = 1; + } + } else page = 1; + if (parse.flags.containsKey("number")) { + try { + number = Integer.parseInt(parse.flags.get("number")); + } catch (NumberFormatException ignored) { + if (source instanceof Player) number = 18; + else number = Integer.MAX_VALUE; + } + } else { + if (source instanceof Player) number = 18; + else number = Integer.MAX_VALUE; + } + if (number < 1) number = 1; + int maxPage = (Math.max(objects.size() - 1, 0) / number) + 1; + if (page < 1) page = 1; + else if (page > maxPage) page = maxPage; + int skip = (page - 1) * number; + + + Text.Builder builder = Text.builder() + .append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")) + .append(Text.of(TextColors.GREEN, "------- " + title + " -------\n")); + + objects.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + Iterator objectIterator = objects.iterator(); + for (int i = 0; i < skip; i++) { + objectIterator.next(); + } + int count = 0; + if(!objectIterator.hasNext()){ + builder.append(Text.of(TextColors.GRAY, TextStyles.ITALIC, "No objects found")); + } + while (objectIterator.hasNext() && count < number) { + IFGObject object = objectIterator.next(); + String fullName = object.getOwner().toString() + ":" + object.getName(); + if (source instanceof Player) { + FGUtil.genStatePrefix(builder, object, source, hasControllers); + } + builder.append(Text.of(FGUtil.getColorForObject(object), + TextActions.runCommand("/foxguard det " + cat.sName + " " + FGUtil.genWorldFlag(object) + fullName), + TextActions.showText(Text.of("View details")), + FGUtil.getObjectDisplayName(object, dispWorld, null, source))); + count++; + if (objectIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); + } + if (maxPage > 1) + builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/foxguard ls " + arguments, null)); + source.sendMessage(builder.build()); + + return CommandResult.empty(); + } + } + + private enum FGCat { + REGION(REGIONS_ALIASES, "r"), + HANDLER(HANDLERS_ALIASES, "h"), + CONTROLLER(CONTROLLERS_ALIASES, HANDLER.sName); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + public final String uName = FCCUtil.toCapitalCase(name()); + public final String sName; + + FGCat(String[] catAliases, String sName) { + this.catAliases = catAliases; + this.sName = sName; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + } + + /*@SuppressWarnings("Duplicates") @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { @@ -151,7 +339,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm Text.Builder builder = Text.builder() .append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")) .append(Text.of(TextColors.GREEN, "------- Regions" + (allFlag ? "" : (" for World: \"" + worldName + "\"")) + " -------\n")); - Collections.sort(regionList, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + regionList.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); Iterator regionIterator = regionList.iterator(); for (int i = 0; i < skip; i++) { regionIterator.next(); @@ -167,14 +355,14 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(TextColors.RED, TextActions.runCommand("/foxguard s r remove " + FGUtil.genWorldFlag(region) + - region.getName()), + FGUtil.getFullName(region)), TextActions.showText(Text.of("Remove from state buffer")), "[-]")); } else { builder.append(Text.of(TextColors.GREEN, TextActions.runCommand("/foxguard s r add " + FGUtil.genWorldFlag(region) + - region.getName()), + FGUtil.getFullName(region)), TextActions.showText(Text.of("Add to state buffer")), "[+]")); builder.append(Text.of(TextColors.GRAY, "[-]")); @@ -184,12 +372,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(FGUtil.getColorForObject(region), TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + fullName), TextActions.showText(Text.of("View details")), - FGUtil.getRegionDisplayName(region, allFlag))); + FGUtil.getObjectDisplayName(region, allFlag, null, source))); count++; if (regionIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); } if (maxPage > 1) - builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/fg ls " + arguments, null)); + builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/foxguard ls " + arguments, null)); source.sendMessage(builder.build()); //---------------------------------------------------------------------------------------------------------- @@ -238,7 +426,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm Text.Builder builder = Text.builder() .append(Text.of(TextColors.GOLD, "\n-----------------------------------------------------\n")) .append(Text.of(TextColors.GREEN, "------- Handlers " + (controllers ? "and Controllers " : "") + "-------\n")); - Collections.sort(handlerList, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + handlerList.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); Iterator handlerIterator = handlerList.iterator(); for (int i = 0; i < skip; i++) { handlerIterator.next(); @@ -254,12 +442,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (selectedHandlers.contains(handler)) { builder.append(Text.of(TextColors.GRAY, "[h+]")); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + handler.getName()), + TextActions.runCommand("/foxguard s h remove " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("Remove from handler state buffer")), "[h-]")); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + handler.getName()), + TextActions.runCommand("/foxguard s h add " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("Add to handler state buffer")), "[h+]")); builder.append(Text.of(TextColors.GRAY, "[h-]")); @@ -269,12 +457,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (selectedControllers.contains(controller)) { builder.append(Text.of(TextColors.GRAY, "[c+]")); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), + TextActions.runCommand("/foxguard s c remove " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Remove from controller state buffer")), "[c-]")); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), + TextActions.runCommand("/foxguard s c add " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Add to controller state buffer")), "[c+]")); builder.append(Text.of(TextColors.GRAY, "[c-]")); @@ -286,12 +474,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (selectedHandlers.contains(handler)) { builder.append(Text.of(TextColors.GRAY, "[+]")); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + handler.getName()), + TextActions.runCommand("/foxguard s h remove " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("Remove from state buffer")), "[-]")); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + handler.getName()), + TextActions.runCommand("/foxguard s h add " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("Add to state buffer")), "[+]")); builder.append(Text.of(TextColors.GRAY, "[-]")); @@ -306,7 +494,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (handlerIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); } if (maxPage > 1) - builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/fg ls " + arguments, null)); + builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/foxguard ls " + arguments, null)); source.sendMessage(builder.build()); //---------------------------------------------------------------------------------------------------------- @@ -367,12 +555,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (selectedHandlers.contains(controller)) { builder.append(Text.of(TextColors.GRAY, "[h+]")); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + controller.getName()), + TextActions.runCommand("/foxguard s h remove " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Remove from handler state buffer")), "[h-]")); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s h add " + controller.getName()), + TextActions.runCommand("/foxguard s h add " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Add to handler state buffer")), "[h+]")); builder.append(Text.of(TextColors.GRAY, "[h-]")); @@ -380,12 +568,12 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (selectedControllers.contains(controller)) { builder.append(Text.of(TextColors.GRAY, "[c+]")); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), + TextActions.runCommand("/foxguard s c remove " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Remove from controller state buffer")), "[c-]")); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s c add " + controller.getName()), + TextActions.runCommand("/foxguard s c add " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Add to controller state buffer")), "[c+]")); builder.append(Text.of(TextColors.GRAY, "[c-]")); @@ -393,21 +581,21 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(" ")); } builder.append(Text.of(FGUtil.getColorForObject(controller), - TextActions.runCommand("/foxguard det h " + controller.getName()), + TextActions.runCommand("/foxguard det h " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("View details")), controller.getShortTypeName() + " : " + controller.getName())); count++; if (controllerIterator.hasNext() && count < number) builder.append(Text.NEW_LINE); } if (maxPage > 1) - builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/fg ls " + arguments, null)); + builder.append(Text.NEW_LINE).append(FCPUtil.pageFooter(page, maxPage, "/foxguard ls " + arguments, null)); source.sendMessage(builder.build()); } else { throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); } return CommandResult.empty(); - } + }*/ @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index e70f285..dcec23f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -128,7 +128,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm source.sendMessage(messageOptional.get()); } } else { - source.sendMessage(Text.of(TextColors.GREEN, success ? + source.sendMessage(Text.of(color, success ? "Successfully modified " + fgCat.lName + "!" : "Modification failed for " + fgCat.lName + "!")); } @@ -137,6 +137,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } } + @SuppressWarnings("Duplicates") @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { if (!testPermission(source)) return ImmutableList.of(); @@ -155,8 +156,16 @@ public List getSuggestions(CommandSource source, String arguments, @Null .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else if (parse.current.index == 1) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix + str) + .collect(GuavaCollectors.toImmutableList()); + } + if (isIn(REGIONS_ALIASES, parse.args[0])) { String worldName = parse.flags.get("world"); + boolean key = parse.flags.containsKey("world"); World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); if (!worldName.isEmpty()) { @@ -165,24 +174,24 @@ else if (parse.current.index == 1) { world = optWorld.get(); } } - if (world == null) return FGManager.getInstance().getRegions().stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .sorted(String.CASE_INSENSITIVE_ORDER) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); - return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .sorted(String.CASE_INSENSITIVE_ORDER) - .map(args -> parse.current.prefix + args) - .collect(GuavaCollectors.toImmutableList()); + if (key && world != null) { + return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } else { + return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + .map(IFGObject::getName) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) + .collect(GuavaCollectors.toImmutableList()); + } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(result.getOwner()).stream() .map(IFGObject::getName) - .filter(new StartsWithPredicate(parse.current.token)) - .sorted(String.CASE_INSENSITIVE_ORDER) - .map(args -> parse.current.prefix + args) + .filter(new StartsWithPredicate(result.getToken())) + .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java similarity index 98% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java index e162976..c436841 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandRename.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java @@ -58,7 +58,7 @@ import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; -public class CommandRename extends FCCommandBase { +public class CommandMove extends FCCommandBase { private static final FlagMapper MAPPER = map -> key -> value -> { map.put(key, value); @@ -220,7 +220,7 @@ else if (parse.current.index == 1) { available = Tristate.fromBoolean(FGManager.getInstance().isRegionNameAvailable(parse.current.token)); } } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { - available = Tristate.fromBoolean(FGManager.getInstance().getHandler(parse.current.token) == null); + available = Tristate.fromBoolean(!FGManager.getInstance().getHandler(parse.current.token).isPresent()); } if (available != null) { switch (available) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index dcb346a..b72b278 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -79,10 +79,11 @@ public CommandResult process(CommandSource source, String arguments) throws Comm PriorityMachine temp = new PriorityMachine(arg); if (machine == null) machine = temp; } catch (NumberFormatException ignored) { - IHandler handler = FGManager.getInstance().getHandler(arg).orElse(null); - if (handler != null && !handlers.contains(handler)) { + try { + FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(arg); + IHandler handler = FGUtil.getHandlerFromCommand(ownerResult); handlers.add(handler); - } else { + } catch (CommandException ignored2) { failures++; } } @@ -113,13 +114,20 @@ public List getSuggestions(CommandSource source, String arguments, @Null .autoCloseQuotes(true) .parse(); if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { + FGUtil.OwnerTabResult result = FGUtil.getOwnerSuggestions(parse.current.token); + if (result.isComplete()) { + return result.getSuggestions().stream() + .map(str -> parse.current.prefix + str) + .collect(GuavaCollectors.toImmutableList()); + } + List selected = ImmutableList.copyOf(FGUtil.getSelectedHandlers(source)); - return FGManager.getInstance().getHandlers().stream() + return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(handler -> !selected.contains(handler) && !(handler instanceof IGlobal)) .map(IFGObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .filter(alias -> !isIn(parse.args, alias)) - .map(args -> parse.current.prefix + args) + .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.COMPLETE)) return ImmutableList.of(parse.current.prefix + " "); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java index 4428cba..4c2842c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java @@ -138,6 +138,11 @@ public Text getUsage(CommandSource source) { }; @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { + return CommandResult.empty(); + } + + /*@Override public CommandResult process(CommandSource source, String arguments) throws CommandException { if (!testPermission(source)) { source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this " + @@ -194,12 +199,13 @@ public CommandResult process(CommandSource source, String arguments) throws Comm source.sendMessage(Text.of(TextColors.GREEN, "Successfully created " + amount + " regions!")); return CommandResult.success(); - } + }*/ @Override public List getSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition) throws CommandException { - return ImmutableList.of(); + Thread.dumpStack(); + return ImmutableList.of("b", "c", "a", "d"); } /*@Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java index 3abd1ea..5b7afe1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java @@ -118,7 +118,7 @@ public String getUniqueTypeString() { public Text details(CommandSource source, String arguments) { Text.Builder builder = Text.builder(); builder.append(Text.of( - TextActions.suggestCommand("/foxguard md h " + this.name + " operator "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName()+ " operator "), TextActions.showText(Text.of(Text.of("Click to change operator"))), TextColors.GOLD, "Operator: ", operator.color, operator.toString() @@ -126,13 +126,13 @@ public Text details(CommandSource source, String arguments) { builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "\nMode: ")) .append(FGUtil.readableTristateText(mode)) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " mode ")) + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " mode ")) .onHover(TextActions.showText(Text.of(Text.of("Click to change mode")))) .build()); builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "\nShort Circuit: ")) .append(Text.of(FCPUtil.readableBooleanText(shortCircuit))) - .onClick(TextActions.runCommand("/foxguard md h " + this.name + " shortCircuit " + !shortCircuit)) + .onClick(TextActions.runCommand("/foxguard md h " + this.getFullName() + " shortCircuit " + !shortCircuit)) .onHover(TextActions.showText(Text.of(Text.of("Click to toggle short circuit")))) .build()); return builder.build(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 51b7f65..3949991 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -1065,17 +1065,17 @@ public Text details(CommandSource source, String arguments) { if (this.passiveSetting == PassiveSetting.GROUP) passiveBuilder.append(Text.of(passiveGroup.color, passiveGroup.displayName)); passiveBuilder - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " passive ")) + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName()+ " passive ")) .onHover(TextActions.showText(Text.of("Click to change the passive config"))); builder.append(passiveBuilder.build()); builder.append(Text.NEW_LINE); builder.append(Text.of(TextColors.GOLD, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " group add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " group add "), TextActions.showText(Text.of("Click to add a group")), "----- Group Members -----\n")); for (Group group : groups) { builder.append(Text.of(group.color, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " users " + group.name + " add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " users " + group.name + " add "), TextActions.showText(Text.of("Click to add player(s) to \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")"))), group.displayName, TextColors.RESET, ": ")); @@ -1096,26 +1096,26 @@ public Text details(CommandSource source, String arguments) { if (source instanceof Player && ((Player) source).getUniqueId().equals(user.getUniqueId())) color = TextColors.YELLOW; builder.append(Text.of(color, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " users " + group.name + " remove " + user.getName()), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " users " + group.name + " remove " + user.getName()), TextActions.showText(Text.of("Click to remove player \"" + user.getName() + "\" from \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")"))), user.getName())).append(Text.of(" ")); }); offline.stream() .sorted((u1, u2) -> u1.toString().compareTo(u2.toString())) .forEach(uuid -> builder.append(Text.of(TextColors.RESET, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " users " + group.name + " remove " + uuid.toString()), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " users " + group.name + " remove " + uuid.toString()), TextActions.showText(Text.of("Click to remove player \"" + uuid.toString() + "\" from \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")"))), uuid.toString())).append(Text.of(" "))); builder.append(Text.NEW_LINE); } builder.append(Text.of(TextColors.GOLD, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " groups add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " groups add "), TextActions.showText(Text.of("Click to add a group")), "----- Group Flags -----\n")); for (Group group : groups) { builder.append(Text.of(group.color, - TextActions.suggestCommand("/foxguard md h " + this.name + " flags " + group.name + " add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags " + group.name + " add "), TextActions.showText(Text.of("Click to add a flag entry")), group.displayName + ":\n")); int index = 0; @@ -1126,12 +1126,12 @@ public Text details(CommandSource source, String arguments) { entryBuilder.append(Text.of(" " + index + ": " + stringBuilder.toString(), TextColors.AQUA, ": ")) .append(FGUtil.readableTristateText(entry.tristate)) .onHover(TextActions.showText(Text.of("Click to change this flag entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " flags " + group.name + " set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags " + group.name + " set " + (index++) + " ")); builder.append(entryBuilder.build()).append(Text.NEW_LINE); } } builder.append(Text.of(this.defaultGroup.color, - TextActions.suggestCommand("/foxguard md h " + this.name + " flags default add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags default add "), TextActions.showText(Text.of("Click to add a flag entry")), this.defaultGroup.displayName + ":")); int index = 0; @@ -1142,7 +1142,7 @@ public Text details(CommandSource source, String arguments) { entryBuilder.append(Text.of(" " + index + ": " + stringBuilder.toString(), TextColors.AQUA, ": ")) .append(FGUtil.readableTristateText(entry.tristate)) .onHover(TextActions.showText(Text.of("Click to change this flag entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " flags default set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags default set " + (index++) + " ")); builder.append(Text.NEW_LINE).append(entryBuilder.build()); } return builder.build(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 78493c5..8003f6f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -846,12 +846,12 @@ public String getUniqueTypeString() { public Text details(CommandSource source, String arguments) { Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.GOLD, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " group add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " group add "), TextActions.showText(Text.of("Click to add a group")), "----- Group Permission Strings -----\n")); for (Group group : groups) { builder.append(Text.of(group.color, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " group modify " + group.name + " "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " group modify " + group.name + " "), TextActions.showText(Text.of("Click to modify \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")"))), group.displayName, TextColors.RESET, ": ")); @@ -862,17 +862,17 @@ public Text details(CommandSource source, String arguments) { permBuilder.append(Text.of("foxguard.handler.", TextColors.YELLOW, this.name.toLowerCase(), TextColors.RESET, ".", group.color, group.name)); } permBuilder.onHover(TextActions.showText(Text.of("Click to modify the permissions string for \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")")))); - permBuilder.onClick(TextActions.suggestCommand("/foxguard md h " + this.getName() + " group modify " + group.name + " --p:")); + permBuilder.onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " group modify " + group.name + " --p:")); builder.append(permBuilder.build()); builder.append(Text.NEW_LINE); } builder.append(Text.of(TextColors.GOLD, - TextActions.suggestCommand("/foxguard md h " + this.getName() + " groups add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " groups add "), TextActions.showText(Text.of("Click to add a group")), "----- Group Flags -----\n")); for (Group group : groups) { builder.append(Text.of(group.color, - TextActions.suggestCommand("/foxguard md h " + this.name + " flags " + group.name + " add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags " + group.name + " add "), TextActions.showText(Text.of("Click to add a flag entry")), group.displayName + ":\n")); int index = 0; @@ -883,12 +883,12 @@ public Text details(CommandSource source, String arguments) { entryBuilder.append(Text.of(" " + index + ": " + stringBuilder.toString(), TextColors.AQUA, ": ")) .append(FGUtil.readableTristateText(entry.tristate)) .onHover(TextActions.showText(Text.of("Click to change this flag entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " flags " + group.name + " set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags " + group.name + " set " + (index++) + " ")); builder.append(entryBuilder.build()).append(Text.NEW_LINE); } } builder.append(Text.of(this.defaultGroup.color, - TextActions.suggestCommand("/foxguard md h " + this.name + " flags default add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags default add "), TextActions.showText(Text.of("Click to add a flag entry")), this.defaultGroup.displayName + ":")); int index = 0; @@ -899,7 +899,7 @@ public Text details(CommandSource source, String arguments) { entryBuilder.append(Text.of(" " + index + ": " + stringBuilder.toString(), TextColors.AQUA, ": ")) .append(FGUtil.readableTristateText(entry.tristate)) .onHover(TextActions.showText(Text.of("Click to change this flag entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " flags default set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " flags default set " + (index++) + " ")); builder.append(Text.NEW_LINE).append(entryBuilder.build()); } return builder.build(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index 225f0e8..80cf084 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -55,7 +55,7 @@ public int compareTo(IHandler o) { } public void markDirty() { - FGUtil.markHandlerDirty(this); + FGUtil.markDirty(this); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java index b8310b0..bee46cd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/PermissionHandler.java @@ -496,7 +496,7 @@ public Text details(CommandSource source, String arguments) { TextColors.AQUA, ">"); builder.append(Text.of( TextActions.showText(Text.of("Click to add a permission entry")), - TextActions.suggestCommand("/foxguard md h " + this.name + " entries add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " entries add "), TextColors.GREEN, "Entries:" )); int index = 0; @@ -515,7 +515,7 @@ public Text details(CommandSource source, String arguments) { } entryBuilder.append(postfix) .onHover(TextActions.showText(Text.of("Click to change this entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + "entries set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + "entries set " + (index++) + " ")); builder.append(Text.NEW_LINE).append(entryBuilder.build()); } Text.Builder entryBuilder = Text.builder(); @@ -530,7 +530,7 @@ public Text details(CommandSource source, String arguments) { } entryBuilder.append(postfix) .onHover(TextActions.showText(Text.of("Click to change this entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " default ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " default ")); builder.append(Text.NEW_LINE).append(entryBuilder.build()); return builder.build(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java index 544ff11..cddb2cf 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/StaticHandler.java @@ -461,7 +461,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N public Text details(CommandSource source, String arguments) { Text.Builder builder = Text.builder(); builder.append(Text.of(TextColors.AQUA, - TextActions.suggestCommand("/foxguard md h " + this.name + " add "), + TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " add "), TextActions.showText(Text.of("Click to add a flag entry")), "Flags:")); int index = 0; @@ -472,7 +472,7 @@ public Text details(CommandSource source, String arguments) { entryBuilder.append(Text.of(" " + index + ": " + stringBuilder.toString(), TextColors.AQUA, ": ")) .append(FGUtil.readableTristateText(entry.tristate)) .onHover(TextActions.showText(Text.of("Click to change this flag entry"))) - .onClick(TextActions.suggestCommand("/foxguard md h " + this.name + " set " + (index++) + " ")); + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " set " + (index++) + " ")); builder.append(Text.NEW_LINE).append(entryBuilder.build()); } return builder.build(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 26d0e38..3d1ba76 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -232,7 +232,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionDisplayName(region, false))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -250,7 +250,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionDisplayName(region, false))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index c3db642..7a70ed6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -175,7 +175,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionDisplayName(region, false))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -193,7 +193,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getRegionDisplayName(region, false))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index 80dad78..40ca4aa 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -75,6 +75,15 @@ public void setEnabled(boolean state) { public abstract void markDirty(); + @Override + public String getFullName() { + String fullName = this.name; + if (this.owner != null && !this.owner.equals(FGManager.SERVER_UUID)) { + fullName = this.owner + ":" + fullName; + } + return fullName; + } + @Override public String toString() { return "FGObjectBase{" + diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index a22e79d..f108957 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -32,6 +32,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; +import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; @@ -171,4 +172,8 @@ default boolean shouldSave() { return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); } + default String getFullName(){ + return FGUtil.getFullName(this); + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java index 10dc9fb..92475f7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java @@ -1,9 +1,13 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.profile.GameProfile; import org.spongepowered.api.service.user.UserStorageService; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; import java.util.List; @@ -34,7 +38,7 @@ public List getOwnerKeywords() { @Override public Optional getOwnerUUID(@Nullable String keyword) { - if(keyword == null || keyword.isEmpty()) return Optional.empty(); + if (keyword == null || keyword.isEmpty()) return Optional.empty(); return service.get(keyword).map(User::getUniqueId); } @@ -47,4 +51,9 @@ public Optional getKeyword(UUID owner) { public String[] getAliases() { return ALIASES; } + + @Override + public Optional getDisplayText(UUID owner, @Nullable CommandSource viewer) {a + return getDisplayName(owner, viewer).map(name -> Text.of(TextColors.YELLOW, name)); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java index bdf73ad..784b37c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java @@ -1,9 +1,15 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.owners; import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.format.TextColor; +import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.Identifiable; +import javax.annotation.Nullable; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -29,6 +35,7 @@ public Optional getOwnerUUID(String keyword) { return Sponge.getServer().getPlayer(keyword).map(Player::getUniqueId); } + @Override public Optional getKeyword(UUID owner) { return Sponge.getServer().getPlayer(owner).map(Player::getName); @@ -38,4 +45,15 @@ public Optional getKeyword(UUID owner) { public String[] getAliases() { return ALIASES; } + + @Override + public Optional getDisplayText(UUID owner, @Nullable CommandSource viewer) { + return getDisplayName(owner, viewer) + .map(name->{ + TextColor color = TextColors.GREEN; + if (viewer instanceof Identifiable && ((Identifiable) viewer).getUniqueId().equals(owner)) + color = TextColors.AQUA; + return Text.of(color, name); + }); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index 13fa52e..463dc12 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -72,7 +72,7 @@ public void clearLinks() { } public void markDirty() { - FGUtil.markRegionDirty(this); + FGUtil.markDirty(this); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java index c18f111..86a898a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java @@ -69,7 +69,7 @@ public Text currentState(CommandSource source) { IController controller = it.next(); if (source instanceof Player) { builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + controller.getName()), + TextActions.runCommand("/foxguard s c remove " + FGUtil.getFullName(controller)), TextActions.showText(Text.of("Remove from Handler State Buffer")), " [-] ")); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java index 6910905..8f706fd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java @@ -69,7 +69,7 @@ public Text currentState(CommandSource source) { IHandler handler = it.next(); if (source instanceof Player) { builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + handler.getName()), + TextActions.runCommand("/foxguard s h remove " + FGUtil.getFullName(handler)), TextActions.showText(Text.of("Remove from Handler State Buffer")), " [-] ")); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java index 4b3ced0..61cb7d5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java @@ -86,12 +86,12 @@ public Text currentState(CommandSource source) { builder.append(Text.of(TextColors.RED, TextActions.runCommand("/foxguard s r remove " + FGUtil.genWorldFlag(region) + - region.getName()), + FGUtil.getFullName(region)), TextActions.showText(Text.of("Remove from State Buffer")), " [-] ")); } builder.append(Text.of(FGUtil.getColorForObject(region), - (index++) + ": " + FGUtil.getRegionDisplayName(region, true))); + (index++) + ": " + FGUtil.getObjectDisplayName(region, true, null, source))); if (regionIterator.hasNext()) builder.append(Text.NEW_LINE); } return builder.build(); @@ -112,8 +112,8 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma .parseLastFlags(false) .leaveFinalAsIs(true) .parse(); - String newArgs = parse.args.length > 1 ? parse.args[1] : ""; if (parse.args.length > 0) { + String newArgs = parse.args.length > 1 ? parse.args[1] : ""; if (parse.args[0].equalsIgnoreCase("add")) { return add(source, newArgs); } else if (parse.args[0].equalsIgnoreCase("remove")) { @@ -202,7 +202,7 @@ public List getScoreboardText() { int[] index = {1}; return this.list.stream() .map(region -> Text.of(FGUtil.getColorForObject(region), - " " + index[0]++ + ": " + FGUtil.getRegionDisplayName(region, true))) + " " + index[0]++ + ": " + FGUtil.getObjectDisplayName(region,true, FGManager.SERVER_UUID, null))) .collect(Collectors.toList()); } @@ -217,7 +217,10 @@ public boolean prioritizeLast() { } public ProcessResult add(CommandSource source, String arguments) throws CommandException { - AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .flagMapper(MAPPER) + .parse(); if (parse.args.length < 1) throw new CommandException(Text.of("Must specify a name!")); IRegion region = FGManager.getInstance().getRegion(parse.args[0]).orElse(null); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index a48a97d..02a9c24 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -85,17 +85,21 @@ public class FGStorageManagerNew { private static final Type INDEX_LIST_TYPE = new TypeToken>() { }.getType(); private static FGStorageManagerNew instance; - public final Gson GSON; public final HashMap defaultModifiedMap; + private final FGConfigManager config; private final UserStorageService userStorageService; private final Logger logger = FoxGuardMain.instance().getLogger(); private final FGManager manager = FGManager.getInstance(); private final Map worldDirectories; + private Gson gson; + private boolean prettyPrint; + private String gsonIndentString; private Path fgDirectory; private boolean serverLoaded = false; private boolean reentry = false; private FGStorageManagerNew() { + config = FGConfigManager.getInstance(); userStorageService = FoxGuardMain.instance().getUserStorage(); defaultModifiedMap = new CacheMap<>((k, m) -> { if (k instanceof IFGObject) { @@ -104,8 +108,17 @@ private FGStorageManagerNew() { } else return null; }); worldDirectories = new HashMap<>(); + prettyPrint = config.prettyPrint(); + StringBuilder builder = new StringBuilder(); + int indent = config.prettyPrintIndent(); + for (int i = 0; i < indent; i++) { + builder.append(" "); + } + gsonIndentString = builder.toString(); GsonBuilder gsonBuilder = new GsonBuilder(); - GSON = gsonBuilder.create(); + gsonBuilder.setPrettyPrinting(); + gson = gsonBuilder.create(); + } public static FGStorageManagerNew getInstance() { @@ -152,8 +165,8 @@ private void saveIndex(Set objects, Path file) { } try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(file, CHARSET))) { - //jsonWriter.setIndent(" "); - GSON.toJson(indexList, List.class, jsonWriter); + if (this.prettyPrint) jsonWriter.setIndent(gsonIndentString); + gson.toJson(indexList, List.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open index for writing: " + file, e); } @@ -187,8 +200,8 @@ public void saveObject(IFGObject object, boolean force) { FGSObjectMeta metadata = new FGSObjectMeta(object); Path metadataFile = directory.resolve(METADATA_FILE_NAME); try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(metadataFile, CHARSET))) { - //jsonWriter.setIndent(" "); - GSON.toJson(metadata, FGSObjectMeta.class, jsonWriter); + if(this.prettyPrint) jsonWriter.setIndent(this.gsonIndentString); + gson.toJson(metadata, FGSObjectMeta.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open metadata for writing: " + metadataFile, e); } @@ -399,7 +412,7 @@ public Optional> loadIndex(Path indexFile) { List index = null; if (Files.exists(indexFile) && !Files.isDirectory(indexFile)) { try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(indexFile))) { - index = GSON.fromJson(jsonReader, INDEX_LIST_TYPE); + index = gson.fromJson(jsonReader, INDEX_LIST_TYPE); } catch (IOException e) { logger.error("Failed to open index for reading: " + indexFile, e); } @@ -416,7 +429,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i Path metadataFile = directory.resolve(METADATA_FILE_NAME); if (Files.exists(metadataFile) && !Files.isDirectory(metadataFile)) { try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(metadataFile))) { - metadata = GSON.fromJson(jsonReader, FGSObjectMeta.class); + metadata = gson.fromJson(jsonReader, FGSObjectMeta.class); } catch (IOException e) { logger.error("Failed to open metadata for reading: " + metadataFile, e); } @@ -510,6 +523,14 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i return Optional.ofNullable(fgObject); } + public Gson getGson() { + return gson; + } + + public String getGsonIndent(){ + return gsonIndentString; + } + private Path getFGDirectory() { if (fgDirectory != null) { constructDirectories(fgDirectory); @@ -872,4 +893,12 @@ public String getIndexFile() { public abstract IFGObject loadInstance(Path directory, String type, FGObjectData data); } + + /*private void setPrettyPrint(boolean prettyPrint) { + if (this.prettyPrint == prettyPrint) return; + this.prettyPrint = prettyPrint; + GsonBuilder builder = new GsonBuilder(); + if (prettyPrint) builder.setPrettyPrinting(); + this.gson = builder.create(); + }*/ } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index c6b6d65..6c95d6f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.util; import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; @@ -50,6 +51,7 @@ import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; @@ -66,6 +68,10 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.HANDLERS_ALIASES; +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.REGIONS_ALIASES; +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; + public final class FGUtil { private static UserStorageService userStorageService; @@ -94,8 +100,23 @@ public static List getSelectedControllers(CommandSource source) { return ((ControllersStateField) FCStateManager.instance().getStateMap().get(source).getOrCreate(ControllersStateField.ID).get()).getList(); } - public static String getRegionDisplayName(IRegion region, boolean dispWorld) { - return region.getShortTypeName() + " : " + (dispWorld && region instanceof IWorldRegion ? ((IWorldRegion) region).getWorld().getName() + " : " : "") + region.getName(); + public static String getObjectDisplayName(IFGObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { + if(owner == null) owner = object.getOwner(); + boolean hasOwner; + hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); + return object.getShortTypeName() + + " : " + + (dispWorld && object instanceof IWorldBound ? ((IWorldBound) object).getWorld().getName() + " : " : "") + + (hasOwner ? OwnerProviderRegistry.getInstance().getDisplayName(owner, null, viewer) + " : " : "") + + object.getName(); + } + public static Text getObjectDisplayTest(IFGObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { + if(owner == null) owner = object.getOwner(); + boolean hasOwner; + hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); + Text.Builder builder = Text.builder(); + + return builder.build(); } public static String getLogName(IFGObject object) { @@ -106,6 +127,15 @@ public static String getLogName(IFGObject object) { return (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + object.getName(); } + public static String getFullName(IFGObject object) { + UUID owner = object.getOwner(); + String fullName = object.getName(); + if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { + fullName = owner + ":" + fullName; + } + return fullName; + } + public static String getCategory(IFGObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) return "worldregion"; @@ -133,8 +163,8 @@ public static Text readableTristateText(Tristate state) { } } - public static void markDirty(IFGObject object){ - if(object instanceof IRegion){ + public static void markDirty(IFGObject object) { + if (object instanceof IRegion) { FGManager.getInstance().markDirty(((IRegion) object), RegionCache.DirtyType.MODIFIED); } FGStorageManagerNew.getInstance().defaultModifiedMap.put(object, true); @@ -152,7 +182,7 @@ public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws Comma if (!handlerOpt.isPresent()) { StringBuilder builder = new StringBuilder(); builder.append("No handler exists with the name \"").append(name).append("\""); - if (owner != FGManager.SERVER_UUID) { + if (!owner.equals(FGManager.SERVER_UUID)) { builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); } builder.append("!"); @@ -223,7 +253,7 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua if (returnRegion == null) { StringBuilder builder = new StringBuilder(); builder.append("No region exists with the name \"").append(name).append("\""); - if (owner != FGManager.SERVER_UUID) { + if (!owner.equals(FGManager.SERVER_UUID)) { builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); } if (world != null && regions.size() > 0) { @@ -332,6 +362,91 @@ public static OwnerTabResult getOwnerSuggestions(String input) { return new OwnerTabResult(); } + public static void genStatePrefix(Text.Builder builder, IFGObject object, CommandSource source){ + genStatePrefix(builder, object, source, false); + } + + public static void genStatePrefix(Text.Builder builder, IFGObject object, CommandSource source, boolean controllerPadding) { + FGCat cat = FGCat.from(object); + if (cat == null) return; + if (cat == FGCat.WORLDREGION) cat = FGCat.REGION; + boolean contains; + if (cat == FGCat.REGION) { + contains = getSelectedRegions(source).contains(object); + controllerPadding = false; + } else { + contains = getSelectedHandlers(source).contains(object); + if (cat == FGCat.CONTROLLER) { + genStateButtons(builder, FGCat.HANDLER, object, contains); + contains = getSelectedControllers(source).contains(object); + controllerPadding =false; + } + } + genStateButtons(builder, cat, object, contains); + if(controllerPadding) + builder.append(Text.of(TextColors.DARK_GRAY, "[c+][c-]")); + builder.append(Text.of(" ")); + } + + private static void genStateButtons(Text.Builder builder, FGCat cat, IFGObject object, boolean contains) { + String plus = "[" + cat.sName + "+]"; + String minus = "[" + cat.sName + "-]"; + if (contains) { + builder.append(Text.of(TextColors.GRAY, plus)); + builder.append(Text.of(TextColors.RED, + TextActions.runCommand("/foxguard s " + cat.sName + " remove " + genWorldFlag(object) + getFullName(object)), + TextActions.showText(Text.of("Remove from " + cat.lName + " state buffer")), + minus)); + } else { + builder.append(Text.of(TextColors.GREEN, + TextActions.runCommand("/foxguard s " + cat.sName + " add " + genWorldFlag(object) + getFullName(object)), + TextActions.showText(Text.of("Add to " + cat.lName + " state buffer")), + plus)); + builder.append(Text.of(TextColors.GRAY, minus)); + } + } + + private enum FGCat { + REGION(REGIONS_ALIASES, "r"), + WORLDREGION(null, REGION.sName), + HANDLER(HANDLERS_ALIASES, "h"), + CONTROLLER(null, HANDLER.sName); + + public final String[] catAliases; + public final String lName = name().toLowerCase(); + public final String uName = FCCUtil.toCapitalCase(name()); + public final String sName; + + FGCat(String[] catAliases, String sName) { + this.catAliases = catAliases; + this.sName = sName; + } + + public static FGCat from(String category) { + for (FGCat cat : values()) { + if (isIn(cat.catAliases, category)) return cat; + } + return null; + } + + public static FGCat from(IFGObject object) { + if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + return WORLDREGION; + } else { + return REGION; + } + } else if (object instanceof IHandler) { + if (object instanceof IController) { + return CONTROLLER; + } else { + return HANDLER; + } + } + return null; + } + } + public static class OwnerTabResult { private boolean complete; private List suggestions; @@ -375,6 +490,17 @@ public String getToken() { public UUID getOwner() { return owner; } + + @Override + public String toString() { + return "OwnerTabResult{" + + "complete=" + complete + + ", suggestions=" + suggestions + + ", prefix='" + prefix + '\'' + + ", token='" + token + '\'' + + ", owner=" + owner + + '}'; + } } public static class OwnerResult { @@ -399,5 +525,14 @@ public UUID getOwner() { public String getOwnerName() { return ownerName; } + + @Override + public String toString() { + return "OwnerResult{" + + "name='" + name + '\'' + + ", owner=" + owner + + ", ownerName='" + ownerName + '\'' + + '}'; + } } } From 001630b95d8d61060867dde69a1bed3e64f27460 Mon Sep 17 00:00:00 2001 From: connor Date: Thu, 7 Dec 2017 08:45:14 +1300 Subject: [PATCH 14/30] Update FoxCore submodule --- FoxCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FoxCore b/FoxCore index fa2c35b..2063a14 160000 --- a/FoxCore +++ b/FoxCore @@ -1 +1 @@ -Subproject commit fa2c35bb47d31163437901e93cc7aa8e4356f9bd +Subproject commit 2063a144cdae6b2f7a0451e6a6ded11f371668d3 From 0525a2f981cdb6a06e9388bb02bb8338450be34e Mon Sep 17 00:00:00 2001 From: connor Date: Thu, 7 Dec 2017 09:42:32 +1300 Subject: [PATCH 15/30] Attempt at cause and context refactor --- .../net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java | 4 +++- .../foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 682520a..c29c32b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -54,12 +54,14 @@ import org.spongepowered.api.command.CommandCallable; import org.spongepowered.api.command.CommandMapping; import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.event.CauseStackManager; import org.spongepowered.api.event.EventManager; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.Order; import org.spongepowered.api.event.block.ChangeBlockEvent; import org.spongepowered.api.event.block.InteractBlockEvent; import org.spongepowered.api.event.cause.Cause; +import org.spongepowered.api.event.cause.EventContext; import org.spongepowered.api.event.entity.DamageEntityEvent; import org.spongepowered.api.event.entity.InteractEntityEvent; import org.spongepowered.api.event.entity.MoveEntityEvent; @@ -95,7 +97,7 @@ url = "https://github.com/FoxDenStudio/FoxGuard") public final class FoxGuardMain { - public final Cause pluginCause = Cause.builder().named("plugin", this).build(); + public final Cause pluginCause = Cause.builder().append(this).build(EventContext.empty()); /** * FoxGuardMain instance object. diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java index d6f6ad6..dede305 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java @@ -52,7 +52,7 @@ public static void printBlockEvent(ChangeBlockEvent event) { sb.append(o).append("\n"); } sb.append("\n"); - event.getCause().getNamedCauses().forEach((k, v) -> sb.append(k).append("::").append(v).append("\n")); + event.getContext().asMap().forEach((k, v) -> sb.append(k).append("::").append(v).append("\n")); FoxGuardMain.instance().getLogger().info(sb.toString()); } } From 06f8e74ea49a90f2882844599ab0d3c6ce9910a0 Mon Sep 17 00:00:00 2001 From: connor Date: Thu, 7 Dec 2017 10:03:31 +1300 Subject: [PATCH 16/30] Bump version --- build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b122577..2d76740 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,10 @@ buildscript { name = "forge" url = "http://files.minecraftforge.net/maven" } + maven { + name = "sponge" + url = "https://repo.spongepowered.org/maven" + } } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' @@ -24,7 +28,7 @@ apply plugin: 'org.spongepowered.plugin' apply plugin: 'net.minecraftforge.gradle.forge' group 'net.foxdenstudio.sponge' -version 'api6-SNAPSHOT' +version 'api7-SNAPSHOT' apply from: project("$gradle.foxCoreName").file("gradle/fox.gradle") apply from: project("$gradle.foxCoreName").file("gradle/publish.gradle") From 2382c86cc18252a2893b9c7f0767ed83ebf1480a Mon Sep 17 00:00:00 2001 From: Connor Hartley Date: Mon, 11 Dec 2017 21:20:44 +1300 Subject: [PATCH 17/30] Use latest spongegradle and evengenimpl --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2d76740..8ba768d 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ buildscript { } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' - classpath 'gradle.plugin.org.spongepowered:spongegradle:0.7' - classpath 'gradle.plugin.org.spongepowered:event-impl-gen:5.0.2' + classpath 'org.spongepowered:spongegradle:0.8.2-SNAPSHOT' + classpath 'org.spongepowered:event-impl-gen:5.2.0-SNAPSHOT' classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' } } From 81593233cfd1d77127fe3b625734437f0a372153 Mon Sep 17 00:00:00 2001 From: Connor Hartley Date: Mon, 11 Dec 2017 21:41:07 +1300 Subject: [PATCH 18/30] Update FoxCore --- FoxCore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FoxCore b/FoxCore index 2063a14..7ba02d0 160000 --- a/FoxCore +++ b/FoxCore @@ -1 +1 @@ -Subproject commit 2063a144cdae6b2f7a0451e6a6ded11f371668d3 +Subproject commit 7ba02d014226b560527d15d7c68b44a593e1c767 From fcad9f21fe7946e8baca8bb49238a104e6272ad9 Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Fri, 15 Dec 2017 13:39:52 -0800 Subject: [PATCH 19/30] oh my god i almost lost all of these changes --- .../sponge/foxguard/plugin/FGManager.java | 150 +++++++++++++----- .../sponge/foxguard/plugin/FoxGuardMain.java | 4 +- .../foxguard/plugin/command/CommandMove.java | 6 +- .../foxguard/plugin/handler/BasicHandler.java | 8 +- .../plugin/misc/FGContextCalculator.java | 3 + .../foxguard/plugin/object/FGObjectBase.java | 10 +- .../foxguard/plugin/object/IFGObject.java | 2 +- .../object/owners/OfflineUserProvider.java | 2 +- .../plugin/region/world/WorldRegionBase.java | 4 +- .../plugin/storage/FGSLegacyLoader.java | 90 +++++++++++ .../plugin/storage/FGSObjectPath.java | 4 +- .../plugin/storage/FGStorageManagerNew.java | 100 ++++++++++-- 12 files changed, 315 insertions(+), 68 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index 2ab8054..e116000 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -53,16 +53,17 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import static com.google.common.base.Preconditions.checkNotNull; public final class FGManager { public static final UUID SERVER_UUID = new UUID(0, 0); - public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users"}; + public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users", "owners"}; private static FGManager instance; private final Map> worldRegions; @@ -123,7 +124,7 @@ public boolean addHandler(IHandler handler, UUID owner) { return false; handler.setOwner(owner); handlers.put(owner, handler); - //FGStorageManager.getInstance().addObject(handler); + FGStorageManagerNew.getInstance().addObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); return true; } @@ -134,7 +135,8 @@ public boolean addRegion(IRegion region) { return addRegion(region, owner); } - public boolean addRegion(IRegion region, UUID owner) { + public boolean addRegion(IRegion region, @Nonnull UUID owner) { + checkNotNull(owner); if (region == null || !isNameValid(region.getName()) || !isRegionNameAvailable(region.getName(), owner) @@ -142,7 +144,7 @@ public boolean addRegion(IRegion region, UUID owner) { region.setOwner(owner); this.regions.put(owner, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); - //FGStorageManager.getInstance().addObject(region); + FGStorageManagerNew.getInstance().addObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); return true; } @@ -165,7 +167,8 @@ public boolean addWorldRegion(IWorldRegion region, World world) { return addWorldRegion(region, owner, world); } - public boolean addWorldRegion(IWorldRegion region, UUID owner, World world) { + public boolean addWorldRegion(IWorldRegion region, @Nonnull UUID owner, World world) { + checkNotNull(owner); if (region == null || world == null || region.getWorld() != null @@ -176,7 +179,7 @@ public boolean addWorldRegion(IWorldRegion region, UUID owner, World world) { region.setOwner(owner); this.worldRegions.get(world).put(owner, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); - //FGStorageManager.getInstance().addObject(region); + FGStorageManagerNew.getInstance().addObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); return true; } @@ -194,7 +197,8 @@ public Set getAllRegions() { } @Nonnull - public Set getAllRegions(UUID owner) { + public Set getAllRegions(@Nonnull UUID owner) { + checkNotNull(owner); Set set = new HashSet<>(); this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.get(owner))); set.addAll(this.regions.get(owner)); @@ -211,7 +215,8 @@ public Set getAllRegions(World world) { } @Nonnull - public Set getAllRegions(String name, UUID owner) { + public Set getAllRegions(String name, @Nonnull UUID owner) { + checkNotNull(owner); Set set = new HashSet<>(); for (IRegion region : this.regions.get(owner)) { if (region.getName().equalsIgnoreCase(name)) set.add(region); @@ -226,7 +231,8 @@ public Set getAllRegions(String name, UUID owner) { } @Nonnull - public Set getAllRegions(World world, UUID owner) { + public Set getAllRegions(World world, @Nonnull UUID owner) { + checkNotNull(owner); if (world == null) return getRegions(); Set set = new HashSet<>(); set.addAll(this.worldRegions.get(world).get(owner)); @@ -235,12 +241,13 @@ public Set getAllRegions(World world, UUID owner) { } @Nonnull - public Set getAllRegionsWithUniqueNames(UUID owner) { + public Set getAllRegionsWithUniqueNames(@Nonnull UUID owner) { return getAllRegionsWithUniqueNames(owner, null); } @Nonnull - public Set getAllRegionsWithUniqueNames(UUID owner, @Nullable World world) { + public Set getAllRegionsWithUniqueNames(@Nonnull UUID owner, @Nullable World world) { + checkNotNull(owner); Set returnSet = new HashSet<>(); returnSet.addAll(this.regions.get(owner)); Map duplicates = new HashMap<>(); @@ -279,7 +286,8 @@ public Optional getController(String name) { } @Nonnull - public Optional getController(String name, UUID owner) { + public Optional getController(String name, @Nonnull UUID owner) { + checkNotNull(owner); for (IHandler handler : handlers.get(owner)) { if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { return Optional.of((IController) handler); @@ -297,7 +305,8 @@ public Set getControllers() { } @Nonnull - public Set getControllers(UUID owner) { + public Set getControllers(@Nonnull UUID owner) { + checkNotNull(owner); return this.handlers.get(owner).stream() .filter(handler -> handler instanceof IController) .map(handler -> ((IController) handler)) @@ -315,7 +324,8 @@ public Optional getHandler(String name) { } @Nonnull - public Optional getHandler(String name, UUID owner) { + public Optional getHandler(String name, @Nonnull UUID owner) { + checkNotNull(owner); for (IHandler handler : handlers.get(owner)) { if (handler.getName().equalsIgnoreCase(name)) { return Optional.of(handler); @@ -330,7 +340,8 @@ public Set getHandlers() { } @Nonnull - public Set getHandlers(UUID owner) { + public Set getHandlers(@Nonnull UUID owner) { + checkNotNull(owner); return ImmutableSet.copyOf(this.handlers.get(owner)); } @@ -377,11 +388,11 @@ public Optional getRegionFromWorld(World world, String name) { } @Nonnull - public Optional getRegionFromWorld(World world, String name, UUID owner) { + public Optional getRegionFromWorld(World world, String name, @Nonnull UUID owner) { + checkNotNull(owner); + Optional region = getWorldRegion(world, name, owner); - if (!region.isPresent()) { - return getRegion(name, owner); - } else return Optional.of(region.get()); + return region.>map(Optional::of).orElseGet(() -> getRegion(name, owner)); } @Nonnull @@ -390,7 +401,8 @@ public Set getRegions() { } @Nonnull - public Set getRegions(UUID owner) { + public Set getRegions(@Nonnull UUID owner) { + checkNotNull(owner); return ImmutableSet.copyOf(this.regions.get(owner)); } @@ -581,7 +593,8 @@ public Optional getWorldRegion(World world, String name) { } @Nonnull - public Optional getWorldRegion(World world, String name, UUID owner) { + public Optional getWorldRegion(World world, String name, @Nonnull UUID owner) { + checkNotNull(owner); for (IWorldRegion region : this.worldRegions.get(world).get(owner)) { if (region.getName().equalsIgnoreCase(name)) { return Optional.of(region); @@ -596,7 +609,8 @@ public Set getWorldRegions(World world) { } @Nonnull - public Set getWorldRegions(World world, UUID owner) { + public Set getWorldRegions(World world, @Nonnull UUID owner) { + checkNotNull(owner); return ImmutableSet.copyOf(this.worldRegions.get(world).get(owner)); } @@ -611,7 +625,7 @@ public boolean isHandlerNameAvailable(String name) { return isHandlerNameAvailable(name, SERVER_UUID); } - public boolean isHandlerNameAvailable(String name, UUID owner) { + public boolean isHandlerNameAvailable(String name, @Nonnull UUID owner) { return !getHandler(name, owner).isPresent(); } @@ -619,8 +633,8 @@ public boolean isRegionNameAvailable(String name) { return isRegionNameAvailable(name, SERVER_UUID); } - public boolean isRegionNameAvailable(String name, UUID owner) { - if (getRegion(name).isPresent()) return false; + public boolean isRegionNameAvailable(String name, @Nonnull UUID owner) { + if (getRegion(name, owner).isPresent()) return false; for (World world : worldRegions.keySet()) { if (getWorldRegion(world, name, owner).isPresent()) return false; } @@ -635,7 +649,7 @@ public boolean isWorldRegionNameAvailable(String name, World world) { return isWorldRegionNameAvailable(name, SERVER_UUID, world); } - public boolean isWorldRegionNameAvailable(String name, UUID owner, World world) { + public boolean isWorldRegionNameAvailable(String name, @Nonnull UUID owner, World world) { return !(getWorldRegion(world, name, owner).isPresent() || getRegion(name, owner).isPresent()); } @@ -645,7 +659,8 @@ public Tristate isWorldRegionNameAvailable(String name) { } @Nonnull - public Tristate isWorldRegionNameAvailable(String name, UUID owner) { + public Tristate isWorldRegionNameAvailable(String name, @Nonnull UUID owner) { + checkNotNull(owner); if (getRegion(name, owner).isPresent()) return Tristate.FALSE; Tristate available = null; for (World world : worldRegions.keySet()) { @@ -663,7 +678,7 @@ public Tristate isWorldRegionNameAvailable(String name, UUID owner) { } } } - if(available == null) available = Tristate.TRUE; + if (available == null) available = Tristate.TRUE; return available; } @@ -690,7 +705,7 @@ public boolean removeHandler(IHandler handler) { if (!this.handlers.values().contains(handler)) { return false; } - //FGStorageManager.getInstance().removeObject(handler); + FGStorageManagerNew.getInstance().removeObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); handlers.values().remove(handler); return true; @@ -703,7 +718,7 @@ public boolean removeRegion(IRegion region) { if (region == null) return false; if (!this.regions.values().contains(region)) return false; this.regions.values().remove(region); - //FGStorageManager.getInstance().removeObject(region); + FGStorageManagerNew.getInstance().removeObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); this.regionCache.markDirty(region, RegionCache.DirtyType.REMOVED); return true; @@ -729,27 +744,80 @@ public boolean removeWorldRegion(IWorldRegion region) { } } if (removed) { - //FGStorageManager.getInstance().removeObject(region); + FGStorageManagerNew.getInstance().removeObject(region); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); this.regionCache.markDirty(region, RegionCache.DirtyType.REMOVED); } return removed; } - public boolean rename(IFGObject object, String newName) { + public boolean move(IFGObject object, @Nullable String newName, @Nullable UUID newOwner, @Nullable World newWorld) { + boolean changed = false, nameChanged = false, ownerChanged = false, worldChanged = false; + String tryName = object.getName(); + if (newName != null && !newName.isEmpty() && isNameValid(newName)) { + changed = true; + nameChanged = true; + tryName = newName; + } + UUID tryOwner = object.getOwner(); + if (newOwner != null) { + changed = true; + ownerChanged = true; + tryOwner = newOwner; + } + World tryWorld = null; + if (object instanceof IWorldRegion && newWorld != null) { + changed = true; + worldChanged = true; + tryWorld = ((IWorldRegion) object).getWorld(); + } + if (!changed) return false; + if (object instanceof IRegion) { if (object instanceof IWorldRegion) { - IWorldRegion region = (IWorldRegion) object; - if (!isWorldRegionNameAvailable(newName, region.getWorld())) return false; + if (!this.worldRegions.containsKey(tryWorld)) return false; + if (!isWorldRegionNameAvailable(tryName, tryOwner, tryWorld)) return false; } else { - if (this.getRegion(newName).isPresent()) return false; + if (this.getRegion(tryName, tryOwner).isPresent()) return false; } } else if (object instanceof IHandler) { - if (this.getHandler(newName).isPresent()) return false; + if (this.getHandler(tryName, tryOwner).isPresent()) return false; + } + + FGStorageManagerNew.getInstance().removeObject(object); + if (nameChanged) + object.setName(newName); + if (ownerChanged || worldChanged) { + if (object instanceof IHandler) { + this.handlers.remove(object.getOwner(), object); + } else if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + this.worldRegions.get(((IWorldRegion) object).getWorld()).remove(object.getOwner(), object); + } else { + this.regions.remove(object.getOwner(), object); + } + } + if (ownerChanged) + object.setOwner(newOwner); + if (worldChanged) { + ((IWorldRegion) object).setWorld(newWorld); + } + if (object instanceof IHandler) { + this.handlers.put(object.getOwner(), (IHandler) object); + } else if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + this.worldRegions.get(((IWorldRegion) object).getWorld()).put(object.getOwner(), (IWorldRegion) object); + } else { + this.regions.put(object.getOwner(), (IRegion) object); + } + } + if (worldChanged) { + IWorldRegion region = ((IWorldRegion) object); + this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); + Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), region)); + } } - //FGStorageManager.getInstance().removeObject(object); - object.setName(newName); - //FGStorageManager.getInstance().addObject(object); + FGStorageManagerNew.getInstance().addObject(object); return true; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index c32a001..91c1a74 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -157,8 +157,8 @@ public void preInit(GamePreInitializationEvent event) { logger.info("Initializing FoxGuard manager instance"); FGManager.init(); - logger.info("Starting MCStats metrics extension"); - stats.start(); + //logger.info("Starting MCStats metrics extension"); + //stats.start(); } @Listener diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java index c436841..9c07924 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java @@ -122,7 +122,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm throw new CommandException(Text.of("There is already a region with the name \"" + parse.args[2] + "\"!")); } String oldName = region.getName(); - FGManager.getInstance().rename(region, parse.args[2]); + FGManager.getInstance().move(region, parse.args[2], null, null); source.sendMessage(Text.of(TextColors.GREEN, "Region \"" + oldName + "\" successfully renamed to \"" + parse.args[2] + "\"!")); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { if (parse.args.length < 2) throw new CommandException(Text.of("You must specify a name!")); @@ -140,10 +140,10 @@ public CommandResult process(CommandSource source, String arguments) throws Comm throw new ArgumentParseException(Text.of("New name (\"" + parse.args[2] + "\") can't start with a number!"), parse.args[2], 1); if (handler.getName().equalsIgnoreCase(parse.args[2])) throw new CommandException(Text.of("You cannot rename a handler to its own name.")); - if (FGManager.getInstance().getHandler(parse.args[2]) != null) + if (FGManager.getInstance().getHandler(parse.args[2]).isPresent()) throw new CommandException(Text.of("There is already a handler with the name \"" + parse.args[2] + "\"!")); String oldName = handler.getName(); - FGManager.getInstance().rename(handler, parse.args[2]); + FGManager.getInstance().move(handler, parse.args[2], null, null); source.sendMessage(Text.of(TextColors.GREEN, "Handler \"" + oldName + "\" successfully renamed to \"" + parse.args[2] + "\"!")); } else throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); return CommandResult.empty(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 3949991..4569c4d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -1157,7 +1157,8 @@ public List detailsSuggestions(CommandSource source, String arguments, @ public void save(Path directory) { FGStorageManagerOld storageManager = FGStorageManagerOld.getInstance(); UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { + + /*try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); @@ -1171,7 +1172,10 @@ public void save(Path directory) { List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); stringEntries.clear(); stringEntries.addAll(this.defaultPermissions.stream().map(TristateEntry::serialize).collect(Collectors.toList())); - } + }*/ + + + Path groupsDirectory = directory.resolve("groups"); storageManager.constructDirectory(groupsDirectory); for (Group group : this.groups) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java index aec8d53..d6f4073 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.misc; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.Sponge; @@ -54,6 +55,8 @@ public void accumulateContexts(Subject calculable, Set accumulator) { StringBuilder builder = new StringBuilder(); for (Iterator iterator = regions.iterator(); iterator.hasNext(); ) { IRegion region = iterator.next(); + if (region instanceof IGlobal || !region.getOwner().equals(FGManager.SERVER_UUID)) continue; + if (region instanceof IWorldRegion) { builder.append(((IWorldRegion) region).getWorld().getName()).append(":"); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index 40ca4aa..309bf8e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -60,7 +61,7 @@ public UUID getOwner() { @Override public void setOwner(UUID owner) { - this.owner = owner; + this.owner = owner == null ? FGManager.SERVER_UUID : owner; } @Override @@ -84,6 +85,13 @@ public String getFullName() { return fullName; } + @Override + public int compareTo(@NotNull IFGObject o) { + int ret = this.owner.compareTo(o.getOwner()); + if (ret != 0) return ret; + return this.name.compareToIgnoreCase(o.getName()); + } + @Override public String toString() { return "FGObjectBase{" + diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index f108957..a77b2ff 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -49,7 +49,7 @@ * and {@link IHandler Handlers}. * Essentially the core of the code, this is the most used interface. */ -public interface IFGObject extends IModifiable { +public interface IFGObject extends IModifiable, Comparable { /** * Gets the name of the object. It should be alphanumeric with limited use of special characters. diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java index 92475f7..2f5d3cd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java @@ -53,7 +53,7 @@ public String[] getAliases() { } @Override - public Optional getDisplayText(UUID owner, @Nullable CommandSource viewer) {a + public Optional getDisplayText(UUID owner, @Nullable CommandSource viewer) { return getDisplayName(owner, viewer).map(name -> Text.of(TextColors.YELLOW, name)); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java index fa6a43a..975abe1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/WorldRegionBase.java @@ -44,9 +44,7 @@ public World getWorld() { @Override public void setWorld(World world) { - if (this.world == null) { - this.world = world; - } + this.world = world; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java new file mode 100644 index 0000000..2cf3529 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java @@ -0,0 +1,90 @@ +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +import net.foxdenstudio.sponge.foxguard.plugin.FGConfigManager; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import org.mapdb.DB; +import org.mapdb.DBMaker; +import org.mapdb.Serializer; +import org.slf4j.Logger; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Created by fox on 12/6/17. + */ +public class FGSLegacyLoader { + + private static FGSLegacyLoader instance = new FGSLegacyLoader(); + private final Logger logger = FoxGuardMain.instance().getLogger(); + + public static FGSLegacyLoader getInstance() { + return instance; + } + + private FGSLegacyLoader() { + } + + public Optional> getLegacyIndex(Path file) { + if (Files.notExists(file) || Files.isDirectory(file)) return Optional.empty(); + + logger.info("Loading legacy index: " + file); + + try (DB mainDB = openFoxDB(file)) { + List ret = new ArrayList<>(); + + Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); + Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); + Map priorityMap = mainDB.exists("priority") ? + mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen() : + null; + Map linksMap = mainDB.exists("links") ? + mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen() : + null; + + mainMap.forEach((name, category) -> { + if (!typeMap.containsKey(name)) return; + String type = typeMap.get(name); + Boolean enabled = enabledMap.getOrDefault(name, true); + Integer priority = priorityMap != null ? priorityMap.getOrDefault(name, 0) : null; + List links = null; + if (linksMap != null) { + String handlerString = linksMap.getOrDefault(name, ""); + if (!handlerString.isEmpty()) { + links = new ArrayList<>(); + String[] parts = handlerString.split(","); + for (String part : parts) { + if (!part.isEmpty()) { + links.add(new FGSObjectPath(part, FGManager.SERVER_UUID)); + } + } + } + } + FGSObjectIndex index = new FGSObjectIndex(name, null, category, type, enabled, priority, links); + ret.add(index); + }); + if (ret.isEmpty()) return Optional.empty(); + else return Optional.of(ret); + } + } + + public String getIndexDBName(String catFileName) { + return catFileName + ".foxdb"; + } + + @SuppressWarnings("Duplicates") + public static DB openFoxDB(Path path) { + FGConfigManager c = FGConfigManager.getInstance(); + DBMaker.Maker maker = DBMaker.fileDB(path.normalize().toFile()); + if (!c.lockDatabaseFiles()) maker.fileLockDisable(); + if (c.useMMappedFiles()) maker.fileMmapEnableIfSupported(); + if (c.gcCleanerHack()) maker.cleanerHackEnable(); + return maker.make(); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java index 2c494ad..66449c6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import java.util.UUID; @@ -39,11 +40,12 @@ public class FGSObjectPath { transient IFGObject object; public FGSObjectPath() { + this.owner = FGManager.SERVER_UUID; } public FGSObjectPath(String name, UUID owner) { this.name = name; - this.owner = owner; + this.owner = owner == null ? FGManager.SERVER_UUID : owner; } public FGSObjectPath(IFGObject object) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 02a9c24..12363be 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -58,7 +58,9 @@ import org.spongepowered.api.world.World; import org.spongepowered.api.world.storage.WorldProperties; +import javax.annotation.Nullable; import java.io.IOException; +import java.io.Writer; import java.lang.reflect.Type; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; @@ -67,8 +69,6 @@ import java.util.*; import java.util.stream.Collectors; -import javax.annotation.Nullable; - import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; /** @@ -150,7 +150,7 @@ public void saveWorldRegionIndex(World world) { private void saveIndex(Set objects, Path file) { List indexList = new ArrayList<>(); - for (IFGObject object : objects) { + objects.stream().sorted().forEach(object -> { boolean saveLinks = (object instanceof ILinkable && ((ILinkable) object).saveLinks()); boolean autoSave = object.autoSave(); if (autoSave || saveLinks) { @@ -162,16 +162,27 @@ private void saveIndex(Set objects, Path file) { } indexList.add(index); } - } + }); - try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(file, CHARSET))) { - if (this.prettyPrint) jsonWriter.setIndent(gsonIndentString); + try (JsonWriter jsonWriter = getJsonWriter(Files.newBufferedWriter(file, CHARSET))) { gson.toJson(indexList, List.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open index for writing: " + file, e); } } + private void updateIndexFor(IFGObject object) { + if (object instanceof IHandler) { + saveHandlerIndex(); + } else if (object instanceof IRegion) { + if (object instanceof IWorldRegion) { + saveWorldRegionIndex(((IWorldRegion) object).getWorld()); + } else { + saveRegionIndex(); + } + } + } + public void saveObject(IFGObject object) { saveObject(object, false); } @@ -199,8 +210,7 @@ public void saveObject(IFGObject object, boolean force) { logger.info("Saving metadata for " + category + " " + logName); FGSObjectMeta metadata = new FGSObjectMeta(object); Path metadataFile = directory.resolve(METADATA_FILE_NAME); - try (JsonWriter jsonWriter = new JsonWriter(Files.newBufferedWriter(metadataFile, CHARSET))) { - if(this.prettyPrint) jsonWriter.setIndent(this.gsonIndentString); + try (JsonWriter jsonWriter = getJsonWriter(Files.newBufferedWriter(metadataFile, CHARSET))) { gson.toJson(metadata, FGSObjectMeta.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open metadata for writing: " + metadataFile, e); @@ -224,16 +234,60 @@ public void saveObjects(Set objects, boolean force) { objects.forEach(object -> saveObject(object, force)); } + public void addObject(IFGObject object) { + if (reentry) return; + Path directory = getObjectDirectory(object); + if (Files.exists(directory)) { + if (Files.isDirectory(directory)) { + deleteDirectory(directory, true); + } else { + logger.warn("Found file instead of directory. Deleting."); + try { + Files.delete(directory); + } catch (IOException e) { + logger.error("Unable to delete file: " + directory, e); + return; + } + } + saveObject(object); + updateIndexFor(object); + + } + } + + public void removeObject(IFGObject object) { + if (reentry) return; + Path directory = getObjectDirectory(object); + if (config.cleanupFiles()) { + if (Files.exists(directory)) { + if (Files.isDirectory(directory)) { + deleteDirectory(directory); + } else { + try { + Files.delete(directory); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + } + public void loadServer() { if (serverLoaded) return; boolean oldReentry = reentry; reentry = true; FGManager manager = FGManager.getInstance(); + FGSLegacyLoader legacyLoader = FGSLegacyLoader.getInstance(); logger.info("Loading regions"); Path regionIndexFile = getFGDirectory().resolve(FGCat.REGION.getIndexFile()); Optional> regionIndexOpt = loadIndex(regionIndexFile); + if (!regionIndexOpt.isPresent()) { + regionIndexFile = getFGDirectory().resolve(legacyLoader.getIndexDBName(FGCat.REGION.pathName)); + regionIndexOpt = legacyLoader.getLegacyIndex(regionIndexFile); + } class RegionEntry { IRegion region; FGSObjectIndex index; @@ -271,6 +325,10 @@ public RegionEntry(IRegion region, FGSObjectIndex index) { logger.info("Loading handlers"); Path handlerIndexFile = getFGDirectory().resolve(FGCat.HANDLER.getIndexFile()); Optional> handlerIndexOpt = loadIndex(handlerIndexFile); + if (!handlerIndexOpt.isPresent()) { + handlerIndexFile = getFGDirectory().resolve(legacyLoader.getIndexDBName(FGCat.HANDLER.pathName)); + handlerIndexOpt = legacyLoader.getLegacyIndex(handlerIndexFile); + } class ControllerEntry { IController controller; FGSObjectIndex index; @@ -361,10 +419,15 @@ public void loadWorld(World world) { reentry = true; FGManager manager = FGManager.getInstance(); + FGSLegacyLoader legacyLoader = FGSLegacyLoader.getInstance(); logger.info("Loading worldregions for world: " + world.getName()); Path regionIndexFile = getWorldDirectory(world).resolve(FGCat.WORLDREGION.getIndexFile()); Optional> worldRegionIndexOpt = loadIndex(regionIndexFile); + if (!worldRegionIndexOpt.isPresent()) { + regionIndexFile = getWorldDirectory(world).resolve(legacyLoader.getIndexDBName(FGCat.WORLDREGION.pathName)); + worldRegionIndexOpt = legacyLoader.getLegacyIndex(regionIndexFile); + } if (worldRegionIndexOpt.isPresent()) { List worldRegionIndex = worldRegionIndexOpt.get(); for (FGSObjectIndex index : worldRegionIndex) { @@ -417,7 +480,7 @@ public Optional> loadIndex(Path indexFile) { logger.error("Failed to open index for reading: " + indexFile, e); } } else { - logger.error("Index file does not exist: " + indexFile); + logger.warn("Index file does not exist: " + indexFile); } return Optional.ofNullable(index); } @@ -523,14 +586,25 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i return Optional.ofNullable(fgObject); } - public Gson getGson() { - return gson; + public GsonBuilder getGsonBuilder() { + GsonBuilder builder = new GsonBuilder(); + if(prettyPrint) builder.setPrettyPrinting(); + return builder; } - public String getGsonIndent(){ - return gsonIndentString; + public JsonWriter getJsonWriter(Writer out){ + JsonWriter writer = new JsonWriter(out); + if(this.prettyPrint) writer.setIndent(this.gsonIndentString); + + return writer; } + /*public String getGsonIndent() { + return gsonIndentString; + }*/ + + + private Path getFGDirectory() { if (fgDirectory != null) { constructDirectories(fgDirectory); From 13575b75fbb43f444c5ed5550a61f25315e41dda Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Sun, 17 Dec 2017 03:25:26 -0800 Subject: [PATCH 20/30] update foxcore refx --- FoxCore-Sponge | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FoxCore-Sponge b/FoxCore-Sponge index e6f9ada..ae18e8a 160000 --- a/FoxCore-Sponge +++ b/FoxCore-Sponge @@ -1 +1 @@ -Subproject commit e6f9adaf066d9af93cf579f403d22b9f7cbdc1eb +Subproject commit ae18e8ac9cd05db2f1c870e01e46f4e3e8522a40 From 6772b2f3490cd1951b66867785f9f1f020be2614 Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Tue, 20 Feb 2018 12:24:40 -0800 Subject: [PATCH 21/30] I FINALLY REMOVED THE OLD STORAGE HANDLER I AM SO HAPPY AHHHHHHHHHHHHHHHHH Me IRL right now: https://goo.gl/bCs25c --- gradle/devenv.gradle | 2 +- .../foxguard/plugin/FGStorageManagerOld.java | 1286 ----------------- .../foxguard/plugin/command/CommandHere.java | 2 +- .../plugin/controller/ControllerBase.java | 52 +- .../plugin/controller/LogicController.java | 2 +- .../controller/message/MessageController.java | 6 +- .../foxguard/plugin/handler/BasicHandler.java | 113 +- .../foxguard/plugin/handler/GroupHandler.java | 119 +- .../foxguard/plugin/handler/HandlerBase.java | 5 - .../foxguard/plugin/handler/IHandler.java | 6 +- .../plugin/handler/util/PermissionEntry.java | 81 ++ .../plugin/handler/util/TristateEntry.java | 78 + .../plugin/listener/BlockChangeListener.java | 2 +- .../plugin/listener/DamageListener.java | 2 +- .../plugin/listener/ExplosionListener.java | 2 +- .../listener/InteractBlockListener.java | 2 +- .../listener/InteractEntityListener.java | 2 +- .../plugin/listener/PlayerMoveListener.java | 5 +- .../listener/PlayerMoveListenerNew.java | 11 +- .../plugin/listener/SpawnEntityListener.java | 2 +- .../foxguard/plugin/object/FGObjectBase.java | 7 - .../foxguard/plugin/object/IFGObject.java | 9 +- .../plugin/storage/FGStorageManagerNew.java | 4 +- 23 files changed, 396 insertions(+), 1404 deletions(-) delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java diff --git a/gradle/devenv.gradle b/gradle/devenv.gradle index d585292..a3fafee 100644 --- a/gradle/devenv.gradle +++ b/gradle/devenv.gradle @@ -1,3 +1,3 @@ -gradle.ext.isDevEnv = false +gradle.ext.isDevEnv = true gradle.ext.foxCorePath = 'FoxCore-Sponge' diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java deleted file mode 100644 index 373ba40..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGStorageManagerOld.java +++ /dev/null @@ -1,1286 +0,0 @@ -/* - * This file is part of FoxGuard, licensed under the MIT License (MIT). - * - * Copyright (c) gravityfox - https://gravityfox.net/ - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package net.foxdenstudio.sponge.foxguard.plugin; - -import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; -import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; -import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; -import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; -import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; -import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; -import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; -import org.mapdb.*; -import org.slf4j.Logger; -import org.spongepowered.api.Sponge; -import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.service.user.UserStorageService; -import org.spongepowered.api.world.World; - -import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; - -import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; - -/** - * Created by Fox on 4/6/2016. - */ -public final class FGStorageManagerOld { - - public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", - "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", - "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; - private static FGStorageManagerOld instance; - private final HashMap defaultModifiedMap; - private final UserStorageService userStorageService; - private final Logger logger = FoxGuardMain.instance().getLogger(); - private final Set loaded = new HashSet<>(); - private final Path directory = getDirectory(); - private final Map worldDirectories; - - private FGStorageManagerOld() { - userStorageService = FoxGuardMain.instance().getUserStorage(); - defaultModifiedMap = new CacheMap<>((k, m) -> { - if (k instanceof IFGObject) { - m.put((IFGObject) k, true); - return true; - } else return null; - }); - worldDirectories = new CacheMap<>((k, m) -> { - if (k instanceof String) { - Path dir = getWorldDirectory((String) k); - m.put((String) k, dir); - return dir; - } else return null; - }); - } - - public static FGStorageManagerOld getInstance() { - if (instance == null) instance = new FGStorageManagerOld(); - return instance; - } - - public static DB openFoxDB(Path path) { - FGConfigManager c = FGConfigManager.getInstance(); - DBMaker.Maker maker = DBMaker.fileDB(path.normalize().toFile()); - if (!c.lockDatabaseFiles()) maker.fileLockDisable(); - if (c.useMMappedFiles()) maker.fileMmapEnableIfSupported(); - if (c.gcCleanerHack()) maker.cleanerHackEnable(); - return maker.make(); - } - - private static String serializeHandlerList(Collection handlers) { - StringBuilder builder = new StringBuilder(); - for (Iterator it = handlers.iterator(); it.hasNext(); ) { - builder.append(it.next().getName()); - if (it.hasNext()) builder.append(","); - } - return builder.toString(); - } - - public void saveRegions() { - saveRegions(false); - } - - public synchronized void saveRegions(boolean force) { - logger.info("Saving regions" + (force ? " (forced save)" : "")); - Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - mainMap.clear(); - linksMap.clear(); - - Path serverDir = directory.resolve("regions"); - constructDirectory(serverDir); - FGManager.getInstance().getRegions().forEach(fgObject -> { - String name = fgObject.getName(); - UUID owner = fgObject.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; - if (fgObject.autoSave()) { - Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving region " + logName + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving region " + logName + "!", e); - } - - logger.info("Saving metadata for region " + logName); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaOwner.set(owner); - metaEnabled.set(fgObject.isEnabled()); - } - } else { - logger.info("Region " + logName + " is already up to date. Skipping..."); - } - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - ownerMap.put(name, owner); - enabledMap.put(name, fgObject.isEnabled()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("Region " + logName + " does not need saving. Skipping..."); - } - if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getLinks())); - } else { - logger.info("Region " + logName + " does not need its links saved. Skipping..."); - } - }); - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveRegions(force); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public void saveWorldRegions(World world) { - saveWorldRegions(world, false); - } - - public synchronized void saveWorldRegions(World world, boolean force) { - logger.info("Saving world regions in world " + world.getName() + (force ? " (forced save)" : "")); - Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - mainMap.clear(); - linksMap.clear(); - - Path serverDir = worldDirectories.get(world.getName()).resolve("wregions"); - constructDirectory(serverDir); - FGManager.getInstance().getWorldRegions(world).forEach(fgObject -> { - String name = fgObject.getName(); - UUID owner = fgObject.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; - if (fgObject.autoSave()) { - Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving world region " + logName + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving world region " + logName + " in world " + world.getName() + "!", e); - } - - logger.info("Saving metadata for world region " + logName); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaOwner.set(owner); - metaEnabled.set(fgObject.isEnabled()); - } - } else { - logger.info("Region " + logName + " is already up to date. Skipping..."); - } - - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - ownerMap.put(name, owner); - enabledMap.put(name, fgObject.isEnabled()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("World region " + logName + " does not need saving. Skipping..."); - } - if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getLinks())); - } else { - logger.info("World region " + logName + " does not need its links saved. Skipping..."); - } - }); - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveWorldRegions(world, force); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public void saveHandlers() { - saveHandlers(false); - } - - public synchronized void saveHandlers(boolean force) { - logger.info("Saving handlers" + (force ? " (forced save)" : "")); - Path dbFile = directory.resolve("handlers.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map priorityMap = mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen(); - - mainMap.clear(); - - Path serverDir = directory.resolve("handlers"); - constructDirectory(serverDir); - FGManager.getInstance().getHandlers().forEach(fgObject -> { - String name = fgObject.getName(); - UUID owner = fgObject.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; - if (fgObject.autoSave()) { - Path singleDir = serverDir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving handler " + logName + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving handler " + logName + "!", e); - } - - logger.info("Saving metadata for handler " + logName); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - Atomic.Integer metaPriority = metaDB.atomicInteger("priority").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaOwner.set(owner); - metaEnabled.set(fgObject.isEnabled()); - metaPriority.set(fgObject.getPriority()); - } - } else { - logger.info("Region " + logName + " is already up to date. Skipping..."); - } - - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - ownerMap.put(name, owner); - enabledMap.put(name, fgObject.isEnabled()); - priorityMap.put(name, fgObject.getPriority()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("Handler " + logName + " does not need saving. Skipping..."); - } - }); - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveHandlers(force); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public void saveRegion(IRegion fgObject) { - saveRegion(fgObject, false); - } - - public synchronized void saveRegion(IRegion fgObject, boolean force) { - if (fgObject instanceof IWorldRegion) saveWorldRegion((IWorldRegion) fgObject, force); - else { - Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - Path serverDir = directory.resolve("regions"); - constructDirectory(serverDir); - String name = fgObject.getName(); - UUID owner = fgObject.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; - if (fgObject.autoSave()) { - Path singleDir = isOwned ? serverDir.resolve("users").resolve(owner.toString()) : serverDir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving region " + logName + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving region " + logName + "!", e); - } - - logger.info("Saving metadata for region " + logName); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaOwner.set(owner); - metaEnabled.set(fgObject.isEnabled()); - } - } else { - logger.info("Region " + logName + " is already up to date. Skipping..."); - } - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - ownerMap.put(name, owner); - enabledMap.put(name, fgObject.isEnabled()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("Region " + logName + " does not need saving. Skipping..."); - } - if (fgObject.saveLinks()) { - linksMap.put(name, serializeHandlerList(fgObject.getLinks())); - } else { - logger.info("Region " + logName + " does not need its links saved. Skipping..."); - } - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveRegions(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - } - - public void saveWorldRegion(IWorldRegion fgObject) { - saveWorldRegion(fgObject, false); - } - - public synchronized void saveWorldRegion(IWorldRegion fgObject, boolean force) { - World world = fgObject.getWorld(); - Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map ownerMap = mainDB.hashMap("owners", Serializer.STRING, Serializer.UUID).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - Path serverDir = worldDirectories.get(world.getName()).resolve("wregions"); - constructDirectory(serverDir); - String name = fgObject.getName(); - UUID owner = fgObject.getOwner(); - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = userStorageService.get(owner); - String logName = (userOwner.isPresent() ? userOwner.get().getName() + ":" : "") + (isOwned ? owner + ":" : "") + name; - if (fgObject.autoSave()) { - Path singleDir = serverDir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving world region " + logName + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving world region " + logName + " in world " + world.getName() + "!", e); - } - - logger.info("Saving metadata for world region " + logName); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Var metaOwner = metaDB.atomicVar("owner", Serializer.UUID).createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaOwner.set(owner); - metaEnabled.set(fgObject.isEnabled()); - } - } else { - logger.info("Region " + name + " is already up to date. Skipping..."); - } - - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - ownerMap.put(name, owner); - enabledMap.put(name, fgObject.isEnabled()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("World region " + logName + " does not need saving. Skipping..."); - } - if (fgObject.saveLinks()) { - logger.info("Saving links for world region " + logName + ""); - linksMap.put(name, serializeHandlerList(fgObject.getLinks())); - } else { - logger.info("World region " + logName + " does not need its links saved. Skipping..."); - } - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveWorldRegions(fgObject.getWorld()); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public void saveHandler(IHandler fgObject) { - saveHandler(fgObject, false); - } - - public synchronized void saveHandler(IHandler fgObject, boolean force) { - Path dbFile = directory.resolve("handlers.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map priorityMap = mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen(); - - Path dir = directory.resolve("handlers"); - constructDirectory(dir); - if (fgObject.autoSave()) { - String name = fgObject.getName(); - Path singleDir = dir.resolve(name.toLowerCase()); - boolean shouldSave = fgObject.shouldSave(); - if (force || shouldSave) { - logger.info((shouldSave ? "S" : "Force s") + "aving handler " + name + " in directory: " + singleDir); - constructDirectory(singleDir); - try { - fgObject.save(singleDir); - } catch (Exception e) { - logger.error("There was an error while saving handler " + name + "!", e); - } - - logger.info("Saving metadata for handler " + name); - try (DB metaDB = openFoxDB(singleDir.resolve("metadata.foxdb"))) { - Atomic.String metaName = metaDB.atomicString("name").createOrOpen(); - Atomic.String metaCategory = metaDB.atomicString("category").createOrOpen(); - Atomic.String metaType = metaDB.atomicString("type").createOrOpen(); - Atomic.Boolean metaEnabled = metaDB.atomicBoolean("enabled").createOrOpen(); - Atomic.Integer metaPriority = metaDB.atomicInteger("priority").createOrOpen(); - metaName.set(name); - metaCategory.set(FGUtil.getCategory(fgObject)); - metaType.set(fgObject.getUniqueTypeString()); - metaEnabled.set(fgObject.isEnabled()); - metaPriority.set(fgObject.getPriority()); - } - } else { - logger.info("Region \"" + name + "\" is already up to date. Skipping..."); - } - - mainMap.put(name, FGUtil.getCategory(fgObject)); - typeMap.put(name, fgObject.getUniqueTypeString()); - enabledMap.put(name, fgObject.isEnabled()); - priorityMap.put(name, fgObject.getPriority()); - - defaultModifiedMap.put(fgObject, false); - } else { - logger.info("Handler " + fgObject.getName() + " does not need saving. Skipping..."); - } - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file and trying again"); - Files.deleteIfExists(dbFile); - saveHandlers(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public synchronized void removeRegion(IRegion fgObject) { - if (fgObject instanceof IWorldRegion) removeWorldRegion((IWorldRegion) fgObject); - else try (DB mainDB = openFoxDB(directory.resolve("regions.foxdb"))) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - mainMap.remove(fgObject.getName()); - typeMap.remove(fgObject.getName()); - enabledMap.remove(fgObject.getName()); - linksMap.remove(fgObject.getName()); - } catch (DBException.DataCorruption e) { - try { - Files.deleteIfExists(directory.resolve("regions.foxdb")); - saveRegions(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - if (FGConfigManager.getInstance().cleanupFiles()) { - Path singleDir = new LoadEntry(fgObject).getPath(); - if (Files.exists(singleDir)) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - - public synchronized void removeWorldRegion(IWorldRegion fgObject) { - try (DB mainDB = openFoxDB(worldDirectories.get(fgObject.getWorld().getName()).resolve("wregions.foxdb"))) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - - mainMap.remove(fgObject.getName()); - typeMap.remove(fgObject.getName()); - enabledMap.remove(fgObject.getName()); - linksMap.remove(fgObject.getName()); - } catch (DBException.DataCorruption e) { - try { - Files.deleteIfExists(directory.resolve("wregions.foxdb")); - saveWorldRegions(fgObject.getWorld()); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - if (FGConfigManager.getInstance().cleanupFiles()) { - Path singleDir = new LoadEntry(fgObject).getPath(); - if (Files.exists(singleDir)) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - - public synchronized void removeHandler(IHandler fgObject) { - try (DB mainDB = openFoxDB(directory.resolve("handlers.foxdb"))) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map priorityMap = mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen(); - - mainMap.remove(fgObject.getName()); - typeMap.remove(fgObject.getName()); - enabledMap.remove(fgObject.getName()); - priorityMap.remove(fgObject.getName()); - } catch (DBException.DataCorruption e) { - try { - Files.deleteIfExists(directory.resolve("handlers.foxdb")); - saveHandlers(); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - if (FGConfigManager.getInstance().cleanupFiles()) { - Path singleDir = new LoadEntry(fgObject).getPath(); - if (Files.exists(singleDir)) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - - public synchronized void loadRegions() { - Path dbFile = directory.resolve("regions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - - Path dir = directory.resolve("regions"); - mainMap.entrySet().forEach((entry) -> { - String name = entry.getKey(); - Path singleDir = dir.resolve(name.toLowerCase()); - Path metaDataFile = singleDir.resolve("metadata.foxdb"); - logger.info("Loading region \"" + name + "\" from " + singleDir); - if (Files.exists(metaDataFile) && !Files.isDirectory(metaDataFile)) { - String category; - String type; - Boolean enabled; - try (DB metaDB = openFoxDB(metaDataFile)) { - category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); - type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); - enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); - } - logger.info("Region info loaded! Name: \"" + name + - "\", Category: \"" + category + - "\", Type: \"" + type + - "\", Enabled: " + enabled); - if (name.equalsIgnoreCase(GlobalRegion.NAME)) { - logger.info("Global region found! Skipping..."); - return; - } - if (!FGManager.getInstance().isRegionNameAvailable(name)) { - logger.error("Name conflict detected! \"" + name + "\" is already in use! A world region is likely already using that name."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - if (category == null) category = ""; - if (type == null) type = ""; - IRegion object = null; - try { - if (category.equalsIgnoreCase("region")) - object = FGFactoryManager.getInstance().createRegion(singleDir,type, new FGObjectData().setName(name).setEnabled(enabled)); - else logger.warn("Category \"" + category + "\" is invalid!"); - } catch (Exception e) { - logger.error("There was an error creating the region!", e); - } - if (object != null) { - loaded.add(new LoadEntry(object)); - FGManager.getInstance().addRegion(object); - logger.info("Successfully created and added region \"" + name + "\"!"); - } else { - logger.warn("A region was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } else { - logger.warn("Metadata file not found! Skipping..."); - if (Files.exists(singleDir)) { - if (isEmptyDirectory(singleDir)) { - logger.warn("Empty region directory found. Deleting..."); - try { - Files.delete(singleDir); - } catch (IOException e) { - logger.error("There was an error deleting the region directory: " + singleDir, e); - } - } else { - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - } - }); - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file"); - Files.deleteIfExists(dbFile); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public synchronized void loadWorldRegions(World world) { - Path dbFile = worldDirectories.get(world.getName()).resolve("wregions.foxdb").normalize(); - try (DB mainDB = openFoxDB(dbFile)) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - - Path dir = worldDirectories.get(world.getName()).resolve("wregions"); - mainMap.entrySet().forEach((entry) -> { - String name = entry.getKey(); - Path singleDir = dir.resolve(name.toLowerCase()); - Path metaDataFile = singleDir.resolve("metadata.foxdb"); - logger.info("Loading world region \"" + name + "\" from " + singleDir); - if (Files.exists(metaDataFile) && !Files.isDirectory(metaDataFile)) { - String category; - String type; - Boolean enabled; - try (DB metaDB = openFoxDB(metaDataFile)) { - category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); - type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); - enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); - } - logger.info("World region info loaded! Name: \"" + name + - "\", Category: \"" + category + - "\", Type: \"" + type + - "\", Enabled: " + enabled); - if (category == null) category = ""; - if (type == null) type = ""; - if (name.equalsIgnoreCase(GlobalWorldRegion.NAME) || type.equals(GlobalWorldRegion.TYPE)) { - logger.info("Global world region found! Skipping..."); - return; - } - if (!FGManager.getInstance().isWorldRegionNameAvailable(name, world)) { - logger.error("Name conflict detected! \"" + name + "\" is already in use! A super region is likely already using that name."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - IWorldRegion object = null; - try { - if (category.equalsIgnoreCase("worldregion")) - object = FGFactoryManager.getInstance().createWorldRegion(singleDir, type, new FGObjectData().setName(name).setEnabled(enabled)); - else logger.warn("Category \"" + category + "\" is invalid!"); - } catch (Exception e) { - logger.error("There was an error creating the world region!", e); - } - if (object != null) { - loaded.add(new LoadEntry(object, world.getName())); - FGManager.getInstance().addWorldRegion(object, world); - logger.info("Successfully created and added world region \"" + name + "\"!"); - } else { - logger.warn("A world region was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } else { - logger.warn("Metadata file not found! Skipping..."); - if (Files.exists(singleDir)) { - if (isEmptyDirectory(singleDir)) { - logger.warn("Empty world region directory found. Deleting..."); - try { - Files.delete(singleDir); - } catch (IOException e) { - logger.error("There was an error deleting the world region directory: " + singleDir, e); - } - } else { - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - } - }); - } catch (DBException.DataCorruption e) { - try { - FoxGuardMain.instance().getLogger().error("Database file \"" + dbFile + "\" appears to be corrupted:", e); - FoxGuardMain.instance().getLogger().error("Deleting the database file"); - Files.deleteIfExists(dbFile); - } catch (IOException e1) { - e1.printStackTrace(); - } - } - } - - public synchronized void loadHandlers() { - try (DB mainDB = openFoxDB(directory.resolve("handlers.foxdb"))) { - Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); - Map enabledMap = mainDB.hashMap("enabled", Serializer.STRING, Serializer.BOOLEAN).createOrOpen(); - Map priorityMap = mainDB.hashMap("priority", Serializer.STRING, Serializer.INTEGER).createOrOpen(); - - Path dir = directory.resolve("handlers"); - mainMap.entrySet().forEach((entry) -> { - String name = entry.getKey(); - Path singleDir = dir.resolve(name.toLowerCase()); - Path metaDataFile = singleDir.resolve("metadata.foxdb"); - logger.info("Loading handler \"" + name + "\" from " + singleDir); - if (Files.exists(metaDataFile) && !Files.isDirectory(metaDataFile)) { - String category; - String type; - Boolean enabled; - Integer priority; - try (DB metaDB = openFoxDB(metaDataFile)) { - category = metaDB.exists("category") ? metaDB.atomicString("category").createOrOpen().get() : entry.getValue(); - type = metaDB.exists("type") ? metaDB.atomicString("type").createOrOpen().get() : typeMap.get(name); - enabled = metaDB.exists("enabled") ? metaDB.atomicBoolean("enabled").createOrOpen().get() : enabledMap.get(name); - priority = metaDB.exists("priority") ? metaDB.atomicInteger("priority").createOrOpen().get() : priorityMap.get(name); - } - logger.info("Handler info loaded! Name: \"" + name + - "\", Category: \"" + category + - "\", Type: \"" + type + - "\", Enabled: " + enabled + - ", Priority: " + priority); - if (name.equalsIgnoreCase(GlobalHandler.NAME)) { - logger.info("Global handler found! Skipping..."); - return; - } - if (category == null) category = ""; - if (type == null) type = ""; - IHandler object = null; - try { - final HandlerData data = new HandlerData().setName(name).setEnabled(enabled).setPriority(priority); - if (category.equalsIgnoreCase("handler")) - object = FGFactoryManager.getInstance().createHandler(singleDir, type, data); - else if (category.equalsIgnoreCase("controller")) - object = FGFactoryManager.getInstance().createController(singleDir, type, data); - else logger.warn("Category \"" + category + "\" is invalid!"); - } catch (Exception e) { - logger.error("There was an error creating the handler!", e); - } - if (object != null) { - loaded.add(new LoadEntry(object)); - FGManager.getInstance().addHandler(object); - logger.info("Successfully created and added handler \"" + name + "\"!"); - } else { - logger.warn("A handler was unable to be created. Either the metadata is incorrect, or there is no longer a factory available to create it."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } else { - if (name.equalsIgnoreCase(GlobalHandler.NAME)) { - logger.info("Global handler found! Skipping..."); - return; - } - logger.warn("Metadata file not found! Skipping..."); - if (Files.exists(singleDir)) { - if (isEmptyDirectory(singleDir)) { - logger.warn("Empty handler directory found. Deleting..."); - try { - Files.delete(singleDir); - } catch (IOException e) { - logger.error("There was an error deleting the handler directory: " + singleDir, e); - } - } else { - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - gcCleanup(); - deleteDirectory(singleDir); - } - } - } - } - }); - } - } - - public synchronized void loadGlobalHandler() { - Path path; - constructDirectory(path = directory.resolve("handlers")); - constructDirectory(path = path.resolve(GlobalHandler.NAME.toLowerCase())); - FGManager.getInstance().getGlobalHandler().load(path); - } - - public void loadLinks() { - loadRegionLinks(); - Sponge.getServer().getWorlds().forEach(this::loadWorldRegionLinks); - loadControllerLinks(); - } - - public synchronized void loadRegionLinks() { - logger.info("Loading region links"); - try (DB mainDB = openFoxDB(directory.resolve("regions.foxdb"))) { - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - linksMap.entrySet().forEach(entry -> { - Optional regionOpt = FGManager.getInstance().getRegion(entry.getKey()); - if (regionOpt.isPresent()) { - IRegion region = regionOpt.get(); - logger.info("Loading links for region \"" + region.getName() + "\""); - String handlersString = entry.getValue(); - if (handlersString != null && !handlersString.isEmpty()) { - String[] handlersNames = handlersString.split(","); - Arrays.stream(handlersNames).forEach(handlerName -> { - Optional handlerOpt = FGManager.getInstance().getHandler(handlerName); - if (handlerOpt.isPresent()) { - IHandler handler = handlerOpt.get(); - if (FGManager.getInstance().link(region, handler)) { - logger.info("Linked region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); - } else { - logger.warn("Failed to link region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\" for some reason!"); - } - } else { - logger.error("Unable to link region \"" + region.getName() + "\" to handler \"" + handlerName + "\" because that handler doesn't exist!"); - } - }); - } else { - logger.info("No links to load for region \"" + region.getName() + "\"!"); - } - } else { - logger.error("Unable to load links for region \"" + entry.getKey() + "\" because that region does not exist!"); - } - }); - } - } - - public synchronized void loadWorldRegionLinks(World world) { - logger.info("Loading world region links for world \"" + world.getName() + "\""); - try (DB mainDB = openFoxDB(worldDirectories.get(world.getName()).resolve("wregions.foxdb"))) { - Map linksMap = mainDB.hashMap("links", Serializer.STRING, Serializer.STRING).createOrOpen(); - linksMap.entrySet().forEach(entry -> { - Optional regionOpt = FGManager.getInstance().getWorldRegion(world, entry.getKey()); - if (regionOpt.isPresent()) { - IWorldRegion region = regionOpt.get(); - logger.info("Loading links for world region \"" + region.getName() + "\""); - String handlersString = entry.getValue(); - if (handlersString != null && !handlersString.isEmpty()) { - String[] handlersNames = handlersString.split(","); - Arrays.stream(handlersNames).forEach(handlerName -> { - Optional handlerOpt = FGManager.getInstance().getHandler(handlerName); - if (handlerOpt.isPresent()) { - IHandler handler = handlerOpt.get(); - if (FGManager.getInstance().link(region, handler)) { - logger.info("Linked world region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\""); - } else { - logger.warn("Failed to link world region \"" + region.getName() + "\" to handler \"" + handler.getName() + "\" for some reason!"); - } - } else { - logger.error("Unable to link world region \"" + region.getName() + "\" to handler \"" + handlerName + "\" because that handler doesn't exist!"); - } - }); - } else { - logger.info("No links to load for world region \"" + region.getName() + "\"!"); - } - } else { - logger.error("Unable to load links for world region \"" + entry.getKey() + "\" because that world region does not exist!"); - } - }); - } - } - - public synchronized void loadControllerLinks() { - logger.info("Loading controller links"); - Path dir = directory.resolve("handlers"); - for (IController controller : FGManager.getInstance().getControllers()) { - logger.info("Loading links for controller \"" + controller.getName() + "\""); - controller.loadLinks(dir.resolve(controller.getName().toLowerCase()), null); - } - } - - public synchronized void addObject(IFGObject object) { - LoadEntry entry = new LoadEntry(object); - if (!loaded.contains(entry)) { - Path singleDirectory = entry.getPath(); - if (Files.exists(singleDirectory)) { - logger.info("Deleting directory \"" + singleDirectory + "\" to make room for new data."); - gcCleanup(); - deleteDirectory(singleDirectory, true); - } - loaded.add(entry); - if (object instanceof IRegion) { - if (object instanceof IWorldRegion) { - this.saveWorldRegion((IWorldRegion) object, true); - } else { - this.saveRegion((IRegion) object, true); - } - } else if (object instanceof IHandler) { - this.saveHandler((IHandler) object, true); - } - } - } - - public void removeObject(IFGObject object) { - if (object instanceof IRegion) { - if (object instanceof IWorldRegion) { - this.removeWorldRegion((IWorldRegion) object); - } else { - this.removeRegion((IRegion) object); - } - } else if (object instanceof IHandler) { - this.removeHandler((IHandler) object); - } - } - - public void constructDirectory(Path directory) { - if (!Files.exists(directory)) { - try { - int counter = 1; - while (true) { - try { - Files.createDirectory(directory); - break; - } catch (AccessDeniedException e) { - if (counter > 5) throw e; - else { - logger.error("Unable to create directory: " + directory + " Trying again in " + counter + " second(s)"); - try { - Thread.sleep(1000 * counter); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - } - } - counter++; - } - logger.info("Created directory: " + directory); - } catch (IOException e) { - logger.error("There was an error creating the directory: " + directory, e); - } - } else if (!Files.isDirectory(directory)) { - logger.warn("There is a file at " + directory + " where a directory was expected. Deleting and replacing with a directory..."); - try { - Files.delete(directory); - try { - int counter = 1; - while (true) { - try { - Files.createDirectory(directory); - break; - } catch (AccessDeniedException e) { - if (counter > 5) throw e; - else { - logger.error("Unable to create directory: " + directory + " Trying again in " + counter + " second(s)"); - try { - Thread.sleep(1000 * counter); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } - } - } - counter++; - } - logger.info("Created directory: " + directory); - } catch (IOException e) { - logger.error("Error creating the directory: " + directory, e); - } - } catch (IOException e) { - logger.error("Error deleting the file: " + directory, e); - } - } - } - - private Path getDirectory() { - Path path = Sponge.getGame().getSavesDirectory(); - if (FGConfigManager.getInstance().saveInWorldFolder()) { - path = path.resolve(Sponge.getServer().getDefaultWorldName()); - } else if (FGConfigManager.getInstance().useConfigFolder()) { - path = FoxGuardMain.instance().getConfigDirectory(); - } - path = path.resolve("foxguard"); - constructDirectory(path); - return path; - } - - private Path getWorldDirectory(String world) { - Path path = Sponge.getGame().getSavesDirectory(); - if (FGConfigManager.getInstance().saveWorldRegionsInWorldFolders()) { - path = path.resolve(Sponge.getServer().getDefaultWorldName()); - if (!Sponge.getServer().getDefaultWorld().get().getWorldName().equalsIgnoreCase(world)) { - path = path.resolve(world); - } - path = path.resolve("foxguard"); - } else { - if (FGConfigManager.getInstance().useConfigFolder()) { - path = FoxGuardMain.instance().getConfigDirectory(); - } - path = path.resolve("foxguard").resolve("worlds").resolve(world); - } - constructDirectory(path); - return path; - } - - private void deleteDirectory(Path directory) { - deleteDirectory(directory, false); - } - - private void deleteDirectory(Path directory, boolean innerOnly) { - FoxGuardMain.instance().getLogger().info("Deleting directory: " + directory); - if (Files.exists(directory) && Files.isDirectory(directory)) - try { - Files.walkFileTree(directory, new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - try { - Files.delete(file); - logger.info("Deleted file: " + file); - } catch (IOException e) { - logger.error("There was an error deleting the file: " + file, e); - } - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - if (exc == null && (!innerOnly || !Files.isSameFile(dir, directory))) { - try { - Files.delete(dir); - logger.info("Deleted directory: " + dir); - } catch (IOException e) { - logger.error("There was an error deleting the directory: " + dir, e); - } - } - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - logger.error("There was an error while trying to recursively delete the directory: " + directory, e); - } - else if (Files.exists(directory)) { - logger.warn(directory + "is a file. A directory was expected. Deleting..."); - try { - Files.delete(directory); - } catch (IOException e) { - logger.error("There was an error deleting the file: " + directory, e); - } - } - } - - private boolean isEmptyDirectory(Path directory) { - if (!Files.exists(directory)) return true; - if (!Files.isDirectory(directory)) return false; - try { - DirectoryStream stream = Files.newDirectoryStream(directory); - return !stream.iterator().hasNext(); - } catch (IOException e) { - logger.error("Could not read contents of directory: " + directory, e); - return false; - } - } - - private void gcCleanup() { - if (FGConfigManager.getInstance().gcAndFinalize()) { - System.gc(); - System.runFinalization(); - } - } - - public enum Type { - REGION, WREGION, HANDLER - } - - private final class LoadEntry { - public final String name; - public final Type type; - public final String world; - - public LoadEntry(String name, Type type, String world) { - this.name = name; - this.type = type; - this.world = world; - } - - public LoadEntry(IFGObject object) { - name = object.getName(); - if (object instanceof IWorldRegion) { - type = Type.WREGION; - world = ((IWorldRegion) object).getWorld().getName(); - } else if (object instanceof IRegion) { - type = Type.REGION; - world = ""; - } else if (object instanceof IHandler) { - type = Type.HANDLER; - world = ""; - } else throw new IllegalArgumentException("Object is not of a valid subtype!"); - } - - public LoadEntry(IFGObject object, String altWorld) { - name = object.getName(); - if (object instanceof IWorldRegion) { - type = Type.WREGION; - world = altWorld; - } else if (object instanceof IRegion) { - type = Type.REGION; - world = ""; - } else if (object instanceof IHandler) { - type = Type.HANDLER; - world = ""; - } else throw new IllegalArgumentException("Object is not of a valid subtype!"); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - LoadEntry entry = (LoadEntry) o; - - if (name != null ? !name.equals(entry.name) : entry.name != null) return false; - if (type != entry.type) return false; - return world != null ? world.equals(entry.world) : entry.world == null; - - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + (type != null ? type.hashCode() : 0); - result = 31 * result + (world != null ? world.hashCode() : 0); - return result; - } - - public Path getPath() { - Path singleDirectory; - switch (this.type) { - case REGION: - singleDirectory = directory.resolve("regions"); - break; - case WREGION: - singleDirectory = worldDirectories.get(this.world).resolve("wregions"); - break; - case HANDLER: - singleDirectory = directory.resolve("handlers"); - break; - default: - singleDirectory = null; - break; - } - return singleDirectory.resolve(this.name.toLowerCase()); - } - } -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 18aec7f..687ec56 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -177,7 +177,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } output.append(Text.of(TextColors.GREEN, "------- Handlers Located Here -------\n")); if (parse.flags.containsKey("priority")) { - handlerList.sort((o1, o2) -> o2.getPriority() - o1.getPriority()); + handlerList.sort(IHandler.PRIORITY); hudConfig.priority = true; } else { handlerList.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java index 0e2c1b4..302b036 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/ControllerBase.java @@ -27,70 +27,68 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerBase; import net.foxdenstudio.sponge.foxguard.plugin.handler.HandlerData; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import org.mapdb.DB; -import org.mapdb.Serializer; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Optional; public abstract class ControllerBase extends HandlerBase implements IController { - protected final List handlers; + protected final List links; public ControllerBase(HandlerData data) { super(data); - this.handlers = new ArrayList<>(); + this.links = new ArrayList<>(); } @Override public List getLinks() { - return ImmutableList.copyOf(this.handlers); + return ImmutableList.copyOf(this.links); } @Override public boolean addLink(IHandler handler) { if (!FGManager.getInstance().isRegistered(handler)) return false; int maxLinks = this.maxLinks(); - return !(maxLinks >= 0 && this.handlers.size() >= maxLinks) && this.handlers.add(handler); + return !(maxLinks >= 0 && this.links.size() >= maxLinks) && this.links.add(handler); } @Override public boolean removeLink(IHandler handler) { - return this.handlers.remove(handler); + return this.links.remove(handler); } @Override public void clearLinks() { - this.handlers.clear(); + this.links.clear(); } + /** + * Called when links are to be loaded. The new FoxGuard storage manager stores and loads links for you, but + * + * @param directory + * @param savedList + */ @Override public void loadLinks(Path directory, List savedList) { - try (DB linksDB = FGStorageManagerOld.openFoxDB(directory.resolve("links.foxdb"))) { - List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); - handlers.clear(); - linksList.stream() - .filter(name -> !this.name.equalsIgnoreCase(name)) - .map(name -> FGManager.getInstance().getHandler(name)) - .filter(Optional::isPresent) - .map(Optional::get) - .forEach(handlers::add); - - } + links.clear(); + links.addAll(savedList); } + /** + * Stub method for controllers to put custom link saving code. This way, subclasses have something to call to save only links. + * I'm not sure why this is useful, if it's useful at all. I might end up removing it, or redoing controller save code entirely, + * cause array based serialization makes much less sense for controllers than regions. + *

+ * so actually, while i'm at it: + * TODO do something like map or arbitrary tree based serialization instea for controllers in a way that foxguard storage understands. + * + * @param directory the save directory of the controller + */ protected void saveLinks(Path directory) { - try (DB linksDB = FGStorageManagerOld.openFoxDB(directory.resolve("links.foxdb"))) { - List linksList = linksDB.indexTreeList("links", Serializer.STRING).createOrOpen(); - linksList.clear(); - handlers.stream().map(IFGObject::getName).forEach(linksList::add); - } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java index 5b7afe1..3964916 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/LogicController.java @@ -91,7 +91,7 @@ public LogicController(HandlerData data, Operator operator, Tristate mode, boole @Override public EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra) { - return EventResult.of(operator.operate(this.handlers, mode, shortCircuit, user, flags, extra)); + return EventResult.of(operator.operate(this.links, mode, shortCircuit, user, flags, extra)); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java index 76bc5d5..b735185 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/message/MessageController.java @@ -105,7 +105,7 @@ public int maxLinks() { @Override public boolean addLink(IHandler handler) { - if (this.handlers.size() < 1) { + if (this.links.size() < 1) { slot = new HandlerWrapper(handler); return super.addLink(handler); } else return false; @@ -124,8 +124,8 @@ public void clearLinks() { } public IHandler getHandler() { - if (this.handlers.size() == 0) return null; - else return this.handlers.get(0); + if (this.links.size() == 0) return null; + else return this.links.get(0); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index 4569c4d..5c6f52c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -27,6 +27,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; @@ -34,7 +39,6 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; @@ -43,6 +47,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.util.TristateEntry; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGSLegacyLoader; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.foxdenstudio.sponge.foxguard.plugin.util.EverythingSet; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; @@ -52,6 +57,7 @@ import ninja.leaping.configurate.loader.ConfigurationLoader; import org.mapdb.DB; import org.mapdb.Serializer; +import org.slf4j.Logger; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -70,6 +76,7 @@ import javax.annotation.Nullable; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -108,7 +115,7 @@ public class BasicHandler extends HandlerBase { private Group passiveGroup; private Map passiveGroupCacheRef; - public BasicHandler(String name){ + public BasicHandler(String name) { this(new HandlerData() .setName(name) .setEnabled(true) @@ -1065,7 +1072,7 @@ public Text details(CommandSource source, String arguments) { if (this.passiveSetting == PassiveSetting.GROUP) passiveBuilder.append(Text.of(passiveGroup.color, passiveGroup.displayName)); passiveBuilder - .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName()+ " passive ")) + .onClick(TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " passive ")) .onHover(TextActions.showText(Text.of("Click to change the passive config"))); builder.append(passiveBuilder.build()); builder.append(Text.NEW_LINE); @@ -1090,7 +1097,7 @@ public Text details(CommandSource source, String arguments) { } } online.stream() - .sorted((u1, u2) -> u1.getName().compareTo(u2.getName())) + .sorted(Comparator.comparing(User::getName)) .forEach(user -> { TextColor color = TextColors.WHITE; if (source instanceof Player && ((Player) source).getUniqueId().equals(user.getUniqueId())) @@ -1101,7 +1108,7 @@ public Text details(CommandSource source, String arguments) { user.getName())).append(Text.of(" ")); }); offline.stream() - .sorted((u1, u2) -> u1.toString().compareTo(u2.toString())) + .sorted(Comparator.comparing(UUID::toString)) .forEach(uuid -> builder.append(Text.of(TextColors.RESET, TextActions.suggestCommand("/foxguard md h " + this.getFullName() + " users " + group.name + " remove " + uuid.toString()), TextActions.showText(Text.of("Click to remove player \"" + uuid.toString() + "\" from \"", group.color, group.displayName, TextColors.RESET, "\"" + (group.name.equals(group.displayName) ? "" : " (" + group.name + ")"))), @@ -1155,8 +1162,9 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { - FGStorageManagerOld storageManager = FGStorageManagerOld.getInstance(); + FGStorageManagerNew storageManager = FGStorageManagerNew.getInstance(); UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); + Logger logger = FoxGuardMain.instance().getLogger(); /*try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); @@ -1174,7 +1182,23 @@ public void save(Path directory) { stringEntries.addAll(this.defaultPermissions.stream().map(TristateEntry::serialize).collect(Collectors.toList())); }*/ + Path dataFile = directory.resolve("data.foxcf"); + GsonBuilder gsonBuilder = FGStorageManagerNew.getInstance().getGsonBuilder(); + gsonBuilder.registerTypeAdapter(TristateEntry.class, TristateEntry.ADAPTER); + Gson gson = gsonBuilder.create(); + GsonData data = new GsonData(); + data.groups = new HashMap<>(); + for (Map.Entry> entry : this.groupPermissions.entrySet()) { + data.groups.put(entry.getKey().name, entry.getValue()); + } + data.defaultGroup = this.defaultPermissions; + + try (JsonWriter jsonWriter = storageManager.getJsonWriter(Files.newBufferedWriter(dataFile, FGStorageManagerNew.CHARSET))) { + gson.toJson(data, GsonData.class, jsonWriter); + } catch (IOException e) { + logger.error("Failed to open data file for writing: " + data, e); + } Path groupsDirectory = directory.resolve("groups"); storageManager.constructDirectory(groupsDirectory); @@ -1528,6 +1552,12 @@ public String toString() { } } + private static class GsonData { + Map> groups; + @SerializedName("default") + List defaultGroup; + } + public static class Group { private final Set users; private String name; @@ -1665,13 +1695,38 @@ public IHandler create(String name, String arguments, CommandSource source) thro @Override public IHandler create(Path directory, HandlerData data) { - FGStorageManagerOld storageManager = FGStorageManagerOld.getInstance(); + Logger logger = FoxGuardMain.instance().getLogger(); + FGStorageManagerNew storageManagerNew = FGStorageManagerNew.getInstance(); + + GsonBuilder gsonBuilder = storageManagerNew.getGsonBuilder(); + gsonBuilder.registerTypeAdapter(TristateEntry.class, TristateEntry.ADAPTER); + Gson gson = gsonBuilder.create(); + + GsonData gsonData = null; + Path gsonDataFile = directory.resolve("data.foxcf"); + if (Files.exists(gsonDataFile) && !Files.isDirectory(gsonDataFile)) { + try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(gsonDataFile))) { + gsonData = gson.fromJson(jsonReader, GsonData.class); + if (gsonData == null) gsonData = new GsonData(); + if (gsonData.groups == null) gsonData.groups = new HashMap<>(); + if (gsonData.defaultGroup == null) gsonData.defaultGroup = new ArrayList<>(); + } catch (IOException e) { + logger.error("Failed to open data file for reading: " + data, e); + } + } + List groupNames = new ArrayList<>(); - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { - groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); + if (gsonData != null) { + groupNames.addAll(gsonData.groups.keySet()); + } else { + Path dbFile = directory.resolve("groups.foxdb"); + if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) + try (DB flagMapDB = FGSLegacyLoader.openFoxDB(dbFile)) { + groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); + } } Path groupsDirectory = directory.resolve("groups"); - storageManager.constructDirectory(groupsDirectory); + storageManagerNew.constructDirectory(groupsDirectory); List groups = new ArrayList<>(); for (String groupName : groupNames) { Path groupFile = groupsDirectory.resolve(groupName + ".cfg"); @@ -1694,21 +1749,33 @@ public IHandler create(Path directory, HandlerData data) { } Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { + if (gsonData != null) { for (Group group : groups) { - List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); - groupPermissions.put(group, stringEntries.stream() - .map(TristateEntry::deserialize) - .filter(entry -> !entry.set.isEmpty()) - .distinct() - .collect(Collectors.toList())); + groupPermissions.put(group, gsonData.groups.get(group.name)); + } + defaultPermissions = gsonData.defaultGroup; + } else { + Path dbFile = directory.resolve("flags.foxdb"); + if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) { + try (DB flagMapDB = FGSLegacyLoader.openFoxDB(dbFile)) { + for (Group group : groups) { + List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); + groupPermissions.put(group, stringEntries.stream() + .map(TristateEntry::deserialize) + .filter(entry -> !entry.set.isEmpty()) + .distinct() + .collect(Collectors.toList())); + } + List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); + defaultPermissions = stringEntries.stream() + .map(TristateEntry::deserialize) + .filter(entry -> !entry.set.isEmpty()) + .distinct() + .collect(Collectors.toList()); + } + } else { + defaultPermissions = new ArrayList<>(); } - List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); - defaultPermissions = stringEntries.stream() - .map(TristateEntry::deserialize) - .filter(entry -> !entry.set.isEmpty()) - .distinct() - .collect(Collectors.toList()); } Path basicFile = directory.resolve("basic.cfg"); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index 8003f6f..765817a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -26,6 +26,11 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; import com.google.common.collect.ImmutableList; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; @@ -33,7 +38,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; -import net.foxdenstudio.sponge.foxguard.plugin.FGStorageManagerOld; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; @@ -41,6 +46,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.util.TristateEntry; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.IHandlerFactory; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGSLegacyLoader; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -49,10 +55,12 @@ import ninja.leaping.configurate.loader.ConfigurationLoader; import org.mapdb.DB; import org.mapdb.Serializer; +import org.slf4j.Logger; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColor; @@ -63,6 +71,7 @@ import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; +import javax.annotation.Nullable; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -70,8 +79,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.annotation.Nullable; - import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; import static org.spongepowered.api.util.Tristate.UNDEFINED; @@ -912,7 +919,10 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { + FGStorageManagerNew storageManager = FGStorageManagerNew.getInstance(); + UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); + Logger logger = FoxGuardMain.instance().getLogger(); + /*try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); groupNames.clear(); groupNames.addAll(this.groups.stream().map(group -> group.name).collect(Collectors.toList())); @@ -926,27 +936,44 @@ public void save(Path directory) { List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); stringEntries.clear(); stringEntries.addAll(this.defaultPermissions.stream().map(TristateEntry::serialize).collect(Collectors.toList())); + }*/ + + Path dataFile = directory.resolve("data.foxcf"); + GsonBuilder gsonBuilder = FGStorageManagerNew.getInstance().getGsonBuilder(); + gsonBuilder.registerTypeAdapter(TristateEntry.class, TristateEntry.ADAPTER); + Gson gson = gsonBuilder.create(); + + GsonData data = new GsonData(); + data.groups = new HashMap<>(); + for (Map.Entry> entry : this.groupPermissions.entrySet()) { + data.groups.put(entry.getKey().name, entry.getValue()); } - { - Path groupsFile = directory.resolve("groups.cfg"); - ConfigurationLoader loader = - HoconConfigurationLoader.builder().setPath(groupsFile).build(); - CommentedConfigurationNode root = FCPUtil.getHOCONConfiguration(groupsFile, loader); - CommentedConfigurationNode defaultNode = root.getNode("default"); - defaultNode.getNode("displayname").setValue(this.defaultGroup.displayName); - defaultNode.getNode("color").setValue(this.defaultGroup.color.getName()); - CommentedConfigurationNode groupsNode = root.getNode("groups"); - for (Group group : this.groups) { - CommentedConfigurationNode groupNode = groupsNode.getNode(group.name); - groupNode.getNode("displayname").setValue(group.displayName); - groupNode.getNode("color").setValue(group.color.getName()); - groupNode.getNode("permission").setValue(group.permission); - } - try { - loader.save(root); - } catch (IOException e) { - e.printStackTrace(); - } + data.defaultGroup = this.defaultPermissions; + + try (JsonWriter jsonWriter = storageManager.getJsonWriter(Files.newBufferedWriter(dataFile, FGStorageManagerNew.CHARSET))) { + gson.toJson(data, GsonData.class, jsonWriter); + } catch (IOException e) { + logger.error("Failed to open data file for writing: " + data, e); + } + + Path groupsFile = directory.resolve("groups.cfg"); + ConfigurationLoader loader = + HoconConfigurationLoader.builder().setPath(groupsFile).build(); + CommentedConfigurationNode root = FCPUtil.getHOCONConfiguration(groupsFile, loader); + CommentedConfigurationNode defaultNode = root.getNode("default"); + defaultNode.getNode("displayname").setValue(this.defaultGroup.displayName); + defaultNode.getNode("color").setValue(this.defaultGroup.color.getName()); + CommentedConfigurationNode groupsNode = root.getNode("groups"); + for (Group group : this.groups) { + CommentedConfigurationNode groupNode = groupsNode.getNode(group.name); + groupNode.getNode("displayname").setValue(group.displayName); + groupNode.getNode("color").setValue(group.color.getName()); + groupNode.getNode("permission").setValue(group.permission); + } + try { + loader.save(root); + } catch (IOException e) { + e.printStackTrace(); } } @@ -1178,6 +1205,12 @@ private boolean userFilter(Operation op, boolean isPresent) { } } + private static class GsonData { + Map> groups; + @SerializedName("default") + List defaultGroup; + } + public static class Group { private String name; private String displayName; @@ -1242,20 +1275,42 @@ public IHandler create(String name, String arguments, CommandSource source) thro return handler; } + @SuppressWarnings("Duplicates") @Override public IHandler create(Path directory, HandlerData data) { - if (Files.exists(directory.resolve("groups.foxdb")) || Files.exists(directory.resolve("flags.foxdb"))) { - return createOld(directory, data); + Logger logger = FoxGuardMain.instance().getLogger(); + FGStorageManagerNew storageManagerNew = FGStorageManagerNew.getInstance(); + + GsonBuilder gsonBuilder = storageManagerNew.getGsonBuilder(); + gsonBuilder.registerTypeAdapter(TristateEntry.class, TristateEntry.ADAPTER); + Gson gson = gsonBuilder.create(); + + GsonData gsonData = null; + Path gsonDataFile = directory.resolve("data.foxcf"); + if (Files.exists(gsonDataFile) && !Files.isDirectory(gsonDataFile)) { + try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(gsonDataFile))) { + gsonData = gson.fromJson(jsonReader, GsonData.class); + if (gsonData == null) gsonData = new GsonData(); + if (gsonData.groups == null) gsonData.groups = new HashMap<>(); + if (gsonData.defaultGroup == null) gsonData.defaultGroup = new ArrayList<>(); + } catch (IOException e) { + logger.error("Failed to open data file for reading: " + data, e); + } } - return null; - } - public IHandler createOld(Path directory, HandlerData data) { List groupNames = new ArrayList<>(); - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { - groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); + if (gsonData != null) { + groupNames.addAll(gsonData.groups.keySet()); + } else { + Path dbFile = directory.resolve("groups.foxdb"); + if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) + try (DB flagMapDB = FGSLegacyLoader.openFoxDB(directory.resolve("groups.foxdb"))) { + groupNames.addAll(flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen()); + } } + List groups = new ArrayList<>(); + Path groupsFile = directory.resolve("groups.cfg"); ConfigurationLoader loader = HoconConfigurationLoader.builder().setPath(groupsFile).build(); @@ -1274,7 +1329,7 @@ public IHandler createOld(Path directory, HandlerData data) { Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("flags.foxdb"))) { + try (DB flagMapDB = FGSLegacyLoader.openFoxDB(directory.resolve("flags.foxdb"))) { for (Group group : groups) { List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); groupPermissions.put(group, stringEntries.stream() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index 80cf084..1589e4b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -49,11 +49,6 @@ public void setPriority(int priority) { this.priority = priority > Integer.MIN_VALUE ? priority : Integer.MIN_VALUE + 1; } - @Override - public int compareTo(IHandler o) { - return o.getPriority() - this.priority; - } - public void markDirty() { FGUtil.markDirty(this); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java index 0268a8b..c3ce423 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java @@ -32,13 +32,15 @@ import org.spongepowered.api.entity.living.player.User; import javax.annotation.Nullable; +import java.util.Comparator; -public interface IHandler extends IFGObject, Comparable { +public interface IHandler extends IFGObject { + + Comparator PRIORITY = (h1, h2) -> h2.getPriority() - h1.getPriority(); EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra); int getPriority(); void setPriority(int priority); - } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java index ab9e47f..ff97cec 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java @@ -25,9 +25,17 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler.util; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; +import org.slf4j.Logger; +import org.spongepowered.api.util.Tristate; +import java.io.IOException; import java.util.HashSet; import java.util.Optional; import java.util.Set; @@ -37,6 +45,7 @@ */ public class PermissionEntry extends Entry { + public static final TypeAdapter ADAPTER = new PermissionEntryAdapter().nullSafe(); public String permission; public boolean relative; @@ -68,4 +77,76 @@ public static PermissionEntry deserialize(String string) { public String serializeValue() { return permission; } + + @SuppressWarnings("Duplicates") + public static class PermissionEntryAdapter extends TypeAdapter { + + private PermissionEntryAdapter() { + } + + @Override + public void write(JsonWriter out, PermissionEntry value) throws IOException { + out.beginObject(); + out.name("set"); + out.beginArray(); + for (Flag flag : value.set) { + out.value(flag.getName()); + } + out.endArray(); + out.name("value"); + out.value(value.serializeValue()); + out.endObject(); + } + + @Override + public PermissionEntry read(JsonReader in) throws IOException { + FlagRegistry registry = FlagRegistry.getInstance(); + Logger logger = FoxGuardMain.instance().getLogger(); + + in.beginObject(); + Set set = new HashSet<>(); + String permission = null; + while (in.peek() != JsonToken.END_OBJECT) { + String name = in.nextName(); + switch (name) { + case "set": { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + break; + } + in.beginArray(); + while (in.peek() != JsonToken.END_ARRAY) { + if(in.peek() == JsonToken.NULL) { + in.nextNull(); + continue; + } + Optional flagOptional = registry.getFlag(in.nextString()); + flagOptional.ifPresent(set::add); + } + in.endArray(); + } + break; + case "value": { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + break; + } + permission = in.nextString(); + } + break; + } + } + if (set.isEmpty()) { + // TODO add custom exception for stacktrace + logger.error("Tried to deserialize a TristateEntry with an empty flag set!", new RuntimeException("Error deserializing TristateEntry")); + return null; + } + if (permission == null) { + logger.warn("Deserialized a TristateEntry with a null tristate! Replacing with UNDEFINED."); + permission = "undefined"; + } + + return new PermissionEntry(set, permission); + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java index 2e324e0..40abb08 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java @@ -25,11 +25,17 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler.util; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; +import org.slf4j.Logger; import org.spongepowered.api.util.Tristate; +import java.io.IOException; import java.util.HashSet; import java.util.Optional; import java.util.Set; @@ -39,6 +45,7 @@ */ public class TristateEntry extends Entry { + public static final TypeAdapter ADAPTER = new TristateEntryAdapter().nullSafe(); public Tristate tristate; public TristateEntry(Set set, Tristate tristate) { @@ -80,4 +87,75 @@ public static TristateEntry deserialize(String string) { public String serializeValue() { return tristate.name(); } + + public static class TristateEntryAdapter extends TypeAdapter { + + private TristateEntryAdapter() { + } + + @Override + public void write(JsonWriter out, TristateEntry value) throws IOException { + out.beginObject(); + out.name("set"); + out.beginArray(); + for (Flag flag : value.set) { + out.value(flag.getName()); + } + out.endArray(); + out.name("value"); + out.value(value.serializeValue()); + out.endObject(); + } + + @Override + public TristateEntry read(JsonReader in) throws IOException { + FlagRegistry registry = FlagRegistry.getInstance(); + Logger logger = FoxGuardMain.instance().getLogger(); + + in.beginObject(); + Set set = new HashSet<>(); + Tristate tristate = null; + while (in.peek() != JsonToken.END_OBJECT) { + String name = in.nextName(); + switch (name) { + case "set": { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + break; + } + in.beginArray(); + while (in.peek() != JsonToken.END_ARRAY) { + if(in.peek() == JsonToken.NULL) { + in.nextNull(); + continue; + } + Optional flagOptional = registry.getFlag(in.nextString()); + flagOptional.ifPresent(set::add); + } + in.endArray(); + } + break; + case "value": { + if (in.peek() == JsonToken.NULL) { + in.nextNull(); + break; + } + tristate = Tristate.valueOf(in.nextString()); + } + break; + } + } + if (set.isEmpty()) { + // TODO add custom exception for stacktrace + logger.error("Tried to deserialize a TristateEntry with an empty flag set!", new RuntimeException("Error deserializing TristateEntry")); + return null; + } + if (tristate == null) { + logger.warn("Deserialized a TristateEntry with a null tristate! Replacing with UNDEFINED."); + tristate = Tristate.UNDEFINED; + } + + return new TristateEntry(set, tristate); + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index 8b611e5..356b365 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -125,7 +125,7 @@ public void handle(ChangeBlockEvent event) throws Exception { } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority = handlerList.get(0).getPriority(); for (IHandler handler : handlerList) { if (handler.getPriority() < currPriority && flagState != UNDEFINED) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index d9b1726..a83c3bd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -110,7 +110,7 @@ public void handle(DamageEntityEvent event) throws Exception { } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority; if (entity instanceof Player) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index 9a070b9..d8ae90c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -127,7 +127,7 @@ public void handle(ExplosionEvent event) throws Exception { } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority = handlerList.get(0).getPriority(); for (IHandler handler : handlerList) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java index 30bc67b..eab0bdd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java @@ -95,7 +95,7 @@ public void handle(InteractBlockEvent event) throws Exception { } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority = handlerList.get(0).getPriority(); Tristate flagState = UNDEFINED; for (IHandler handler : handlerList) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index 429eee8..80b3d2f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -120,7 +120,7 @@ public void handle(InteractEntityEvent event) throws Exception { } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority = handlerList.get(0).getPriority(); Tristate flagState = UNDEFINED; for (IHandler handler : handlerSet) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 3d1ba76..5f1e93d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -217,7 +217,7 @@ public void renderHUD(Player player, List regions, List handl Collections.sort(regions, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); if (config.handlers) { if (config.priority) { - Collections.sort(handlers, (o1, o2) -> o2.getPriority() - o1.getPriority()); + Collections.sort(handlers, IHandler.PRIORITY); } else { Collections.sort(handlers, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); } @@ -326,7 +326,8 @@ public HandlerWrapper(IHandler handler, Type type) { @Override public int compareTo(HandlerWrapper w) { - int val = handler.compareTo(w.handler); + int val = IHandler.PRIORITY.compare(handler, w.handler); +// int val = handler.compareTo(w.handler); return val != 0 ? val : type.compareTo(w.type); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index 7a70ed6..019efab 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -157,12 +157,12 @@ public void renderHUD(Player player, List regions, List handl Scoreboard scoreboard = this.scoreboardMap.get(player); Objective objective = scoreboard.getObjective("foxguardhere").get(); if (config.regions) { - Collections.sort(regions, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + regions.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); if (config.handlers) { if (config.priority) { - Collections.sort(handlers, (o1, o2) -> o2.getPriority() - o1.getPriority()); + handlers.sort(IHandler.PRIORITY); } else { - Collections.sort(handlers, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + handlers.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); } objective.setDisplayName(Text.of(TextColors.GOLD, " Regions and Handlers Here ")); final int total = regions.size() + handlers.size(); @@ -209,7 +209,7 @@ public void renderHUD(Player player, List regions, List handl } else { int slot = handlers.size(); objective.setDisplayName(Text.of(TextColors.GOLD, " Handlers Here ")); - Collections.sort(handlers, (o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); + handlers.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); for (IHandler handler : handlers) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(handler), " " + handler.getShortTypeName() + " : " + handler.getName())); @@ -259,7 +259,8 @@ public HandlerWrapper(IHandler handler, Direction direction) { @Override public int compareTo(HandlerWrapper w) { - int val = handler.compareTo(w.handler); +// int val = handler.compareTo(w.handler); + int val = IHandler.PRIORITY.compare(handler, w.handler); return val != 0 ? val : direction.compareTo(w.direction); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index c7cb13f..e1c825a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -124,7 +124,7 @@ public void handle(SpawnEntityEvent event) throws Exception { return; } List handlerList = new ArrayList<>(handlerSet); - Collections.sort(handlerList); + handlerList.sort(IHandler.PRIORITY); int currPriority = handlerList.get(0).getPriority(); for (IHandler handler : handlerList) { if (handler.getPriority() < currPriority && flagState != Tristate.UNDEFINED) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java index 309bf8e..75affbd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java @@ -85,13 +85,6 @@ public String getFullName() { return fullName; } - @Override - public int compareTo(@NotNull IFGObject o) { - int ret = this.owner.compareTo(o.getOwner()); - if (ret != 0) return ret; - return this.name.compareToIgnoreCase(o.getName()); - } - @Override public String toString() { return "FGObjectBase{" + diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index a77b2ff..8f959e0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -41,6 +41,7 @@ import javax.annotation.Nullable; import java.nio.file.Path; +import java.util.Comparator; import java.util.List; import java.util.UUID; @@ -49,7 +50,13 @@ * and {@link IHandler Handlers}. * Essentially the core of the code, this is the most used interface. */ -public interface IFGObject extends IModifiable, Comparable { +public interface IFGObject extends IModifiable { + + Comparator OWNER_AND_NAME = (o1,o2)->{ + int ret = o1.getOwner().compareTo(o2.getOwner()); + if (ret != 0) return ret; + return o1.getName().compareToIgnoreCase(o2.getName()); + }; /** * Gets the name of the object. It should be alphanumeric with limited use of special characters. diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 12363be..31b6333 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -149,8 +149,7 @@ public void saveWorldRegionIndex(World world) { private void saveIndex(Set objects, Path file) { List indexList = new ArrayList<>(); - - objects.stream().sorted().forEach(object -> { + objects.stream().sorted(IFGObject.OWNER_AND_NAME).forEach(object -> { boolean saveLinks = (object instanceof ILinkable && ((ILinkable) object).saveLinks()); boolean autoSave = object.autoSave(); if (autoSave || saveLinks) { @@ -589,6 +588,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i public GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); if(prettyPrint) builder.setPrettyPrinting(); + return builder; } From 879e58697b8eda44df95aa9ca092de1ae146a02a Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Tue, 20 Feb 2018 12:33:03 -0800 Subject: [PATCH 22/30] Fix devenv being set in repo. D'oh. --- gradle/devenv.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/devenv.gradle b/gradle/devenv.gradle index a3fafee..d585292 100644 --- a/gradle/devenv.gradle +++ b/gradle/devenv.gradle @@ -1,3 +1,3 @@ -gradle.ext.isDevEnv = true +gradle.ext.isDevEnv = false gradle.ext.foxCorePath = 'FoxCore-Sponge' From 78fb85dc1d0969d55acd8cf2df801db67a61eb7e Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Thu, 15 Mar 2018 15:24:28 -0700 Subject: [PATCH 23/30] More things!!! :DDD --- .../foxguard/plugin/FGConfigManager.java | 48 ++-- .../sponge/foxguard/plugin/FGManager.java | 8 +- .../plugin/command/CommandCreate.java | 19 +- .../plugin/command/CommandDelete.java | 23 ++ .../plugin/command/CommandDetail.java | 6 +- .../foxguard/plugin/command/CommandMove.java | 8 +- .../plugin/handler/WelcomeHandler.java | 81 ++++-- .../plugin/handler/util/PermissionEntry.java | 1 + .../plugin/handler/util/TristateEntry.java | 1 + .../OwnerManager.java} | 96 +------ .../provider}/IDisplayableOwnerProvider.java | 2 +- .../provider}/IOwnerProvider.java | 2 +- .../provider}/OfflineUserProvider.java | 3 +- .../provider}/OnlinePlayerProvider.java | 2 +- .../provider}/UUIDProvider.java | 2 +- .../plugin/object/owner/type/Owner.java | 64 +++++ .../plugin/object/path/PathManager.java | 15 ++ .../plugin/storage/FGStorageManagerNew.java | 253 ++++++++++++++++-- .../foxguard/plugin/util/ExtraContext.java | 1 + .../sponge/foxguard/plugin/util/FGUtil.java | 14 +- 20 files changed, 476 insertions(+), 173 deletions(-) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners/OwnerProviderRegistry.java => owner/OwnerManager.java} (65%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners => owner/provider}/IDisplayableOwnerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners => owner/provider}/IOwnerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners => owner/provider}/OfflineUserProvider.java (93%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners => owner/provider}/OnlinePlayerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owners => owner/provider}/UUIDProvider.java (97%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java index f32695b..1805a8a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGConfigManager.java @@ -46,9 +46,12 @@ public final class FGConfigManager { private int nameLengthLimit; // storage - private boolean cleanupFiles; private boolean gcAndFinalize; + // storage/cleanup + private boolean cleanOnDelete; + private boolean cleanOnError; + // storage/json private boolean prettyPrint; private int prettyPrintIndent; @@ -103,16 +106,6 @@ public void save() { "Extremely long names can cause a variety of un-fixable issues. You have been warned."); // storage - root.getNode("storage", "cleanupFiles") - .setValue(cleanupFiles) - .setComment("Sets whether to aggressively delete files that are no longer used. Default: true\n" + - "This is meant to keep the file store clean and free of clutter.\n" + - "The caveat is that objects that fail to load are deleted without warning.\n" + - "However, modifying databases and moving the files around can trigger the cleanup.\n" + - "If plugin simply fails to load the database, it would just be discarded.\n" + - "Setting this option to false will prevent databases from being deleted.\n" + - "However, they will still be overwritten if a new database is made with the same name."); - root.getNode("storage", "gcAndFinalize") .setValue(gcAndFinalize) .setComment("Whether to run try running gc and finalization when deleting things.\n" + @@ -120,6 +113,20 @@ public void save() { "Use only if you are having trouble deleting things from in game.\n" + "This really only makes a difference on Windows, so you can leave this alone on Unix based operating systems."); + // storage/cleanup + root.getNode("storage", "cleanup", "cleanOnDelete") + .setValue(cleanOnDelete) + .setComment("Sets whether to delete object files when objects are deleted. Default: true\n" + + "This is meant to keep the file store clean and free of clutter.\n" + + "If set to false, files will be left intact when deleting objects.\n" + + "However if a new object is made with the same name, the files will be deleted to make space."); + + root.getNode("storage", "cleanup", "cleanOnError") + .setValue(cleanOnError) + .setComment("Sets whether to delete object files if they fail to load. Default: false\n" + + "This is also meant to keep the file store clean and free of clutter.\n" + + "However it is usually left off because it may be undesirable to delete files if they are still recoverable."); + // storage/json root.getNode("storage", "json", "prettyPrint") .setValue(prettyPrint) @@ -227,9 +234,12 @@ private void load() { nameLengthLimit = root.getNode("general", "nameLengthLimit").getInt(24); // storage - cleanupFiles = root.getNode("storage", "cleanupFiles").getBoolean(true); gcAndFinalize = root.getNode("storage", "gcAndFinalize").getBoolean(false); + // storage/cleaup + cleanOnDelete = root.getNode("storage", "cleanup", "cleanOnDelete").getBoolean(true); + cleanOnError = root.getNode("storage", "cleanup", "cleanOnError").getBoolean(false); + // storage/json prettyPrint = root.getNode("storage", "json", "prettyPrint").getBoolean(false); prettyPrintIndent = root.getNode("storage", "json", "prettyPrintIndent").getInt(4); @@ -270,14 +280,20 @@ public int getNameLengthLimit() { } // storage - public boolean cleanupFiles() { - return cleanupFiles; - } - public boolean gcAndFinalize() { return gcAndFinalize; } + // storage/cleanup + public boolean cleanOnDelete() { + return cleanOnDelete; + } + + public boolean cleanOnError() { + return cleanOnError; + } + + // storage/json public boolean prettyPrint() { return prettyPrint; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index e116000..fb4e67b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -120,7 +120,8 @@ public boolean addHandler(IHandler handler) { public boolean addHandler(IHandler handler, UUID owner) { if (handler == null || !isNameValid(handler.getName()) - || !isHandlerNameAvailable(handler.getName(), owner)) + || !isHandlerNameAvailable(handler.getName(), owner) + || this.handlers.containsValue(handler)) return false; handler.setOwner(owner); handlers.put(owner, handler); @@ -140,7 +141,8 @@ public boolean addRegion(IRegion region, @Nonnull UUID owner) { if (region == null || !isNameValid(region.getName()) || !isRegionNameAvailable(region.getName(), owner) - || region instanceof IWorldRegion) return false; + || region instanceof IWorldRegion + || this.regions.containsValue(region)) return false; region.setOwner(owner); this.regions.put(owner, region); this.regionCache.markDirty(region, RegionCache.DirtyType.ADDED); @@ -705,9 +707,9 @@ public boolean removeHandler(IHandler handler) { if (!this.handlers.values().contains(handler)) { return false; } + handlers.values().remove(handler); FGStorageManagerNew.getInstance().removeObject(handler); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), handler)); - handlers.values().remove(handler); return true; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index b3e0d3e..d316ca9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -38,8 +38,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.owners.IOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.Sponge; @@ -137,7 +137,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } } else { String[] parts = ownerString.split(":", 2); - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + OwnerManager registry = OwnerManager.getInstance(); Optional ownerOpt; if (parts.length == 1) { ownerOpt = registry.getUUIDForOwner(null, parts[0]); @@ -214,11 +214,14 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu source.sendMessage(Text.of(TextColors.GREEN, fgCat.uName + " created successfully")); StringBuilder logMessage = new StringBuilder(); - logMessage.append(source.getName()).append(" created a ").append(fgCat.lName).append(": ") - .append("Name: ").append(object.getName()).append(" "); + logMessage.append(source.getName()) + .append(" created a ") + .append(fgCat.lName) + .append(": Name: ") + .append(object.getName()); if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { - logMessage.append("Owner: ").append(OwnerProviderRegistry.getInstance().getKeyword(owner, null)) + logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) .append(" (").append(owner).append(")"); } @@ -352,7 +355,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF String[] parts = parse.current.token.split(":", 2); System.out.println(parts.length ); if (parts.length == 1) { - ImmutableList collect = OwnerProviderRegistry.getInstance().getProviders().stream() + ImmutableList collect = OwnerManager.getInstance().getProviders().stream() .map(IOwnerProvider::getPrimaryAlias) .filter(string -> string != null && !string.isEmpty()) .filter(new StartsWithPredicate(parse.current.token)) @@ -362,7 +365,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF return collect; } else if (parts.length == 2) { - Optional providerOpt = OwnerProviderRegistry.getInstance().getProvider(parts[0]); + Optional providerOpt = OwnerManager.getInstance().getProvider(parts[0]); if (providerOpt.isPresent()) { IOwnerProvider provider = providerOpt.get(); System.out.println(provider.getOwnerKeywords()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index 7f88002..3a896af 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -32,9 +32,11 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; @@ -51,6 +53,7 @@ import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.stream.Stream; import javax.annotation.Nullable; @@ -115,6 +118,26 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (!success) throw new CommandException(Text.of("There was an error trying to delete the " + fgCat.lName + "!")); source.sendMessage(Text.of(TextColors.GREEN, fgCat.uName + " deleted successfully!")); + + StringBuilder logMessage = new StringBuilder(); + logMessage.append(source.getName()) + .append(" deleted the ") + .append(fgCat.lName) + .append(": Name: ") + .append(object.getName()); + + UUID owner = ownerResult.getOwner(); + if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { + logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) + .append(" (").append(owner).append(")"); + } + + if (object instanceof IWorldRegion) { + logMessage.append(" World: ").append(((IWorldRegion) object).getWorld().getName()); + } + + FoxGuardMain.instance().getLogger().info(logMessage.toString()); + return CommandResult.success(); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 4938834..e7ab2bd 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -37,7 +37,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; -import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -45,7 +45,6 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.command.args.ArgumentParseException; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.action.TextActions; @@ -66,7 +65,6 @@ import javax.annotation.Nullable; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; -import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; public class CommandDetail extends FCCommandBase { @@ -141,7 +139,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm TextColors.GREEN, "------- General -------\n", TextColors.GOLD, "Name: ", TextColors.RESET, name + "\n")); if (hasOwner) { - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + OwnerManager registry = OwnerManager.getInstance(); builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "Owner: ")) .append(registry.getDisplayText(owner, null, source)) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java index 9c07924..ef048a4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java @@ -74,7 +74,11 @@ public CommandResult process(CommandSource source, String arguments) throws Comm source.sendMessage(Text.of(TextColors.RED, "You don't have permission to use this command!")); return CommandResult.empty(); } - AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); + AdvCmdParser.ParseResult parse = AdvCmdParser.builder() + .arguments(arguments) + .flagMapper(MAPPER) + .parse(); + if (parse.args.length == 0) { source.sendMessage(Text.builder() .append(Text.of(TextColors.GREEN, "Usage: ")) @@ -154,7 +158,6 @@ public List getSuggestions(CommandSource source, String arguments, @Null if (!testPermission(source)) return ImmutableList.of(); AdvCmdParser.ParseResult parse = AdvCmdParser.builder() .arguments(arguments) - .limit(2) .flagMapper(MAPPER) .excludeCurrent(true) .autoCloseQuotes(true) @@ -221,6 +224,7 @@ else if (parse.current.index == 1) { } } else if (isIn(HANDLERS_ALIASES, parse.args[0]) || isIn(CONTROLLERS_ALIASES, parse.args[0])) { available = Tristate.fromBoolean(!FGManager.getInstance().getHandler(parse.current.token).isPresent()); + System.out.println("asdjfkasdkfjasdlfj"); } if (available != null) { switch (available) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java index 660096a..7ab0938 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/WelcomeHandler.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; @@ -46,15 +47,18 @@ import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.text.format.TextStyle; +import org.spongepowered.api.text.format.TextStyles; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; import javax.annotation.Nullable; +import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,12 +71,22 @@ public class WelcomeHandler extends HandlerBase { private static final Pattern PATTERN = Pattern.compile("&[0-9a-fk-or]|%|(?:\\.|&(?![0-9a-fk-or%])|[^&%])+"); + private boolean enter; + private boolean exit; + private String enterString = ""; + private String exitString = ""; private TextTemplate enterTemplate = TextTemplate.EMPTY; private TextTemplate exitTemplate = TextTemplate.EMPTY; public WelcomeHandler(HandlerData data) { + this(data, "", ""); + } + + public WelcomeHandler(HandlerData data, String enterString, String exitString) { super(data); + this.setEnter(enterString); + this.setExit(exitString); } @Override @@ -87,11 +101,11 @@ public ProcessResult modify(CommandSource source, String arguments) throws Comma if (parse.args.length < 2) return ProcessResult.failure(); - if (parse.args[0].equalsIgnoreCase("enter")) enterTemplate = fromString(parse.args[1]); - else if (parse.args[0].equalsIgnoreCase("exit")) exitTemplate = fromString(parse.args[1]); + if (parse.args[0].equalsIgnoreCase("enter")) this.setEnter(parse.args[1]); + else if (parse.args[0].equalsIgnoreCase("exit")) this.setExit(parse.args[1]); else ProcessResult.of(false, "Invalid Command!"); - return ProcessResult.failure(); + return ProcessResult.success(); } @Override @@ -120,9 +134,13 @@ public List modifySuggestions(CommandSource source, String arguments, @N public EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra) { if (flags.get(Flags.MOVE)) { Player player = (Player) user; - - if (flags.get(Flags.ENTER)) player.sendMessage(enterTemplate.toText()); - else if (flags.get(Flags.EXIT)) player.sendMessage(exitTemplate.toText()); + Map input = ImmutableMap.of("player", player.getName()); + if (flags.get(Flags.ENTER)) { + player.sendMessage(enterTemplate.apply(input).build()); + //player.sendMessage(enterTemplate.toText()); + } else if (flags.get(Flags.EXIT)) { + player.sendMessage(exitTemplate.apply(input).build()); + } } return EventResult.pass(); } @@ -144,11 +162,12 @@ public String getUniqueTypeString() { @Override public Text details(CommandSource source, String arguments) { + final Text quote = Text.of(TextColors.AQUA, "\""); Text.Builder builder = Text.builder(); - builder.append(Text.of(TextColors.GREEN, "Enter:\n")); - builder.append(enterTemplate.toText()); - builder.append(Text.of(TextColors.GOLD, "Exit:\n")); - builder.append(exitTemplate.toText()); + builder.append(Text.of(TextColors.GREEN, "Enter:\n ")); + builder.append(quote).append(enterTemplate.toText()).append(quote); + builder.append(Text.of(TextColors.GOLD, "\nExit:\n ")); + builder.append(quote).append(exitTemplate.toText()).append(quote); return builder.build(); } @@ -163,30 +182,52 @@ public void save(Path directory) { ConfigurationLoader loader = HoconConfigurationLoader.builder().setPath(file).build(); CommentedConfigurationNode root = FCPUtil.getHOCONConfiguration(file, loader); - root.getNode("enter").setValue(enterTemplate); - root.getNode("exit").setValue(exitTemplate); + root.getNode("enter").setValue(enterString); + root.getNode("exit").setValue(exitString); + try { + loader.save(root); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void setEnter(String enterString) { + this.enter = !enterString.isEmpty(); + this.enterString = enterString; + this.enterTemplate = fromString(enterString); + } + + public void setExit(String exitString) { + this.exit = !exitString.isEmpty(); + this.exitString = exitString; + this.exitTemplate = fromString(exitString); } private static TextTemplate fromString(String string) { List elements = new ArrayList<>(); Matcher matcher = PATTERN.matcher(string); + TextColor curColor = TextColors.RESET; + TextStyle curStyle = TextStyles.RESET; while (matcher.find()) { String str = matcher.group(); if (str.equals("%")) { - elements.add(TextTemplate.arg("player").build()); + elements.add(TextTemplate.arg("player") + .color(curColor) + .style(curStyle) + .build()); } else if (str.matches("&[0-9a-fk-or]")) { str = str.substring(1); if (str.matches("[0-9a-f]")) { Optional colorOpt = FCPUtil.textColorFromHex(str); - colorOpt.ifPresent(elements::add); + if (colorOpt.isPresent()) curColor = colorOpt.get(); } else { Optional styleOpt = FCPUtil.textStyleFromCode(str); - styleOpt.ifPresent(elements::add); + if (styleOpt.isPresent()) curStyle = styleOpt.get(); } } else { - elements.add(str); + elements.add(Text.of(curColor, curStyle, str)); } } @@ -204,7 +245,13 @@ public IHandler create(String name, String arguments, CommandSource source) thro @Override public IHandler create(Path directory, HandlerData data) { - return null; + Path file = directory.resolve("messages.cfg"); + ConfigurationLoader loader = + HoconConfigurationLoader.builder().setPath(file).build(); + CommentedConfigurationNode root = FCPUtil.getHOCONConfiguration(file, loader); + String enterString = root.getNode("enter").getString(""); + String exitString = root.getNode("enter").getString(""); + return new WelcomeHandler(data, enterString, exitString); } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java index ff97cec..a01797e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/PermissionEntry.java @@ -136,6 +136,7 @@ public PermissionEntry read(JsonReader in) throws IOException { break; } } + in.endObject(); if (set.isEmpty()) { // TODO add custom exception for stacktrace logger.error("Tried to deserialize a TristateEntry with an empty flag set!", new RuntimeException("Error deserializing TristateEntry")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java index 40abb08..551eb5b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/util/TristateEntry.java @@ -145,6 +145,7 @@ public TristateEntry read(JsonReader in) throws IOException { break; } } + in.endObject(); if (set.isEmpty()) { // TODO add custom exception for stacktrace logger.error("Tried to deserialize a TristateEntry with an empty flag set!", new RuntimeException("Error deserializing TristateEntry")); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java similarity index 65% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java index 312e4b8..8009765 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OwnerProviderRegistry.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java @@ -23,11 +23,12 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.*; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; @@ -41,106 +42,23 @@ /** * Created by Fox on 12/22/2016. */ -public class OwnerProviderRegistry { +public class OwnerManager { - private static final SecureRandom sRandom = new SecureRandom(); - - private static OwnerProviderRegistry instance; - private Set inUse = new HashSet<>(); + private static OwnerManager instance; private List ownerProviders; - public OwnerProviderRegistry() { + public OwnerManager() { ownerProviders = new ArrayList<>(); ownerProviders.add(UUIDProvider.getInstance()); ownerProviders.add(new OnlinePlayerProvider()); ownerProviders.add(new OfflineUserProvider()); } - public static OwnerProviderRegistry getInstance() { - if (instance == null) instance = new OwnerProviderRegistry(); + public static OwnerManager getInstance() { + if (instance == null) instance = new OwnerManager(); return instance; } - /** - * This method checks if a {@link UUID} could potentially be a player {@link UUID}. - * It does this by checking if it's a v3 or v4 uuid. - * For our purposes, it really doesn't matter that we're breaking RFC spec, - * because all we care about is avoiding name conflicts. - * Beyond that, UUID is just a convenient method of keeping track of owners. - * - * @param uuid the {@link UUID} to check - * @return Whether this is a v3 or v4 {@link UUID}, meaning whether it could be a player {@link UUID}. - */ - public static boolean isPlayerUUID(UUID uuid) { - byte a = (byte) (uuid.getMostSignificantBits() >>> 12 & 0xf); - byte b = (byte) (uuid.getLeastSignificantBits() >>> 60 & 0xf); - return (a == 0x3 || a == 0x4) && b >= 0x8 && b <= 0xb; - } - - private static UUID uuidFromBytes(byte[] data) { - long msb = 0; - long lsb = 0; - for (int i = 0; i < 8; i++) - msb = (msb << 8) | (data[i] & 0xff); - for (int i = 8; i < 16; i++) - lsb = (lsb << 8) | (data[i] & 0xff); - return new UUID(msb, lsb); - } - - /** - * Registers a {@link UUID} for use as a virtual player owner. - * This ensures that this UUID will not be used elsewhere due to collisions. - * - * @param uuid the {@link UUID} to register. - * @return Whether the {@link UUID} was successfully registered. Returns false if it has already been registered. - */ - - public boolean registerUUID(UUID uuid) { - return !isPlayerUUID(uuid) && inUse.add(uuid); - } - - public boolean isRegistered(UUID uuid) { - return inUse.contains(uuid); - } - - public boolean unregisterUUID(UUID uuid) { - return inUse.remove(uuid); - } - - /** - * Generates a random {@link UUID} that is NOT to RFC spec. - * The version for this {@link UUID} is zero, and the variant is random. - * By breaking RFC spec, we guarantee that there will not be a collision. - * - * @return - */ - - public UUID generateUUID() { - byte[] randomBytes = new byte[16]; - UUID uuid; - do { - sRandom.nextBytes(randomBytes); - randomBytes[0] = 0x00; /* leading zeros */ - randomBytes[6] &= 0x0f; /* clear version */ - uuid = uuidFromBytes(randomBytes); - } while (inUse.contains(uuid)); - - return uuid; - } - - /** - * Generates a {@link UUID} with {@link OwnerProviderRegistry#generateUUID()} and adds it. - * This is a convenience method. - * - * @return the generated {@link UUID} - */ - - public UUID generateAndRegisterUUID() { - UUID uuid = generateUUID(); - inUse.add(uuid); - return uuid; - } - public boolean registerProvider(IOwnerProvider provider) { return !ownerProviders.contains(provider) && ownerProviders.add(provider); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java index 4f489e3..40c2784 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IDisplayableOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.Player; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java index dd61b8d..54825e4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/IOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; import java.util.List; import java.util.Optional; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java similarity index 93% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java index 2f5d3cd..7e7be40 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OfflineUserProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java @@ -1,6 +1,5 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; -import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java index 784b37c..26b910a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/OnlinePlayerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java @@ -1,4 +1,4 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandSource; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java similarity index 97% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java index 4b5d1c2..989aa2a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owners/UUIDProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owners; +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java new file mode 100644 index 0000000..284f209 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java @@ -0,0 +1,64 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.owner.type; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; +import java.nio.file.Path; + +/** + * Created by fox on 3/4/18. + */ +public abstract class Owner { + + private final String type; + + protected Owner(String type){ + this.type = type; + } + + public String getType(){ + return this.type; + } + + public abstract Path getPath(); + + protected abstract void serializeData(JsonWriter out); + + public static class Adapter extends TypeAdapter { + + private final TypeAdapter jsonElementTypeAdapter; + + public Adapter(TypeAdapter jsonElementTypeAdapter) { + this.jsonElementTypeAdapter = jsonElementTypeAdapter; + } + + @Override + public void write(JsonWriter out, Owner value) throws IOException { + + } + + @Override + public Owner read(JsonReader in) throws IOException { + + return null; + } + } + + public static class AdapterFactory implements TypeAdapterFactory { + + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if(!Owner.class.isAssignableFrom(type.getRawType())) return null; + TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); + Adapter adapter = new Adapter(jsonElementTypeAdapter); + return (TypeAdapter) adapter; + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java new file mode 100644 index 0000000..7461473 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -0,0 +1,15 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path; + +/** + * Created by fox on 3/7/18. + */ +public class PathManager { + private static PathManager ourInstance = new PathManager(); + + public static PathManager getInstance() { + return ourInstance; + } + + private PathManager() { + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 31b6333..28918f9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -257,7 +257,7 @@ public void addObject(IFGObject object) { public void removeObject(IFGObject object) { if (reentry) return; Path directory = getObjectDirectory(object); - if (config.cleanupFiles()) { + if (config.cleanOnDelete()) { if (Files.exists(directory)) { if (Files.isDirectory(directory)) { deleteDirectory(directory); @@ -270,6 +270,7 @@ public void removeObject(IFGObject object) { } } } + updateIndexFor(object); } public void loadServer() { @@ -576,10 +577,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i if (fgObject == null) { logger.warn("The " + fgCat.lName + " was unable to be created."); - if (FGConfigManager.getInstance().cleanupFiles()) { - logger.warn("Cleaning up unused files"); - deleteDirectory(directory); - } + cleanup(directory, true); } return Optional.ofNullable(fgObject); @@ -587,14 +585,14 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i public GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); - if(prettyPrint) builder.setPrettyPrinting(); + if (prettyPrint) builder.setPrettyPrinting(); return builder; } - public JsonWriter getJsonWriter(Writer out){ + public JsonWriter getJsonWriter(Writer out) { JsonWriter writer = new JsonWriter(out); - if(this.prettyPrint) writer.setIndent(this.gsonIndentString); + if (this.prettyPrint) writer.setIndent(this.gsonIndentString); return writer; } @@ -603,7 +601,17 @@ public JsonWriter getJsonWriter(Writer out){ return gsonIndentString; }*/ - + private void cleanup(Path directory, boolean errored) { + FGConfigManager manager = FGConfigManager.getInstance(); + if (errored) { + if (!manager.cleanOnError()) return; + logger.warn("Cleaning up errored object directory: " + directory); + } else { + if (!manager.cleanOnDelete()) return; + logger.info("Cleaning up directory of deleted object: " + directory); + } + autoPath(directory, false, true, true); + } private Path getFGDirectory() { if (fgDirectory != null) { @@ -646,6 +654,189 @@ private Path getWorldDirectory(World world) { return path; } + public boolean autoPath(Path path, boolean create, boolean empty, boolean force) { + boolean exists = Files.exists(path); + boolean notExists = Files.notExists(path); + + if (exists == notExists) { + logger.error("There was an unknown file IO error trying to access path: " + path); + return false; + } + + if (exists) { + boolean isDirectory = Files.isDirectory(path); + if (isDirectory) { + boolean isEmpty = isEmptyDirectory(path); + if (create) { + if (!empty || isEmpty) return true; + } else if (isEmpty) { + return tryOp(FileOp.DELETE_DIR, path); + } + try { + Files.walkFileTree(path, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + tryOpEx(FileOp.DELETE_FILE, file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + if (exc == null && !(create && Files.isSameFile(dir, path))) { + tryOpEx(FileOp.DELETE_DIR, dir); + } + return FileVisitResult.CONTINUE; + } + }); + return true; + } catch (IOException e) { + logger.error("There was an error while trying to recursively " + (create ? "clear" : "delete") + " the directory: " + path, e); + return false; + } + } else { + if (create) { + if (force) { + logger.warn("Replacing file with directory: " + path); + } else { + logger.error("Unable to create directory because there is a file at the path: " + path); + return false; + } + } else logger.info("Deleting file: " + path); + + boolean success = tryOp(FileOp.DELETE_FILE, path); + if (create && success) { + success = tryOp(FileOp.CREATE, path); + } + return success; + } + } else { + if (!create) return true; + + boolean multiple = false; + + Path parent = path.normalize().getParent(); + while (parent != null && Files.notExists(parent)) { + parent = parent.getParent(); + multiple = true; + } + if (parent != null && !Files.exists(parent)) { + logger.error("There was an unknown file IO error trying to access path: " + parent); + return false; + } + if (parent != null && Files.exists(parent) && !Files.isDirectory(parent)) { + if (force) { + logger.warn("Deleting file: " + parent + + "\nthat is in the way of directories: " + path); + } else { + logger.error("Unable to create directories: " + path + + "\nbecause there is a file at the path: " + parent); + return false; + } + tryOp(FileOp.DELETE_FILE, parent); + multiple = true; + } + if(multiple){ + tryOp(FileOp.CREATE_MULTI, path); + } else { + tryOp(FileOp.CREATE, path); + } + + + } + + +// boolean isDirectory = Files.isDirectory(path); +// +// if (!empty && exists && isDirectory && create) { +// return true; +// } +// +// boolean isEmpty = isEmptyDirectory(path); +// +// if (exists && isDirectory && create && isEmpty) { +// return true; +// } + return false; + } + + private boolean tryOp(FileOp op, Path path) { + try { + tryOpUnsafe(op, path); + return true; + } catch (IOException e) { + logger.error("There was an IO error " + op.message3 + ": " + path, e); + return false; + } + } + + private void tryOpEx(FileOp op, Path path) throws IOException { + try { + tryOpUnsafe(op, path); + } catch (IOException e) { + throw new IOException("There was an IO error " + op.message3 + ": " + path, e); + } + } + + private void tryOpUnsafe(FileOp op, Path path) throws IOException { + int counter = 1; + float time = 0.25f; + while (true) { + try { + op.operate(path); + break; + } catch (AccessDeniedException e) { + if (counter > 5) { + logger.error("Access denied while trying to " + op.message1 + ": " + path, e); + throw e; + } else { + logger.warn("Access denied while trying to " + op.message1 + ": " + path + " Trying again in " + time + " second(s)"); + try { + Thread.sleep((long) (1000 * time)); + } catch (InterruptedException e1) { + logger.warn("Thread sleep was interrupted: ", e); + } + } + } + counter++; + time *= 2; + } + logger.info(op.message2 + ": " + path); + } + + private enum FileOp { + CREATE("create directory", "Created directory", "creating the directory") { + @Override + public void operate(Path path) throws IOException { + Files.createDirectory(path); + } + }, CREATE_MULTI("create directories", "Created directories", "creating the directories") { + @Override + public void operate(Path path) throws IOException { + Files.createDirectories(path); + } + }, DELETE_DIR("delete directory", "Deleted directory", "deleting the directory") { + @Override + public void operate(Path path) throws IOException { + Files.delete(path); + } + }, DELETE_FILE("delete file", "Deleted file", "deleting the file") { + @Override + public void operate(Path path) throws IOException { + DELETE_DIR.operate(path); + } + }; + + String message1, message2, message3; + + FileOp(String message1, String message2, String message3) { + this.message1 = message1; + this.message2 = message2; + this.message3 = message3; + } + + abstract public void operate(Path path) throws IOException; + } + public void constructDirectories(Path directory) { LinkedList stack = new LinkedList<>(); Path dir = directory.normalize(); @@ -712,10 +903,22 @@ private void deleteDirectory(Path directory) { deleteDirectory(directory, false); } - private void deleteDirectory(Path directory, boolean innerOnly) { - FoxGuardMain.instance().getLogger().info("Deleting directory: " + directory); - if (Files.exists(directory) && Files.isDirectory(directory)) - try { + /** + * Deletes a directory recursively. + *

+ * If the boolean flag is set, this method attempts to return after leaving the filesystem + * with an empty directory at the parameter specified path. + * This includes doing functions such as deleting files and creating the directory if it doesn't already exist. + * + * @param directory the path at which to delete or prepare an empty directory + * @param makeEmpty whether to delete the directory or prepare and clear it (make it an empty directory). + */ + private void deleteDirectory(Path directory, boolean makeEmpty) { + if (Files.exists(directory)) { + if (makeEmpty && isEmptyDirectory(directory)) return; + FoxGuardMain.instance().getLogger().info((makeEmpty ? "Clearing" : "Deleting") + " directory: " + directory); + + if (Files.isDirectory(directory)) try { Files.walkFileTree(directory, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -730,7 +933,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - if (exc == null && !(innerOnly && Files.isSameFile(dir, directory))) { + if (exc == null && !(makeEmpty && Files.isSameFile(dir, directory))) { try { Files.delete(dir); logger.info("Deleted directory: " + dir); @@ -742,15 +945,23 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx } }); } catch (IOException e) { - logger.error("There was an error while trying to recursively delete the directory: " + directory, e); + logger.error("There was an error while trying to recursively " + (makeEmpty ? "clear" : "delete") + " the directory: " + directory, e); } - else if (Files.exists(directory)) { - logger.warn(directory + "is a file. A directory was expected. Deleting..."); - try { - Files.delete(directory); - } catch (IOException e) { - logger.error("There was an error deleting the file: " + directory, e); + else { + logger.warn(directory + "is a file. A directory was expected. Deleting..."); + try { + Files.delete(directory); + if (makeEmpty) { + logger.warn("Replacing file with empty directory instead."); + constructDirectory(directory); + } + } catch (IOException e) { + logger.error("There was an error deleting the file: " + directory, e); + } + } + } else if (makeEmpty) { + constructDirectory(directory); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/ExtraContext.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/ExtraContext.java index 9b983df..6129ad7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/ExtraContext.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/ExtraContext.java @@ -53,6 +53,7 @@ public boolean present(Class clazz) { return false; } + @SuppressWarnings("unchecked") public Optional first(Class clazz) { for (Object o : objects) { if (clazz.isInstance(o)) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 6c95d6f..a9ff82f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -36,8 +36,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; -import net.foxdenstudio.sponge.foxguard.plugin.object.owners.IOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.owners.OwnerProviderRegistry; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; @@ -107,7 +107,7 @@ public static String getObjectDisplayName(IFGObject object, boolean dispWorld, @ return object.getShortTypeName() + " : " + (dispWorld && object instanceof IWorldBound ? ((IWorldBound) object).getWorld().getName() + " : " : "") - + (hasOwner ? OwnerProviderRegistry.getInstance().getDisplayName(owner, null, viewer) + " : " : "") + + (hasOwner ? OwnerManager.getInstance().getDisplayName(owner, null, viewer) + " : " : "") + object.getName(); } public static Text getObjectDisplayTest(IFGObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { @@ -294,7 +294,7 @@ public static OwnerResult processUserInput(String input) throws CommandException else if (name.isEmpty()) throw new CommandException(Text.of("Name must not be empty!")); - Optional ownerOpt = OwnerProviderRegistry.getInstance().getUUIDForOwner(provider, ownerQualifier); + Optional ownerOpt = OwnerManager.getInstance().getUUIDForOwner(provider, ownerQualifier); if (!ownerOpt.isPresent()) { String errorName = (provider != null ? provider + ":" : "") + ownerQualifier; throw new CommandException(Text.of("\"" + errorName + "\" is not a valid owner!")); @@ -311,7 +311,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { String[] parts = input.split(":", 3); if (parts.length == 1) { if (prefixed) { - List list = OwnerProviderRegistry.getInstance().getProviders().stream() + List list = OwnerManager.getInstance().getProviders().stream() .map(IOwnerProvider::getPrimaryAlias) .filter(str -> str != null && !str.isEmpty()) .filter(new StartsWithPredicate(parts[0])) @@ -325,7 +325,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { return new OwnerTabResult("", parts[0], FGManager.SERVER_UUID); } } else if (parts.length == 2) { - OwnerProviderRegistry registry = OwnerProviderRegistry.getInstance(); + OwnerManager registry = OwnerManager.getInstance(); Optional providerOpt = registry.getProvider(parts[0]); if (providerOpt.isPresent()) { IOwnerProvider provider = providerOpt.get(); @@ -350,7 +350,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { } } else if (parts.length == 3) { - Optional providerOpt = OwnerProviderRegistry.getInstance().getProvider(parts[0]); + Optional providerOpt = OwnerManager.getInstance().getProvider(parts[0]); if (providerOpt.isPresent()) { IOwnerProvider provider = providerOpt.get(); Optional ownerOpt = provider.getOwnerUUID(parts[1]); From ba9e0567de6d871f4d396ad90adc29920fd62e28 Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Sat, 7 Apr 2018 03:29:57 -0700 Subject: [PATCH 24/30] Lots of changes. Added paths and stuff. Redoing owners because i messed up the first time. wheeeeeeeeeee --- .../sponge/foxguard/plugin/FGManager.java | 6 +- .../plugin/command/CommandCreate.java | 24 +-- .../plugin/command/CommandDelete.java | 10 +- .../plugin/command/CommandDetail.java | 10 +- .../plugin/command/CommandEnableDisable.java | 16 +- .../foxguard/plugin/command/CommandLink.java | 10 +- .../foxguard/plugin/command/CommandList.java | 10 +- .../plugin/command/CommandModify.java | 11 +- .../foxguard/plugin/command/CommandMove.java | 8 +- .../plugin/command/CommandPriority.java | 4 +- .../plugin/command/link/IExpression.java | 4 +- .../plugin/command/link/LinkageParser.java | 26 +-- .../plugin/event/FGUpdateObjectEvent.java | 4 +- .../foxguard/plugin/handler/HandlerBase.java | 4 +- .../foxguard/plugin/handler/IHandler.java | 10 +- .../plugin/listener/BlockChangeListener.java | 6 +- .../plugin/listener/DamageListener.java | 4 +- .../plugin/listener/ExplosionListener.java | 8 +- .../listener/InteractBlockListener.java | 4 +- .../listener/InteractEntityListener.java | 4 +- .../plugin/listener/PlayerMoveListener.java | 6 +- .../plugin/listener/SpawnEntityListener.java | 4 +- ...FGObjectBase.java => GuardObjectBase.java} | 5 +- .../foxguard/plugin/object/IFGObject.java | 159 +--------------- .../foxguard/plugin/object/IGuardObject.java | 171 ++++++++++++++++++ .../plugin/object/factory/IFGFactory.java | 4 +- .../object/path/FoxInvalidPathException.java | 21 +++ .../plugin/object/path/PathManager.java | 71 ++++++++ .../object/path/element/BasePathElement.java | 112 ++++++++++++ .../path/element/IModifiablePathElement.java | 43 +++++ .../object/path/element/IPathElement.java | 30 +++ .../object/path/element/OwnerPathElement.java | 85 +++++++++ .../path/owner/OwnerAdapterFactory.java | 20 ++ .../object/path/owner/OwnerTypeAdapter.java | 16 ++ .../owner/provider/PathOwnerProvider.java | 41 +++++ .../object/path/owner/types/NameOwner.java | 83 +++++++++ .../type => path/owner/types}/Owner.java | 21 ++- .../object/path/owner/types/UUIDOwner.java | 102 +++++++++++ .../foxguard/plugin/region/IRegion.java | 10 +- .../foxguard/plugin/region/RegionBase.java | 4 +- .../plugin/state/ControllersStateField.java | 8 +- .../plugin/state/HandlersStateField.java | 6 +- .../plugin/state/RegionsStateField.java | 8 +- .../plugin/storage/FGSObjectIndex.java | 4 +- .../plugin/storage/FGSObjectMeta.java | 4 +- .../plugin/storage/FGSObjectPath.java | 6 +- .../plugin/storage/FGStorageManagerNew.java | 55 +++--- .../sponge/foxguard/plugin/util/FGUtil.java | 26 +-- .../foxguard/plugin/util/FoxException.java | 23 +++ 49 files changed, 1006 insertions(+), 325 deletions(-) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{FGObjectBase.java => GuardObjectBase.java} (95%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxInvalidPathException.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner/type => path/owner/types}/Owner.java (72%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FoxException.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index fb4e67b..75c48d0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -38,7 +38,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; @@ -694,7 +694,7 @@ public void markDirty(IRegion region, RegionCache.DirtyType type) { regionCache.markDirty(region, type); } - public boolean removeObject(IFGObject object) { + public boolean removeObject(IGuardObject object) { if (object instanceof IRegion) return removeRegion(((IRegion) object)); else return object instanceof IHandler && removeHandler(((IHandler) object)); } @@ -753,7 +753,7 @@ public boolean removeWorldRegion(IWorldRegion region) { return removed; } - public boolean move(IFGObject object, @Nullable String newName, @Nullable UUID newOwner, @Nullable World newWorld) { + public boolean move(IGuardObject object, @Nullable String newName, @Nullable UUID newOwner, @Nullable World newWorld) { boolean changed = false, nameChanged = false, ownerChanged = false, worldChanged = false; String tryName = object.getName(); if (newName != null && !newName.isEmpty() && isNameValid(newName)) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index d316ca9..0ae28bf 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -36,7 +36,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; @@ -181,7 +181,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu } String finalBlock = num < 4 ? "" : parse.args[3]; - IFGObject object; + IGuardObject object; try { object = fgCat.create(name, type, finalBlock, source); } catch (CommandException e) { @@ -434,12 +434,12 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + public IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException { return FGFactoryManager.getInstance().createRegion(name, type, arguments, source); } @Override - public boolean add(IFGObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return object instanceof IRegion && FGManager.getInstance().addRegion(((IRegion) object), owner, world); } @@ -453,12 +453,12 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + public IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException { return FGFactoryManager.getInstance().createWorldRegion(name, type, arguments, source); } @Override - public boolean add(IFGObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return world != null && object instanceof IWorldRegion && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), owner, world); @@ -471,12 +471,12 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + public IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException { return FGFactoryManager.getInstance().createHandler(name, type, arguments, source); } @Override - public boolean add(IFGObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return object instanceof IHandler && FGManager.getInstance().addHandler(((IHandler) object), owner); } @@ -488,12 +488,12 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException { + public IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException { return FGFactoryManager.getInstance().createController(name, type, arguments, source); } @Override - public boolean add(IFGObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return HANDLER.add(object, owner, world); } }; @@ -517,8 +517,8 @@ public static FGCat from(String category) { public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); - public abstract IFGObject create(String name, String type, String arguments, CommandSource source) throws CommandException; + public abstract IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException; - public abstract boolean add(IFGObject object, UUID owner, @Nullable World world); + public abstract boolean add(IGuardObject object, UUID owner, @Nullable World world); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index 3a896af..e8d62b4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -34,7 +34,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; @@ -95,7 +95,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); - IFGObject object; + IGuardObject object; FGManager fgManager = FGManager.getInstance(); switch (fgCat) { case REGION: @@ -180,14 +180,14 @@ else if (parse.current.index == 1) { if (key && world != null) { return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() .filter(region -> !(region instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() .filter(region -> !(region instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); @@ -195,7 +195,7 @@ else if (parse.current.index == 1) { } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(handler -> !(handler instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index e7ab2bd..27208af 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -35,7 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; @@ -106,7 +106,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); - IFGObject object; + IGuardObject object; switch (fgCat) { case REGION: object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.containsKey("world"), parse.flags.get("world")); @@ -310,20 +310,20 @@ else if (parse.current.index == 1) { } if (key && world != null) { return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers(result.getOwner()).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index d3dac2a..8e7353d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -36,11 +36,10 @@ import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -58,7 +57,6 @@ import org.spongepowered.api.world.World; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -106,7 +104,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm return CommandResult.empty(); } - List objects = new ArrayList<>(); + List objects = new ArrayList<>(); FGCat cat = FGCat.OBJECT; if (parse.args.length > 0) { @@ -131,7 +129,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm String worldValue = parse.flags.get("world"); for (int i = 1; i < parse.args.length; i++) { FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[i]); - IFGObject object; + IGuardObject object; switch (cat) { case REGION: object = FGUtil.getRegionFromCommand(source, ownerResult, worldKey, worldValue); @@ -147,7 +145,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm int successes = 0; int failures = 0; - for (IFGObject object : objects) { + for (IGuardObject object : objects) { if (object instanceof GlobalWorldRegion || object instanceof GlobalHandler || object.isEnabled() == this.enableState) failures++; else { @@ -363,14 +361,14 @@ else if (parse.current.index > 0) { if (key && world != null) { return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); @@ -378,7 +376,7 @@ else if (parse.current.index > 0) { } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index d5a8e3f..eecedce 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -33,7 +33,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; @@ -145,13 +145,13 @@ public List getSuggestions(CommandSource source, String arguments, @Null } if (key && world != null) { return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); @@ -174,14 +174,14 @@ public List getSuggestions(CommandSource source, String arguments, @Null IRegion finalRegion = region; return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() .filter(handler -> !finalRegion.getLinks().contains(handler) && !(handler instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(tabResult.getToken())) .map(args -> parse.current.prefix + tabResult.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() .filter(handler -> !(handler instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(tabResult.getToken())) .map(args -> parse.current.prefix + tabResult.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index d891281..cfe10ae 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -30,13 +30,11 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; -import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandException; @@ -97,7 +95,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .build()); return CommandResult.empty(); } else { - List objects = new ArrayList<>(); + List objects = new ArrayList<>(); FGCat cat = FGCat.from(parse.args[0]); if (cat == null) throw new ArgumentParseException(Text.of("Not a valid category!"), parse.args[0], 0); @@ -213,7 +211,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(Text.of(TextColors.GREEN, "------- " + title + " -------\n")); objects.sort((o1, o2) -> o1.getName().compareToIgnoreCase(o2.getName())); - Iterator objectIterator = objects.iterator(); + Iterator objectIterator = objects.iterator(); for (int i = 0; i < skip; i++) { objectIterator.next(); } @@ -222,7 +220,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm builder.append(Text.of(TextColors.GRAY, TextStyles.ITALIC, "No objects found")); } while (objectIterator.hasNext() && count < number) { - IFGObject object = objectIterator.next(); + IGuardObject object = objectIterator.next(); String fullName = object.getOwner().toString() + ":" + object.getName(); if (source instanceof Player) { FGUtil.genStatePrefix(builder, object, source, hasControllers); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index dcec23f..c4e4c03 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -26,7 +26,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.command; import com.google.common.collect.ImmutableList; -import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; import net.foxdenstudio.sponge.foxcore.plugin.command.util.AdvCmdParser; import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; @@ -35,7 +34,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -96,7 +95,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.OwnerResult ownerResult = FGUtil.processUserInput(parse.args[1]); - IFGObject object; + IGuardObject object; switch (fgCat) { case REGION: object = FGUtil.getRegionFromCommand(source, ownerResult, parse.flags.containsKey("world"), parse.flags.get("world")); @@ -176,20 +175,20 @@ else if (parse.current.index == 1) { } if (key && world != null) { return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers(result.getOwner()).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java index ef048a4..3589437 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandMove.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; @@ -181,20 +181,20 @@ else if (parse.current.index == 1) { } if (world == null) return FGManager.getInstance().getRegions().stream() .filter(region -> !(region instanceof GlobalWorldRegion)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); return FGManager.getInstance().getAllRegions(world).stream() .filter(region -> !(region instanceof GlobalWorldRegion)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { return FGManager.getInstance().getHandlers().stream() .filter(region -> !(region instanceof GlobalHandler)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index b72b278..f1c9441 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -31,7 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.command.CommandException; @@ -124,7 +124,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null List selected = ImmutableList.copyOf(FGUtil.getSelectedHandlers(source)); return FGManager.getInstance().getHandlers(result.getOwner()).stream() .filter(handler -> !selected.contains(handler) && !(handler instanceof IGlobal)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .filter(alias -> !isIn(parse.args, alias)) .map(args -> parse.current.prefix + result.getPrefix() + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/IExpression.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/IExpression.java index 48da4a4..883aa9f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/IExpression.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/IExpression.java @@ -25,7 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.command.link; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import java.util.Set; @@ -34,7 +34,7 @@ */ public interface IExpression { - Set getValue(); + Set getValue(); Set getLinks(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java index 6fe071b..1f60b94 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/link/LinkageParser.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -98,19 +98,19 @@ else if (match.startsWith("%")) { } else if (expressionString.endsWith(" ")) { if (stage == Stage.START) { return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .sorted() .collect(Collectors.toList()); } else { return FGManager.getInstance().getHandlers().stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .sorted() .collect(Collectors.toList()); } } else if (expressionString.endsWith(token)) { if (token.startsWith("^")) { return FGManager.getInstance().getControllers().stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(token.substring(1))) .sorted() .map(str -> endPart + str.substring(token.length() - 1)) @@ -129,14 +129,14 @@ else if (match.startsWith("%")) { } else { if (stage == Stage.START) { return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(token)) .sorted() .map(str -> endPart + str.substring(token.length())) .collect(Collectors.toList()); } else { return FGManager.getInstance().getHandlers().stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(token)) .sorted() .map(str -> endPart + str.substring(token.length())) @@ -146,7 +146,7 @@ else if (match.startsWith("%")) { } } else { return FGManager.getInstance().getAllRegions(world).stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .sorted() .collect(Collectors.toList()); } @@ -210,7 +210,7 @@ else if (matcher.group().equals(">") && parentheses == 0) { private Set parseSegment(String segmentString, CommandSource source) { Set set = new LinkedHashSet<>(); - Set stubObjects = new LinkedHashSet<>(); + Set stubObjects = new LinkedHashSet<>(); Matcher matcher = PATTERN.matcher(segmentString); while (matcher.find()) { if (matcher.group().equals("(")) { @@ -266,9 +266,9 @@ private Set parseSegment(String segmentString, CommandSource source } @Override - public Set getValue() { + public Set getValue() { if (contents.size() > 0) { - Set set = new LinkedHashSet<>(); + Set set = new LinkedHashSet<>(); for (IExpression expression : contents.get(0)) { set.addAll(expression.getValue()); } @@ -320,13 +320,13 @@ public class Result { public class ExpressionStub implements IExpression { - Set set; + Set set; - public ExpressionStub(Set set) { + public ExpressionStub(Set set) { this.set = set; } - public Set getValue() { + public Set getValue() { return set; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/event/FGUpdateObjectEvent.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/event/FGUpdateObjectEvent.java index 43f9e05..3b3c9ab 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/event/FGUpdateObjectEvent.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/event/FGUpdateObjectEvent.java @@ -25,10 +25,10 @@ package net.foxdenstudio.sponge.foxguard.plugin.event; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; public interface FGUpdateObjectEvent extends FGUpdateEvent { - IFGObject getTarget(); + IGuardObject getTarget(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index 1589e4b..dc11ebb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -25,10 +25,10 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; -import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectBase; +import net.foxdenstudio.sponge.foxguard.plugin.object.GuardObjectBase; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; -public abstract class HandlerBase extends FGObjectBase implements IHandler { +public abstract class HandlerBase extends GuardObjectBase implements IHandler { int priority; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java index c3ce423..afaf7ee 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java @@ -27,20 +27,26 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.living.player.User; import javax.annotation.Nullable; import java.util.Comparator; -public interface IHandler extends IFGObject { +public interface IHandler extends IGuardObject { Comparator PRIORITY = (h1, h2) -> h2.getPriority() - h1.getPriority(); + String SUFFIX = "h"; EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra); int getPriority(); void setPriority(int priority); + + @Override + default String getPathSuffix() { + return SUFFIX; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index 356b365..0647f24 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.block.BlockSnapshot; import org.spongepowered.api.block.BlockTypes; @@ -106,7 +106,7 @@ public void handle(ChangeBlockEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } else { FGManager.getInstance().getRegionsAtMultiLocI( @@ -114,7 +114,7 @@ public void handle(ChangeBlockEvent event) throws Exception { .map(trans -> trans.getOriginal().getLocation().get()) .collect(Collectors.toList()) ).forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } Tristate flagState = UNDEFINED; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index a83c3bd..b17c14e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -31,7 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.hanging.Hanging; @@ -100,7 +100,7 @@ public void handle(DamageEntityEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); Tristate flagState = UNDEFINED; boolean invincible = false; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java index d8ae90c..d081c54 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/ExplosionListener.java @@ -31,7 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.explosive.Explosive; import org.spongepowered.api.entity.living.player.Player; @@ -93,7 +93,7 @@ public void handle(ExplosionEvent event) throws Exception { .map(trans -> trans.getOriginal().getLocation().get()) .collect(Collectors.toList()) ).forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } else if (event instanceof ExplosionEvent.Detonate) { flags.set(DETONATE); @@ -105,7 +105,7 @@ public void handle(ExplosionEvent event) throws Exception { FGManager.getInstance().getRegionsAtMultiLocI(locations) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } else if (event instanceof ExplosionEvent.Pre) { @@ -116,7 +116,7 @@ public void handle(ExplosionEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } Tristate flagState = Tristate.UNDEFINED; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java index eab0bdd..a689681 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractBlockListener.java @@ -30,7 +30,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.block.BlockSnapshot; import org.spongepowered.api.block.BlockTypes; @@ -85,7 +85,7 @@ public void handle(InteractBlockEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .filter(handler -> !handlerSet.contains(handler)) .forEach(handlerSet::add)); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index 80b3d2f..f14ff8d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -30,7 +30,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.hanging.Hanging; @@ -110,7 +110,7 @@ public void handle(InteractEntityEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .filter(handler -> !handlerSet.contains(handler)) .forEach(handlerSet::add)); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 5f1e93d..7802501 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -34,7 +34,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -133,7 +133,7 @@ public void handle(MoveEntityEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, from).stream() .filter(region -> region.contains(from, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .filter(handler -> !temp.contains(handler)) .forEach(temp::add)); } else { @@ -144,7 +144,7 @@ public void handle(MoveEntityEvent event) throws Exception { .forEach(region -> { if (regionHUD) regionList.add(region); region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .filter(handler -> !toList.contains(handler)) .forEach(toList::add); }); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index e1c825a..d656907 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -31,7 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagBitSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.hanging.Hanging; @@ -115,7 +115,7 @@ public void handle(SpawnEntityEvent event) throws Exception { FGManager.getInstance().getRegionsInChunkAtPos(world, pos).stream() .filter(region -> region.contains(pos, world)) .forEach(region -> region.getLinks().stream() - .filter(IFGObject::isEnabled) + .filter(IGuardObject::isEnabled) .forEach(handlerSet::add)); } Tristate flagState = Tristate.UNDEFINED; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java similarity index 95% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java index 75affbd..99f5b86 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java @@ -26,17 +26,16 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import org.jetbrains.annotations.NotNull; import java.util.UUID; -public abstract class FGObjectBase implements IFGObject { +public abstract class GuardObjectBase implements IGuardObject { protected String name; protected UUID owner; protected boolean enabled = true; - public FGObjectBase(FGObjectData data) { + public GuardObjectBase(FGObjectData data) { String name = data.getName(); this.name = (name == null || name.isEmpty()) ? "null" : name; UUID owner = data.getOwner(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 8f959e0..993dae4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -1,58 +1,11 @@ -/* - * This file is part of FoxGuard, licensed under the MIT License (MIT). - * - * Copyright (c) gravityfox - https://gravityfox.net/ - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - package net.foxdenstudio.sponge.foxguard.plugin.object; -import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; -import net.foxdenstudio.sponge.foxcore.plugin.util.IModifiable; -import net.foxdenstudio.sponge.foxguard.plugin.command.CommandDetail; -import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; -import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; -import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; -import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; -import org.spongepowered.api.command.CommandException; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.text.Text; -import org.spongepowered.api.world.Location; -import org.spongepowered.api.world.World; - -import javax.annotation.Nullable; -import java.nio.file.Path; import java.util.Comparator; -import java.util.List; import java.util.UUID; -/** - * Interface for all FoxGuard Objects. Inherited by {@link IRegion Regions}, {@link IWorldRegion World Regions}, - * and {@link IHandler Handlers}. - * Essentially the core of the code, this is the most used interface. - */ -public interface IFGObject extends IModifiable { +public interface IFGObject { - Comparator OWNER_AND_NAME = (o1,o2)->{ + Comparator OWNER_AND_NAME = (o1, o2) -> { int ret = o1.getOwner().compareTo(o2.getOwner()); if (ret != 0) return ret; return o1.getName().compareToIgnoreCase(o2.getName()); @@ -76,111 +29,5 @@ public interface IFGObject extends IModifiable { void setOwner(UUID owner); - /** - * Gets the short direction name for this object. It should be around four letters. It should be human readable. - * It is used in object lists, such as when using the list or detail commands. - * - * @return The human readable short direction name. - */ - String getShortTypeName(); - - /** - * Gets the long direction name for this object. It should be human readable. Avoid abbreviating. - * It is used in the general information section of the detail command. - * - * @return The human readable long direction name. - */ - String getLongTypeName(); - - /** - * Gets the unique ID for this object. It should be alphabetic only. This return must be static. - * This is used for SQL storage. It is the same identifier used in the object factories. This return should be static. - * - * @return The unique identifier for this direction of object. - */ - String getUniqueTypeString(); - - /** - * Returns whether this object is enabled or disabled. - * - * @return Enable status. - */ - boolean isEnabled(); - - /** - * Sets the enable status of this object. - * - * @param state - */ - void setEnabled(boolean state); - - /** - * Gets the details for the object as a SpongeAPI {@link Text} Object. Used in the {@link CommandDetail Detail} command. - * Should be dynamically generated with formatted text. Multiple lines are allowed. - * Any arguments leftover from the detail command are passed to the detail method. - * This allows specific queries in case there is more data stored than can reasonably displayed. - * It is recommended to have click actions wherever possible to ease the configuration of objects. - * - * @param source - * @param arguments The extra arguments from the {@link CommandDetail Detail} command. Object should still return something meaningful if this is empty. - * @return A {@link Text} object that provides meaningful information about the object. - */ - Text details(CommandSource source, String arguments); - - List detailsSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition); - - /** - * Called when the object is being saved. - * It is completely up to the object how it wants to save itself. - * The only requirement is that it stays within its own directory and is able to load itself later. - * - * @param directory The directory for this object to save to. - */ - void save(Path directory); - - /** - * Specifies whether FoxGuard should try saving this object. - * This simply involves saving the object to a list, creating a metadata file, - * and then calling {@link IFGObject#save(Path)} - *

- * This should be set to false only when an object already employs some other method of persistence, or simply does not require it. - * This will often be the case if another plugin is hooking into FoxGuard and using an object as a kind of API accessor. - * These object are either transient, or have their own methods of persistence. - *

- * When set to false, FoxGuard will save this object, meaning it will not be loaded on the next server start, - * which means the object must be re-added by some other means, or not at all. - * - * @return Whether FoxGuard should auto-save this object. - */ - @SuppressWarnings("SameReturnValue") - default boolean autoSave() { - return true; - } - - /** - * This method is called when the modify command is used to try to modify an object. - * This method is essentially a command handler that does a specific job. - *

- * The only really important thing to note is that it is (REALLY) important that an object report a modify result of success if and only if the object was actually modified. - * "Actually modified" implies that the object needs to be saved again. - *

- * This contract is less important if an object implements the {@link IFGObject#shouldSave()} method. - * - * @param source The {@link CommandSource} of the modify command - * @param arguments The {@link String} arguments specifically for this object - * @return the result of the operation. The success flag should be true if and only if the object was changed in some way. - * @throws CommandException If there is an issue parsing the command. - */ - - @Override - ProcessResult modify(CommandSource source, String arguments) throws CommandException; - - default boolean shouldSave() { - return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); - } - - default String getFullName(){ - return FGUtil.getFullName(this); - } - + String getFullName(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java new file mode 100644 index 0000000..21fab91 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java @@ -0,0 +1,171 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.object; + +import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; +import net.foxdenstudio.sponge.foxcore.plugin.util.IModifiable; +import net.foxdenstudio.sponge.foxguard.plugin.command.CommandDetail; +import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; +import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; +import org.spongepowered.api.command.CommandException; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import javax.annotation.Nullable; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; + +/** + * Interface for all FoxGuard Objects. Inherited by {@link IRegion Regions}, {@link IWorldRegion World Regions}, + * and {@link IHandler Handlers}. + * Essentially the core of the code, this is the most used interface. + */ +public interface IGuardObject extends IModifiable, IFGObject { + + /** + * Gets the short direction name for this object. It should be around four letters. It should be human readable. + * It is used in object lists, such as when using the list or detail commands. + * + * @return The human readable short direction name. + */ + String getShortTypeName(); + + /** + * Gets the long direction name for this object. It should be human readable. Avoid abbreviating. + * It is used in the general information section of the detail command. + * + * @return The human readable long direction name. + */ + String getLongTypeName(); + + /** + * Gets the unique ID for this object. It should be alphabetic only. This return must be static. + * This is used for SQL storage. It is the same identifier used in the object factories. This return should be static. + * + * @return The unique identifier for this direction of object. + */ + String getUniqueTypeString(); + + /** + * Returns whether this object is enabled or disabled. + * + * @return Enable status. + */ + boolean isEnabled(); + + /** + * Sets the enable status of this object. + * + * @param state + */ + void setEnabled(boolean state); + + /** + * Gets the details for the object as a SpongeAPI {@link Text} Object. Used in the {@link CommandDetail Detail} command. + * Should be dynamically generated with formatted text. Multiple lines are allowed. + * Any arguments leftover from the detail command are passed to the detail method. + * This allows specific queries in case there is more data stored than can reasonably displayed. + * It is recommended to have click actions wherever possible to ease the configuration of objects. + * + * @param source + * @param arguments The extra arguments from the {@link CommandDetail Detail} command. Object should still return something meaningful if this is empty. + * @return A {@link Text} object that provides meaningful information about the object. + */ + Text details(CommandSource source, String arguments); + + List detailsSuggestions(CommandSource source, String arguments, @Nullable Location targetPosition); + + /** + * Called when the object is being saved. + * It is completely up to the object how it wants to save itself. + * The only requirement is that it stays within its own directory and is able to load itself later. + * + * @param directory The directory for this object to save to. + */ + void save(Path directory); + + /** + * Specifies whether FoxGuard should try saving this object. + * This simply involves saving the object to a list, creating a metadata file, + * and then calling {@link IGuardObject#save(Path)} + *

+ * This should be set to false only when an object already employs some other method of persistence, or simply does not require it. + * This will often be the case if another plugin is hooking into FoxGuard and using an object as a kind of API accessor. + * These object are either transient, or have their own methods of persistence. + *

+ * When set to false, FoxGuard will save this object, meaning it will not be loaded on the next server start, + * which means the object must be re-added by some other means, or not at all. + * + * @return Whether FoxGuard should auto-save this object. + */ + @SuppressWarnings("SameReturnValue") + default boolean autoSave() { + return true; + } + + /** + * This method is called when the modify command is used to try to modify an object. + * This method is essentially a command handler that does a specific job. + *

+ * The only really important thing to note is that it is (REALLY) important that an object report a modify result of success if and only if the object was actually modified. + * "Actually modified" implies that the object needs to be saved again. + *

+ * This contract is less important if an object implements the {@link IGuardObject#shouldSave()} method. + * + * @param source The {@link CommandSource} of the modify command + * @param arguments The {@link String} arguments specifically for this object + * @return the result of the operation. The success flag should be true if and only if the object was changed in some way. + * @throws CommandException If there is an issue parsing the command. + */ + + @Override + ProcessResult modify(CommandSource source, String arguments) throws CommandException; + + default boolean shouldSave() { + return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); + } + + /** + * Gets the path suffix when storing references in paths. + * This allows objects of completely disparate types to be stored under the same name. + * Any types that share any hierarchy or can otherwise be used in place of another should have the same suffix. + * @return the path suffix. + */ + String getPathSuffix(); + + @Override + default String getFullName(){ + return FGUtil.getFullName(this); + } + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java index 735937c..d85f9f2 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/factory/IFGFactory.java @@ -25,7 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.factory; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.world.Location; @@ -36,7 +36,7 @@ public interface IFGFactory { - IFGObject create(String name, String arguments, CommandSource source) throws CommandException; + IGuardObject create(String name, String arguments, CommandSource source) throws CommandException; String[] getAliases(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxInvalidPathException.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxInvalidPathException.java new file mode 100644 index 0000000..db9a6b2 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxInvalidPathException.java @@ -0,0 +1,21 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path; + +import net.foxdenstudio.sponge.foxguard.plugin.util.FoxException; + +import java.util.List; + +public class FoxInvalidPathException extends FoxException { + + public FoxInvalidPathException(String element, String prefix, List path) { + super(); + } + + private static String message(String element, String prefix, List path){ + StringBuilder pathString = new StringBuilder(prefix).append(path.get(0)); + for (int i = 1; i < path.size(); i++) { + pathString.append("/").append(path.get(i)); + } + return "Element \"" + element+ "\" in path \"" + pathString.toString() + "\" " + + "is invalid" ; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java index 7461473..d620ad1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -1,5 +1,16 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; +import com.google.gson.TypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.NameOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; + +import java.util.HashMap; +import java.util.Map; + /** * Created by fox on 3/7/18. */ @@ -11,5 +22,65 @@ public static PathManager getInstance() { } private PathManager() { + registerOwnerType(UUIDOwner.TYPE, UUIDOwner.class, + UUIDOwner.Adapter::new, + UUIDOwner.PathProvider::new); + registerOwnerType(NameOwner.TYPE, NameOwner.class, + NameOwner.Adapter::new, + NameOwner.PathProvider::new); + } + + private Map> typeClassMap = new HashMap<>(); + private Map, OwnerAdapterFactory> adapterMap = new HashMap<>(); + private Map, PathOwnerProvider.Factory> literalPathProviderMap = new HashMap<>(); + + public boolean registerOwnerType( + String type, + Class tClass, + OwnerAdapterFactory adapterFactory, + PathOwnerProvider.Factory pathProviderFactory) { + if (this.typeClassMap.containsKey(type)) return false; + this.typeClassMap.put(type, tClass); + this.adapterMap.put(tClass, adapterFactory); + this.literalPathProviderMap.put(tClass, pathProviderFactory); + return true; + } + + @SuppressWarnings("unchecked") + public TypeAdapter getOwnerTypeAdapter(Class tClass) { + return (TypeAdapter) this.adapterMap.get(tClass); + } + + @SuppressWarnings("unchecked") + public PathOwnerProvider.Factory getLiteralPathOwnerProvider(Class tClass) { + return (PathOwnerProvider.Factory) this.literalPathProviderMap.get(tClass); + } + + public PathOwnerProvider.Factory getLiteralPathOwnerProvider(String type) { + return this.getLiteralPathOwnerProvider(this.typeClassMap.get(type)); + } + + public PathResult process(String input) { + + + return null; + } + + enum RootPaths { + ; + + IPathElement path; + + RootPaths() { + + } + } + + public static class PathResult { + String objectName; + boolean objectPresent; + + IPathElement pathElement; + boolean pathPresent; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java new file mode 100644 index 0000000..e8e203b --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java @@ -0,0 +1,112 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import org.spongepowered.api.util.GuavaCollectors; + +import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +public class BasePathElement implements IModifiablePathElement { + + IModifiablePathElement parent; + Map children; + Map objects; + + public BasePathElement(@Nonnull IModifiablePathElement parent) { + this.parent = parent; + } + + /** + * Protected constructor that does not set a parent. + * While regular instances should always have a parent of some kind, + */ + protected BasePathElement() { + } + + @Override + public Optional resolve(String name, boolean create) { + IPathElement ret = this.children.get(name); + if (ret == null && create) { + ret = new BasePathElement(this); + this.children.put(name, ret); + } + return Optional.ofNullable(ret); + } + + @Override + public boolean addChild(String name, IPathElement path) { + IPathElement prev = this.children.get(name); + if (prev != null) return prev == path; + + this.children.put(name, path); + return true; + } + + @Override + public Optional get(String name) { + return this.objects.get(name); + } + + @Override + public Collection getPathSuggestions() { + return this.children.entrySet().stream() + .filter(e->e.getValue().isPersistent()) + .map(Map.Entry::getKey) + .sorted() + .collect(GuavaCollectors.toImmutableList()); + } + + @Override + public Map getObjects() { + return ImmutableMap.copyOf(this.objects); + } + + @Override + public boolean isPersistent() { + for (IPathElement child : this.children.values()) { + if (child.isPersistent()) return true; + } + return false; + } + + @Override + public boolean add(IGuardObject object, String name, boolean genExtension) { + String keyName = name; + if (genExtension) { + keyName += "." + object.getPathSuffix(); + } + if (this.objects.containsKey(keyName)) return false; + + this.objects.put(keyName, object); + + return true; + } + + @Override + public boolean remove(IGuardObject object) { + return this.objects.values().remove(object); + } + + @Override + public boolean remove(IPathElement path) { + return this.children.values().remove(path); + } + + @Override + public IModifiablePathElement getParent() { + return this.parent; + } + + @Override + public boolean setParent(IModifiablePathElement path, String newName) { + if (!path.addChild(newName, this)) return false; + if (!this.parent.remove(this)) { + path.remove(this); + return false; + } + return true; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java new file mode 100644 index 0000000..e1e0aac --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java @@ -0,0 +1,43 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; + +import java.util.Optional; + +public interface IModifiablePathElement extends IPathElement { + + @Override + default Optional resolve(String name) { + return resolve(name, false); + } + + Optional resolve(String name, boolean create); + + boolean addChild(String name, IPathElement path); + + default boolean add(IGuardObject object) { + return add(object, object.getName()); + } + + default boolean add(IGuardObject object, String name) { + return add(object, name, true); + } + + /** + * Adds object to this path with alternate name. + * The genExtension flag controls whether the type extension should be automatically generated. + * + * @param object the object to add. + * @param name + * @param genExtension + * @return + */ + boolean add(IGuardObject object, String name, boolean genExtension); + + boolean remove(IGuardObject object); + + boolean remove(IPathElement path); + + boolean setParent(IModifiablePathElement path, String newName); + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java new file mode 100644 index 0000000..76fe620 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java @@ -0,0 +1,30 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.FoxInvalidPathException; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +public interface IPathElement { + + Optional resolve(String name) throws FoxInvalidPathException; + + Optional get(String name); + + Collection getPathSuggestions(); + + Map getObjects(); + + /** + * Check whether this is still persistent. + * Paths that are no longer persistent don't lead to anything, + * and can be excluded from suggestions and serialization. + * + * @return Whether this path should continue to persist. + */ + boolean isPersistent(); + + IPathElement getParent(); +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java new file mode 100644 index 0000000..bc74712 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java @@ -0,0 +1,85 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; + +import java.util.*; + +public class OwnerPathElement implements IPathElement { + + private static final PathManager manager = PathManager.getInstance(); + + private final String prefix; + private final List currentPath; + private final String group; + private final String type; + private final OwnerPathElement parent; + private final PathOwnerProvider provider; + + public OwnerPathElement(String prefix) { + this.prefix = prefix; + this.currentPath = new ArrayList<>(); + this.group = null; + this.type = null; + this.parent = null; + this.provider = null; + } + + private OwnerPathElement(OwnerPathElement parent, String next) { + this.prefix = parent.prefix; + this.parent = parent; + this.currentPath = new ArrayList<>(parent.currentPath); + this.currentPath.add(next); + int size = this.currentPath.size(); + this.group = size > 0 ? this.currentPath.get(0) : null; + this.type = size > 1 ? this.currentPath.get(1) : null; + this.provider = size > 1 ? manager.getLiteralPathOwnerProvider(this.type).get() : null; + for (int i = 2; i < size; i++) { + String element = this.currentPath.get(i); + this.provider.apply(element); + } + } + + @Override + public Optional resolve(String name) { + return Optional.of(new OwnerPathElement(this, name)); + } + + @Override + public Optional get(String name) { + if(!this.provider.isValid()) return Optional.empty(); + + // TODO actually lookup the object + + return Optional.empty(); + } + + @Override + public Collection getPathSuggestions() { + return this.provider.getSuggestions(); + } + + @Override + public Map getObjects() { + if(!this.provider.isValid()) return ImmutableMap.of(); + + // TODO actually lookup the object + + return ImmutableMap.of(); + } + + @Override + public boolean isPersistent() { + + // TODO actually lookup the object + return false; + } + + @Override + public IPathElement getParent() { + return this.parent; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java new file mode 100644 index 0000000..99097fd --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java @@ -0,0 +1,20 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; + +import java.util.function.BiFunction; + +/** + * Interface for adapter factory. This class does not normally need to be fully implemented, + * as a method reference to a single {@code String} arg constructor is usually sufficient. + * + * @param The type of the owner this factory is supposed to generate adapters for + */ +public interface OwnerAdapterFactory extends BiFunction> { + + @Override + OwnerTypeAdapter apply(String group, Gson gson); + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java new file mode 100644 index 0000000..de83c93 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java @@ -0,0 +1,16 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; + +public abstract class OwnerTypeAdapter extends TypeAdapter { + + public final String group; + protected final Gson gson; + + protected OwnerTypeAdapter(String group, Gson gson) { + this.group = group; + this.gson = gson; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java new file mode 100644 index 0000000..f5629d7 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java @@ -0,0 +1,41 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider; + +import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.Supplier; + +public interface PathOwnerProvider { + + boolean apply(String element); + + default Collection getSuggestions() { + return this.getSuggestions(this.numApplied()); + } + + default Collection getSuggestions(int index) { + return ImmutableList.of(); + } + + int numApplied(); + + boolean isValid(); + + int minimumElements(); + + Optional getOwner(String group); + + /** + * Interface for Provider factory. This class does not normally need to be fully implemented, + * as a method reference to a no-args constructor is usually sufficient. + * + * @param + */ + interface Factory extends Supplier> { + + @Override + PathOwnerProvider get(); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java new file mode 100644 index 0000000..4878219 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java @@ -0,0 +1,83 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +public class NameOwner extends Owner { + + public static final String TYPE = "name"; + + String name; + + protected NameOwner(String group, String name) { + super(TYPE, group); + } + + @Override + public Path getPartialDirectory() { + return Paths.get(name); + } + + public static class Adapter extends OwnerTypeAdapter { + + public Adapter(String group, Gson gson) { + super(group, gson); + } + + @Override + public void write(JsonWriter out, NameOwner value) throws IOException { + + } + + @Override + public NameOwner read(JsonReader in) throws IOException { + return null; + } + } + + public static class PathProvider implements PathOwnerProvider { + + String name = null; + boolean valid = false; + int count = 0; + + @Override + public boolean apply(String element) { + valid = true; + if (count++ == 0 && element != null && !element.isEmpty()) { + name = element; + return true; + } + valid = false; + return false; + } + + @Override + public int numApplied() { + return count; + } + + @Override + public boolean isValid() { + return valid; + } + + @Override + public int minimumElements() { + return 1; + } + + @Override + public Optional getOwner(String group) { + return this.valid ? Optional.of(new NameOwner(group, this.name)) : Optional.empty(); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java similarity index 72% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java index 284f209..c2941c6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/type/Owner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java @@ -1,4 +1,4 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.type; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; import com.google.gson.Gson; import com.google.gson.JsonElement; @@ -10,6 +10,7 @@ import java.io.IOException; import java.nio.file.Path; +import java.nio.file.Paths; /** * Created by fox on 3/4/18. @@ -17,18 +18,26 @@ public abstract class Owner { private final String type; + private final String group; - protected Owner(String type){ + protected Owner(String type, String group) { this.type = type; + this.group = group; } - public String getType(){ + public String getType() { return this.type; } - public abstract Path getPath(); + public String getGroup() { + return this.group; + } + + public Path getDirectory() { + return Paths.get(group, type).resolve(getPartialDirectory()); + } - protected abstract void serializeData(JsonWriter out); + public abstract Path getPartialDirectory(); public static class Adapter extends TypeAdapter { @@ -55,7 +64,7 @@ public static class AdapterFactory implements TypeAdapterFactory { @SuppressWarnings("unchecked") @Override public TypeAdapter create(Gson gson, TypeToken type) { - if(!Owner.class.isAssignableFrom(type.getRawType())) return null; + if (!Owner.class.isAssignableFrom(type.getRawType())) return null; TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); Adapter adapter = new Adapter(jsonElementTypeAdapter); return (TypeAdapter) adapter; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java new file mode 100644 index 0000000..a3cca80 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java @@ -0,0 +1,102 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; +import java.util.UUID; + +public class UUIDOwner extends Owner { + + public static final String TYPE = "uuid"; + public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; + + UUID uuid; + + public UUIDOwner(String group, UUID uuid) { + super(TYPE, group); + this.uuid = uuid; + } + + @Override + public Path getPartialDirectory() { + return Paths.get(uuid.toString()); + } + + public static class Adapter extends OwnerTypeAdapter { + + public Adapter(String group, Gson gson) { + super(group, gson); + } + + @Override + public void write(JsonWriter out, UUIDOwner value) throws IOException { + + } + + @Override + public UUIDOwner read(JsonReader in) throws IOException { + return null; + } + } + + public static class PathProvider implements PathOwnerProvider { + + UUID uuid = null; + boolean valid = false; + int count = 0; + + @SuppressWarnings("Duplicates") + @Override + public boolean apply(String element) { + valid = true; + if (count++ == 0) { + if (element != null && !element.isEmpty()) { + if (element.matches(UUID_REGEX)) { + uuid = UUID.fromString(element); + return true; + } else { + element = element.replace("-", ""); + if (element.matches("[\\da-f]{32}")) { + element = element.substring(0, 8) + "-" + + element.substring(8, 12) + "-" + + element.substring(12, 16) + "-" + + element.substring(16, 20) + "-" + + element.substring(20, 32); + uuid = UUID.fromString(element); + return true; + } + } + } + } + valid = false; + return false; + } + + @Override + public int numApplied() { + return count; + } + + @Override + public boolean isValid() { + return valid; + } + + @Override + public int minimumElements() { + return 1; + } + + @Override + public Optional getOwner(String group) { + return this.valid ? Optional.of(new UUIDOwner(group, uuid)) : Optional.empty(); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java index 7d2bce3..26a0ceb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java @@ -27,7 +27,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.util.IBounded; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import java.util.Set; @@ -35,7 +35,9 @@ /** * Created by Fox on 3/29/2016. */ -public interface IRegion extends IFGObject, ILinkable, IBounded { +public interface IRegion extends IGuardObject, ILinkable, IBounded { + + String SUFFIX = "r"; @Override Set getLinks(); @@ -45,4 +47,8 @@ default boolean saveLinks() { return true; } + @Override + default String getPathSuffix() { + return SUFFIX; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java index 463dc12..69ef2eb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/RegionBase.java @@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableSet; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectBase; +import net.foxdenstudio.sponge.foxguard.plugin.object.GuardObjectBase; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import net.foxdenstudio.sponge.foxguard.plugin.util.RegionCache; @@ -36,7 +36,7 @@ import java.util.HashSet; import java.util.Set; -public abstract class RegionBase extends FGObjectBase implements IRegion { +public abstract class RegionBase extends GuardObjectBase implements IRegion { private final Set handlers; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java index 86a898a..737f9bf 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.state.SourceState; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -121,14 +121,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N if (parse.args[0].equals("add")) { return FGManager.getInstance().getControllers().stream() .filter(handler -> !this.list.contains(handler)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .sorted(String.CASE_INSENSITIVE_ORDER) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.args[0].equals("remove")) { return this.list.stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); @@ -240,7 +240,7 @@ public List removeSuggestions(CommandSource source, String arguments) th if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.ARGUMENT)) { if (parse.current.index == 0) return this.list.stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .collect(GuavaCollectors.toImmutableList()); } else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.COMPLETE)) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java index 8f706fd..2fd94e6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.state.SourceState; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; @@ -121,14 +121,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N if (parse.args[0].equals("add")) { return FGManager.getInstance().getHandlers().stream() .filter(handler -> !this.list.contains(handler)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .sorted(String.CASE_INSENSITIVE_ORDER) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); } else if (parse.args[0].equals("remove")) { return this.list.stream() - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java index 61cb7d5..2d532d6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java @@ -32,7 +32,7 @@ import net.foxdenstudio.sponge.foxcore.plugin.state.ListStateFieldBase; import net.foxdenstudio.sponge.foxcore.plugin.state.SourceState; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -151,14 +151,14 @@ public List modifySuggestions(CommandSource source, String arguments, @N if (parse.args[0].equals("add")) { if (world == null) return FGManager.getInstance().getRegions().stream() .filter(region -> !this.list.contains(region)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .sorted(String.CASE_INSENSITIVE_ORDER) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); else return FGManager.getInstance().getAllRegions(world).stream() .filter(region -> !this.list.contains(region)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .sorted(String.CASE_INSENSITIVE_ORDER) .map(args -> parse.current.prefix + args) @@ -167,7 +167,7 @@ public List modifySuggestions(CommandSource source, String arguments, @N final World finalWorld = world; return this.list.stream() .filter(region -> !(region instanceof IWorldRegion) || finalWorld != null && ((IWorldRegion) region).getWorld().equals(finalWorld)) - .map(IFGObject::getName) + .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) .map(args -> parse.current.prefix + args) .collect(GuavaCollectors.toImmutableList()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java index 4ee6831..f18f2e2 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java @@ -26,7 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import java.util.List; @@ -53,7 +53,7 @@ public FGSObjectIndex(String name, UUID owner, String category, String type, Boo public FGSObjectIndex() { } - public FGSObjectIndex(IFGObject object) { + public FGSObjectIndex(IGuardObject object) { super(object); this.enabled = object.isEnabled(); if (object instanceof IHandler) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java index 35bfe73..4599d1b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java @@ -25,7 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import java.util.UUID; @@ -48,7 +48,7 @@ public FGSObjectMeta(String name, UUID owner, String category, String type) { public FGSObjectMeta() { } - public FGSObjectMeta(IFGObject object) { + public FGSObjectMeta(IGuardObject object) { super(object); this.category = FGUtil.getCategory(object); this.type = object.getUniqueTypeString(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java index 66449c6..2f09a77 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java @@ -26,7 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import java.util.UUID; @@ -37,7 +37,7 @@ public class FGSObjectPath { String name; UUID owner; - transient IFGObject object; + transient IGuardObject object; public FGSObjectPath() { this.owner = FGManager.SERVER_UUID; @@ -48,7 +48,7 @@ public FGSObjectPath(String name, UUID owner) { this.owner = owner == null ? FGManager.SERVER_UUID : owner; } - public FGSObjectPath(IFGObject object) { + public FGSObjectPath(IGuardObject object) { this( object.getName(), object.getOwner() diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 28918f9..8850d3a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -43,6 +43,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; @@ -85,7 +86,7 @@ public class FGStorageManagerNew { private static final Type INDEX_LIST_TYPE = new TypeToken>() { }.getType(); private static FGStorageManagerNew instance; - public final HashMap defaultModifiedMap; + public final HashMap defaultModifiedMap; private final FGConfigManager config; private final UserStorageService userStorageService; private final Logger logger = FoxGuardMain.instance().getLogger(); @@ -102,8 +103,8 @@ private FGStorageManagerNew() { config = FGConfigManager.getInstance(); userStorageService = FoxGuardMain.instance().getUserStorage(); defaultModifiedMap = new CacheMap<>((k, m) -> { - if (k instanceof IFGObject) { - m.put((IFGObject) k, true); + if (k instanceof IGuardObject) { + m.put((IGuardObject) k, true); return true; } else return null; }); @@ -147,7 +148,7 @@ public void saveWorldRegionIndex(World world) { saveIndex(worldRegions, file); } - private void saveIndex(Set objects, Path file) { + private void saveIndex(Set objects, Path file) { List indexList = new ArrayList<>(); objects.stream().sorted(IFGObject.OWNER_AND_NAME).forEach(object -> { boolean saveLinks = (object instanceof ILinkable && ((ILinkable) object).saveLinks()); @@ -170,7 +171,7 @@ private void saveIndex(Set objects, Path file) { } } - private void updateIndexFor(IFGObject object) { + private void updateIndexFor(IGuardObject object) { if (object instanceof IHandler) { saveHandlerIndex(); } else if (object instanceof IRegion) { @@ -182,11 +183,11 @@ private void updateIndexFor(IFGObject object) { } } - public void saveObject(IFGObject object) { + public void saveObject(IGuardObject object) { saveObject(object, false); } - public void saveObject(IFGObject object, boolean force) { + public void saveObject(IGuardObject object, boolean force) { if (reentry) return; FGCat type = getObjectType(object); String logName = FGUtil.getLogName(object); @@ -224,16 +225,16 @@ public void saveObject(IFGObject object, boolean force) { } } - public void saveObjects(Set objects) { + public void saveObjects(Set objects) { saveObjects(objects, false); } - public void saveObjects(Set objects, boolean force) { + public void saveObjects(Set objects, boolean force) { if (reentry) return; objects.forEach(object -> saveObject(object, force)); } - public void addObject(IFGObject object) { + public void addObject(IGuardObject object) { if (reentry) return; Path directory = getObjectDirectory(object); if (Files.exists(directory)) { @@ -254,7 +255,7 @@ public void addObject(IFGObject object) { } } - public void removeObject(IFGObject object) { + public void removeObject(IGuardObject object) { if (reentry) return; Path directory = getObjectDirectory(object); if (config.cleanOnDelete()) { @@ -305,9 +306,9 @@ public RegionEntry(IRegion region, FGSObjectIndex index) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.REGION) { Path directory = getObjectDirectory(index, null); - Optional fgObjectOptional = loadObject(directory, index, null); + Optional fgObjectOptional = loadObject(directory, index, null); if (fgObjectOptional.isPresent()) { - IFGObject fgObject = fgObjectOptional.get(); + IGuardObject fgObject = fgObjectOptional.get(); if (fgObject instanceof IRegion) { IRegion region = (IRegion) fgObject; manager.addRegion(region); @@ -347,9 +348,9 @@ public ControllerEntry(IController controller, FGSObjectIndex index, Path direct FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { Path directory = getObjectDirectory(index, null); - Optional fgObjectOptional = loadObject(directory, index, null); + Optional fgObjectOptional = loadObject(directory, index, null); if (fgObjectOptional.isPresent()) { - IFGObject fgObject = fgObjectOptional.get(); + IGuardObject fgObject = fgObjectOptional.get(); if (fgObject instanceof IHandler) { IHandler handler = (IHandler) fgObject; manager.addHandler(handler); @@ -434,9 +435,9 @@ public void loadWorld(World world) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.WORLDREGION) { Path directory = getObjectDirectory(index, world); - Optional fgObjectOptional = loadObject(directory, index, world); + Optional fgObjectOptional = loadObject(directory, index, world); if (fgObjectOptional.isPresent()) { - IFGObject fgObject = fgObjectOptional.get(); + IGuardObject fgObject = fgObjectOptional.get(); if (fgObject instanceof IWorldRegion) { IWorldRegion worldRegion = (IWorldRegion) fgObject; manager.addWorldRegion(worldRegion, world); @@ -485,7 +486,7 @@ public Optional> loadIndex(Path indexFile) { return Optional.ofNullable(index); } - public Optional loadObject(Path directory, @Nullable FGSObjectIndex index, @Nullable World world) { + public Optional loadObject(Path directory, @Nullable FGSObjectIndex index, @Nullable World world) { if (!Files.exists(directory) || !Files.isDirectory(directory)) return Optional.empty(); FGSObjectMeta metadata = null; @@ -568,7 +569,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectIndex i infoMessage.append("Enabled: \"").append(data.isEnabled()).append("\""); logger.info(infoMessage.toString()); - IFGObject fgObject = null; + IGuardObject fgObject = null; try { fgObject = fgCat.loadInstance(directory, type, data); } catch (Exception e) { @@ -977,7 +978,7 @@ private boolean isEmptyDirectory(Path directory) { } } - private Path getObjectDirectory(IFGObject object) { + private Path getObjectDirectory(IGuardObject object) { World world = null; boolean flag = false; if (object instanceof IWorldBound) { @@ -1069,7 +1070,7 @@ private boolean isGlobal(FGCat fgCat, String type, String name) { return false; } - private FGCat getObjectType(IFGObject object) { + private FGCat getObjectType(IGuardObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) { return FGCat.WORLDREGION; @@ -1092,7 +1093,7 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + public IGuardObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createRegion(directory, type, data); } }, @@ -1105,7 +1106,7 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + public IGuardObject loadInstance(Path directory, String type, FGObjectData data) { return FGFactoryManager.getInstance().createWorldRegion(directory, type, data); } }, @@ -1116,7 +1117,7 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + public IGuardObject loadInstance(Path directory, String type, FGObjectData data) { HandlerData handlerData; if (data instanceof HandlerData) { handlerData = (HandlerData) data; @@ -1133,7 +1134,7 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + public IGuardObject loadInstance(Path directory, String type, FGObjectData data) { HandlerData handlerData; if (data instanceof HandlerData) { handlerData = (HandlerData) data; @@ -1150,7 +1151,7 @@ public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { } @Override - public IFGObject loadInstance(Path directory, String type, FGObjectData data) { + public IGuardObject loadInstance(Path directory, String type, FGObjectData data) { return null; } }; @@ -1176,7 +1177,7 @@ public String getIndexFile() { public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); - public abstract IFGObject loadInstance(Path directory, String type, FGObjectData data); + public abstract IGuardObject loadInstance(Path directory, String type, FGObjectData data); } /*private void setPrettyPrint(boolean prettyPrint) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index a9ff82f..7d9085c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -34,7 +34,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; @@ -76,7 +76,7 @@ public final class FGUtil { private static UserStorageService userStorageService; - public static TextColor getColorForObject(IFGObject object) { + public static TextColor getColorForObject(IGuardObject object) { if (object instanceof GlobalRegion) return TextColors.LIGHT_PURPLE; else if (object instanceof IGlobal) return TextColors.YELLOW; else if (!object.isEnabled()) return TextColors.GRAY; @@ -100,7 +100,7 @@ public static List getSelectedControllers(CommandSource source) { return ((ControllersStateField) FCStateManager.instance().getStateMap().get(source).getOrCreate(ControllersStateField.ID).get()).getList(); } - public static String getObjectDisplayName(IFGObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { + public static String getObjectDisplayName(IGuardObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { if(owner == null) owner = object.getOwner(); boolean hasOwner; hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); @@ -110,7 +110,7 @@ public static String getObjectDisplayName(IFGObject object, boolean dispWorld, @ + (hasOwner ? OwnerManager.getInstance().getDisplayName(owner, null, viewer) + " : " : "") + object.getName(); } - public static Text getObjectDisplayTest(IFGObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { + public static Text getObjectDisplayTest(IGuardObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { if(owner == null) owner = object.getOwner(); boolean hasOwner; hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); @@ -119,7 +119,7 @@ public static Text getObjectDisplayTest(IFGObject object, boolean dispWorld, @Nu return builder.build(); } - public static String getLogName(IFGObject object) { + public static String getLogName(IGuardObject object) { if (userStorageService == null) userStorageService = FoxGuardMain.instance().getUserStorage(); UUID owner = object.getOwner(); boolean isOwned = !owner.equals(FGManager.SERVER_UUID); @@ -127,7 +127,7 @@ public static String getLogName(IFGObject object) { return (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + object.getName(); } - public static String getFullName(IFGObject object) { + public static String getFullName(IGuardObject object) { UUID owner = object.getOwner(); String fullName = object.getName(); if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { @@ -136,7 +136,7 @@ public static String getFullName(IFGObject object) { return fullName; } - public static String getCategory(IFGObject object) { + public static String getCategory(IGuardObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) return "worldregion"; else return "region"; @@ -146,7 +146,7 @@ public static String getCategory(IFGObject object) { } else return "object"; } - public static String genWorldFlag(IFGObject object) { + public static String genWorldFlag(IGuardObject object) { return object instanceof IWorldBound ? "--w:" + ((IWorldBound) object).getWorld().getName() + " " : ""; } @@ -163,7 +163,7 @@ public static Text readableTristateText(Tristate state) { } } - public static void markDirty(IFGObject object) { + public static void markDirty(IGuardObject object) { if (object instanceof IRegion) { FGManager.getInstance().markDirty(((IRegion) object), RegionCache.DirtyType.MODIFIED); } @@ -362,11 +362,11 @@ public static OwnerTabResult getOwnerSuggestions(String input) { return new OwnerTabResult(); } - public static void genStatePrefix(Text.Builder builder, IFGObject object, CommandSource source){ + public static void genStatePrefix(Text.Builder builder, IGuardObject object, CommandSource source){ genStatePrefix(builder, object, source, false); } - public static void genStatePrefix(Text.Builder builder, IFGObject object, CommandSource source, boolean controllerPadding) { + public static void genStatePrefix(Text.Builder builder, IGuardObject object, CommandSource source, boolean controllerPadding) { FGCat cat = FGCat.from(object); if (cat == null) return; if (cat == FGCat.WORLDREGION) cat = FGCat.REGION; @@ -388,7 +388,7 @@ public static void genStatePrefix(Text.Builder builder, IFGObject object, Comman builder.append(Text.of(" ")); } - private static void genStateButtons(Text.Builder builder, FGCat cat, IFGObject object, boolean contains) { + private static void genStateButtons(Text.Builder builder, FGCat cat, IGuardObject object, boolean contains) { String plus = "[" + cat.sName + "+]"; String minus = "[" + cat.sName + "-]"; if (contains) { @@ -429,7 +429,7 @@ public static FGCat from(String category) { return null; } - public static FGCat from(IFGObject object) { + public static FGCat from(IGuardObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) { return WORLDREGION; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FoxException.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FoxException.java new file mode 100644 index 0000000..925f8fc --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FoxException.java @@ -0,0 +1,23 @@ +package net.foxdenstudio.sponge.foxguard.plugin.util; + +public class FoxException extends Exception { + + public FoxException() { + } + + public FoxException(String message) { + super(message); + } + + public FoxException(String message, Throwable cause) { + super(message, cause); + } + + public FoxException(Throwable cause) { + super(cause); + } + + public FoxException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} From eee2b072ec47d5704475788b2c864514c32d819e Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Sun, 8 Apr 2018 01:09:34 -0700 Subject: [PATCH 25/30] So many changes. --- .../sponge/foxguard/plugin/FGManager.java | 3 + .../foxguard/plugin/handler/HandlerBase.java | 2 +- .../foxguard/plugin/handler/IHandler.java | 3 +- .../foxguard/plugin/object/IFGObject.java | 2 + .../plugin/object/path/PathManager.java | 72 ++++++--- .../object/path/element/BasePathElement.java | 85 ++--------- .../object/path/element/GroupElement.java | 143 ++++++++++++++++++ .../path/element/IModifiablePathElement.java | 7 +- .../object/path/element/IPathElement.java | 7 +- .../object/path/element/IPathOnlyElement.java | 21 +++ .../path/element/IRelocatablePathElement.java | 10 ++ .../object/path/element/OwnerPathElement.java | 133 ++++++++++++---- .../object/path/element/RootGroupElement.java | 33 ++++ .../path/element/StructuredGroupElement.java | 28 ++++ .../path/owner/OwnerAdapterFactory.java | 4 +- .../object/path/owner/OwnerTypeAdapter.java | 5 +- .../provider/LiteralPathProviderBase.java | 17 +++ .../owner/provider/PathOwnerProvider.java | 38 +++-- .../object/path/owner/types/BaseOwner.java | 108 +++++++++++++ .../object/path/owner/types/IOwner.java | 17 +++ .../object/path/owner/types/NameOwner.java | 59 +++----- .../object/path/owner/types/NumberOwner.java | 67 ++++++++ .../plugin/object/path/owner/types/Owner.java | 73 --------- .../object/path/owner/types/ServerOwner.java | 28 ++++ .../owner/types/SingleKeyComparableOwner.java | 32 ++++ .../path/owner/types/SingleKeyOwner.java | 83 ++++++++++ .../object/path/owner/types/UUIDOwner.java | 91 +++++------ .../plugin/storage/FGStorageManagerNew.java | 3 +- .../foxguard/plugin/util/RegionCache.java | 1 + 29 files changed, 857 insertions(+), 318 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index 75c48d0..209516b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -41,6 +41,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.ServerOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; @@ -63,6 +65,7 @@ public final class FGManager { public static final UUID SERVER_UUID = new UUID(0, 0); + public static final ServerOwner SERVER_OWNER = ServerOwner.SERVER; public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users", "owners"}; private static FGManager instance; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java index dc11ebb..0232fa9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerBase.java @@ -46,7 +46,7 @@ public int getPriority() { public void setPriority(int priority) { if (priority < Integer.MIN_VALUE / 2 + 1) priority = Integer.MIN_VALUE / 2 + 1; else if (priority > Integer.MAX_VALUE / 2) priority = Integer.MAX_VALUE / 2; - this.priority = priority > Integer.MIN_VALUE ? priority : Integer.MIN_VALUE + 1; + this.priority = priority; } public void markDirty() { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java index afaf7ee..ffc2b7a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java @@ -30,13 +30,14 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.living.player.User; +import scala.Int; import javax.annotation.Nullable; import java.util.Comparator; public interface IHandler extends IGuardObject { - Comparator PRIORITY = (h1, h2) -> h2.getPriority() - h1.getPriority(); + Comparator PRIORITY = Comparator.comparingInt(IHandler::getPriority); String SUFFIX = "h"; EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 993dae4..71a83b7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -1,5 +1,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; + import java.util.Comparator; import java.util.UUID; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java index d620ad1..6184fe6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -1,44 +1,56 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; import com.google.gson.TypeAdapter; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.OwnerPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.NameOwner; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.*; +import org.spongepowered.api.command.CommandSource; import java.util.HashMap; import java.util.Map; +import java.util.UUID; +import java.util.function.Function; /** * Created by fox on 3/7/18. */ public class PathManager { + public static final String LITERAL_PREFIX = "::"; + public static final String DYNAMIC_PREFIX = ":"; private static PathManager ourInstance = new PathManager(); + private Map> typeClassMap = new HashMap<>(); + private Map, OwnerAdapterFactory> adapterMap = new HashMap<>(); + private Map, PathOwnerProvider.Literal.Factory> literalPathProviderMap = new HashMap<>(); + private Map> dynamicPathProviderMap = new HashMap<>(); - public static PathManager getInstance() { - return ourInstance; - } + + private Map playerLocalGroups = new HashMap<>(); private PathManager() { registerOwnerType(UUIDOwner.TYPE, UUIDOwner.class, UUIDOwner.Adapter::new, - UUIDOwner.PathProvider::new); + UUIDOwner.LiteralPathProvider::new); registerOwnerType(NameOwner.TYPE, NameOwner.class, NameOwner.Adapter::new, - NameOwner.PathProvider::new); + NameOwner.LiteralPathProvider::new); + registerOwnerType(NumberOwner.TYPE, NumberOwner.class, + NumberOwner.Adapter::new, + NumberOwner.LiteralPathProvider::new); } - private Map> typeClassMap = new HashMap<>(); - private Map, OwnerAdapterFactory> adapterMap = new HashMap<>(); - private Map, PathOwnerProvider.Factory> literalPathProviderMap = new HashMap<>(); + public static PathManager getInstance() { + return ourInstance; + } - public boolean registerOwnerType( + public boolean registerOwnerType( String type, Class tClass, OwnerAdapterFactory adapterFactory, - PathOwnerProvider.Factory pathProviderFactory) { + PathOwnerProvider.Literal.Factory pathProviderFactory) { if (this.typeClassMap.containsKey(type)) return false; this.typeClassMap.put(type, tClass); this.adapterMap.put(tClass, adapterFactory); @@ -47,32 +59,50 @@ public boolean registerOwnerType( } @SuppressWarnings("unchecked") - public TypeAdapter getOwnerTypeAdapter(Class tClass) { + public TypeAdapter getOwnerTypeAdapter(Class tClass) { return (TypeAdapter) this.adapterMap.get(tClass); } @SuppressWarnings("unchecked") - public PathOwnerProvider.Factory getLiteralPathOwnerProvider(Class tClass) { - return (PathOwnerProvider.Factory) this.literalPathProviderMap.get(tClass); + public PathOwnerProvider.Literal.Factory getLiteralPathOwnerProvider(Class tClass) { + return (PathOwnerProvider.Literal.Factory) this.literalPathProviderMap.get(tClass); } - public PathOwnerProvider.Factory getLiteralPathOwnerProvider(String type) { + public PathOwnerProvider.Literal.Factory getLiteralPathOwnerProvider(String type) { return this.getLiteralPathOwnerProvider(this.typeClassMap.get(type)); } - public PathResult process(String input) { + public PathOwnerProvider.Factory getDynamicPathOwnerProvider(String type) { + return this.dynamicPathProviderMap.get(type); + } + + + public IGuardObject getObject(String input, String extension, CommandSource source) { return null; } - enum RootPaths { + public enum RootPath { + + LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // - :: + DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX), // - : ; - IPathElement path; + public final String prefix; + Function rootProvider; - RootPaths() { + RootPath(Function rootProvider, String prefix) { + this.rootProvider = rootProvider; + this.prefix = prefix; + } + public static RootPath from(String input) { + if (input == null) return null; + for (RootPath root : values()) { + if (input.startsWith(root.prefix)) return root; + } + return null; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java index e8e203b..937162a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java @@ -1,112 +1,47 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; -import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; -import org.spongepowered.api.util.GuavaCollectors; import javax.annotation.Nonnull; import java.util.Collection; import java.util.Map; import java.util.Optional; -public class BasePathElement implements IModifiablePathElement { +public abstract class BasePathElement implements IPathElement { - IModifiablePathElement parent; - Map children; - Map objects; + IPathElement parent; - public BasePathElement(@Nonnull IModifiablePathElement parent) { + public BasePathElement(IPathElement parent) { this.parent = parent; } - /** - * Protected constructor that does not set a parent. - * While regular instances should always have a parent of some kind, - */ - protected BasePathElement() { - } - - @Override - public Optional resolve(String name, boolean create) { - IPathElement ret = this.children.get(name); - if (ret == null && create) { - ret = new BasePathElement(this); - this.children.put(name, ret); - } - return Optional.ofNullable(ret); - } - @Override - public boolean addChild(String name, IPathElement path) { - IPathElement prev = this.children.get(name); - if (prev != null) return prev == path; - - this.children.put(name, path); - return true; + public Optional resolve(String name) { + return Optional.empty(); } @Override - public Optional get(String name) { - return this.objects.get(name); + public Optional get(@Nonnull String name) { + return Optional.empty(); } @Override public Collection getPathSuggestions() { - return this.children.entrySet().stream() - .filter(e->e.getValue().isPersistent()) - .map(Map.Entry::getKey) - .sorted() - .collect(GuavaCollectors.toImmutableList()); + return null; } @Override public Map getObjects() { - return ImmutableMap.copyOf(this.objects); + return null; } @Override public boolean isPersistent() { - for (IPathElement child : this.children.values()) { - if (child.isPersistent()) return true; - } return false; } @Override - public boolean add(IGuardObject object, String name, boolean genExtension) { - String keyName = name; - if (genExtension) { - keyName += "." + object.getPathSuffix(); - } - if (this.objects.containsKey(keyName)) return false; - - this.objects.put(keyName, object); - - return true; - } - - @Override - public boolean remove(IGuardObject object) { - return this.objects.values().remove(object); - } - - @Override - public boolean remove(IPathElement path) { - return this.children.values().remove(path); - } - - @Override - public IModifiablePathElement getParent() { + public IPathElement getParent() { return this.parent; } - - @Override - public boolean setParent(IModifiablePathElement path, String newName) { - if (!path.addChild(newName, this)) return false; - if (!this.parent.remove(this)) { - path.remove(this); - return false; - } - return true; - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java new file mode 100644 index 0000000..4d98d1c --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java @@ -0,0 +1,143 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import org.spongepowered.api.util.GuavaCollectors; + +import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +public class GroupElement implements IModifiablePathElement { + + IPathElement parent; + String name; + Map children; + Map objects; + + public GroupElement(@Nonnull IModifiablePathElement parent, String name) { + this.applyParent(parent, name); + } + + /** + * Protected constructor that does not set a parent. + * While regular instances should always have a parent of some kind, + */ + protected GroupElement() { + } + + @Override + public Optional resolve(String name, boolean create) { + if (name.equals(".")) { + return Optional.of(this); + } else if (name.equals("..")) { + if (this.parent != null) { + return Optional.of(this.parent); + } else { + return Optional.of(this); + } + } + IPathElement ret = this.children.get(name); + if (ret == null && create) { + ret = new GroupElement(this, name); + } + return Optional.ofNullable(ret); + } + + @Override + public Optional getName(IPathElement path) { + return Optional.empty(); + } + + @Override + public boolean add(String name, IPathElement path) { + if (name.startsWith(".")) return false; + + IPathElement prev = this.children.get(name); + if (prev != null) return prev == path; + + this.children.put(name, path); + return true; + } + + @Override + public Optional get(@Nonnull String name) { + IGuardObject object = this.objects.get(name); + if (object != null) { + return Optional.of(object); + } else if (this.parent != null && name.isEmpty() || name.startsWith(".")) { + return this.parent.get(this.name + name); + } else return Optional.empty(); + } + + @Override + public boolean add(IGuardObject object, String name, boolean genExtension) { + String keyName = name; + if (genExtension) { + keyName += "." + object.getPathSuffix(); + } + if (this.objects.containsKey(keyName)) return false; + + this.objects.put(keyName, object); + + return true; + } + + @Override + public boolean remove(IGuardObject object) { + return this.objects.values().remove(object); + } + + @Override + public boolean remove(IPathElement path) { + return this.children.values().remove(path); + } + + @Override + public Collection getPathSuggestions() { + return this.children.entrySet().stream() + .filter(e -> e.getValue().isPersistent()) + .map(Map.Entry::getKey) + .sorted() + .collect(GuavaCollectors.toImmutableList()); + } + + @Override + public Map getObjects() { + return ImmutableMap.copyOf(this.objects); + } + + @Override + public boolean isPersistent() { + if (!this.objects.isEmpty()) return true; + + for (IPathElement child : this.children.values()) { + if (child.isPersistent()) return true; + } + return false; + } + + @Override + public IPathElement getParent() { + return this.parent; + } + + @Override + public boolean setParent(@Nonnull IPathElement parent) { + this.parent = parent; + Optional nameOpt = parent.getName(this); + this.name = nameOpt.orElse(null); + return true; + } + + @Override + public boolean applyParent(@Nonnull IModifiablePathElement parent, @Nonnull String name) { + if (this.parent == null) this.parent = parent; + if (this.name == null) this.name = name; + if (!parent.add(name, this)) return false; + this.parent = parent; + this.name = name; + return true; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java index e1e0aac..2f9e141 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java @@ -2,9 +2,10 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import javax.annotation.Nonnull; import java.util.Optional; -public interface IModifiablePathElement extends IPathElement { +public interface IModifiablePathElement extends IRelocatablePathElement { @Override default Optional resolve(String name) { @@ -13,7 +14,7 @@ default Optional resolve(String name) { Optional resolve(String name, boolean create); - boolean addChild(String name, IPathElement path); + boolean add(String name, IPathElement path); default boolean add(IGuardObject object) { return add(object, object.getName()); @@ -38,6 +39,4 @@ default boolean add(IGuardObject object, String name) { boolean remove(IPathElement path); - boolean setParent(IModifiablePathElement path, String newName); - } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java index 76fe620..5115207 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java @@ -3,15 +3,18 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.path.FoxInvalidPathException; +import javax.annotation.Nonnull; import java.util.Collection; import java.util.Map; import java.util.Optional; public interface IPathElement { - Optional resolve(String name) throws FoxInvalidPathException; + Optional resolve(String name); - Optional get(String name); + Optional getName(IPathElement path); + + Optional get(@Nonnull String name); Collection getPathSuggestions(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java new file mode 100644 index 0000000..66a150f --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java @@ -0,0 +1,21 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; + +import javax.annotation.Nonnull; +import java.util.Map; +import java.util.Optional; + +public interface IPathOnlyElement extends IRelocatablePathElement { + + @Override + default Optional get(@Nonnull String name) { + return Optional.empty(); + } + + @Override + default Map getObjects() { + return ImmutableMap.of(); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java new file mode 100644 index 0000000..518d00a --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java @@ -0,0 +1,10 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import javax.annotation.Nonnull; + +public interface IRelocatablePathElement extends IPathElement { + + boolean applyParent(@Nonnull IModifiablePathElement parent, @Nonnull String newName); + + boolean setParent(@Nonnull IPathElement parent); +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java index bc74712..5d27a82 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java @@ -4,59 +4,66 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.*; -public class OwnerPathElement implements IPathElement { +public abstract class OwnerPathElement

> implements IPathElement { - private static final PathManager manager = PathManager.getInstance(); + private static final PathManager MANAGER = PathManager.getInstance(); - private final String prefix; - private final List currentPath; - private final String group; - private final String type; - private final OwnerPathElement parent; - private final PathOwnerProvider provider; + public final String prefix; + protected final OwnerPathElement

parent; + protected final List currentPath; + protected P provider; public OwnerPathElement(String prefix) { this.prefix = prefix; this.currentPath = new ArrayList<>(); - this.group = null; - this.type = null; this.parent = null; this.provider = null; } - private OwnerPathElement(OwnerPathElement parent, String next) { + private OwnerPathElement(OwnerPathElement

parent, String next) { this.prefix = parent.prefix; this.parent = parent; this.currentPath = new ArrayList<>(parent.currentPath); this.currentPath.add(next); - int size = this.currentPath.size(); - this.group = size > 0 ? this.currentPath.get(0) : null; - this.type = size > 1 ? this.currentPath.get(1) : null; - this.provider = size > 1 ? manager.getLiteralPathOwnerProvider(this.type).get() : null; - for (int i = 2; i < size; i++) { - String element = this.currentPath.get(i); - this.provider.apply(element); - } - } - - @Override - public Optional resolve(String name) { - return Optional.of(new OwnerPathElement(this, name)); } @Override public Optional get(String name) { - if(!this.provider.isValid()) return Optional.empty(); + if (name.isEmpty() || !this.provider.isValid()) return Optional.empty(); + + if (this.parent != null) { + if (name.startsWith(".")) { + String current = this.currentPath.get(this.currentPath.size() - 1); + return this.parent.get(current + name); + } + } + IOwner owner = provider.getOwner().orElse(null); + // TODO actually lookup the object return Optional.empty(); } + @SuppressWarnings("unchecked") + @Override + public Optional getName(IPathElement path) { + if (path instanceof OwnerPathElement && ((OwnerPathElement) path).parent == this) { + List curPath = ((OwnerPathElement

) path).currentPath; + return Optional.of(curPath.get(curPath.size() - 1)); + } + return Optional.empty(); + } + + + @Override + public abstract Optional resolve(String name); + @Override public Collection getPathSuggestions() { return this.provider.getSuggestions(); @@ -64,7 +71,7 @@ public Collection getPathSuggestions() { @Override public Map getObjects() { - if(!this.provider.isValid()) return ImmutableMap.of(); + if (!this.provider.isValid()) return ImmutableMap.of(); // TODO actually lookup the object @@ -82,4 +89,76 @@ public boolean isPersistent() { public IPathElement getParent() { return this.parent; } + + public static class Literal extends OwnerPathElement> { + + public final String group; + public final String type; + + public Literal(String prefix) { + super(prefix); + this.group = null; + this.type = null; + } + + private Literal(Literal parent, String next) { + super(parent, next); + int size = this.currentPath.size(); + this.group = size > 0 ? this.currentPath.get(0) : null; + this.type = size > 1 ? this.currentPath.get(1) : null; + if (size > 1) { + this.provider = MANAGER.getLiteralPathOwnerProvider(this.type).get(); + this.provider.setGroup(group); + for (int i = 2; i < size; i++) { + String element = this.currentPath.get(i); + this.provider.apply(element); + } + } else this.provider = null; + } + + @Override + public Optional resolve(String name) { + if (name == null || name.isEmpty()) return Optional.empty(); + else if (name.equals("..")) { + if (this.parent != null) { + return Optional.of((Literal) this.parent); + } else { + return Optional.of(this); + } + } else return Optional.of(new Literal(this, name)); + } + } + + public static class Dynamic extends OwnerPathElement> { + + public final String type; + + public Dynamic(String prefix) { + super(prefix); + this.type = null; + } + + private Dynamic(Dynamic parent, String next) { + super(parent, next); + int size = this.currentPath.size(); + this.type = size > 0 ? this.currentPath.get(0) : null; + this.provider = size > 0 ? MANAGER.getDynamicPathOwnerProvider(this.type).get() : null; + for (int i = 1; i < size; i++) { + String element = this.currentPath.get(i); + this.provider.apply(element); + } + } + + @Override + public Optional resolve(String name) { + if (name == null || name.isEmpty()) return Optional.empty(); + else if (name.equals("..")) { + if (this.parent != null) { + return Optional.of((Dynamic) this.parent); + } else { + return Optional.of(this); + } + } else return Optional.of(new Dynamic(this, name)); + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java new file mode 100644 index 0000000..f42af78 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java @@ -0,0 +1,33 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; + +import java.util.HashMap; +import java.util.Map; + +public class RootGroupElement extends StructuredGroupElement { + + public RootGroupElement(){ + this(ImmutableMap.of()); + } + + public RootGroupElement(Map fixedChildren) { + super(fixedChildren); + } + + @Override + public boolean isPersistent() { + return true; + } + + public static RootGroupElement getServerRootGroup(){ + Map fixed = new HashMap<>(); + + + + return new RootGroupElement(fixed); + } + + + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java new file mode 100644 index 0000000..fca7f13 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java @@ -0,0 +1,28 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableMap; + +import javax.annotation.Nonnull; +import java.util.HashMap; +import java.util.Map; + +public class StructuredGroupElement extends GroupElement { + + private Map fixedChildren; + + public StructuredGroupElement(@Nonnull IModifiablePathElement parent, String name, Map fixedChildren) { + this(fixedChildren); + this.applyParent(parent, name); + } + + protected StructuredGroupElement(Map fixedChildren) { + this.children = new HashMap<>(fixedChildren); + this.fixedChildren = ImmutableMap.copyOf(fixedChildren); + } + + @Override + public boolean remove(IPathElement path) { + if (this.fixedChildren.containsValue(path)) return false; + return super.remove(path); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java index 99097fd..2c08e3c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerAdapterFactory.java @@ -2,7 +2,7 @@ import com.google.gson.Gson; import com.google.gson.TypeAdapter; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import java.util.function.BiFunction; @@ -12,7 +12,7 @@ * * @param The type of the owner this factory is supposed to generate adapters for */ -public interface OwnerAdapterFactory extends BiFunction> { +public interface OwnerAdapterFactory extends BiFunction> { @Override OwnerTypeAdapter apply(String group, Gson gson); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java index de83c93..c50c83c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java @@ -2,9 +2,10 @@ import com.google.gson.Gson; import com.google.gson.TypeAdapter; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; -public abstract class OwnerTypeAdapter extends TypeAdapter { +public abstract class OwnerTypeAdapter extends TypeAdapter { public final String group; protected final Gson gson; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java new file mode 100644 index 0000000..e0e75b1 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java @@ -0,0 +1,17 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; + +import javax.annotation.Nonnull; + +public abstract class LiteralPathProviderBase implements PathOwnerProvider.Literal { + + protected String group; + + @Override + public boolean setGroup(@Nonnull String group) { + if(group.isEmpty()) return false; + this.group = group; + return true; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java index f5629d7..5fcc72e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java @@ -1,14 +1,14 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider; import com.google.common.collect.ImmutableList; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.Owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.Collection; import java.util.Optional; import java.util.function.Supplier; -public interface PathOwnerProvider { - +public interface PathOwnerProvider { boolean apply(String element); default Collection getSuggestions() { @@ -25,17 +25,29 @@ default Collection getSuggestions(int index) { int minimumElements(); - Optional getOwner(String group); + Optional getOwner(); - /** - * Interface for Provider factory. This class does not normally need to be fully implemented, - * as a method reference to a no-args constructor is usually sufficient. - * - * @param - */ - interface Factory extends Supplier> { + interface Factory extends Supplier>{ - @Override - PathOwnerProvider get(); } + + interface Literal extends PathOwnerProvider { + + boolean setGroup(String group); + + /** + * Interface for Provider factory. This class does not normally need to be fully implemented, + * as a method reference to a no-args constructor is usually sufficient. + * + * @param + */ + + interface Factory extends Supplier> { + + @Override + Literal get(); + + } + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java new file mode 100644 index 0000000..b60b066 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java @@ -0,0 +1,108 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Objects; + +/** + * Created by fox on 3/4/18. + */ +public abstract class BaseOwner implements IOwner { + + protected final String group; + protected final String type; + + protected BaseOwner(@Nonnull String type, @Nonnull String group) { + this.type = type; + this.group = group; + } + + public String getType() { + return this.type; + } + + public String getGroup() { + return this.group; + } + + @Override + public final Path getDirectory() { + return Paths.get(FGStorageManagerNew.OWNERS_DIR_NAME, group, type).resolve(getPartialDirectory()); + } + + protected abstract Path getPartialDirectory(); + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BaseOwner baseOwner = (BaseOwner) o; + return Objects.equals(type, baseOwner.type) && + Objects.equals(group, baseOwner.group); + } + + @Override + public int hashCode() { + return Objects.hash(type, group); + } + + @Override + public int compareTo(@Nonnull IOwner o) { + if (o == ServerOwner.SERVER) return 1; + if (o instanceof BaseOwner) { + BaseOwner baseOwner = ((BaseOwner) o); + int compare = this.group.compareTo(baseOwner.group); + if (compare != 0) return compare; + compare = this.type.compareTo(baseOwner.type); + return compare; + } else return 0; + } + + @Override + public String toString() { + return "BaseOwner{" + group + ", " + type + '}'; + } + + public static class Adapter extends TypeAdapter { + + private final TypeAdapter jsonElementTypeAdapter; + + public Adapter(TypeAdapter jsonElementTypeAdapter) { + this.jsonElementTypeAdapter = jsonElementTypeAdapter; + } + + @Override + public void write(JsonWriter out, BaseOwner value) throws IOException { + + } + + @Override + public BaseOwner read(JsonReader in) throws IOException { + + return null; + } + } + + public static class AdapterFactory implements TypeAdapterFactory { + + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!BaseOwner.class.isAssignableFrom(type.getRawType())) return null; + TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); + Adapter adapter = new Adapter(jsonElementTypeAdapter); + return (TypeAdapter) adapter; + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java new file mode 100644 index 0000000..0a3d6cb --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java @@ -0,0 +1,17 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import java.nio.file.Path; + +public interface IOwner extends Comparable { + + Path getDirectory(); + + @Override + String toString(); + + @Override + boolean equals(Object owner); + + @Override + int hashCode(); +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java index 4878219..5bbe686 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java @@ -4,26 +4,29 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; +import javax.annotation.Nonnull; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; -public class NameOwner extends Owner { +public class NameOwner extends SingleKeyComparableOwner { public static final String TYPE = "name"; - String name; - - protected NameOwner(String group, String name) { - super(TYPE, group); + protected NameOwner(@Nonnull String group, @Nonnull String name) { + super(TYPE, group, name); } @Override public Path getPartialDirectory() { - return Paths.get(name); + return Paths.get(key); + } + + @Override + public String toString() { + return "NameOwner{" + this.group + ", " + this.key + '}'; } public static class Adapter extends OwnerTypeAdapter { @@ -33,51 +36,27 @@ public Adapter(String group, Gson gson) { } @Override - public void write(JsonWriter out, NameOwner value) throws IOException { - + public void write(JsonWriter out, NameOwner value) { + gson.toJson(value.key, value.key.getClass(), out); } @Override public NameOwner read(JsonReader in) throws IOException { - return null; + String name = gson.fromJson(in, String.class); + return new NameOwner(group, name); } } - public static class PathProvider implements PathOwnerProvider { - - String name = null; - boolean valid = false; - int count = 0; - - @Override - public boolean apply(String element) { - valid = true; - if (count++ == 0 && element != null && !element.isEmpty()) { - name = element; - return true; - } - valid = false; - return false; - } - - @Override - public int numApplied() { - return count; - } - - @Override - public boolean isValid() { - return valid; - } + public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { @Override - public int minimumElements() { - return 1; + protected String process(String element) { + return element; } @Override - public Optional getOwner(String group) { - return this.valid ? Optional.of(new NameOwner(group, this.name)) : Optional.empty(); + public Optional getOwner() { + return this.valid ? Optional.of(new NameOwner(group, key)) : Optional.empty(); } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java new file mode 100644 index 0000000..03a4db5 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java @@ -0,0 +1,67 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import com.google.gson.Gson; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; + +import javax.annotation.Nonnull; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +public class NumberOwner extends SingleKeyComparableOwner { + + public static final String TYPE = "number"; + + protected NumberOwner(@Nonnull String group, @Nonnull Integer key) { + super(TYPE, group, key); + } + + @Override + protected Path getPartialDirectory() { + return Paths.get(key.toString()); + } + + @Override + public String toString() { + return "NumberOwner{" + this.group + ", " + this.key + '}'; + } + + public static class Adapter extends OwnerTypeAdapter { + + public Adapter(String group, Gson gson) { + super(group, gson); + } + + @Override + public void write(JsonWriter out, NumberOwner value) { + gson.toJson(value.key, value.key.getClass(), out); + } + + @Override + public NumberOwner read(JsonReader in) { + Integer uuid = gson.fromJson(in, Integer.class); + return new NumberOwner(group, uuid); + } + } + + + public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { + + @Override + protected Integer process(String element) { + Integer number = null; + try { + number = Integer.parseInt(element); + } catch (NumberFormatException ignored) { + } + return number; + } + + @Override + public Optional getOwner() { + return this.valid ? Optional.of(new NumberOwner(group, key)) : Optional.empty(); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java deleted file mode 100644 index c2941c6..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/Owner.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; - -/** - * Created by fox on 3/4/18. - */ -public abstract class Owner { - - private final String type; - private final String group; - - protected Owner(String type, String group) { - this.type = type; - this.group = group; - } - - public String getType() { - return this.type; - } - - public String getGroup() { - return this.group; - } - - public Path getDirectory() { - return Paths.get(group, type).resolve(getPartialDirectory()); - } - - public abstract Path getPartialDirectory(); - - public static class Adapter extends TypeAdapter { - - private final TypeAdapter jsonElementTypeAdapter; - - public Adapter(TypeAdapter jsonElementTypeAdapter) { - this.jsonElementTypeAdapter = jsonElementTypeAdapter; - } - - @Override - public void write(JsonWriter out, Owner value) throws IOException { - - } - - @Override - public Owner read(JsonReader in) throws IOException { - - return null; - } - } - - public static class AdapterFactory implements TypeAdapterFactory { - - @SuppressWarnings("unchecked") - @Override - public TypeAdapter create(Gson gson, TypeToken type) { - if (!Owner.class.isAssignableFrom(type.getRawType())) return null; - TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); - Adapter adapter = new Adapter(jsonElementTypeAdapter); - return (TypeAdapter) adapter; - } - } -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java new file mode 100644 index 0000000..fc98edd --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java @@ -0,0 +1,28 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import javax.annotation.Nonnull; +import java.nio.file.Path; +import java.nio.file.Paths; + +public final class ServerOwner implements IOwner { + + public static final ServerOwner SERVER = new ServerOwner(); + + private ServerOwner() { + } + + @Override + public Path getDirectory() { + return Paths.get("."); + } + + @Override + public String toString() { + return "Server-Owner"; + } + + @Override + public int compareTo(@Nonnull IOwner o) { + return equals(o) ? 0 : -1; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java new file mode 100644 index 0000000..d04fb48 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java @@ -0,0 +1,32 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import javax.annotation.Nonnull; + +public abstract class SingleKeyComparableOwner> extends SingleKeyOwner { + + protected SingleKeyComparableOwner(@Nonnull String type, @Nonnull String group, @Nonnull T key) { + super(type, group, key); + } + + @Override + public int compareTo(@Nonnull IOwner o) { + if (o == ServerOwner.SERVER) return 1; + if (o instanceof BaseOwner) { + BaseOwner baseOwner = ((BaseOwner) o); + int compare = super.compareTo(baseOwner); + if (o instanceof SingleKeyComparableOwner) { + SingleKeyComparableOwner comparableOwner = ((SingleKeyComparableOwner) o); + if (this.key.getClass() == comparableOwner.key.getClass()) { + //noinspection unchecked + return this.key.compareTo((T) comparableOwner.key); + } else throw new IllegalStateException("Can't compare two keys of different types! " + + "Expected: " + this.key.getClass() + + ", Actual: " + comparableOwner.key.getClass()); + } else + throw new IllegalStateException("All owners of same type must be the same class! Type-id: \"" + this.type + + "\", Expected-class: " + this.getClass() + + ", Actual-class: " + o.getClass()); + } else + throw new IllegalStateException("All IOwner instances that aren't the server owner must extend BaseOwner"); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java new file mode 100644 index 0000000..d0e8725 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java @@ -0,0 +1,83 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.LiteralPathProviderBase; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; + +import javax.annotation.Nonnull; +import java.util.Objects; +import java.util.Optional; + +public abstract class SingleKeyOwner extends BaseOwner { + + protected T key; + + protected SingleKeyOwner(@Nonnull String type, @Nonnull String group, @Nonnull T key) { + super(type, group); + this.key = key; + } + + public T getKey() { + return this.key; + } + + @Override + public String toString() { + return "SingleKeyOwner{" + this.group + ", " + this.type + ", " + this.key + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SingleKeyOwner owner = (SingleKeyOwner) o; + return Objects.equals(this.key, owner.key); + } + + @Override + public int hashCode() { + + return Objects.hash(super.hashCode(), this.key); + } + + public static abstract class LiteralPathProvider extends LiteralPathProviderBase { + + T key = null; + boolean valid = false; + int count = 0; + + @Override + public boolean apply(String element) { + valid = true; + if (count++ == 0 && element != null && !element.isEmpty()) { + T result = this.process(element); + if (result != null) { + key = result; + return true; + } + } + valid = false; + return false; + } + + protected abstract T process(String element); + + @Override + public int numApplied() { + return count; + } + + @Override + public boolean isValid() { + return valid; + } + + @Override + public int minimumElements() { + return 1; + } + + @Override + public abstract Optional getOwner(); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java index a3cca80..08289c8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java @@ -4,29 +4,35 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; +import org.spongepowered.api.entity.living.player.User; -import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; import java.util.UUID; -public class UUIDOwner extends Owner { +public class UUIDOwner extends SingleKeyComparableOwner { + public static final String USER_GROUP = "user"; public static final String TYPE = "uuid"; public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; - UUID uuid; - public UUIDOwner(String group, UUID uuid) { - super(TYPE, group); - this.uuid = uuid; + super(TYPE, group, uuid); + } + + public UUIDOwner(User user){ + this(USER_GROUP, user.getUniqueId()); } @Override public Path getPartialDirectory() { - return Paths.get(uuid.toString()); + return Paths.get(key.toString()); + } + + @Override + public String toString() { + return "UUIDOwner{" + this.group + ", " + this.key + '}'; } public static class Adapter extends OwnerTypeAdapter { @@ -36,67 +42,40 @@ public Adapter(String group, Gson gson) { } @Override - public void write(JsonWriter out, UUIDOwner value) throws IOException { - + public void write(JsonWriter out, UUIDOwner value) { + gson.toJson(value.key, value.key.getClass(), out); } @Override - public UUIDOwner read(JsonReader in) throws IOException { - return null; + public UUIDOwner read(JsonReader in) { + UUID uuid = gson.fromJson(in, UUID.class); + return new UUIDOwner(group, uuid); } } - public static class PathProvider implements PathOwnerProvider { + public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { - UUID uuid = null; - boolean valid = false; - int count = 0; - - @SuppressWarnings("Duplicates") @Override - public boolean apply(String element) { - valid = true; - if (count++ == 0) { - if (element != null && !element.isEmpty()) { - if (element.matches(UUID_REGEX)) { - uuid = UUID.fromString(element); - return true; - } else { - element = element.replace("-", ""); - if (element.matches("[\\da-f]{32}")) { - element = element.substring(0, 8) + "-" - + element.substring(8, 12) + "-" - + element.substring(12, 16) + "-" - + element.substring(16, 20) + "-" - + element.substring(20, 32); - uuid = UUID.fromString(element); - return true; - } - } + protected UUID process(String element) { + if (element.matches(UUID_REGEX)) { + return UUID.fromString(element); + } else { + element = element.replace("-", ""); + if (element.matches("[\\da-f]{32}")) { + element = element.substring(0, 8) + "-" + + element.substring(8, 12) + "-" + + element.substring(12, 16) + "-" + + element.substring(16, 20) + "-" + + element.substring(20, 32); + return UUID.fromString(element); } } - valid = false; - return false; - } - - @Override - public int numApplied() { - return count; - } - - @Override - public boolean isValid() { - return valid; - } - - @Override - public int minimumElements() { - return 1; + return null; } @Override - public Optional getOwner(String group) { - return this.valid ? Optional.of(new UUIDOwner(group, uuid)) : Optional.empty(); + public Optional getOwner() { + return this.valid ? Optional.of(new UUIDOwner(group, key)) : Optional.empty(); } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 8850d3a..e9a7ea5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -82,6 +82,7 @@ public class FGStorageManagerNew { "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; public static final String METADATA_FILE_NAME = "metadata.foxcf"; + public static final String OWNERS_DIR_NAME = "owners"; public static final Charset CHARSET = StandardCharsets.UTF_8; private static final Type INDEX_LIST_TYPE = new TypeToken>() { }.getType(); @@ -1016,7 +1017,7 @@ private Path getObjectDirectory(FGCat fgCat, UUID owner, String name, boolean in if (!ownerFirst) dir = dir.resolve(fgCat.pathName); if (owner != null && !owner.equals(SERVER_UUID)) { - dir = dir.resolve("owners").resolve(owner.toString()); + dir = dir.resolve(OWNERS_DIR_NAME).resolve(owner.toString()); } if (ownerFirst) dir = dir.resolve(fgCat.pathName); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java index a442ec9..c6227f9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.world.World; From 46a9274b756abeed239a1c12e9d76d79fc57119f Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Wed, 11 Apr 2018 11:04:44 -0700 Subject: [PATCH 26/30] I BROKE EVERYTHING AGAIN AGAIN AGAIN!!!!! --- .../sponge/foxguard/plugin/FGManager.java | 121 ++++++++------- .../plugin/command/CommandCreate.java | 4 +- .../plugin/command/CommandDelete.java | 2 +- .../plugin/command/CommandDetail.java | 8 +- .../foxguard/plugin/command/CommandHere.java | 4 +- .../foxguard/plugin/command/CommandList.java | 2 +- .../foxguard/plugin/handler/HandlerData.java | 3 +- .../plugin/listener/PlayerMoveListener.java | 4 +- .../listener/PlayerMoveListenerNew.java | 4 +- .../plugin/misc/FGContextCalculator.java | 2 +- .../foxguard/plugin/object/FGObjectData.java | 25 ++- .../plugin/object/GuardObjectBase.java | 24 +-- .../foxguard/plugin/object/IFGObject.java | 12 +- .../foxguard/plugin/object/IGuardObject.java | 18 +-- .../plugin/object/owner/OwnerManager.java | 2 +- .../foxguard/plugin/object/path/FoxPath.java | 145 ++++++++++++++++++ .../plugin/object/path/PathManager.java | 76 ++++----- .../object/path/element/BasePathElement.java | 47 ------ .../path/element/DirectOwnerElement.java | 89 +++++++++++ .../object/path/element/GroupElement.java | 62 ++------ .../path/element/IModifiablePathElement.java | 13 +- .../object/path/element/IPathElement.java | 28 +++- .../object/path/element/IPathOnlyElement.java | 20 ++- .../path/element/IRelocatablePathElement.java | 10 -- .../object/path/element/OwnerPathElement.java | 27 ++-- .../object/path/element/RootGroupElement.java | 120 ++++++++++++++- .../path/element/StructuredGroupElement.java | 6 - .../object/path/owner/OwnerTypeAdapter.java | 7 +- .../owner/provider/PathOwnerProvider.java | 4 - .../object/path/owner/types/BaseOwner.java | 100 ++++++++++-- .../plugin/state/ControllersStateField.java | 2 +- .../plugin/state/HandlersStateField.java | 2 +- .../plugin/state/RegionsStateField.java | 4 +- .../plugin/storage/FGSLegacyLoader.java | 2 +- .../plugin/storage/FGSObjectIndex.java | 3 +- .../plugin/storage/FGSObjectMeta.java | 3 +- .../plugin/storage/FGSObjectPath.java | 13 +- .../plugin/storage/FGStorageManagerNew.java | 41 ++--- .../sponge/foxguard/plugin/util/FGUtil.java | 107 +++++++------ .../foxguard/plugin/util/RegionCache.java | 6 +- 40 files changed, 749 insertions(+), 423 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index 209516b..c5dff7a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -64,14 +64,13 @@ public final class FGManager { - public static final UUID SERVER_UUID = new UUID(0, 0); public static final ServerOwner SERVER_OWNER = ServerOwner.SERVER; public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users", "owners"}; private static FGManager instance; - private final Map> worldRegions; - private final Multimap regions; - private final Multimap handlers; + private final Map> worldRegions; + private final Multimap regions; + private final Multimap handlers; private final GlobalRegion globalRegion; private final GlobalHandler globalHandler; @@ -81,7 +80,7 @@ private FGManager() { instance = this; worldRegions = new CacheMap<>((key, map) -> { if (key instanceof World) { - Multimap uuidMap = HashMultimap.create(); + Multimap uuidMap = HashMultimap.create(); map.put((World) key, uuidMap); return uuidMap; } else return null; @@ -90,8 +89,8 @@ private FGManager() { handlers = HashMultimap.create(); globalRegion = new GlobalRegion(); globalHandler = new GlobalHandler(); - regions.put(SERVER_UUID, globalRegion); - handlers.put(SERVER_UUID, globalHandler); + regions.put(SERVER_OWNER, globalRegion); + handlers.put(SERVER_OWNER, globalHandler); globalRegion.addLink(globalHandler); this.regionCache = new RegionCache(regions, worldRegions); @@ -103,8 +102,8 @@ public static FGManager getInstance() { public static void init() { if (instance == null) instance = new FGManager(); - if (instance.regions.isEmpty()) instance.regions.put(SERVER_UUID, instance.globalRegion); - if (instance.handlers.isEmpty()) instance.handlers.put(SERVER_UUID, instance.globalHandler); + if (instance.regions.isEmpty()) instance.regions.put(SERVER_OWNER, instance.globalRegion); + if (instance.handlers.isEmpty()) instance.handlers.put(SERVER_OWNER, instance.globalHandler); } public static boolean isNameValid(String name) { @@ -115,12 +114,12 @@ public static boolean isNameValid(String name) { } public boolean addHandler(IHandler handler) { - UUID owner = handler.getOwner(); - if (owner == null) owner = SERVER_UUID; + IOwner owner = handler.getOwner(); + if (owner == null) owner = SERVER_OWNER; return addHandler(handler, owner); } - public boolean addHandler(IHandler handler, UUID owner) { + public boolean addHandler(IHandler handler, IOwner owner) { if (handler == null || !isNameValid(handler.getName()) || !isHandlerNameAvailable(handler.getName(), owner) @@ -134,12 +133,12 @@ public boolean addHandler(IHandler handler, UUID owner) { } public boolean addRegion(IRegion region) { - UUID owner = region.getOwner(); - if (owner == null) owner = SERVER_UUID; + IOwner owner = region.getOwner(); + if (owner == null) owner = SERVER_OWNER; return addRegion(region, owner); } - public boolean addRegion(IRegion region, @Nonnull UUID owner) { + public boolean addRegion(IRegion region, @Nonnull IOwner owner) { checkNotNull(owner); if (region == null || !isNameValid(region.getName()) @@ -155,24 +154,24 @@ public boolean addRegion(IRegion region, @Nonnull UUID owner) { } public boolean addRegion(IRegion region, @Nullable World world) { - UUID owner = region.getOwner(); - if (owner == null) owner = SERVER_UUID; + IOwner owner = region.getOwner(); + if (owner == null) owner = SERVER_OWNER; return addRegion(region, owner, world); } - public boolean addRegion(IRegion region, UUID owner, @Nullable World world) { + public boolean addRegion(IRegion region, IOwner owner, @Nullable World world) { if (region instanceof IWorldRegion) { return world != null && addWorldRegion((IWorldRegion) region, owner, world); } else return addRegion(region, owner); } public boolean addWorldRegion(IWorldRegion region, World world) { - UUID owner = region.getOwner(); - if (owner == null) owner = SERVER_UUID; + IOwner owner = region.getOwner(); + if (owner == null) owner = SERVER_OWNER; return addWorldRegion(region, owner, world); } - public boolean addWorldRegion(IWorldRegion region, @Nonnull UUID owner, World world) { + public boolean addWorldRegion(IWorldRegion region, @Nonnull IOwner owner, World world) { checkNotNull(owner); if (region == null || world == null @@ -202,7 +201,7 @@ public Set getAllRegions() { } @Nonnull - public Set getAllRegions(@Nonnull UUID owner) { + public Set getAllRegions(@Nonnull IOwner owner) { checkNotNull(owner); Set set = new HashSet<>(); this.worldRegions.forEach((world, worldMultimap) -> set.addAll(worldMultimap.get(owner))); @@ -220,14 +219,14 @@ public Set getAllRegions(World world) { } @Nonnull - public Set getAllRegions(String name, @Nonnull UUID owner) { + public Set getAllRegions(String name, @Nonnull IOwner owner) { checkNotNull(owner); Set set = new HashSet<>(); for (IRegion region : this.regions.get(owner)) { if (region.getName().equalsIgnoreCase(name)) set.add(region); } - for (Multimap map : this.worldRegions.values()) { + for (Multimap map : this.worldRegions.values()) { for (IWorldRegion region : map.get(owner)) { if (region.getName().equalsIgnoreCase(name)) set.add(region); } @@ -236,7 +235,7 @@ public Set getAllRegions(String name, @Nonnull UUID owner) { } @Nonnull - public Set getAllRegions(World world, @Nonnull UUID owner) { + public Set getAllRegions(World world, @Nonnull IOwner owner) { checkNotNull(owner); if (world == null) return getRegions(); Set set = new HashSet<>(); @@ -246,12 +245,12 @@ public Set getAllRegions(World world, @Nonnull UUID owner) { } @Nonnull - public Set getAllRegionsWithUniqueNames(@Nonnull UUID owner) { + public Set getAllRegionsWithUniqueNames(@Nonnull IOwner owner) { return getAllRegionsWithUniqueNames(owner, null); } @Nonnull - public Set getAllRegionsWithUniqueNames(@Nonnull UUID owner, @Nullable World world) { + public Set getAllRegionsWithUniqueNames(@Nonnull IOwner owner, @Nullable World world) { checkNotNull(owner); Set returnSet = new HashSet<>(); returnSet.addAll(this.regions.get(owner)); @@ -277,21 +276,21 @@ public Set getAllRegionsWithUniqueNames(@Nonnull UUID owner, @Nullable @Nonnull public Set getAllServerRegions() { - return getAllRegions(SERVER_UUID); + return getAllRegions(SERVER_OWNER); } @Nonnull public Set getAllServerRegions(World world) { - return getAllRegions(world, SERVER_UUID); + return getAllRegions(world, SERVER_OWNER); } @Nonnull public Optional getController(String name) { - return getController(name, SERVER_UUID); + return getController(name, SERVER_OWNER); } @Nonnull - public Optional getController(String name, @Nonnull UUID owner) { + public Optional getController(String name, @Nonnull IOwner owner) { checkNotNull(owner); for (IHandler handler : handlers.get(owner)) { if ((handler instanceof IController) && handler.getName().equalsIgnoreCase(name)) { @@ -310,7 +309,7 @@ public Set getControllers() { } @Nonnull - public Set getControllers(@Nonnull UUID owner) { + public Set getControllers(@Nonnull IOwner owner) { checkNotNull(owner); return this.handlers.get(owner).stream() .filter(handler -> handler instanceof IController) @@ -325,11 +324,11 @@ public GlobalHandler getGlobalHandler() { @Nonnull public Optional getHandler(String name) { - return getHandler(name, SERVER_UUID); + return getHandler(name, SERVER_OWNER); } @Nonnull - public Optional getHandler(String name, @Nonnull UUID owner) { + public Optional getHandler(String name, @Nonnull IOwner owner) { checkNotNull(owner); for (IHandler handler : handlers.get(owner)) { if (handler.getName().equalsIgnoreCase(name)) { @@ -345,7 +344,7 @@ public Set getHandlers() { } @Nonnull - public Set getHandlers(@Nonnull UUID owner) { + public Set getHandlers(@Nonnull IOwner owner) { checkNotNull(owner); return ImmutableSet.copyOf(this.handlers.get(owner)); } @@ -362,7 +361,7 @@ public Set getHandlers(boolean includeControllers) { } @Nonnull - public Set getHandlers(boolean includeControllers, UUID owner) { + public Set getHandlers(boolean includeControllers, IOwner owner) { if (includeControllers) { return getHandlers(owner); } else { @@ -374,11 +373,11 @@ public Set getHandlers(boolean includeControllers, UUID owner) { @Nonnull public Optional getRegion(String name) { - return getRegion(name, SERVER_UUID); + return getRegion(name, SERVER_OWNER); } @Nonnull - public Optional getRegion(String name, UUID owner) { + public Optional getRegion(String name, IOwner owner) { for (IRegion region : this.regions.get(owner)) { if (region.getName().equalsIgnoreCase(name)) { return Optional.of(region); @@ -389,11 +388,11 @@ public Optional getRegion(String name, UUID owner) { @Nonnull public Optional getRegionFromWorld(World world, String name) { - return getRegionFromWorld(world, name, SERVER_UUID); + return getRegionFromWorld(world, name, SERVER_OWNER); } @Nonnull - public Optional getRegionFromWorld(World world, String name, @Nonnull UUID owner) { + public Optional getRegionFromWorld(World world, String name, @Nonnull IOwner owner) { checkNotNull(owner); Optional region = getWorldRegion(world, name, owner); @@ -406,7 +405,7 @@ public Set getRegions() { } @Nonnull - public Set getRegions(@Nonnull UUID owner) { + public Set getRegions(@Nonnull IOwner owner) { checkNotNull(owner); return ImmutableSet.copyOf(this.regions.get(owner)); } @@ -569,36 +568,36 @@ public Set getRegionsInChunkAtPos(World world, Vector3d pos, boolean in @Nonnull public Set getServerControllers() { - return getControllers(SERVER_UUID); + return getControllers(SERVER_OWNER); } @Nonnull public Set getServerHandlers() { - return getHandlers(SERVER_UUID); + return getHandlers(SERVER_OWNER); } @Nonnull public Set getServerHandlers(boolean includeControllers) { - return getHandlers(includeControllers, SERVER_UUID); + return getHandlers(includeControllers, SERVER_OWNER); } @Nonnull public Set getServerRegions() { - return getRegions(SERVER_UUID); + return getRegions(SERVER_OWNER); } @Nonnull public Set getServerWorldRegions(World world) { - return getWorldRegions(world, SERVER_UUID); + return getWorldRegions(world, SERVER_OWNER); } @Nonnull public Optional getWorldRegion(World world, String name) { - return getWorldRegion(world, name, SERVER_UUID); + return getWorldRegion(world, name, SERVER_OWNER); } @Nonnull - public Optional getWorldRegion(World world, String name, @Nonnull UUID owner) { + public Optional getWorldRegion(World world, String name, @Nonnull IOwner owner) { checkNotNull(owner); for (IWorldRegion region : this.worldRegions.get(world).get(owner)) { if (region.getName().equalsIgnoreCase(name)) { @@ -614,7 +613,7 @@ public Set getWorldRegions(World world) { } @Nonnull - public Set getWorldRegions(World world, @Nonnull UUID owner) { + public Set getWorldRegions(World world, @Nonnull IOwner owner) { checkNotNull(owner); return ImmutableSet.copyOf(this.worldRegions.get(world).get(owner)); } @@ -622,23 +621,23 @@ public Set getWorldRegions(World world, @Nonnull UUID owner) { public void initWorld(World world) { GlobalWorldRegion gwr = new GlobalWorldRegion(); gwr.setWorld(world); - this.worldRegions.get(world).put(SERVER_UUID, gwr); + this.worldRegions.get(world).put(SERVER_OWNER, gwr); this.regionCache.markDirty(gwr, RegionCache.DirtyType.ADDED); } public boolean isHandlerNameAvailable(String name) { - return isHandlerNameAvailable(name, SERVER_UUID); + return isHandlerNameAvailable(name, SERVER_OWNER); } - public boolean isHandlerNameAvailable(String name, @Nonnull UUID owner) { + public boolean isHandlerNameAvailable(String name, @Nonnull IOwner owner) { return !getHandler(name, owner).isPresent(); } public boolean isRegionNameAvailable(String name) { - return isRegionNameAvailable(name, SERVER_UUID); + return isRegionNameAvailable(name, SERVER_OWNER); } - public boolean isRegionNameAvailable(String name, @Nonnull UUID owner) { + public boolean isRegionNameAvailable(String name, @Nonnull IOwner owner) { if (getRegion(name, owner).isPresent()) return false; for (World world : worldRegions.keySet()) { if (getWorldRegion(world, name, owner).isPresent()) return false; @@ -651,20 +650,20 @@ public boolean isRegistered(IHandler handler) { } public boolean isWorldRegionNameAvailable(String name, World world) { - return isWorldRegionNameAvailable(name, SERVER_UUID, world); + return isWorldRegionNameAvailable(name, SERVER_OWNER, world); } - public boolean isWorldRegionNameAvailable(String name, @Nonnull UUID owner, World world) { + public boolean isWorldRegionNameAvailable(String name, @Nonnull IOwner owner, World world) { return !(getWorldRegion(world, name, owner).isPresent() || getRegion(name, owner).isPresent()); } @Nonnull public Tristate isWorldRegionNameAvailable(String name) { - return isWorldRegionNameAvailable(name, SERVER_UUID); + return isWorldRegionNameAvailable(name, SERVER_OWNER); } @Nonnull - public Tristate isWorldRegionNameAvailable(String name, @Nonnull UUID owner) { + public Tristate isWorldRegionNameAvailable(String name, @Nonnull IOwner owner) { checkNotNull(owner); if (getRegion(name, owner).isPresent()) return Tristate.FALSE; Tristate available = null; @@ -741,7 +740,7 @@ public boolean removeWorldRegion(IWorldRegion region) { regions.remove(region); removed = true; } else { - for (Multimap multimap : this.worldRegions.values()) { + for (Multimap multimap : this.worldRegions.values()) { if (multimap.values().contains(region)) { multimap.values().remove(region); removed = true; @@ -756,7 +755,7 @@ public boolean removeWorldRegion(IWorldRegion region) { return removed; } - public boolean move(IGuardObject object, @Nullable String newName, @Nullable UUID newOwner, @Nullable World newWorld) { + public boolean move(IGuardObject object, @Nullable String newName, @Nullable IOwner newOwner, @Nullable World newWorld) { boolean changed = false, nameChanged = false, ownerChanged = false, worldChanged = false; String tryName = object.getName(); if (newName != null && !newName.isEmpty() && isNameValid(newName)) { @@ -764,7 +763,7 @@ public boolean move(IGuardObject object, @Nullable String newName, @Nullable UUI nameChanged = true; tryName = newName; } - UUID tryOwner = object.getOwner(); + IOwner tryOwner = object.getOwner(); if (newOwner != null) { changed = true; ownerChanged = true; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index 0ae28bf..a685624 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -128,7 +128,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu if (lengthLimit > 0 && name.length() > lengthLimit) throw new CommandException(Text.of("Name is too long! Max " + lengthLimit + " characters.")); - UUID owner = FGManager.SERVER_UUID; + UUID owner = FGManager.SERVER_OWNER; if (parse.flags.containsKey("owner")) { String ownerString = parse.flags.get("owner"); if (ownerString.isEmpty()) { @@ -220,7 +220,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu .append(": Name: ") .append(object.getName()); - if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { + if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) .append(" (").append(owner).append(")"); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index e8d62b4..b9d172e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -127,7 +127,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(object.getName()); UUID owner = ownerResult.getOwner(); - if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { + if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) .append(" (").append(owner).append(")"); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 27208af..5110917 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -123,7 +123,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm String name = object.getName(); String fullName = name; boolean hasOwner = false; - if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { + if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { fullName = owner + ":" + fullName; hasOwner = true; } @@ -212,7 +212,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.genStatePrefix(builder, controller, source); } builder.append(Text.of(FGUtil.getColorForObject(controller), - TextActions.runCommand("/foxguard det c " + FGUtil.getFullName(controller)), + TextActions.runCommand("/foxguard det c " + controller.getFullName()), TextActions.showText(Text.of("View details for controller \"" + controller.getName() + "\"")), FGUtil.getObjectDisplayName(controller, false, null, source) )); @@ -224,7 +224,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.genStatePrefix(builder, region, source); } builder.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + FGUtil.getFullName(region)), + TextActions.runCommand("/foxguard det r " + FGUtil.genWorldFlag(region) + region.getFullName()), TextActions.showText(Text.of("View details for region \"" + region.getName() + "\"")), FGUtil.getObjectDisplayName(region, true, null, source) )); @@ -265,7 +265,7 @@ private void outboundLinks(Text.Builder builder, ILinkable linkable, CommandSour FGUtil.genStatePrefix(builder, handler, source, hasControllers); } builder.append(Text.of(FGUtil.getColorForObject(handler), - TextActions.runCommand("/foxguard det h " + FGUtil.getFullName(handler)), + TextActions.runCommand("/foxguard det h " + handler.getFullName()), TextActions.showText(Text.of("View details for " + (handler instanceof IController ? "controller" : "handler") + " \"" + handler.getName() + "\"")), FGUtil.getObjectDisplayName(handler, false, null, source) )); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 687ec56..069a6f9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -154,7 +154,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.genStatePrefix(output, region, source); } output.append(Text.of(FGUtil.getColorForObject(region), - TextActions.runCommand("/foxguard detail r " + FGUtil.genWorldFlag(region) + FGUtil.getFullName(region)), + TextActions.runCommand("/foxguard detail r " + FGUtil.genWorldFlag(region) + region.getFullName()), TextActions.showText(Text.of("View details")), FGUtil.getObjectDisplayName(region, false, null, source))); if (regionListIterator.hasNext()) output.append(Text.NEW_LINE); @@ -189,7 +189,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm FGUtil.genStatePrefix(output, handler, source, hasControllers); } output.append(Text.of(FGUtil.getColorForObject(handler), - TextActions.runCommand("/foxguard detail handler " + FGUtil.getFullName(handler)), + TextActions.runCommand("/foxguard detail handler " + handler.getFullName()), TextActions.showText(Text.of("View details")), FGUtil.getObjectDisplayName(handler, false, null, source))); if (handlerListIterator.hasNext()) output.append(Text.NEW_LINE); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java index cfe10ae..dd7f2c4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandList.java @@ -221,7 +221,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } while (objectIterator.hasNext() && count < number) { IGuardObject object = objectIterator.next(); - String fullName = object.getOwner().toString() + ":" + object.getName(); + String fullName = object.getFullName(); if (source instanceof Player) { FGUtil.genStatePrefix(builder, object, source, hasControllers); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java index 5dd8f14..468997f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/HandlerData.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.handler; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.UUID; @@ -59,7 +60,7 @@ public HandlerData setName(String name) { } @Override - public HandlerData setOwner(UUID owner) { + public HandlerData setOwner(IOwner owner) { return (HandlerData) super.setOwner(owner); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index 7802501..e13d994 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -232,7 +232,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_OWNER, null))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -250,7 +250,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_OWNER, null))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java index 019efab..1908a92 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java @@ -175,7 +175,7 @@ public void renderHUD(Player player, List regions, List handl for (int i = 0; i < regionCount && i < regions.size(); i++) { IRegion region = regions.get(i); Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_OWNER, null))); score.setScore(slot--); } Score handlersScore = objective.getOrCreateScore(Text.of(TextColors.GREEN, "Handlers " + (config.priority ? "by Priority " : ""), @@ -193,7 +193,7 @@ public void renderHUD(Player player, List regions, List handl objective.setDisplayName(Text.of(TextColors.GOLD, " Regions Here (" + player.getWorld().getName() + ") ")); for (IRegion region : regions) { Score score = objective.getOrCreateScore(Text.of(FGUtil.getColorForObject(region), - " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_UUID, null))); + " " + FGUtil.getObjectDisplayName(region, false, FGManager.SERVER_OWNER, null))); score.setScore(slot--); if (slot <= 0) break; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java index d6f4073..4cadcb5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/misc/FGContextCalculator.java @@ -55,7 +55,7 @@ public void accumulateContexts(Subject calculable, Set accumulator) { StringBuilder builder = new StringBuilder(); for (Iterator iterator = regions.iterator(); iterator.hasNext(); ) { IRegion region = iterator.next(); - if (region instanceof IGlobal || !region.getOwner().equals(FGManager.SERVER_UUID)) continue; + if (region instanceof IGlobal || !region.getOwner().equals(FGManager.SERVER_OWNER)) continue; if (region instanceof IWorldRegion) { builder.append(((IWorldRegion) region).getWorld().getName()).append(":"); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java index 9a4a28a..77c3db1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/FGObjectData.java @@ -26,27 +26,22 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.UUID; public class FGObjectData { protected String name; - protected UUID owner; + protected IOwner owner; protected boolean enabled; - public FGObjectData(String name, UUID owner, boolean enabled) { - if (name == null) this.name = ""; - else this.name = name; - - if(owner == null) this.owner = FGManager.SERVER_UUID; - else this.owner = owner; - - this.enabled = enabled; + public FGObjectData(String name, IOwner owner, boolean enabled) { + setName(name).setOwner(owner).setEnabled(enabled); } public FGObjectData() { - this("", FGManager.SERVER_UUID, true); + this("", FGManager.SERVER_OWNER, true); } public String getName() { @@ -54,16 +49,18 @@ public String getName() { } public FGObjectData setName(String name) { - this.name = name; + if (name == null) this.name = ""; + else this.name = name; return this; } - public UUID getOwner() { + public IOwner getOwner() { return owner; } - public FGObjectData setOwner(UUID owner) { - this.owner = owner; + public FGObjectData setOwner(IOwner owner) { + if(owner == null) this.owner = FGManager.SERVER_OWNER; + else this.owner = owner; return this; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java index 99f5b86..4538684 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/GuardObjectBase.java @@ -26,20 +26,21 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.UUID; public abstract class GuardObjectBase implements IGuardObject { protected String name; - protected UUID owner; + protected IOwner owner; protected boolean enabled = true; public GuardObjectBase(FGObjectData data) { String name = data.getName(); this.name = (name == null || name.isEmpty()) ? "null" : name; - UUID owner = data.getOwner(); - this.owner = owner == null ? FGManager.SERVER_UUID : owner; + IOwner owner = data.getOwner(); + this.owner = owner == null ? FGManager.SERVER_OWNER : owner; this.enabled = data.isEnabled(); } @@ -54,13 +55,13 @@ public void setName(String name) { } @Override - public UUID getOwner() { + public IOwner getOwner() { return owner; } @Override - public void setOwner(UUID owner) { - this.owner = owner == null ? FGManager.SERVER_UUID : owner; + public void setOwner(IOwner owner) { + this.owner = owner == null ? FGManager.SERVER_OWNER : owner; } @Override @@ -75,18 +76,9 @@ public void setEnabled(boolean state) { public abstract void markDirty(); - @Override - public String getFullName() { - String fullName = this.name; - if (this.owner != null && !this.owner.equals(FGManager.SERVER_UUID)) { - fullName = this.owner + ":" + fullName; - } - return fullName; - } - @Override public String toString() { - return "FGObjectBase{" + + return "GuardObjectBase{" + "name='" + name + '\'' + ", owner=" + owner + ", enabled=" + enabled + diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 71a83b7..7b402b6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -27,9 +27,17 @@ public interface IFGObject { */ void setName(String name); - UUID getOwner(); + IOwner getOwner(); - void setOwner(UUID owner); + void setOwner(IOwner owner); + + /** + * Gets the path suffix when storing references in paths. + * This allows objects of completely disparate types to be stored under the same name. + * Any types that share any hierarchy or can otherwise be used in place of another should have the same suffix. + * @return the path suffix. + */ + String getPathSuffix(); String getFullName(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java index 21fab91..86882ff 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java @@ -27,8 +27,10 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.ProcessResult; import net.foxdenstudio.sponge.foxcore.plugin.util.IModifiable; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.command.CommandDetail; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; @@ -155,17 +157,15 @@ default boolean shouldSave() { return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); } - /** - * Gets the path suffix when storing references in paths. - * This allows objects of completely disparate types to be stored under the same name. - * Any types that share any hierarchy or can otherwise be used in place of another should have the same suffix. - * @return the path suffix. - */ - String getPathSuffix(); - @Override default String getFullName(){ - return FGUtil.getFullName(this); + // TODO Rewrite full name impl to use paths with full owners or static IDs + IOwner owner = this.getOwner(); + String fullName = this.getName(); + if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { + fullName = owner + ":" + fullName; + } + return fullName; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java index 8009765..29b6487 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java @@ -79,7 +79,7 @@ public List getProviders() { public Optional getUUIDForOwner(@Nullable String providerType, @Nullable String qualifier) { if (providerType == null || providerType.isEmpty()) { if (qualifier == null || qualifier.isEmpty()) { - return Optional.of(FGManager.SERVER_UUID); + return Optional.empty();//return Optional.of(FGManager.SERVER_OWNER); } else { for (IOwnerProvider provider : ownerProviders) { Optional ownerOpt = provider.getOwnerUUID(qualifier); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java new file mode 100644 index 0000000..f69e52f --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java @@ -0,0 +1,145 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.DirectOwnerElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.OwnerPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; +import net.minecraft.world.World; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.User; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +public final class FoxPath { + + public static final String LOCAL_ALT_PREPREFIX = "~"; + + public static final String LITERAL_PREFIX = "::"; + public static final String DYNAMIC_PREFIX = ":"; + public static final String SERVER_OWNER_PREFIX = "//:"; + public static final String LOCAL_OWNER_PREFIX = "/:"; + public static final String SERVER_GROUP_PREFIX = "//"; + public static final String LOCAL_GROUP_PREFIX = "/"; + public static final String WORKING_PATH_PREFIX = "./"; + + public static final RootPath DEFAULT_ROOT = RootPath.SERVER_OWNER; + + private static final PathManager PATH_MANAGER = PathManager.getInstance(); + + private int depth = 0; + private RootPath rootPath; + private List pathNames = new ArrayList<>(); + private List pathElements = new ArrayList<>(); + + FoxPath(@Nonnull RootPath rootPath, @Nullable CommandSource source) { + this(rootPath, rootPath.prefixes[0], source); + } + + FoxPath(@Nonnull String rootPrefix, @Nullable CommandSource source) { + this(RootPath.from(rootPrefix), rootPrefix, source); + } + + private FoxPath(@Nonnull RootPath rootPath, @Nonnull String prefix, @Nullable CommandSource source) { + this.rootPath = rootPath; + this.pathElements.add(rootPath.rootProvider.apply(source)); + this.pathNames.add(prefix); + } + + @Nonnull + public Result resolve(@Nonnull String element) { + if (element.equals(".")) return Result.SUCCESS; + else if (element.equals("..")) { + goUp(); + return Result.SUCCESS; + } else if (element.startsWith(".")) return Result.FAILED; + + IPathElement currentElement = this.pathElements.get(depth); + if (currentElement == null) return Result.FAILED; + + Optional newElementOpt = currentElement.resolve(element); + if (newElementOpt.isPresent()) { + this.pathElements.add(newElementOpt.get()); + this.pathNames.add(element); + this.depth++; + return Result.SUCCESS; + } else { + this.pathElements.add(null); + this.pathNames.add(element); + this.depth++; + return Result.PHANTOM; + } + } + + + public static Optional fromUserInput(@Nonnull String input, @Nullable String extension, @Nullable World world) { + RootPath rootPath = RootPath.from(input); + input = rootPath.trimPrefix(input); + if (input.isEmpty()) return Optional.empty(); + String[] parts = input.split(":+", 2); + + if (extension == null) extension = ""; + + return null; + } + + private void goUp() { + if (depth == 0) return; + + pathNames.remove(depth); + pathElements.remove(depth); + depth--; + } + + enum Result { + SUCCESS, FAILED, PHANTOM + } + + public enum RootPath { + + LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // - :: + DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX, '~' + DYNAMIC_PREFIX), // - : + SERVER_OWNER(new DirectOwnerElement.Suppier(true), SERVER_OWNER_PREFIX), + LOCAL_OWNER(new DirectOwnerElement.Suppier(false)), + SERVER_GROUP(source -> PATH_MANAGER.getServerGroup()), + LOCAL_GROUP(source -> source instanceof User ? + PATH_MANAGER.getUserLocalGroup(((User) source).getUniqueId()) : + PATH_MANAGER.getServerLocalGroup()), + //WORKING_PATH(), + ; + + public final String[] prefixes; + Function rootProvider; + + RootPath(Function rootProvider, String... prefixes) { + this.rootProvider = rootProvider; + this.prefixes = prefixes; + } + + public String getPrefix(String input) { + for (String prefix : this.prefixes) { + if (input.startsWith(prefix)) return prefix; + } + return ""; + } + + public String trimPrefix(String input) { + return input.substring(getPrefix(input).length()); + } + + public static RootPath from(String input) { + if (input == null) return null; + for (RootPath root : values()) { + for (String prefix : root.prefixes) { + if (input.startsWith(prefix)) return root; + } + } + return null; + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java index 6184fe6..18bd9d9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -1,34 +1,37 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; -import com.google.gson.TypeAdapter; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.OwnerPathElement; +import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.*; -import org.spongepowered.api.command.CommandSource; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import java.util.function.Function; /** * Created by fox on 3/7/18. */ public class PathManager { - public static final String LITERAL_PREFIX = "::"; - public static final String DYNAMIC_PREFIX = ":"; private static PathManager ourInstance = new PathManager(); private Map> typeClassMap = new HashMap<>(); private Map, OwnerAdapterFactory> adapterMap = new HashMap<>(); private Map, PathOwnerProvider.Literal.Factory> literalPathProviderMap = new HashMap<>(); private Map> dynamicPathProviderMap = new HashMap<>(); - - private Map playerLocalGroups = new HashMap<>(); + private Map userLocalGroups = new CacheMap<>((key, map) -> { + if (key instanceof UUID) { + RootGroupElement element = RootGroupElement.createLocal(); + map.put(((UUID) key), element); + return element; + } else return null; + }); + private RootGroupElement serverLocalGroup = RootGroupElement.createLocal(); + private RootGroupElement serverGroup = RootGroupElement.createServer(); private PathManager() { registerOwnerType(UUIDOwner.TYPE, UUIDOwner.class, @@ -59,8 +62,16 @@ public boolean registerOwnerType( } @SuppressWarnings("unchecked") - public TypeAdapter getOwnerTypeAdapter(Class tClass) { - return (TypeAdapter) this.adapterMap.get(tClass); + public OwnerAdapterFactory getOwnerTypeAdapterFactory(Class tClass) { + return (OwnerAdapterFactory) this.adapterMap.get(tClass); + } + + public OwnerAdapterFactory getOwnerTypeAdapter(String type) { + return this.adapterMap.get(this.typeClassMap.get(type)); + } + + public Class getTypeClass(String type) { + return this.typeClassMap.get(type); } @SuppressWarnings("unchecked") @@ -76,41 +87,20 @@ public PathOwnerProvider.Factory getDynamicPathOwnerProvider(S return this.dynamicPathProviderMap.get(type); } - - public IGuardObject getObject(String input, String extension, CommandSource source) { - - - return null; + public RootGroupElement getServerLocalGroup() { + return serverLocalGroup; } - public enum RootPath { - - LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // - :: - DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX), // - : - ; - - public final String prefix; - Function rootProvider; - - RootPath(Function rootProvider, String prefix) { - this.rootProvider = rootProvider; - this.prefix = prefix; - } - - public static RootPath from(String input) { - if (input == null) return null; - for (RootPath root : values()) { - if (input.startsWith(root.prefix)) return root; - } - return null; - } + public RootGroupElement getServerGroup() { + return serverGroup; } - public static class PathResult { - String objectName; - boolean objectPresent; + public RootGroupElement getUserLocalGroup(@Nonnull UUID user) { + return this.userLocalGroups.get(user); + } - IPathElement pathElement; - boolean pathPresent; + public RootGroupElement getLocalGroup(@Nullable UUID user) { + return user == null ? getServerLocalGroup() : getUserLocalGroup(user); } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java deleted file mode 100644 index 937162a..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/BasePathElement.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; - -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; - -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; - -public abstract class BasePathElement implements IPathElement { - - IPathElement parent; - - public BasePathElement(IPathElement parent) { - this.parent = parent; - } - - @Override - public Optional resolve(String name) { - return Optional.empty(); - } - - @Override - public Optional get(@Nonnull String name) { - return Optional.empty(); - } - - @Override - public Collection getPathSuggestions() { - return null; - } - - @Override - public Map getObjects() { - return null; - } - - @Override - public boolean isPersistent() { - return false; - } - - @Override - public IPathElement getParent() { - return this.parent; - } -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java new file mode 100644 index 0000000..4121dfd --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java @@ -0,0 +1,89 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.world.World; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Function; + +public class DirectOwnerElement implements IPathElement { + + private final UUID uuid; + private final UUIDOwner owner; + + public DirectOwnerElement(UUID uuid) { + this.uuid = uuid; + owner = new UUIDOwner(UUIDOwner.USER_GROUP, this.uuid); + } + + @Override + public Optional resolve(String name) { + return Optional.empty(); + } + + @Override + public Optional getName(IPathElement path) { + return Optional.empty(); + } + + @Override + public Optional get(@Nonnull String name, @Nullable World world) { + //TODO fetch object from manager + return Optional.empty(); + } + + @Override + public Collection getPathSuggestions() { + return ImmutableList.of(); + } + + @Override + public Map getObjects() { + //TODO fetch objects from manager. + return null; + } + + @Override + public boolean isPersistent() { + return false; + } + + @Override + public boolean finished() { + return true; + } + + public static class Suppier implements Function { + + private final Map cache = new CacheMap<>((key, map) -> { + if (key instanceof UUID) { + UUID uuid = ((UUID) key); + DirectOwnerElement element = new DirectOwnerElement(uuid); + map.put(uuid, element); + return element; + } else return null; + }); + private final boolean server; + + public Suppier(boolean server) { + this.server = server; + } + + @Override + public IPathElement apply(CommandSource source) { + return source instanceof User && !this.server ? + cache.get(((User) source).getUniqueId()) : + cache.get(null); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java index 4d98d1c..1b01164 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java @@ -1,46 +1,30 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; import com.google.common.collect.ImmutableMap; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collection; import java.util.Map; import java.util.Optional; public class GroupElement implements IModifiablePathElement { - IPathElement parent; - String name; Map children; - Map objects; + Map objects; - public GroupElement(@Nonnull IModifiablePathElement parent, String name) { - this.applyParent(parent, name); - } + public GroupElement() { - /** - * Protected constructor that does not set a parent. - * While regular instances should always have a parent of some kind, - */ - protected GroupElement() { } @Override public Optional resolve(String name, boolean create) { - if (name.equals(".")) { - return Optional.of(this); - } else if (name.equals("..")) { - if (this.parent != null) { - return Optional.of(this.parent); - } else { - return Optional.of(this); - } - } IPathElement ret = this.children.get(name); if (ret == null && create) { - ret = new GroupElement(this, name); + ret = new GroupElement(); } return Optional.ofNullable(ret); } @@ -62,17 +46,15 @@ public boolean add(String name, IPathElement path) { } @Override - public Optional get(@Nonnull String name) { - IGuardObject object = this.objects.get(name); + public Optional get(@Nonnull String name, @Nullable World world) { + IFGObject object = this.objects.get(name); if (object != null) { return Optional.of(object); - } else if (this.parent != null && name.isEmpty() || name.startsWith(".")) { - return this.parent.get(this.name + name); } else return Optional.empty(); } @Override - public boolean add(IGuardObject object, String name, boolean genExtension) { + public boolean add(IFGObject object, String name, boolean genExtension) { String keyName = name; if (genExtension) { keyName += "." + object.getPathSuffix(); @@ -85,7 +67,7 @@ public boolean add(IGuardObject object, String name, boolean genExtension) { } @Override - public boolean remove(IGuardObject object) { + public boolean remove(IFGObject object) { return this.objects.values().remove(object); } @@ -104,7 +86,7 @@ public Collection getPathSuggestions() { } @Override - public Map getObjects() { + public Map getObjects() { return ImmutableMap.copyOf(this.objects); } @@ -118,26 +100,4 @@ public boolean isPersistent() { return false; } - @Override - public IPathElement getParent() { - return this.parent; - } - - @Override - public boolean setParent(@Nonnull IPathElement parent) { - this.parent = parent; - Optional nameOpt = parent.getName(this); - this.name = nameOpt.orElse(null); - return true; - } - - @Override - public boolean applyParent(@Nonnull IModifiablePathElement parent, @Nonnull String name) { - if (this.parent == null) this.parent = parent; - if (this.name == null) this.name = name; - if (!parent.add(name, this)) return false; - this.parent = parent; - this.name = name; - return true; - } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java index 2f9e141..8e0e383 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IModifiablePathElement.java @@ -1,11 +1,10 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import javax.annotation.Nonnull; import java.util.Optional; -public interface IModifiablePathElement extends IRelocatablePathElement { +public interface IModifiablePathElement extends IPathElement { @Override default Optional resolve(String name) { @@ -16,11 +15,11 @@ default Optional resolve(String name) { boolean add(String name, IPathElement path); - default boolean add(IGuardObject object) { + default boolean add(IFGObject object) { return add(object, object.getName()); } - default boolean add(IGuardObject object, String name) { + default boolean add(IFGObject object, String name) { return add(object, name, true); } @@ -33,9 +32,9 @@ default boolean add(IGuardObject object, String name) { * @param genExtension * @return */ - boolean add(IGuardObject object, String name, boolean genExtension); + boolean add(IFGObject object, String name, boolean genExtension); - boolean remove(IGuardObject object); + boolean remove(IFGObject object); boolean remove(IPathElement path); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java index 5115207..a017665 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java @@ -1,9 +1,11 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.FoxInvalidPathException; +import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import org.spongepowered.api.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -14,11 +16,24 @@ public interface IPathElement { Optional getName(IPathElement path); - Optional get(@Nonnull String name); + Optional get(@Nonnull String name, @Nullable World world); Collection getPathSuggestions(); - Map getObjects(); + Map getObjects(); + + default Map getObjects(String extension){ + ImmutableMap.Builder builder = ImmutableMap.builder(); + + for(Map.Entry entry : getObjects().entrySet()){ + String name = entry.getKey(); + if(name.endsWith(extension)){ + builder.put(entry); + } + } + + return builder.build(); + } /** * Check whether this is still persistent. @@ -29,5 +44,8 @@ public interface IPathElement { */ boolean isPersistent(); - IPathElement getParent(); + default boolean finished(){ + return false; + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java index 66a150f..0ddbd8a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java @@ -1,21 +1,33 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; import com.google.common.collect.ImmutableMap; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import org.spongepowered.api.world.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Map; import java.util.Optional; -public interface IPathOnlyElement extends IRelocatablePathElement { +public interface IPathOnlyElement extends IPathElement { @Override - default Optional get(@Nonnull String name) { + default Optional get(@Nonnull String name, @Nullable World world) { return Optional.empty(); } @Override - default Map getObjects() { + default Map getObjects() { return ImmutableMap.of(); } + + @Override + default Optional getName(IPathElement path) { + return Optional.empty(); + } + + @Override + default boolean isPersistent() { + return false; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java deleted file mode 100644 index 518d00a..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IRelocatablePathElement.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; - -import javax.annotation.Nonnull; - -public interface IRelocatablePathElement extends IPathElement { - - boolean applyParent(@Nonnull IModifiablePathElement parent, @Nonnull String newName); - - boolean setParent(@Nonnull IPathElement parent); -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java index 5d27a82..e9f0fee 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java @@ -6,7 +6,10 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import org.spongepowered.api.world.World; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.*; public abstract class OwnerPathElement

> implements IPathElement { @@ -33,13 +36,13 @@ private OwnerPathElement(OwnerPathElement

parent, String next) { } @Override - public Optional get(String name) { + public Optional get(@Nonnull String name, @Nullable World world) { if (name.isEmpty() || !this.provider.isValid()) return Optional.empty(); if (this.parent != null) { if (name.startsWith(".")) { String current = this.currentPath.get(this.currentPath.size() - 1); - return this.parent.get(current + name); + return this.parent.get(current + name, null); } } IOwner owner = provider.getOwner().orElse(null); @@ -86,8 +89,8 @@ public boolean isPersistent() { } @Override - public IPathElement getParent() { - return this.parent; + public boolean finished() { + return this.provider.isValid(); } public static class Literal extends OwnerPathElement> { @@ -119,13 +122,7 @@ private Literal(Literal parent, String next) { @Override public Optional resolve(String name) { if (name == null || name.isEmpty()) return Optional.empty(); - else if (name.equals("..")) { - if (this.parent != null) { - return Optional.of((Literal) this.parent); - } else { - return Optional.of(this); - } - } else return Optional.of(new Literal(this, name)); + else return Optional.of(new Literal(this, name)); } } @@ -152,13 +149,7 @@ private Dynamic(Dynamic parent, String next) { @Override public Optional resolve(String name) { if (name == null || name.isEmpty()) return Optional.empty(); - else if (name.equals("..")) { - if (this.parent != null) { - return Optional.of((Dynamic) this.parent); - } else { - return Optional.of(this); - } - } else return Optional.of(new Dynamic(this, name)); + else return Optional.of(new Dynamic(this, name)); } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java index f42af78..8b45564 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java @@ -1,13 +1,21 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.profile.GameProfile; +import org.spongepowered.api.service.user.UserStorageService; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.Identifiable; -import java.util.HashMap; -import java.util.Map; +import java.util.*; public class RootGroupElement extends StructuredGroupElement { - public RootGroupElement(){ + public RootGroupElement() { this(ImmutableMap.of()); } @@ -20,14 +28,118 @@ public boolean isPersistent() { return true; } - public static RootGroupElement getServerRootGroup(){ + public static RootGroupElement createServer() { + PathManager manager = PathManager.getInstance(); Map fixed = new HashMap<>(); + fixed.put("s", manager.getServerLocalGroup()); + fixed.put("p", new PlayerAccessNameElement()); + + fixed.put("o", new PlayerAccessOfflineElement()); + + fixed.put("u", new PlayerAccessUUIDElement()); return new RootGroupElement(fixed); } + public static RootGroupElement createLocal() { + return new RootGroupElement(); + } + + private static class PlayerAccessNameElement implements IPathOnlyElement, IPathElement { + + @Override + public Optional resolve(String name) { + Optional playerOptional = Sponge.getServer().getPlayer(name); + + return playerOptional.map(player -> PathManager.getInstance().getUserLocalGroup(player.getUniqueId())); + } + + @Override + public Collection getPathSuggestions() { + return Sponge.getServer().getOnlinePlayers().stream() + .map(User::getName) + .sorted() + .collect(GuavaCollectors.toImmutableList()); + } + } + + private static class PlayerAccessOfflineElement implements IPathOnlyElement, IPathElement { + + @Override + public Optional resolve(String name) { + UserStorageService service = FoxGuardMain.instance().getUserStorage(); + Optional playerOptional = service.get(name); + + return playerOptional.map(player -> PathManager.getInstance().getUserLocalGroup(player.getUniqueId())); + } + + @Override + public Collection getPathSuggestions() { + UserStorageService service = FoxGuardMain.instance().getUserStorage(); + return service.getAll().stream() + .map(org.spongepowered.api.profile.GameProfile::getName) + .filter(Optional::isPresent) + .map(Optional::get) + .sorted() + .collect(GuavaCollectors.toImmutableList()); + } + } + + private static class PlayerAccessUUIDElement implements IPathOnlyElement, IPathElement { + + public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; + @Override + public Optional resolve(String name) { + UUID uuid = null; + if (name.matches(UUID_REGEX)) { + uuid = UUID.fromString(name); + } else { + name = name.replace("-", ""); + if (name.matches("[\\da-f]+")) { + if (name.length() == 32) { + name = name.substring(0, 8) + "-" + + name.substring(8, 12) + "-" + + name.substring(12, 16) + "-" + + name.substring(16, 20) + "-" + + name.substring(20, 32); + uuid = UUID.fromString(name); + } else if (name.length() < 32) { + List candidates = getCandidates(name); + if (candidates.size() == 1) uuid = candidates.get(0); + } + } + } + if (uuid == null) return Optional.empty(); + return Optional.ofNullable(PathManager.getInstance().getUserLocalGroup(uuid)); + } + + @Override + public Collection getPathSuggestions() { + UserStorageService service = FoxGuardMain.instance().getUserStorage(); + + return service.getAll().stream() + .map(Identifiable::getUniqueId) + .map(UUID::toString) + .sorted() + .collect(GuavaCollectors.toImmutableList()); + } + + private List getCandidates(String name) { + UserStorageService service = FoxGuardMain.instance().getUserStorage(); + name = name.replace("-", ""); + + List candidates = new ArrayList<>(); + for (GameProfile profile : service.getAll()) { + UUID id = profile.getUniqueId(); + if (id.toString().replace("-", "").startsWith(name)) { + candidates.add(id); + } + } + return candidates; + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java index fca7f13..15c1908 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java @@ -2,7 +2,6 @@ import com.google.common.collect.ImmutableMap; -import javax.annotation.Nonnull; import java.util.HashMap; import java.util.Map; @@ -10,11 +9,6 @@ public class StructuredGroupElement extends GroupElement { private Map fixedChildren; - public StructuredGroupElement(@Nonnull IModifiablePathElement parent, String name, Map fixedChildren) { - this(fixedChildren); - this.applyParent(parent, name); - } - protected StructuredGroupElement(Map fixedChildren) { this.children = new HashMap<>(fixedChildren); this.fixedChildren = ImmutableMap.copyOf(fixedChildren); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java index c50c83c..e6fea23 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/OwnerTypeAdapter.java @@ -5,13 +5,18 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import javax.annotation.Nonnull; + public abstract class OwnerTypeAdapter extends TypeAdapter { public final String group; protected final Gson gson; - protected OwnerTypeAdapter(String group, Gson gson) { + protected OwnerTypeAdapter(@Nonnull String group, @Nonnull Gson gson) { this.group = group; this.gson = gson; } + + + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java index 5fcc72e..308aa9d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java @@ -12,10 +12,6 @@ public interface PathOwnerProvider { boolean apply(String element); default Collection getSuggestions() { - return this.getSuggestions(this.numApplied()); - } - - default Collection getSuggestions(int index) { return ImmutableList.of(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java index b60b066..05eaa58 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java @@ -6,7 +6,11 @@ import com.google.gson.TypeAdapterFactory; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import javax.annotation.Nonnull; @@ -20,12 +24,14 @@ */ public abstract class BaseOwner implements IOwner { + public static final String DEFAULT_GROUP = "unknown"; + protected final String group; protected final String type; protected BaseOwner(@Nonnull String type, @Nonnull String group) { this.type = type; - this.group = group; + this.group = group.isEmpty() ? DEFAULT_GROUP : group; } public String getType() { @@ -76,33 +82,99 @@ public String toString() { public static class Adapter extends TypeAdapter { + public static final String GROUP_KEY = "group"; + public static final String TYPE_KEY = "type"; + public static final String DATA_KEY = "data"; + private final TypeAdapter jsonElementTypeAdapter; + private final Gson gson; - public Adapter(TypeAdapter jsonElementTypeAdapter) { + public Adapter(TypeAdapter jsonElementTypeAdapter, Gson gson) { this.jsonElementTypeAdapter = jsonElementTypeAdapter; + this.gson = gson; } + @SuppressWarnings("unchecked") @Override public void write(JsonWriter out, BaseOwner value) throws IOException { - + if (value == null) { + out.nullValue(); + return; + } + out.beginObject(); + out.name(GROUP_KEY); + out.value(value.group); + out.name(TYPE_KEY); + out.value(value.type); + out.name(DATA_KEY); + + OwnerAdapterFactory factory = PathManager.getInstance().getOwnerTypeAdapterFactory(value.getClass()); + OwnerTypeAdapter adapter = factory.apply(value.group, gson); + adapter.write(out, value); + out.endObject(); } @Override public BaseOwner read(JsonReader in) throws IOException { - - return null; + if(in.peek() == JsonToken.NULL) { + in.nextNull(); + return null; + } + String group = null, type = null; + JsonElement tree = null; + BaseOwner owner = null; + + in.beginObject(); + + while (in.hasNext() && in.peek() != JsonToken.END_OBJECT) { + String name = in.nextName(); + switch (name) { + case GROUP_KEY: + group = in.nextString(); + break; + case TYPE_KEY: + type = in.nextString(); + break; + case DATA_KEY: + if (group == null || group.isEmpty() || type == null || type.isEmpty()) { + tree = jsonElementTypeAdapter.read(in); + } else { + OwnerAdapterFactory factory = PathManager.getInstance().getOwnerTypeAdapter(type); + OwnerTypeAdapter adapter = factory.apply(group, gson); + owner = adapter.read(in); + } + + + } + } + in.endObject(); + + if (group == null || group.isEmpty() || type == null || type.isEmpty()) return null; + + if (tree != null) { + OwnerAdapterFactory factory = PathManager.getInstance().getOwnerTypeAdapter(type); + OwnerTypeAdapter adapter = factory.apply(group, gson); + owner = adapter.fromJsonTree(tree); + } + + return owner; } - } - public static class AdapterFactory implements TypeAdapterFactory { + public static class Factory implements TypeAdapterFactory { - @SuppressWarnings("unchecked") - @Override - public TypeAdapter create(Gson gson, TypeToken type) { - if (!BaseOwner.class.isAssignableFrom(type.getRawType())) return null; - TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); - Adapter adapter = new Adapter(jsonElementTypeAdapter); - return (TypeAdapter) adapter; + public static final Factory INSTANCE = new Factory(); + + private Factory(){} + + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!BaseOwner.class.isAssignableFrom(type.getRawType())) return null; + TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); + Adapter adapter = new Adapter(jsonElementTypeAdapter, gson); + return (TypeAdapter) adapter; + } } } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java index 737f9bf..463e8ba 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/ControllersStateField.java @@ -69,7 +69,7 @@ public Text currentState(CommandSource source) { IController controller = it.next(); if (source instanceof Player) { builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s c remove " + FGUtil.getFullName(controller)), + TextActions.runCommand("/foxguard s c remove " + controller.getFullName()), TextActions.showText(Text.of("Remove from Handler State Buffer")), " [-] ")); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java index 2fd94e6..5fba0f5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/HandlersStateField.java @@ -69,7 +69,7 @@ public Text currentState(CommandSource source) { IHandler handler = it.next(); if (source instanceof Player) { builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s h remove " + FGUtil.getFullName(handler)), + TextActions.runCommand("/foxguard s h remove " + handler.getFullName()), TextActions.showText(Text.of("Remove from Handler State Buffer")), " [-] ")); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java index 2d532d6..df50d97 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/state/RegionsStateField.java @@ -86,7 +86,7 @@ public Text currentState(CommandSource source) { builder.append(Text.of(TextColors.RED, TextActions.runCommand("/foxguard s r remove " + FGUtil.genWorldFlag(region) + - FGUtil.getFullName(region)), + region.getFullName()), TextActions.showText(Text.of("Remove from State Buffer")), " [-] ")); } @@ -202,7 +202,7 @@ public List getScoreboardText() { int[] index = {1}; return this.list.stream() .map(region -> Text.of(FGUtil.getColorForObject(region), - " " + index[0]++ + ": " + FGUtil.getObjectDisplayName(region,true, FGManager.SERVER_UUID, null))) + " " + index[0]++ + ": " + FGUtil.getObjectDisplayName(region,true, FGManager.SERVER_OWNER, null))) .collect(Collectors.toList()); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java index 2cf3529..d88a264 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java @@ -61,7 +61,7 @@ public Optional> getLegacyIndex(Path file) { String[] parts = handlerString.split(","); for (String part : parts) { if (!part.isEmpty()) { - links.add(new FGSObjectPath(part, FGManager.SERVER_UUID)); + links.add(new FGSObjectPath(part, FGManager.SERVER_OWNER)); } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java index f18f2e2..2145e33 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java @@ -28,6 +28,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.List; import java.util.UUID; @@ -43,7 +44,7 @@ public class FGSObjectIndex extends FGSObjectMeta { Integer priority; List links; - public FGSObjectIndex(String name, UUID owner, String category, String type, Boolean enabled, Integer priority, List links) { + public FGSObjectIndex(String name, IOwner owner, String category, String type, Boolean enabled, Integer priority, List links) { super(name, owner, category, type); this.enabled = enabled; this.priority = priority; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java index 4599d1b..8f53b81 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java @@ -26,6 +26,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import java.util.UUID; @@ -39,7 +40,7 @@ public class FGSObjectMeta extends FGSObjectPath { String category; String type; - public FGSObjectMeta(String name, UUID owner, String category, String type) { + public FGSObjectMeta(String name, IOwner owner, String category, String type) { super(name, owner); this.category = category; this.type = type; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java index 2f09a77..3aed483 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java @@ -27,6 +27,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.UUID; @@ -36,16 +37,16 @@ */ public class FGSObjectPath { String name; - UUID owner; + IOwner owner; transient IGuardObject object; public FGSObjectPath() { - this.owner = FGManager.SERVER_UUID; + this.owner = FGManager.SERVER_OWNER; } - public FGSObjectPath(String name, UUID owner) { + public FGSObjectPath(String name, IOwner owner) { this.name = name; - this.owner = owner == null ? FGManager.SERVER_UUID : owner; + this.owner = owner == null ? FGManager.SERVER_OWNER : owner; } public FGSObjectPath(IGuardObject object) { @@ -64,11 +65,11 @@ public void setName(String name) { this.name = name; } - public UUID getOwner() { + public IOwner getOwner() { return owner; } - public void setOwner(UUID owner) { + public void setOwner(IOwner owner) { this.owner = owner; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index e9a7ea5..29c7b0b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -46,6 +46,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -70,7 +72,7 @@ import java.util.*; import java.util.stream.Collectors; -import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_UUID; +import static net.foxdenstudio.sponge.foxguard.plugin.FGManager.SERVER_OWNER; /** * Created by Fox on 7/8/2017. @@ -117,10 +119,7 @@ private FGStorageManagerNew() { builder.append(" "); } gsonIndentString = builder.toString(); - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.setPrettyPrinting(); - gson = gsonBuilder.create(); - + gson = getGsonBuilder().create(); } public static FGStorageManagerNew getInstance() { @@ -156,6 +155,7 @@ private void saveIndex(Set objects, Path file) { boolean autoSave = object.autoSave(); if (autoSave || saveLinks) { FGSObjectIndex index = new FGSObjectIndex(object); + if (index.owner.equals(SERVER_OWNER)) index.owner = null; if (!autoSave) { index.type = null; index.enabled = null; @@ -525,13 +525,13 @@ public Optional loadObject(Path directory, @Nullable FGSObjectInde return Optional.empty(); } - UUID owner = null; + IOwner owner = null; if (index != null) owner = index.owner; - if (owner == null) owner = SERVER_UUID; + if (owner == null) owner = SERVER_OWNER; - boolean isOwned = !owner.equals(SERVER_UUID); - Optional userOwner = isOwned ? userStorageService.get(owner) : Optional.empty(); - UUID finalOwner = owner; + boolean isOwned = !owner.equals(SERVER_OWNER); + Optional userOwner = isOwned ? FGUtil.getUserFromOwner(owner) : Optional.empty(); + IOwner finalOwner = owner; String ownerName = (userOwner.map(user -> user.getName() + ":" + finalOwner).orElse("None")); @@ -587,6 +587,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectInde public GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapterFactory(BaseOwner.Adapter.Factory.INSTANCE); if (prettyPrint) builder.setPrettyPrinting(); return builder; @@ -737,7 +738,7 @@ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOEx tryOp(FileOp.DELETE_FILE, parent); multiple = true; } - if(multiple){ + if (multiple) { tryOp(FileOp.CREATE_MULTI, path); } else { tryOp(FileOp.CREATE, path); @@ -1002,7 +1003,7 @@ private Path getObjectDirectory(FGSObjectMeta meta, @Nullable World world) { world); } - private Path getObjectDirectory(FGCat fgCat, UUID owner, String name, boolean inWorld, @Nullable World world) { + private Path getObjectDirectory(FGCat fgCat, IOwner owner, String name, boolean inWorld, @Nullable World world) { if (fgCat == null) fgCat = FGCat.OBJECT; Path dir; if (inWorld) { @@ -1016,8 +1017,8 @@ private Path getObjectDirectory(FGCat fgCat, UUID owner, String name, boolean in boolean ownerFirst = FGConfigManager.getInstance().ownerFirst(); if (!ownerFirst) dir = dir.resolve(fgCat.pathName); - if (owner != null && !owner.equals(SERVER_UUID)) { - dir = dir.resolve(OWNERS_DIR_NAME).resolve(owner.toString()); + if (owner != null && !owner.equals(SERVER_OWNER)) { + dir = dir.resolve(owner.getDirectory()); } if (ownerFirst) dir = dir.resolve(fgCat.pathName); @@ -1089,7 +1090,7 @@ private FGCat getObjectType(IGuardObject object) { private enum FGCat { REGION("regions") { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { return FGManager.getInstance().isRegionNameAvailable(name, owner); } @@ -1100,7 +1101,7 @@ public IGuardObject loadInstance(Path directory, String type, FGObjectData data) }, WORLDREGION("wregions") { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { if (world == null) return FGManager.getInstance().isWorldRegionNameAvailable(name, owner) == Tristate.TRUE; else return FGManager.getInstance().isWorldRegionNameAvailable(name, owner, world); @@ -1113,7 +1114,7 @@ public IGuardObject loadInstance(Path directory, String type, FGObjectData data) }, HANDLER("handlers") { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { return FGManager.getInstance().isHandlerNameAvailable(name, owner); } @@ -1130,7 +1131,7 @@ public IGuardObject loadInstance(Path directory, String type, FGObjectData data) }, CONTROLLER(HANDLER.pathName) { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { return HANDLER.isNameAvailable(name, owner, world); } @@ -1147,7 +1148,7 @@ public IGuardObject loadInstance(Path directory, String type, FGObjectData data) }, OBJECT("objects") { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { return true; } @@ -1176,7 +1177,7 @@ public String getIndexFile() { return pathName + ".foxcf"; } - public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); + public abstract boolean isNameAvailable(String name, IOwner owner, @Nullable World world); public abstract IGuardObject loadInstance(Path directory, String type, FGObjectData data); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 7d9085c..429a022 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -25,7 +25,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.util; -import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; @@ -34,10 +33,10 @@ import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; @@ -46,7 +45,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import org.spongepowered.api.Sponge; -import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.service.user.UserStorageService; @@ -54,23 +52,13 @@ import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; -import org.spongepowered.api.util.GuavaCollectors; -import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.util.Tristate; -import org.spongepowered.api.world.Locatable; -import org.spongepowered.api.world.World; +import javax.annotation.Nullable; import java.util.List; import java.util.Optional; -import java.util.Set; -import java.util.UUID; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.HANDLERS_ALIASES; -import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.REGIONS_ALIASES; -import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.isIn; +import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public final class FGUtil { @@ -100,42 +88,53 @@ public static List getSelectedControllers(CommandSource source) { return ((ControllersStateField) FCStateManager.instance().getStateMap().get(source).getOrCreate(ControllersStateField.ID).get()).getList(); } - public static String getObjectDisplayName(IGuardObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { - if(owner == null) owner = object.getOwner(); + public static String getObjectDisplayName(IGuardObject object, boolean dispWorld, @Nullable IOwner owner, @Nullable CommandSource viewer) { + if (owner == null) owner = object.getOwner(); boolean hasOwner; - hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); + hasOwner = (owner != null && !owner.equals(FGManager.SERVER_OWNER)); return object.getShortTypeName() + " : " + (dispWorld && object instanceof IWorldBound ? ((IWorldBound) object).getWorld().getName() + " : " : "") - + (hasOwner ? OwnerManager.getInstance().getDisplayName(owner, null, viewer) + " : " : "") + // TODO make better display name thing + + (hasOwner ? owner.toString() + " : " : "") + object.getName(); } - public static Text getObjectDisplayTest(IGuardObject object, boolean dispWorld, @Nullable UUID owner, @Nullable CommandSource viewer) { - if(owner == null) owner = object.getOwner(); + + public static Text getObjectDisplayTest(IGuardObject object, boolean dispWorld, @Nullable IOwner owner, @Nullable CommandSource viewer) { + if (owner == null) owner = object.getOwner(); boolean hasOwner; - hasOwner = (owner != null && !owner.equals(FGManager.SERVER_UUID)); + hasOwner = (owner != null && !owner.equals(FGManager.SERVER_OWNER)); Text.Builder builder = Text.builder(); + // TODO finish display text + return builder.build(); } public static String getLogName(IGuardObject object) { if (userStorageService == null) userStorageService = FoxGuardMain.instance().getUserStorage(); - UUID owner = object.getOwner(); - boolean isOwned = !owner.equals(FGManager.SERVER_UUID); - Optional userOwner = isOwned ? userStorageService.get(owner) : Optional.empty(); + IOwner owner = object.getOwner(); + boolean isOwned = !owner.equals(FGManager.SERVER_OWNER); + // TODO come up with better logname impl + Optional userOwner = isOwned ? Optional.of(owner) + .filter(o -> o instanceof UUIDOwner) + .map(o -> (UUIDOwner) o) + .filter(o -> o.getGroup().equals(UUIDOwner.USER_GROUP)) + .flatMap(o -> userStorageService.get(o.getKey())) : + Optional.empty(); return (userOwner.map(user -> user.getName() + ":").orElse("")) + (isOwned ? owner + ":" : "") + object.getName(); } - public static String getFullName(IGuardObject object) { - UUID owner = object.getOwner(); - String fullName = object.getName(); - if (owner != null && !owner.equals(FGManager.SERVER_UUID)) { - fullName = owner + ":" + fullName; - } - return fullName; + public static Optional getUserFromOwner(IOwner owner) { + return owner == null || owner.equals(FGManager.SERVER_OWNER) ? Optional.empty() : + Optional.of(owner) + .filter(o -> o instanceof UUIDOwner) + .map(o -> (UUIDOwner) o) + .filter(o -> o.getGroup().equals(UUIDOwner.USER_GROUP)) + .flatMap(o -> userStorageService.get(o.getKey())); } + public static String getCategory(IGuardObject object) { if (object instanceof IRegion) { if (object instanceof IWorldRegion) return "worldregion"; @@ -170,7 +169,7 @@ public static void markDirty(IGuardObject object) { FGStorageManagerNew.getInstance().defaultModifiedMap.put(object, true); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), object)); } - +/* @Nonnull public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws CommandException { String name = qualifier.getName(); @@ -182,7 +181,7 @@ public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws Comma if (!handlerOpt.isPresent()) { StringBuilder builder = new StringBuilder(); builder.append("No handler exists with the name \"").append(name).append("\""); - if (!owner.equals(FGManager.SERVER_UUID)) { + if (!owner.equals(FGManager.SERVER_OWNER)) { builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); } builder.append("!"); @@ -198,7 +197,7 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua UUID owner = qualifier.getOwner(); IRegion returnRegion = null; - /*regionOpt = FGManager.getInstance().getRegion(name, owner); + *//*regionOpt = FGManager.getInstance().getRegion(name, owner); if (!regionOpt.isPresent()) { World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); @@ -213,7 +212,7 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua } if (world == null) throw new CommandException(Text.of("Must specify a world!")); regionOpt = FGManager.getInstance().getWorldRegion(world, name, owner); - }*/ + }*//* Set regions = FGManager.getInstance().getAllRegions(qualifier.getName(), qualifier.getOwner()); World world = null; @@ -253,7 +252,7 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua if (returnRegion == null) { StringBuilder builder = new StringBuilder(); builder.append("No region exists with the name \"").append(name).append("\""); - if (!owner.equals(FGManager.SERVER_UUID)) { + if (!owner.equals(FGManager.SERVER_OWNER)) { builder.append(" and owner \"").append(qualifier.getOwnerName()).append("\""); } if (world != null && regions.size() > 0) { @@ -322,7 +321,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { } return new OwnerTabResult(list); } else { - return new OwnerTabResult("", parts[0], FGManager.SERVER_UUID); + return new OwnerTabResult("", parts[0], FGManager.SERVER_OWNER); } } else if (parts.length == 2) { OwnerManager registry = OwnerManager.getInstance(); @@ -360,9 +359,9 @@ public static OwnerTabResult getOwnerSuggestions(String input) { } return new OwnerTabResult(); - } + }*/ - public static void genStatePrefix(Text.Builder builder, IGuardObject object, CommandSource source){ + public static void genStatePrefix(Text.Builder builder, IGuardObject object, CommandSource source) { genStatePrefix(builder, object, source, false); } @@ -379,11 +378,11 @@ public static void genStatePrefix(Text.Builder builder, IGuardObject object, Com if (cat == FGCat.CONTROLLER) { genStateButtons(builder, FGCat.HANDLER, object, contains); contains = getSelectedControllers(source).contains(object); - controllerPadding =false; + controllerPadding = false; } } genStateButtons(builder, cat, object, contains); - if(controllerPadding) + if (controllerPadding) builder.append(Text.of(TextColors.DARK_GRAY, "[c+][c-]")); builder.append(Text.of(" ")); } @@ -394,12 +393,12 @@ private static void genStateButtons(Text.Builder builder, FGCat cat, IGuardObjec if (contains) { builder.append(Text.of(TextColors.GRAY, plus)); builder.append(Text.of(TextColors.RED, - TextActions.runCommand("/foxguard s " + cat.sName + " remove " + genWorldFlag(object) + getFullName(object)), + TextActions.runCommand("/foxguard s " + cat.sName + " remove " + genWorldFlag(object) + object.getFullName()), TextActions.showText(Text.of("Remove from " + cat.lName + " state buffer")), minus)); } else { builder.append(Text.of(TextColors.GREEN, - TextActions.runCommand("/foxguard s " + cat.sName + " add " + genWorldFlag(object) + getFullName(object)), + TextActions.runCommand("/foxguard s " + cat.sName + " add " + genWorldFlag(object) + object.getFullName()), TextActions.showText(Text.of("Add to " + cat.lName + " state buffer")), plus)); builder.append(Text.of(TextColors.GRAY, minus)); @@ -446,13 +445,13 @@ public static FGCat from(IGuardObject object) { return null; } } - +/* public static class OwnerTabResult { private boolean complete; private List suggestions; private String prefix; private String token; - private UUID owner; + private IOwner owner; public OwnerTabResult() { this.complete = true; @@ -464,7 +463,7 @@ public OwnerTabResult(List suggestions) { this.suggestions = suggestions; } - public OwnerTabResult(String prefix, String token, UUID owner) { + public OwnerTabResult(String prefix, String token, IOwner owner) { this.complete = false; this.prefix = prefix; this.token = token; @@ -487,7 +486,7 @@ public String getToken() { return token; } - public UUID getOwner() { + public IOwner getOwner() { return owner; } @@ -505,10 +504,10 @@ public String toString() { public static class OwnerResult { private String name; - private UUID owner; + private IOwner owner; private String ownerName; - private OwnerResult(String name, UUID owner, String ownerName) { + private OwnerResult(String name, IOwner owner, String ownerName) { this.name = name; this.owner = owner; this.ownerName = ownerName; @@ -518,7 +517,7 @@ public String getName() { return name; } - public UUID getOwner() { + public IOwner getOwner() { return owner; } @@ -534,5 +533,5 @@ public String toString() { ", ownerName='" + ownerName + '\'' + '}'; } - } + }*/ } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java index c6227f9..1758a68 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/RegionCache.java @@ -42,12 +42,12 @@ public class RegionCache { - private final Map> worldRegions; - private final Multimap regions; + private final Map> worldRegions; + private final Multimap regions; private final Map> chunks; - public RegionCache(Multimap regions, Map> worldRegions) { + public RegionCache(Multimap regions, Map> worldRegions) { this.worldRegions = worldRegions; this.regions = regions; chunks = new CacheMap<>((world, worldDataMap) -> { From cc5c22bfad610236937c72f6de01ae39fa8d936e Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Sun, 22 Apr 2018 21:25:45 -0700 Subject: [PATCH 27/30] More changes....... --- .../sponge/foxguard/plugin/FGManager.java | 23 ++- .../plugin/command/CommandCreate.java | 17 +- .../plugin/command/CommandDelete.java | 12 +- .../plugin/command/CommandDetail.java | 14 +- .../plugin/command/CommandEnableDisable.java | 7 +- .../foxguard/plugin/command/CommandLink.java | 9 +- .../plugin/command/CommandModify.java | 7 +- .../plugin/command/CommandPriority.java | 3 +- .../foxguard/plugin/command/CommandTest.java | 7 + .../foxguard/plugin/handler/IHandler.java | 7 +- .../foxguard/plugin/object/IFGObject.java | 4 +- .../foxguard/plugin/object/IGuardObject.java | 7 +- .../plugin/object/filter/IObjectFilter.java | 4 + .../foxguard/plugin/object/path/FoxPath.java | 188 ++++++++++++++---- .../plugin/object/path/IExtensionAdapter.java | 16 ++ .../plugin/object/path/PathManager.java | 12 +- .../path/element/DirectLocalOwnerElement.java | 91 +++++++++ .../path/element/DirectOwnerElement.java | 73 ++----- .../object/path/element/GroupElement.java | 7 +- .../path/element/IOwnerPathElement.java | 20 ++ .../object/path/element/IPathElement.java | 10 +- .../object/path/element/IPathOnlyElement.java | 5 - .../object/path/element/OwnerPathElement.java | 56 +++--- .../object/path/element/RootGroupElement.java | 5 +- .../owner/provider/PathOwnerProvider.java | 2 + .../object/path/owner/types/IOwner.java | 16 ++ .../path/owner/types/SingleKeyOwner.java | 8 +- .../object/path/owner/types/UUIDOwner.java | 3 +- .../foxguard/plugin/region/IRegion.java | 2 +- .../plugin/storage/FGSLegacyLoader.java | 12 +- .../plugin/storage/FGStorageManagerNew.java | 105 ++++++---- .../foxguard/plugin/storage/FoxConfig.java | 13 ++ .../plugin/storage/FoxConfigStub.java | 12 ++ .../sponge/foxguard/plugin/util/FGUtil.java | 35 ++-- 34 files changed, 565 insertions(+), 247 deletions(-) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java index c5dff7a..10d0186 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FGManager.java @@ -38,8 +38,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.event.factory.FGEventFactory; import net.foxdenstudio.sponge.foxguard.plugin.handler.GlobalHandler; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.ServerOwner; @@ -64,6 +64,7 @@ public final class FGManager { + public static final UUID SERVER_UUID_DEPRECATED = new UUID(0,0); public static final ServerOwner SERVER_OWNER = ServerOwner.SERVER; public static final String[] ILLEGAL_NAMES = {"all", "state", "full", "everything", "users", "owners"}; @@ -113,6 +114,26 @@ public static boolean isNameValid(String name) { !Aliases.isIn(ILLEGAL_NAMES, name); } + public boolean contains(IGuardObject object) { + if (object instanceof IRegion) { + if(object instanceof IWorldRegion){ + World world = ((IWorldRegion) object).getWorld(); + if(world != null){ + return this.worldRegions.get(world).containsValue(object); + } else { + for(Multimap map : this.worldRegions.values()){ + if(map.containsValue(object)) return true; + } + return false; + } + } else { + return this.regions.containsValue(object); + } + } else if (object instanceof IHandler) { + return this.handlers.containsValue(object); + } else return false; + } + public boolean addHandler(IHandler handler) { IOwner owner = handler.getOwner(); if (owner == null) owner = SERVER_OWNER; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index a685624..032beaf 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -40,6 +40,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.Sponge; @@ -128,7 +129,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu if (lengthLimit > 0 && name.length() > lengthLimit) throw new CommandException(Text.of("Name is too long! Max " + lengthLimit + " characters.")); - UUID owner = FGManager.SERVER_OWNER; + UUID owner = FGManager.SERVER_UUID_DEPRECATED; if (parse.flags.containsKey("owner")) { String ownerString = parse.flags.get("owner"); if (ownerString.isEmpty()) { @@ -430,7 +431,7 @@ private enum FGCat { REGION(REGIONS_ALIASES, FGFactoryManager.getInstance()::getRegionTypeAliases) { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { - return FGManager.getInstance().isRegionNameAvailable(name, owner); + return FGManager.getInstance().isRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)); } @Override @@ -441,15 +442,15 @@ public IGuardObject create(String name, String type, String arguments, CommandSo @Override public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return object instanceof IRegion - && FGManager.getInstance().addRegion(((IRegion) object), owner, world); + && FGManager.getInstance().addRegion(((IRegion) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); } }, WORLDREGION(WORLDREGIONS_ALIASES, FGFactoryManager.getInstance()::getWorldRegionTypeAliases) { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { if (world == null) - return FGManager.getInstance().isWorldRegionNameAvailable(name, owner) == Tristate.TRUE; - else return FGManager.getInstance().isWorldRegionNameAvailable(name, owner, world); + return FGManager.getInstance().isWorldRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)) == Tristate.TRUE; + else return FGManager.getInstance().isWorldRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); } @Override @@ -461,13 +462,13 @@ public IGuardObject create(String name, String type, String arguments, CommandSo public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return world != null && object instanceof IWorldRegion - && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), owner, world); + && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); } }, HANDLER(HANDLERS_ALIASES, FGFactoryManager.getInstance()::getHandlerTypeAliases) { @Override public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { - return FGManager.getInstance().isHandlerNameAvailable(name, owner); + return FGManager.getInstance().isHandlerNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)); } @Override @@ -478,7 +479,7 @@ public IGuardObject create(String name, String type, String arguments, CommandSo @Override public boolean add(IGuardObject object, UUID owner, @Nullable World world) { return object instanceof IHandler - && FGManager.getInstance().addHandler(((IHandler) object), owner); + && FGManager.getInstance().addHandler(((IHandler) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner)); } }, CONTROLLER(CONTROLLERS_ALIASES, FGFactoryManager.getInstance()::getControllerTypeAliases) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index b9d172e..1d6adb9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -37,6 +37,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; @@ -126,9 +128,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm .append(": Name: ") .append(object.getName()); - UUID owner = ownerResult.getOwner(); + IOwner owner = ownerResult.getOwner(); if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { - logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) + logMessage.append(" Owner: ").append(owner.toString()) .append(" (").append(owner).append(")"); } @@ -178,14 +180,14 @@ else if (parse.current.index == 1) { } } if (key && world != null) { - return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + return FGManager.getInstance().getAllRegions(world, new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .filter(region -> !(region instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { - return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + return FGManager.getInstance().getAllRegionsWithUniqueNames(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner()), world).stream() .filter(region -> !(region instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) @@ -193,7 +195,7 @@ else if (parse.current.index == 1) { .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers(result.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .filter(handler -> !(handler instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index 5110917..c5423e6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -38,6 +38,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -119,7 +121,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm default: throw new CommandException(Text.of("Something went horribly wrong.")); } - UUID owner = object.getOwner(); + IOwner owner = object.getOwner(); String name = object.getName(); String fullName = name; boolean hasOwner = false; @@ -142,9 +144,9 @@ public CommandResult process(CommandSource source, String arguments) throws Comm OwnerManager registry = OwnerManager.getInstance(); builder.append(Text.builder() .append(Text.of(TextColors.GOLD, "Owner: ")) - .append(registry.getDisplayText(owner, null, source)) + //.append(registry.getDisplayText(owner, null, source)) .append(Text.NEW_LINE) - .onHover(TextActions.showText(registry.getHoverText(owner, null, source))) + //.onHover(TextActions.showText(registry.getHoverText(owner, null, source))) .onShiftClick(TextActions.insertText(owner.toString())) .build() ); @@ -309,20 +311,20 @@ else if (parse.current.index == 1) { } } if (key && world != null) { - return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + return FGManager.getInstance().getAllRegions(world, new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { - return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + return FGManager.getInstance().getAllRegionsWithUniqueNames(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner()), world).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers(result.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java index 8e7353d..80f5ab8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandEnableDisable.java @@ -38,6 +38,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.GlobalWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; @@ -359,14 +360,14 @@ else if (parse.current.index > 0) { } } if (key && world != null) { - return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + return FGManager.getInstance().getAllRegions(world, new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { - return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + return FGManager.getInstance().getAllRegionsWithUniqueNames(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner()), world).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) @@ -374,7 +375,7 @@ else if (parse.current.index > 0) { .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers(result.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .filter(object -> object.isEnabled() != this.enableState && !(object instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java index eecedce..c250aea 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandLink.java @@ -35,6 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.state.HandlersStateField; import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; @@ -144,13 +145,13 @@ public List getSuggestions(CommandSource source, String arguments, @Null } } if (key && world != null) { - return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + return FGManager.getInstance().getAllRegions(world, new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { - return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + return FGManager.getInstance().getAllRegionsWithUniqueNames(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner()), world).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) @@ -172,14 +173,14 @@ public List getSuggestions(CommandSource source, String arguments, @Null } if (region != null) { IRegion finalRegion = region; - return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, tabResult.getOwner())).stream() .filter(handler -> !finalRegion.getLinks().contains(handler) && !(handler instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(tabResult.getToken())) .map(args -> parse.current.prefix + tabResult.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } - return FGManager.getInstance().getHandlers(tabResult.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, tabResult.getOwner())).stream() .filter(handler -> !(handler instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(tabResult.getToken())) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java index c4e4c03..f73f041 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandModify.java @@ -35,6 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; @@ -174,20 +175,20 @@ else if (parse.current.index == 1) { } } if (key && world != null) { - return FGManager.getInstance().getAllRegions(world, result.getOwner()).stream() + return FGManager.getInstance().getAllRegions(world, new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } else { - return FGManager.getInstance().getAllRegionsWithUniqueNames(result.getOwner(), world).stream() + return FGManager.getInstance().getAllRegionsWithUniqueNames(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner()), world).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) .collect(GuavaCollectors.toImmutableList()); } } else if (isIn(HANDLERS_ALIASES, parse.args[0])) { - return FGManager.getInstance().getHandlers(result.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .map(IGuardObject::getName) .filter(new StartsWithPredicate(result.getToken())) .map(args -> parse.current.prefix + result.getPrefix() + args) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java index f1c9441..f4085b9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandPriority.java @@ -33,6 +33,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandResult; @@ -122,7 +123,7 @@ public List getSuggestions(CommandSource source, String arguments, @Null } List selected = ImmutableList.copyOf(FGUtil.getSelectedHandlers(source)); - return FGManager.getInstance().getHandlers(result.getOwner()).stream() + return FGManager.getInstance().getHandlers(new UUIDOwner(UUIDOwner.USER_GROUP, result.getOwner())).stream() .filter(handler -> !selected.contains(handler) && !(handler instanceof IGlobal)) .map(IGuardObject::getName) .filter(new StartsWithPredicate(parse.current.token)) diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java index 4c2842c..2ab9b4a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java @@ -34,6 +34,8 @@ import net.foxdenstudio.sponge.foxcore.plugin.util.BoundingBox2; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.object.FGObjectData; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.FoxPath; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.RectangularRegion; import org.spongepowered.api.Sponge; @@ -139,6 +141,11 @@ public Text getUsage(CommandSource source) { @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { + + Optional ownerOpt = FoxPath.getOwner(arguments, source); + + source.sendMessage(Text.of(ownerOpt)); + return CommandResult.empty(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java index ffc2b7a..20e6956 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java @@ -30,7 +30,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.living.player.User; -import scala.Int; import javax.annotation.Nullable; import java.util.Comparator; @@ -38,7 +37,7 @@ public interface IHandler extends IGuardObject { Comparator PRIORITY = Comparator.comparingInt(IHandler::getPriority); - String SUFFIX = "h"; + String EXTENSION = "h"; EventResult handle(@Nullable User user, FlagBitSet flags, ExtraContext extra); @@ -47,7 +46,7 @@ public interface IHandler extends IGuardObject { void setPriority(int priority); @Override - default String getPathSuffix() { - return SUFFIX; + default String getPathExtension() { + return EXTENSION; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 7b402b6..4264bb9 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -37,7 +37,9 @@ public interface IFGObject { * Any types that share any hierarchy or can otherwise be used in place of another should have the same suffix. * @return the path suffix. */ - String getPathSuffix(); + String getPathExtension(); String getFullName(); + + boolean stillExists(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java index 86882ff..7ffab13 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java @@ -130,7 +130,6 @@ public interface IGuardObject extends IModifiable, IFGObject { * * @return Whether FoxGuard should auto-save this object. */ - @SuppressWarnings("SameReturnValue") default boolean autoSave() { return true; } @@ -146,7 +145,7 @@ default boolean autoSave() { * * @param source The {@link CommandSource} of the modify command * @param arguments The {@link String} arguments specifically for this object - * @return the result of the operation. The success flag should be true if and only if the object was changed in some way. + * @return the result of the operation. Should be true if and only if the object was changed in some way. * @throws CommandException If there is an issue parsing the command. */ @@ -168,4 +167,8 @@ default String getFullName(){ return fullName; } + default boolean stillExists(){ + return FGManager.getInstance().contains(this); + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java new file mode 100644 index 0000000..f927bcd --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java @@ -0,0 +1,4 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.filter; + +public interface IObjectFilter { +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java index f69e52f..774b07a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java @@ -1,13 +1,13 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.DirectOwnerElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.DirectLocalOwnerElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IOwnerPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.OwnerPathElement; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; -import net.minecraft.world.World; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -18,74 +18,172 @@ public final class FoxPath { - public static final String LOCAL_ALT_PREPREFIX = "~"; + public static final String LOCAL_ALT_CHAR = "~"; public static final String LITERAL_PREFIX = "::"; public static final String DYNAMIC_PREFIX = ":"; - public static final String SERVER_OWNER_PREFIX = "//:"; - public static final String LOCAL_OWNER_PREFIX = "/:"; + public static final String SERVER_OWNER_PREFIX = "://"; + public static final String LOCAL_OWNER_PREFIX = ":/"; + public static final String LOCAL_OWNER_PREFIX_ALT = ":" + LOCAL_ALT_CHAR + "/"; public static final String SERVER_GROUP_PREFIX = "//"; public static final String LOCAL_GROUP_PREFIX = "/"; public static final String WORKING_PATH_PREFIX = "./"; - public static final RootPath DEFAULT_ROOT = RootPath.SERVER_OWNER; + public static final Root DEFAULT_ROOT = Root.SERVER_OWNER; private static final PathManager PATH_MANAGER = PathManager.getInstance(); private int depth = 0; - private RootPath rootPath; + private Root root; private List pathNames = new ArrayList<>(); private List pathElements = new ArrayList<>(); - FoxPath(@Nonnull RootPath rootPath, @Nullable CommandSource source) { + FoxPath(@Nonnull Root rootPath, @Nullable CommandSource source) { this(rootPath, rootPath.prefixes[0], source); } FoxPath(@Nonnull String rootPrefix, @Nullable CommandSource source) { - this(RootPath.from(rootPrefix), rootPrefix, source); + this(Root.from(rootPrefix), rootPrefix, source); } - private FoxPath(@Nonnull RootPath rootPath, @Nonnull String prefix, @Nullable CommandSource source) { - this.rootPath = rootPath; - this.pathElements.add(rootPath.rootProvider.apply(source)); + private FoxPath(@Nonnull Root rootPath, @Nonnull String prefix, @Nullable CommandSource source) { + this.root = rootPath; + this.pathElements.add(rootPath.apply(source)); this.pathNames.add(prefix); } @Nonnull - public Result resolve(@Nonnull String element) { - if (element.equals(".")) return Result.SUCCESS; + public ResolveResult resolve(@Nonnull String element) { + if (element.equals(".")) return ResolveResult.SUCCESS; else if (element.equals("..")) { goUp(); - return Result.SUCCESS; - } else if (element.startsWith(".")) return Result.FAILED; + return ResolveResult.SUCCESS; + } else if (element.startsWith(".")) return ResolveResult.FAILED; IPathElement currentElement = this.pathElements.get(depth); - if (currentElement == null) return Result.FAILED; + if (currentElement == null) return ResolveResult.FAILED; Optional newElementOpt = currentElement.resolve(element); if (newElementOpt.isPresent()) { this.pathElements.add(newElementOpt.get()); this.pathNames.add(element); this.depth++; - return Result.SUCCESS; + return ResolveResult.SUCCESS; } else { this.pathElements.add(null); this.pathNames.add(element); this.depth++; - return Result.PHANTOM; + return ResolveResult.PHANTOM; } } + public IPathElement getCurrentElement() { + return this.pathElements.get(this.depth); + } + + + public static Optional getObject(@Nonnull String input, @Nullable CommandSource source, @Nullable String extension, @Nullable World world) { + if (input.isEmpty()) return Optional.empty(); + Root rootPath = Root.from(input); + + boolean explicitPath; + if (rootPath == null) { + explicitPath = false; + rootPath = Root.getDefault(); + } else { + explicitPath = true; + input = rootPath.trimPrefix(input); + } - public static Optional fromUserInput(@Nonnull String input, @Nullable String extension, @Nullable World world) { - RootPath rootPath = RootPath.from(input); - input = rootPath.trimPrefix(input); if (input.isEmpty()) return Optional.empty(); - String[] parts = input.split(":+", 2); + String[] sections = input.split(":+", explicitPath ? 3 : 2); + if (sections.length == 0) return Optional.empty(); + + String pathStr; + String filterStr; + String name; + + int count = sections.length; + if (explicitPath) { + pathStr = sections[0]; + --count; + } else { + pathStr = null; + } + + if (count != 0) { + name = sections[sections.length - 1]; + --count; + } else { + name = null; + } + + if (count != 0) { + filterStr = sections[sections.length - 2]; + } else { + filterStr = null; + } - if (extension == null) extension = ""; + FoxPath foxPath = new FoxPath(rootPath, source); - return null; + if (explicitPath) { + String[] pathParts = pathStr.split("/+"); + ResolveResult resolveResult = ResolveResult.SUCCESS; + for (String part : pathParts) { + if (part.isEmpty()) continue; + resolveResult = foxPath.resolve(part); + } + if (resolveResult != ResolveResult.SUCCESS) { + if (resolveResult == ResolveResult.PHANTOM && name == null) { + name = pathParts[pathParts.length - 1]; + foxPath.goUp(); + } + return Optional.empty(); + } + } + + + return Optional.empty(); + } + + public static Optional getOwner(@Nonnull String input, @Nullable CommandSource source) { + if (input.isEmpty()) return Optional.empty(); + Root rootPath = Root.from(input); + if (rootPath == null) { + rootPath = Root.getDefault(); + } else { + input = rootPath.trimPrefix(input); + } + + //if (input.endsWith(":")) input = input.substring(0, input.length() - 1); + String[] parts = input.split("[/:]+"); + + FoxPath foxPath = new FoxPath(rootPath, source); + IPathElement element; + Optional owner = Optional.empty(); + for (String part : parts) { + if (part.isEmpty()) continue; + element = foxPath.getCurrentElement(); + if (element instanceof IOwnerPathElement) { + IOwnerPathElement ownerElement = ((IOwnerPathElement) element); + Optional newOwner; + if (ownerElement.isFinished()) { + newOwner = ownerElement.getOwner(); + if (newOwner.isPresent()) return newOwner; + } else if (ownerElement.isValid()) { + newOwner = ownerElement.getOwner(); + if (newOwner.isPresent()) owner = newOwner; + } + } + foxPath.resolve(part); + } + element = foxPath.getCurrentElement(); + if (element instanceof IOwnerPathElement && ((IOwnerPathElement) element).isValid()) { + Optional newOwner = ((IOwnerPathElement) element).getOwner(); + if (newOwner.isPresent()) owner = newOwner; + } + + return owner; } private void goUp() { @@ -96,31 +194,30 @@ private void goUp() { depth--; } - enum Result { + enum ResolveResult { SUCCESS, FAILED, PHANTOM } - public enum RootPath { + public enum Root implements Function { - LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // - :: - DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX, '~' + DYNAMIC_PREFIX), // - : - SERVER_OWNER(new DirectOwnerElement.Suppier(true), SERVER_OWNER_PREFIX), - LOCAL_OWNER(new DirectOwnerElement.Suppier(false)), - SERVER_GROUP(source -> PATH_MANAGER.getServerGroup()), - LOCAL_GROUP(source -> source instanceof User ? - PATH_MANAGER.getUserLocalGroup(((User) source).getUniqueId()) : - PATH_MANAGER.getServerLocalGroup()), + SERVER_OWNER(new DirectLocalOwnerElement.Suppier(true), SERVER_OWNER_PREFIX), // -> :// + LOCAL_OWNER(new DirectLocalOwnerElement.Suppier(false), LOCAL_OWNER_PREFIX, LOCAL_OWNER_PREFIX_ALT), // -> :/ :~/ + LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // -> :: + DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX, LOCAL_ALT_CHAR + DYNAMIC_PREFIX), // -> : ~: + SERVER_GROUP(source -> PATH_MANAGER.getServerGroup(), SERVER_GROUP_PREFIX), // -> // + LOCAL_GROUP(PATH_MANAGER::getLocalGroup, LOCAL_GROUP_PREFIX, LOCAL_ALT_CHAR + LOCAL_GROUP_PREFIX), // -> / ~/ //WORKING_PATH(), ; public final String[] prefixes; - Function rootProvider; + private final Function rootProvider; - RootPath(Function rootProvider, String... prefixes) { + Root(Function rootProvider, String... prefixes) { this.rootProvider = rootProvider; this.prefixes = prefixes; } + public String getPrefix(String input) { for (String prefix : this.prefixes) { if (input.startsWith(prefix)) return prefix; @@ -132,14 +229,23 @@ public String trimPrefix(String input) { return input.substring(getPrefix(input).length()); } - public static RootPath from(String input) { + public static Root from(String input) { if (input == null) return null; - for (RootPath root : values()) { + for (Root root : values()) { for (String prefix : root.prefixes) { if (input.startsWith(prefix)) return root; } } return null; } + + public static Root getDefault() { + return SERVER_OWNER; + } + + @Override + public IPathElement apply(@Nullable CommandSource source) { + return rootProvider.apply(source); + } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java new file mode 100644 index 0000000..edc90dd --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java @@ -0,0 +1,16 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; + +import javax.annotation.Nonnull; +import java.util.Optional; + +/** + * Adapter used when trying to resolve object using an owner. + * Because owners don't hold onto references to objects + */ +public interface IExtensionAdapter { + + Optional getObject(@Nonnull String nameWithExtension); + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java index 18bd9d9..e6b1a0e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -3,9 +3,10 @@ import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.*; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.User; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -31,7 +32,7 @@ public class PathManager { } else return null; }); private RootGroupElement serverLocalGroup = RootGroupElement.createLocal(); - private RootGroupElement serverGroup = RootGroupElement.createServer(); + private RootGroupElement serverGroup = RootGroupElement.createServer(this); private PathManager() { registerOwnerType(UUIDOwner.TYPE, UUIDOwner.class, @@ -67,7 +68,7 @@ public OwnerAdapterFactory getOwnerTypeAdapterFactory(C } public OwnerAdapterFactory getOwnerTypeAdapter(String type) { - return this.adapterMap.get(this.typeClassMap.get(type)); + return this.adapterMap.get(this.typeClassMap.get(type)); } public Class getTypeClass(String type) { @@ -103,4 +104,9 @@ public RootGroupElement getLocalGroup(@Nullable UUID user) { return user == null ? getServerLocalGroup() : getUserLocalGroup(user); } + public RootGroupElement getLocalGroup(@Nullable CommandSource source){ + return source instanceof User ? getUserLocalGroup(((User) source).getUniqueId()) : getServerLocalGroup(); + } + + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java new file mode 100644 index 0000000..7c8ebe3 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java @@ -0,0 +1,91 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.world.World; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Function; + +public class DirectLocalOwnerElement implements IOwnerPathElement { + + private final UUID uuid; + private final IOwner owner; + + public DirectLocalOwnerElement(@Nullable UUID uuid) { + this.uuid = uuid; + owner = uuid == null ? FGManager.SERVER_OWNER :new UUIDOwner(UUIDOwner.USER_GROUP, this.uuid); + } + + @Override + public Optional resolve(String name) { + return Optional.empty(); + } + + @Override + public Optional get(@Nonnull String name, @Nullable World world) { + //TODO fetch object from manager + return Optional.empty(); + } + + @Override + public Collection getPathSuggestions() { + return ImmutableList.of(); + } + + @Override + public Map getObjects() { + //TODO fetch objects from manager. + return null; + } + + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isValid() { + return false; + } + + @Override + public Optional getOwner() { + return Optional.of(owner); + } + + public static class Suppier implements Function { + + private final Map cache = new CacheMap<>((key, map) -> { + if (key == null || key instanceof UUID) { + UUID uuid = ((UUID) key); + DirectLocalOwnerElement element = new DirectLocalOwnerElement(uuid); + map.put(uuid, element); + return element; + } else return null; + }); + private final boolean server; + + public Suppier(boolean server) { + this.server = server; + } + + @Override + public IPathElement apply(CommandSource source) { + return !this.server && source instanceof User ? + cache.get(((User) source).getUniqueId()) : + cache.get(null); + } + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java index 4121dfd..b48db0a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java @@ -1,11 +1,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; -import com.google.common.collect.ImmutableList; -import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; -import org.spongepowered.api.command.CommandSource; -import org.spongepowered.api.entity.living.player.User; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import org.spongepowered.api.world.World; import javax.annotation.Nonnull; @@ -13,77 +9,48 @@ import java.util.Collection; import java.util.Map; import java.util.Optional; -import java.util.UUID; -import java.util.function.Function; -public class DirectOwnerElement implements IPathElement { +public class DirectOwnerElement implements IOwnerPathElement { - private final UUID uuid; - private final UUIDOwner owner; + @Nonnull + private final IOwner owner; - public DirectOwnerElement(UUID uuid) { - this.uuid = uuid; - owner = new UUIDOwner(UUIDOwner.USER_GROUP, this.uuid); + public DirectOwnerElement(@Nonnull IOwner owner) { + this.owner = owner; } @Override - public Optional resolve(String name) { - return Optional.empty(); + public boolean isFinished() { + return true; } @Override - public Optional getName(IPathElement path) { - return Optional.empty(); + public boolean isValid() { + return true; } @Override - public Optional get(@Nonnull String name, @Nullable World world) { - //TODO fetch object from manager - return Optional.empty(); + public Optional getOwner() { + return Optional.of(owner); } @Override - public Collection getPathSuggestions() { - return ImmutableList.of(); + public Optional resolve(String name) { + return Optional.empty(); } @Override - public Map getObjects() { - //TODO fetch objects from manager. - return null; + public Optional get(@Nonnull String name, @Nullable World world) { + return owner.getObject(name, world); } @Override - public boolean isPersistent() { - return false; + public Collection getPathSuggestions() { + return null; } @Override - public boolean finished() { - return true; - } - - public static class Suppier implements Function { - - private final Map cache = new CacheMap<>((key, map) -> { - if (key instanceof UUID) { - UUID uuid = ((UUID) key); - DirectOwnerElement element = new DirectOwnerElement(uuid); - map.put(uuid, element); - return element; - } else return null; - }); - private final boolean server; - - public Suppier(boolean server) { - this.server = server; - } - - @Override - public IPathElement apply(CommandSource source) { - return source instanceof User && !this.server ? - cache.get(((User) source).getUniqueId()) : - cache.get(null); - } + public Map getObjects() { + return null; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java index 1b01164..410f59d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java @@ -29,11 +29,6 @@ public Optional resolve(String name, boolean create) { return Optional.ofNullable(ret); } - @Override - public Optional getName(IPathElement path) { - return Optional.empty(); - } - @Override public boolean add(String name, IPathElement path) { if (name.startsWith(".")) return false; @@ -57,7 +52,7 @@ public Optional get(@Nonnull String name, @Nullable World world) { public boolean add(IFGObject object, String name, boolean genExtension) { String keyName = name; if (genExtension) { - keyName += "." + object.getPathSuffix(); + keyName += "." + object.getPathExtension(); } if (this.objects.containsKey(keyName)) return false; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java new file mode 100644 index 0000000..9f5f3e7 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java @@ -0,0 +1,20 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; + +import java.util.Optional; + +public interface IOwnerPathElement extends IPathElement { + + boolean isFinished(); + + boolean isValid(); + + @Override + default boolean isPersistent() { + return false; + } + + Optional getOwner(); + +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java index a017665..dd3a9f3 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathElement.java @@ -14,15 +14,13 @@ public interface IPathElement { Optional resolve(String name); - Optional getName(IPathElement path); - Optional get(@Nonnull String name, @Nullable World world); Collection getPathSuggestions(); Map getObjects(); - default Map getObjects(String extension){ + /*default Map getObjects(String extension){ ImmutableMap.Builder builder = ImmutableMap.builder(); for(Map.Entry entry : getObjects().entrySet()){ @@ -33,7 +31,7 @@ public interface IPathElement { } return builder.build(); - } + }*/ /** * Check whether this is still persistent. @@ -44,8 +42,4 @@ public interface IPathElement { */ boolean isPersistent(); - default boolean finished(){ - return false; - } - } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java index 0ddbd8a..3097374 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IPathOnlyElement.java @@ -21,11 +21,6 @@ default Optional get(@Nonnull String name, @Nullable World return ImmutableMap.of(); } - @Override - default Optional getName(IPathElement path) { - return Optional.empty(); - } - @Override default boolean isPersistent() { return false; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java index e9f0fee..f20333f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java @@ -12,7 +12,7 @@ import javax.annotation.Nullable; import java.util.*; -public abstract class OwnerPathElement

> implements IPathElement { +public abstract class OwnerPathElement

> implements IOwnerPathElement { private static final PathManager MANAGER = PathManager.getInstance(); @@ -53,16 +53,6 @@ public Optional get(@Nonnull String name, @Nullable World world) { return Optional.empty(); } - @SuppressWarnings("unchecked") - @Override - public Optional getName(IPathElement path) { - if (path instanceof OwnerPathElement && ((OwnerPathElement) path).parent == this) { - List curPath = ((OwnerPathElement

) path).currentPath; - return Optional.of(curPath.get(curPath.size() - 1)); - } - return Optional.empty(); - } - @Override public abstract Optional resolve(String name); @@ -82,15 +72,18 @@ public Map getObjects() { } @Override - public boolean isPersistent() { + public boolean isFinished() { + return this.provider != null && this.provider.isFinished(); + } - // TODO actually lookup the object - return false; + @Override + public boolean isValid() { + return this.provider != null && this.provider.isValid(); } @Override - public boolean finished() { - return this.provider.isValid(); + public Optional getOwner() { + return provider.getOwner(); } public static class Literal extends OwnerPathElement> { @@ -110,17 +103,21 @@ private Literal(Literal parent, String next) { this.group = size > 0 ? this.currentPath.get(0) : null; this.type = size > 1 ? this.currentPath.get(1) : null; if (size > 1) { - this.provider = MANAGER.getLiteralPathOwnerProvider(this.type).get(); - this.provider.setGroup(group); - for (int i = 2; i < size; i++) { - String element = this.currentPath.get(i); - this.provider.apply(element); + PathOwnerProvider.Literal.Factory providerFactory = MANAGER.getLiteralPathOwnerProvider(this.type); + if (providerFactory != null) { + this.provider = providerFactory.get(); + this.provider.setGroup(group); + for (int i = 2; i < size; i++) { + String element = this.currentPath.get(i); + this.provider.apply(element); + } } } else this.provider = null; } @Override public Optional resolve(String name) { + //System.out.println(name); if (name == null || name.isEmpty()) return Optional.empty(); else return Optional.of(new Literal(this, name)); } @@ -138,12 +135,19 @@ public Dynamic(String prefix) { private Dynamic(Dynamic parent, String next) { super(parent, next); int size = this.currentPath.size(); + this.type = size > 0 ? this.currentPath.get(0) : null; - this.provider = size > 0 ? MANAGER.getDynamicPathOwnerProvider(this.type).get() : null; - for (int i = 1; i < size; i++) { - String element = this.currentPath.get(i); - this.provider.apply(element); - } + + if (size > 0) { + PathOwnerProvider.Factory providerFactory = MANAGER.getDynamicPathOwnerProvider(this.type); + if (providerFactory != null) { + this.provider = providerFactory.get(); + for (int i = 1; i < size; i++) { + String element = this.currentPath.get(i); + this.provider.apply(element); + } + } + } else this.provider = null; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java index 8b45564..179461b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java @@ -11,6 +11,7 @@ import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.Identifiable; +import javax.annotation.Nullable; import java.util.*; public class RootGroupElement extends StructuredGroupElement { @@ -28,8 +29,8 @@ public boolean isPersistent() { return true; } - public static RootGroupElement createServer() { - PathManager manager = PathManager.getInstance(); + public static RootGroupElement createServer(@Nullable PathManager manager) { + if(manager == null) manager = PathManager.getInstance(); Map fixed = new HashMap<>(); fixed.put("s", manager.getServerLocalGroup()); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java index 308aa9d..db4bab6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java @@ -19,6 +19,8 @@ default Collection getSuggestions() { boolean isValid(); + boolean isFinished(); + int minimumElements(); Optional getOwner(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java index 0a3d6cb..5f9b113 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java @@ -1,6 +1,13 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import org.spongepowered.api.world.World; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.nio.file.Path; +import java.util.Optional; public interface IOwner extends Comparable { @@ -14,4 +21,13 @@ public interface IOwner extends Comparable { @Override int hashCode(); + + default Optional getObject(@Nonnull String name, @Nullable World world) { + FGManager manager = FGManager.getInstance(); + + + + return Optional.empty(); + } + } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java index d0e8725..218275d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java @@ -1,7 +1,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.LiteralPathProviderBase; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import javax.annotation.Nonnull; import java.util.Objects; @@ -69,7 +68,12 @@ public int numApplied() { @Override public boolean isValid() { - return valid; + return this.valid; + } + + @Override + public boolean isFinished() { + return this.valid; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java index 08289c8..dc37a88 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java @@ -6,6 +6,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerTypeAdapter; import org.spongepowered.api.entity.living.player.User; +import javax.annotation.Nonnull; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; @@ -17,7 +18,7 @@ public class UUIDOwner extends SingleKeyComparableOwner { public static final String TYPE = "uuid"; public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; - public UUIDOwner(String group, UUID uuid) { + public UUIDOwner(@Nonnull String group, @Nonnull UUID uuid) { super(TYPE, group, uuid); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java index 26a0ceb..811aa0c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java @@ -48,7 +48,7 @@ default boolean saveLinks() { } @Override - default String getPathSuffix() { + default String getPathExtension() { return SUFFIX; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java index d88a264..e8a3a0a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java @@ -20,6 +20,8 @@ */ public class FGSLegacyLoader { + private static final int VERSION = 1; + private static FGSLegacyLoader instance = new FGSLegacyLoader(); private final Logger logger = FoxGuardMain.instance().getLogger(); @@ -30,13 +32,13 @@ public static FGSLegacyLoader getInstance() { private FGSLegacyLoader() { } - public Optional> getLegacyIndex(Path file) { + public Optional getLegacyIndex(Path file) { if (Files.notExists(file) || Files.isDirectory(file)) return Optional.empty(); logger.info("Loading legacy index: " + file); try (DB mainDB = openFoxDB(file)) { - List ret = new ArrayList<>(); + List list = new ArrayList<>(); Map mainMap = mainDB.hashMap("main", Serializer.STRING, Serializer.STRING).createOrOpen(); Map typeMap = mainDB.hashMap("types", Serializer.STRING, Serializer.STRING).createOrOpen(); @@ -67,10 +69,10 @@ public Optional> getLegacyIndex(Path file) { } } FGSObjectIndex index = new FGSObjectIndex(name, null, category, type, enabled, priority, links); - ret.add(index); + list.add(index); }); - if (ret.isEmpty()) return Optional.empty(); - else return Optional.of(ret); + if (list.isEmpty()) return Optional.empty(); + else return Optional.of(new FGStorageManagerNew.IndexConfig(list, VERSION)); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 29c7b0b..29f5b35 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -80,13 +80,15 @@ */ public class FGStorageManagerNew { + private static final int VERSION = 2; + public static final String[] FS_ILLEGAL_NAMES = {"con", "prn", "aux", "nul", "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9"}; public static final String METADATA_FILE_NAME = "metadata.foxcf"; public static final String OWNERS_DIR_NAME = "owners"; public static final Charset CHARSET = StandardCharsets.UTF_8; - private static final Type INDEX_LIST_TYPE = new TypeToken>() { + private static final Type INDEX_LIST_TYPE = new TypeToken() { }.getType(); private static FGStorageManagerNew instance; public final HashMap defaultModifiedMap; @@ -127,6 +129,10 @@ public static FGStorageManagerNew getInstance() { return instance; } + public static int getVersion() { + return VERSION; + } + public void saveHandlerIndex() { logger.info("Saving handler index"); Path file = getFGDirectory().resolve(FGCat.HANDLER.getIndexFile()); @@ -165,8 +171,10 @@ private void saveIndex(Set objects, Path file) { } }); + IndexConfig data = new IndexConfig(indexList, getVersion()); + try (JsonWriter jsonWriter = getJsonWriter(Files.newBufferedWriter(file, CHARSET))) { - gson.toJson(indexList, List.class, jsonWriter); + gson.toJson(data, FoxConfig.class, jsonWriter); } catch (IOException e) { logger.error("Failed to open index for writing: " + file, e); } @@ -285,67 +293,69 @@ public void loadServer() { logger.info("Loading regions"); Path regionIndexFile = getFGDirectory().resolve(FGCat.REGION.getIndexFile()); - Optional> regionIndexOpt = loadIndex(regionIndexFile); - if (!regionIndexOpt.isPresent()) { + Optional regionConfigOpt = loadIndex(regionIndexFile); + if (!regionConfigOpt.isPresent()) { regionIndexFile = getFGDirectory().resolve(legacyLoader.getIndexDBName(FGCat.REGION.pathName)); - regionIndexOpt = legacyLoader.getLegacyIndex(regionIndexFile); + regionConfigOpt = legacyLoader.getLegacyIndex(regionIndexFile); } class RegionEntry { - IRegion region; - FGSObjectIndex index; + private IRegion region; + private FGSObjectIndex index; - public RegionEntry(IRegion region, FGSObjectIndex index) { + private RegionEntry(IRegion region, FGSObjectIndex index) { this.region = region; this.index = index; } } List loadedRegions = new ArrayList<>(); List extraRegionLinks = new ArrayList<>(); - if (regionIndexOpt.isPresent()) { - List regionIndex = regionIndexOpt.get(); - for (FGSObjectIndex index : regionIndex) { - FGCat fgCat = FGCat.from(index.category); - if (fgCat == FGCat.REGION) { - Path directory = getObjectDirectory(index, null); - Optional fgObjectOptional = loadObject(directory, index, null); - if (fgObjectOptional.isPresent()) { - IGuardObject fgObject = fgObjectOptional.get(); - if (fgObject instanceof IRegion) { - IRegion region = (IRegion) fgObject; - manager.addRegion(region); - loadedRegions.add(new RegionEntry(region, index)); + if (regionConfigOpt.isPresent()) { + FoxConfig> regionConfig = regionConfigOpt.get(); + if (regionConfig.data != null) { + for (FGSObjectIndex index : regionConfig.data) { + FGCat fgCat = FGCat.from(index.category); + if (fgCat == FGCat.REGION) { + Path directory = getObjectDirectory(index, null); + Optional fgObjectOptional = loadObject(directory, index, null); + if (fgObjectOptional.isPresent()) { + IGuardObject fgObject = fgObjectOptional.get(); + if (fgObject instanceof IRegion) { + IRegion region = (IRegion) fgObject; + manager.addRegion(region); + loadedRegions.add(new RegionEntry(region, index)); + } + } else if (index.links != null && !index.links.isEmpty()) { + extraRegionLinks.add(index); } - } else if (index.links != null && !index.links.isEmpty()) { - extraRegionLinks.add(index); + } else { + logger.warn("Found an entry of incorrect category. Expected region, found: " + index.category); } - } else { - logger.warn("Found an entry of incorrect category. Expected region, found: " + index.category); } } } logger.info("Loading handlers"); Path handlerIndexFile = getFGDirectory().resolve(FGCat.HANDLER.getIndexFile()); - Optional> handlerIndexOpt = loadIndex(handlerIndexFile); - if (!handlerIndexOpt.isPresent()) { + Optional handlerConfigOpt = loadIndex(handlerIndexFile); + if (!handlerConfigOpt.isPresent()) { handlerIndexFile = getFGDirectory().resolve(legacyLoader.getIndexDBName(FGCat.HANDLER.pathName)); - handlerIndexOpt = legacyLoader.getLegacyIndex(handlerIndexFile); + handlerConfigOpt = legacyLoader.getLegacyIndex(handlerIndexFile); } class ControllerEntry { - IController controller; - FGSObjectIndex index; - Path directory; + private IController controller; + private FGSObjectIndex index; + private Path directory; - public ControllerEntry(IController controller, FGSObjectIndex index, Path directory) { + private ControllerEntry(IController controller, FGSObjectIndex index, Path directory) { this.controller = controller; this.index = index; this.directory = directory; } } List loadedControllers = new ArrayList<>(); - if (handlerIndexOpt.isPresent()) { - List handlerIndex = handlerIndexOpt.get(); - for (FGSObjectIndex index : handlerIndex) { + if (handlerConfigOpt.isPresent()) { + IndexConfig handlerConfig = handlerConfigOpt.get(); + for (FGSObjectIndex index : handlerConfig.data) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { Path directory = getObjectDirectory(index, null); @@ -425,14 +435,14 @@ public void loadWorld(World world) { logger.info("Loading worldregions for world: " + world.getName()); Path regionIndexFile = getWorldDirectory(world).resolve(FGCat.WORLDREGION.getIndexFile()); - Optional> worldRegionIndexOpt = loadIndex(regionIndexFile); - if (!worldRegionIndexOpt.isPresent()) { + Optional worldRegionConfigOpt = loadIndex(regionIndexFile); + if (!worldRegionConfigOpt.isPresent()) { regionIndexFile = getWorldDirectory(world).resolve(legacyLoader.getIndexDBName(FGCat.WORLDREGION.pathName)); - worldRegionIndexOpt = legacyLoader.getLegacyIndex(regionIndexFile); + worldRegionConfigOpt = legacyLoader.getLegacyIndex(regionIndexFile); } - if (worldRegionIndexOpt.isPresent()) { - List worldRegionIndex = worldRegionIndexOpt.get(); - for (FGSObjectIndex index : worldRegionIndex) { + if (worldRegionConfigOpt.isPresent()) { + IndexConfig worldRegionConfig = worldRegionConfigOpt.get(); + for (FGSObjectIndex index : worldRegionConfig.data) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.WORLDREGION) { Path directory = getObjectDirectory(index, world); @@ -473,8 +483,8 @@ public void loadWorld(World world) { reentry = oldReentry; } - public Optional> loadIndex(Path indexFile) { - List index = null; + public Optional loadIndex(Path indexFile) { + IndexConfig index = null; if (Files.exists(indexFile) && !Files.isDirectory(indexFile)) { try (JsonReader jsonReader = new JsonReader(Files.newBufferedReader(indexFile))) { index = gson.fromJson(jsonReader, INDEX_LIST_TYPE); @@ -1182,6 +1192,15 @@ public String getIndexFile() { public abstract IGuardObject loadInstance(Path directory, String type, FGObjectData data); } + public static class IndexConfig extends FoxConfig>{ + public IndexConfig() { + } + + public IndexConfig(List data, Integer version) { + super(data, version); + } + } + /*private void setPrettyPrint(boolean prettyPrint) { if (this.prettyPrint == prettyPrint) return; this.prettyPrint = prettyPrint; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java new file mode 100644 index 0000000..d5bc1c8 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java @@ -0,0 +1,13 @@ +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +public class FoxConfig extends FoxConfigStub{ + public T data; + + public FoxConfig() { + } + + public FoxConfig(T data, Integer version) { + super(version); + this.data = data; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java new file mode 100644 index 0000000..b730063 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java @@ -0,0 +1,12 @@ +package net.foxdenstudio.sponge.foxguard.plugin.storage; + +public class FoxConfigStub { + public Integer version; + + public FoxConfigStub() { + } + + public FoxConfigStub(Integer version) { + this.version = version; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 429a022..d14d073 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -25,6 +25,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.util; +import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.common.util.FCCUtil; import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; import net.foxdenstudio.sponge.foxcore.plugin.util.IWorldBound; @@ -35,6 +36,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; @@ -45,6 +48,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.RegionsStateField; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.service.user.UserStorageService; @@ -52,11 +56,18 @@ import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColor; import org.spongepowered.api.text.format.TextColors; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.util.Tristate; +import org.spongepowered.api.world.Locatable; +import org.spongepowered.api.world.World; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.UUID; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; @@ -169,11 +180,10 @@ public static void markDirty(IGuardObject object) { FGStorageManagerNew.getInstance().defaultModifiedMap.put(object, true); Sponge.getGame().getEventManager().post(FGEventFactory.createFGUpdateObjectEvent(FoxGuardMain.getCause(), object)); } -/* @Nonnull public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws CommandException { String name = qualifier.getName(); - UUID owner = qualifier.getOwner(); + IOwner owner = qualifier.getOwner(); Optional handlerOpt; handlerOpt = FGManager.getInstance().getHandler(name, owner); @@ -194,10 +204,10 @@ public static IHandler getHandlerFromCommand(OwnerResult qualifier) throws Comma @Nonnull public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qualifier, boolean worldFlag, @Nullable String worldName) throws CommandException { String name = qualifier.getName(); - UUID owner = qualifier.getOwner(); + IOwner owner = qualifier.getOwner(); IRegion returnRegion = null; - *//*regionOpt = FGManager.getInstance().getRegion(name, owner); + /*Optional regionOpt = FGManager.getInstance().getRegion(name, owner); if (!regionOpt.isPresent()) { World world = null; if (source instanceof Locatable) world = ((Locatable) source).getWorld(); @@ -212,7 +222,7 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua } if (world == null) throw new CommandException(Text.of("Must specify a world!")); regionOpt = FGManager.getInstance().getWorldRegion(world, name, owner); - }*//* + }*/ Set regions = FGManager.getInstance().getAllRegions(qualifier.getName(), qualifier.getOwner()); World world = null; @@ -298,7 +308,7 @@ else if (name.isEmpty()) String errorName = (provider != null ? provider + ":" : "") + ownerQualifier; throw new CommandException(Text.of("\"" + errorName + "\" is not a valid owner!")); } - return new OwnerResult(name, ownerOpt.get(), ownerQualifier); + return new OwnerResult(name, new UUIDOwner(UUIDOwner.USER_GROUP, ownerOpt.get()), ownerQualifier); } public static OwnerTabResult getOwnerSuggestions(String input) { @@ -321,7 +331,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { } return new OwnerTabResult(list); } else { - return new OwnerTabResult("", parts[0], FGManager.SERVER_OWNER); + return new OwnerTabResult("", parts[0], FGManager.SERVER_UUID_DEPRECATED); } } else if (parts.length == 2) { OwnerManager registry = OwnerManager.getInstance(); @@ -359,7 +369,7 @@ public static OwnerTabResult getOwnerSuggestions(String input) { } return new OwnerTabResult(); - }*/ + } public static void genStatePrefix(Text.Builder builder, IGuardObject object, CommandSource source) { genStatePrefix(builder, object, source, false); @@ -445,13 +455,12 @@ public static FGCat from(IGuardObject object) { return null; } } -/* public static class OwnerTabResult { private boolean complete; private List suggestions; private String prefix; private String token; - private IOwner owner; + private UUID owner; public OwnerTabResult() { this.complete = true; @@ -463,7 +472,7 @@ public OwnerTabResult(List suggestions) { this.suggestions = suggestions; } - public OwnerTabResult(String prefix, String token, IOwner owner) { + public OwnerTabResult(String prefix, String token, UUID owner) { this.complete = false; this.prefix = prefix; this.token = token; @@ -486,7 +495,7 @@ public String getToken() { return token; } - public IOwner getOwner() { + public UUID getOwner() { return owner; } @@ -533,5 +542,5 @@ public String toString() { ", ownerName='" + ownerName + '\'' + '}'; } - }*/ + } } From 6fdc68d40e912370a2e9e7b1c14cd7a9ab7fe697 Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Fri, 20 Jul 2018 02:13:27 -0700 Subject: [PATCH 28/30] Whee changes --- FoxCore-Sponge | 2 +- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 54208 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 6 +- .../sponge/foxguard/plugin/FoxGuardMain.java | 8 +- .../foxguard/plugin/command/CommandHere.java | 6 +- .../plugin/config/ListenerModule.java | 4 +- .../plugin/listener/BlockChangeListener.java | 7 + .../listener/InteractEntityListener.java | 6 +- ...stenerNew.java => PlayerMoveListener.java} | 8 +- .../plugin/listener/SpawnEntityListener.java | 57 ++++---- .../listener/util/EntityFlagCalculator.java | 5 +- .../foxguard/plugin/util/DebugHelper.java | 58 -------- .../foxguard/plugin/util/DebugManager.java | 127 ++++++++++++++++++ 15 files changed, 189 insertions(+), 112 deletions(-) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/{PlayerMoveListenerNew.java => PlayerMoveListener.java} (98%) delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java diff --git a/FoxCore-Sponge b/FoxCore-Sponge index f549397..821f8b3 160000 --- a/FoxCore-Sponge +++ b/FoxCore-Sponge @@ -1 +1 @@ -Subproject commit f5493974ac14f5571957c3959075b0e4f418cb5d +Subproject commit 821f8b3313a888175d66668a727d154eb3d25c45 diff --git a/build.gradle b/build.gradle index 691b1d3..ad895d5 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,9 @@ buildscript { dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT' classpath 'org.spongepowered:spongegradle:0.8.2-SNAPSHOT' - classpath 'org.spongepowered:event-impl-gen:5.2.0-SNAPSHOT' + classpath 'org.spongepowered:event-impl-gen:5.1.0-SNAPSHOT' + //classpath 'gradle.plugin.org.spongepowered:event-impl-gen:5.0.2' + //classpath 'gradle.plugin.org.spongepowered:event-impl-gen:5.1.0-SNAPSHOT' classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 01b8bf6b1f99cad9213fc495b33ad5bbab8efd20..d8ea0315c80d550996b2b3449d095ac01491ef05 100644 GIT binary patch delta 32229 zcmY&YN+qUg|nM`ckwryu(+qUgH=bVRI|HH2C>gva}yH~5d479Hl z6hTo26buyz2nq@a#+O7o9)S$%KXUo=_ftHNItKOy)`Rn%GceHqcl+}B=T=4t_Fp+k z@jv;(@L$>ZOBWjYzgi*<-SPiSlya1i2>)?5S-sA1f&c>g1($e-$p^r(!1CwUnqR+o zBC_9C=c-8*B%^3aK$nb{D=Qok3eRe*H$HD+)sr!}jMnHhZk9GCM1`^9N>P#7_?5O7 zqR%)vi&a7D8R7`eqC0pC+ja@hG3hAe*`v31M|Hi(@*Q)t=e6_lw!O6T{W2;5%o$;D z=80R3;ERm0$XLA>$qm@|lpl?ORdkd$Hh}?ySh#4*5>KigeGvq1IFgA*|i2auRR%B$ZiV} zgEyGFRf9J`Ii<^)$ZhA;r_AZ%bTjhpy3GEIE9a5aRnFUhp|}An{W`7jicxU{Ju|4sbxXr-*5l!%kCViJNw@m#xm~GPUuxNT zZ(GPs^OeAMA$c@Iqch!fv|+u&9R>NoUTqqgBaoW?P#r6Yd_}=iXp8L&xE3&>_U`z!h`PnV^OC z)V?;+fJsHX@SEnsr>mJdrM5s?Uhc-tzfiK53>s6|9(ozFagWk z5RMeWa|B@fbgta}z?YvfDz-JmT!F_OFaj0fq&2LH+3H)li|8x7$lVPOxl%21*u{A* z`K@tBhitV<#en(R!i_ls4_dqD2D+m(=yAurcH1}d7E-x=A*~7`aj!pEo>qgAW@e!M zo7E;|yg^ILJk4wDL2j7m0of@Xq6dTPz32A=Ckfzob+C>6*F!D#E3kjr9z3YPKrB2e zQ~n+WgnvXXv};Piwvl(LEZRh-?+Lk3(uvt{m-QO(0ep8YFByyXqWNyHp>s({E8Hip zgN^5CUuRp*UdeBR-KY>92>4L-&uf zbv^!H>dIs7n$ofvi01rA#<036!vKSa(YI=Q5g02|LdL&(aNO^zGrJuM&G6Gs+wde4 zcTgTINmeR5ul*ap{&eyS+B&{KTKWj6@?%#Fb0Iix#vV{4kzs_bz3;*=1N^G3m({`8b!LMhE?v! zJM8z%GCFs}N;7=yjSZo@S?IQU>{JU}cN(rqUPS4MoTWk<{B9A$w(4T6h*#pzUui}b zwR)eA>2P%hV$$<_zBfEsQzgkVJZS-`vSgW(!GSM7@zUG<)2e}>a!p%pfAns)ej1sX zn%1A}-&N@|Ru@`RFGOq%aeE^DK)CpZL0MQORrBRQe0K?pfB0A0+htF>v+AX1+eSZs zUqP>PXP_I(0($`@u@N`}lr+>`wx_+Ki6`cKOHPg-ikmw^C* z`j7VFUDcN;3n>h8WuF)aNd&NgLD6j7A{rz-(vtOs_%gwf^93Rp_k=7%mM*)FZTGn5 zdf9fdFb90UKZ6Ql#oCd^H|`Ny7}5RCWM8h2?=uIP80j`Mfo-)Djc={9+d~lfOec7M z=MrHxSTzY-GF4%uUHVe&y2itYdI})`Lv^}n=>Nl4LZ|DnuA z!DtWyhw~=<#rMQf3QFxaqe^8?9Ai)BKd-UnXJ?q< zvkl9~6&0uyNcFx(y(4kibH=^qH6CWuX_|$-BfsAY!qRk#BpLytJh8OhgtWE_^tglHylU4AqV1Pu zxWB1%aZ-Jx*_oFI%x%V^piJmSbo!r+*3aVrps8aWhh$29WUFn`=x0L?|CivHdQa{& zYO1b+{g1<-(f@+{pGFPL4*oxaV+yhRKU1V+EC|wn@U!*4Lxl+s1hkC>1VohR1c9F@ zI1B;E)`a#&UGe+QY3gLbh9E-!MY~$JIs%19bFhlLUl$)|SWn+1Y1+RUrA}gXXKlg9 z0{ho~zN2OV*KUj43a8UKmOOK{YBhIPc6IL{;{RYBmX@4+xEs1{(Q)> zhT%@v0igQ^FbQ~_jotau2jUq{`pubRJ)i~n493k#8DxP74U7Q?O}(XuzhTciX!!lI zs|9*9?BeXHKmS>b`#mm5@vS`wi@j}O$X0`C+5Z9m59>*z1POzoZoWf(5_e2ozMFj% zw^E?F1Eoi|>EzaLRWUPIue?2Z|HxF2DPaTyWd1jtgq!bhpT->r#5cOZLVQAGZz4dr zhu)*7W)EjR$YFd>jO()-w}&j$VPcQR`L%}ifWY;$@HdgK!sv_Jr{EwW{N=C;_qP=P zk5^4z@pO>$k+{&-rV8h=%2BI1ynGJvOBpt2J?6 zcpklQ$1H39MZs8~lhLVhFum+J8V$fI+;VxCTCeHUxS4*SL$fflxkHlzyvf?Qo1EQ} zm>39{C1+~g-eBaOcLN0~wqttuO~ebZJpF!_bi`95_;9-VH@^N`bpN`i@Lnk z=!qRWGfjB7%R+&@XHiw?v87F~55BcaZSWb%nI{p+kB`f0+H2RyWC8=&<+5t3OJD0; zh%%k3sMdYt#>eDKE$(Z&Q2~l>e@58LwQ{MMplq#Zuv44AuJ7tS#}=Cw_~NEl$7QE7 zGMw#VJ2Gvg!rzmw-p*{L++FAx>MwfJ8eHz zSdP$prPV1MmzEY&;K;ws=h*t&Po}igj<-)ou~yHF$>c}Hnk1bc`T>3~H!zWS38cP+ zciK%Uc?ST^t-`ZuV<~I#kkOHeiDaByjDOzQvUMJ7Ej+hnqOW#=wd2Xm?LEzBtV-&H z8P*;ZtH^ZM7t+5@*d^FADj%`oQ4&R1l;R!F6&3j>n)m0cPTuc-AlYClZ+P+dUrDQ7H)Krh^ zG)Xu0#4r<>h$${AIaSj!RUr?xrYQEu%n{#2pCKXL*{-07!zZcDbLo%iBvWHBp~&bsv$TjsTvi(R;-O1 zsanFy$Xhb@xt+SH?0;>@@&xLJ(}~GDFYO8eTw92 z(S4x3w8=X%XWpKZ$h~Fj6)rI}Ri>BXoo%5-(HRK34ZY^5N77isZHY_5K}$F(?H7iw zN;pZq<>n}!GxzI;)~aGCR2~nURN(&Zg>hO(v}NHX4g&CSDII2qbZ#j?gwF71P(_S2 zck>fNM?ww;B?=Dk4=B7Jhr;K|D!}H}m4CTSZ`d!6&r8q9*LzCPtl>XppBi69B~W>b zwsUePKVv2*dP$)~#+chK1CJdSr<2Y3Y8era>?WM!a`+jP-&Pr5uXn$>iks<`S>}kE z4GrPkh5@L=kLY3}nN&!JpwSV=a0=IDt2C1F<)Si;g|mtzXxM_6yrkYU_KS(NU{b7~ zamI0{hBKT8sMb}L)%3JjoyJj1hqHscK8FNX@Kv&qJeFqZ8fwZ_?7<40UyLvJb;;S& zr{#wcbb5|vPHdO8xdpq0)lVq<7&4Y8JTfN~R{@$x>?0g<-qSS+Ugk`bq`Pju2Vx9G zUu%`G{8wU)F$7Qd?O7r?B?X(A7G`1inV8D?-W)cnOtmJ(T`B2{me3z%0${~y3=aztfP@=7lr*=Q!T~P%O!UDFYFBKEmIq%-&bWB8OF** zk^tvq<{@R}6IOk$o@Z+|TZ&)}3NvH=3muF~T_rroha87S_G&}PhG(T1f!b|k4Yj=O zrfM@hnRTVX#;?KWrsSDh@cQ!eU=@*4)3hbB_&18`I^B8H6}m`=ROv?4j7|&cEAI+1 zp5fPLyk{V_q~vc)w~c#px_R~9o$^)XeSk#@Qk1QM8cV%XctnPIS@SnENrGY2+RO18 zu=?$me(6Wq&L=xce8qGGSvgF?dWwx)w%xN+%{lNNyHX#IAsbzQaf@eDLa?fEPg{*& zF@^_~zu9`E#y0#?_D)$9*u+%XdWpXp{a>}(n}nFR^c`r|c3t!G`x5Kp9<2#ENq}J^ zRcA>wS5eu~3Q)C{&de6;NnqwPmLaxL_-HY3^e5cDKlOoU10vC7_+k~EitfQ@*}>cJ z8l_DvOpm9P-P@!`cH@DU4!Tgf6le__OX+*z=FHLA5zpNZL1vd!Se_=91N3rnipsI< z%FNP7ioRO|-s6M=wwJ;B&cdQs@svvTlcL9{O9-u3$14L;wmA;H-LqN^{$?)Vt!RtMb)6N#c!vHRdTD39c!clepxq zrFttG1JJaG}xaS}10>kpR%NhIsXMS98R_ zZ{Nez`$8o10wfh2pPo}*PWikS>`9QLPQh(uudS^;QN-zuRDf4_1Kkw%)^CqNT6D!( zv9>z`E^=(xmf84Buh_Mto7?!;g+8hDcY_W3(4J_8-81SW>#aSE)|B+y`p@%Y4sx1JD6(MRW^6L<7v?T-*4fhr*r`T*D#$eToNK z85?2a%-FS8$did9)bFd$F(my3eb1U>dkM9p)JF&%!xx)R@t2!eOCq&S9Hao>OJSEe zhGNi!83$!%PBOcmRa}7F@*R|V*w4)jivYvRo1k*#>-0F;$McLyJhX^cVjWVoi?58Z zBQa-3FajWP=L43X*?jlH1?y-5`Yp(Hg=<82%_k|*3k~?I73g&*ku?VL=!mr)ik9T- zz-0V`>7ZW!_vTf3%U7-3`35f6a0?eE)&=*vE0At-S&l5W@$<^zjLNW}^7M`ZlYoMT zX(b{L8Pzx-6Yj1V?nWNMeRzduV&qbF?(YgFcN!q2AuCfhY*hN_v)Z%EbUBquMSMQ} zR>o@9kh46Bhb$U4_jnZrYKMxT{}$^FD)`2FF4+gOE;`&aAXboAih&{_Uy?C?kvLye z`9_jdM>rd|sb+|5^J^%f&W~=&8}AUX8>k7}1JzcCUxwIT<%g@cv-95!O z|6bQmyN5Zm6g>!eukXvY1J}h*){U=${@X|5%&$3+Z$`nd%S7?`5eB&&*5ACWfVcUw zdoFrGGhY2YX#D-w9C*b5SX0{q)?nbAp~PY;m|IkOgxP9dwT!%h1rXNs(uq$jn3>0i zDxjI;xPek|OY9lw+cRDbZ|Nc~kv%WqjHv@q-ElMEiUa4js<;y6j0)eHW9;CQ53kWEc3zFcyR|OnzLVQ_;I1XAE^5JvK3J2d zc~;2p{&;D^sHaqkRNeuKT4*Y>p;o8m$;!IOJ#t7XVnknKE2n}Fq8PXULd6LPBx zkgoJrO5gkeJ7%kY=DQZ4=36ls2SmlnTf4o;uPzaO`uGxQBRWC5%^F95L_mvEXYQc? z^4BKSz59_92Ts9KvHv#JOc)f38Yg<5ye6_7Z?4ZPvz2Tx3h??^^t>iBQ~51@un*`W ziOazz1?;=n+yv;SR*x`$ZCoqOFog!CFB%F{xm(yV70iGo!DDXA~Z*`YRNc*PA3|G6FhQ255%BmpsQln=y)$n8Y)u%9>PS zptw;TNAz=%uLCoHMD_sho@uLMttlT`C8D9U$=wDvmDWy9Je^!z^eLoDD7aS0FCiI0(#$+5+MFOOx+@wg`tQI61ORqx>1J+?#uCP&H zLmg+|$at;cQ_1+Qf8pluR|UA9bRx2n&xsAR3~DT^8T{)^9QHB@{` zk11h8TB{Q<5zmL__q63bIvwDzgcd_l4fo4#x$?kV zwUO2*kRuQmf}8K^@2Hlzp2G-PXN@#AQYi8>YX+-(VALszV-G!w?*t2Bod)Z0-@NQ| z-|LzRh&-_-N^IaX=Sd+yezY}{XnF*ilZ)L*rMPh<(qIo*HD9rrPQD@UT*26QR~`Nw z86X2dpE4jy7T@#&`!|vSAi;sk;wI=b&%V-!2%EoYdg%-rG22ukWWFS=~@1Z$I7%uzKVp9iHU;{Lr)J04wcsybt8cXaQ%PlG?f z2R;XlcbD^Bg*&9Gcb<{CS?pW~VdG`X>O~ANZVxcmalQV0dq~gFYpr_xb{{XNEOqE% zg)P$JoV5O3=e&crP^J6QDXWx7-lPas&FLn*CZ>?FT!6B`ZDcRCpiSFUAs@WFyf-Xk zdIwHX|El_6Ex%J>L@yIOaj)X;;oejvMaN@iXXaFyJ&iY1S?;yOELVJT>Xp1*YETJa z75qc}73E(uukzR=y)rLQ<_hm8UmSXdl>B_#Z0IYERzeFBJ+tsceN}RSx?O$m_UV;e zd%_0;5aRDCyNCBJ95>j}I_$H2XJkU|^jJKBi^6UV9FYfEJQ2LgR@9a8M_+s3syxI3iWcaA{D6qB} z96_GiU4jfoa*&#&AT6=1Wt=5E*ai!)1q)m1OBw4^;;x|NYi`2ie>Sm_pwAnBrI{Ny zM$3RyBCwUXZ^xk_x)Dc)KJwen$A8ZTPIi4;FJcaUt~47&*e4Slei_$+QUd^yFHCj< zHNU8~q3gmz3v%T_k_q-5Dw|@j)!zsK5=S=!)SGsxTH>MEE+Ti+ahY)0*tn?t)uigk zHlX5qC!)>Yimfd&h|L$?w5C>b_-l0{-62bQddQ8i&Meps9c-}C_!%eK_A{_gX->3F z?;>@sy|>PB>dC^|Zq~Tgp+x{ocr0klQB=IWv^rX7D{@g8GZw=k^Hgp8bJl~oIP``| zQ{l@aRK=wNP0G%Bxcrg|_+(OPMP1P=%qFA^)%pQ0(4gX zf_ox=)xA+we_dQa8f2XsV(Aq3!s0ubM+L8>L#1y}uHu`N7f#^JX(=G^P_Pq8Ml7%I zgz9p7l*UoKk6zE`#NAcmfKr%uB867z&1#!OHAm@926?CPjkR>Q&yL3U)k@71m_z;zr3A&VI zKT00wPq+4Df~Bl+%q{~OQ)WgSRFY=_cgVW@5yAZh%#Y*|!2=HUPteYgW~~ZD#V7iY z>QU<(-eO)&bF6glNiNl=OY#ny>u2DOjE=W#bjdx#p2>Hzp#@;X(xM7SsY`B3er!!- zKlEjoZZ+^*lz`^*_jvD~joLTePROSBCm(RLLx+SgKKRaniU3(DpG_yjghg3$u{fQb zb;3zkV%IOhr7)6X$#?K#vqA^3l9-Gnw~-v(bMFd-Y)O_9yi#Y-`|=tT7>RJZTwLaJ zc#Q(!$%#$c%WuG<*^Fdmc9Zk24p~liimw-YnqvM1R*M7za_J?mWgk624LYVT+oX+$`l9$}%k#V0N!>5ko$F zmyRwGCn21KCDBhN&0%;2&L9OfnZ12~D)c})b;)k@_bmXKXX4D++v;oeE&U^T{NUo8 zeam5Z!8wXRYg>ehWDfJH-jV;&ZQW{(e<&)y$F9mp_le3mQTCb)W#ou4ACex&Br2-Y z@7+wYKU_(5{_;@rDyt~_wAMyph(t;z)f2m2>ba0PfPin6xMAk!f@tbi%RNDcV{(qf z0I6ML{sREFF&Hy?XI9$7+n$OfxUqt7WK~Rj}Jihj}Az5Q6|^)OCEM2n)SM|3lM7`BuuH4lLHkHu=F_*U&7~ zSRD?{!mKj>B~oPz@ugs?XfJ<}E&lPH3^((tGY^1P8Z^noA)Ua$g2A4^w_GZ%R>C4b zPCBu`=>j6D+`6e~XFc^9N@8Q!o(-CD&@Guo$r|EiI^%SdpBFg$vFwIVk(F`TSs!%Z zzd}=BXw?EOu0Mv_jzCz{(LA)?R?Z>*NXg6slt{4fQMGt-3eSSl2s3%A>+)8>lU=#G zTL-`y-CSHW-7p-YTfDnvUW-mq?Tc^2WNXDp*DGBp%N-A+Obv7e*OQXf*rN%pDG}z< zIp|hISbs*5F#QOBV9rTo^g#3jzQVY3gQxVo%hKVO^g0qjwWOKMm1KZV@J<^^*1#n% z?z(4u8?QuIcoks}#hH~SAz0_q#3~qbv2i(KDqjx$b`sk8 zC1+2A_#W7vjHdQSl~qtBr+8mNd`t@hZ$hXYxj}u-wIby3!H#Q%bCcP*rl@vKUlNcc zV==dKMy?1wYuthL{A6gywI$pt(s(xefY5=`csvXD4zca~C|C7te59xO=b@qykt3fW zApQcT6hD7=ohV~jok?;*hgYT>1@@E*U}qoCVL>oe26K!s8&$kbe4{t|t&BDKgeo+a z{t@e^$tBomoqu%MA_TKUom2cx3;@i&Om?#Zi1A?GBR(T*xP?oXj=>)wEMs2m#}TQ) zA0SU3>4d~Oj_ud3PQFI<5vf5{nQc>+Sdp%Re|1Ka&#DWW;OKfHO_f}+#?pu6yU(UC zBDe&d@y=U;y3La}7a#I8AHtWZ_6X=TR zeAED5Eg7RN*=rDAZ$LRdJ0^s;jQ9dN4yJ7{UZ9wBoijY2bnNf#gHts-8p#=> zN7IXcB!MbBCj>mm#$*Xr)j*$1lC620TIlPO#}Wys-cV*wco@CApm{1XMy%SdU9H-# zCr?AQe9A8g9X2P$Gj?`4oAN)77HT!&``*b`r{MOi@zOQM|PHc7J*r@*Z5J{@_}VoN^q zw#=^F+q`_Gk+l_S&XFOwBElJC`8}`)SlgecJXvT5rHMGS<#HN4VW$@Nd5Si3S5EQ5 z{Ph@}x>yHkxm9Ra2XKlTmW*(#ocHC=BT1nG&L<*K?@#UcT@~GNc6;`6n?f^ShFT@_ zHiu}v-<=ipl9e-f`qpE&POy8!<-ILc`ib9mnEyjUcy4sjk%K95<~sK_}vB zpLt_dVe^1m6LM=^TIw*-jHBP?H`D|bB5}`ASys4jQ#t-bch6Li=o1_-f8sZ zV_5%DceWXe1wfo97WJb$t`(kaB^mHRI$0s?aS)Wf5gFnQpyUMNM(p2?-Th+Hd}lN^ zfpX-9A?$(N{X(ci-gySf>JA&hI2F_U!nPG)n48#b3pJmo2`C`gl=V*5|C4HCMe!A< zADT)qut_i%JLj?L?=u+kEP*ux5EZEB6A0fPy2)+{0XWR+us69JGSf6W*$=1o`D^dR zkhqQ&7Qrj}xQH2z0tLHVm+IaK&GgHjqOJ4BfC$XYqvqLBE0SQ#I#CvRR@6EF1iW(k3XZd1ImUi}HO}NGD~**tmjx#94LcX<6GbZZ3N5#^SjKugZ=# z0Wg%oT*Aa<0uU?k|JFg`enYJ-v^T>a06-uqTDJrEe@l*uGFV5XL{Kjx+sSl$%)gFP zcP5-}0WN2NLhj-0Wsq{^96P2M4`uTKa!jhHJId@z zgax)G>D}N%Khi((F!9*DX6iMhru%N1-3q z6o37&s(oYB^Bx2qd+lAjAQj@Lf97^n%=Hm3BrEO)C(A0SpijHRiwf-xix8F)4sI4qiNn2x=Ex9aAbyP7-e;pdYj= zj0l?Ra1cG-Rh*kCV=3O1)NXw~y-Chv!8M^Nd5aVJOg8h{^`?8i`{lK_vyoON^sZK5 z_iX#6=gaTrqh~bn$Lo~|D02uMjmNPyV#+gISD!jHm5Q^lKr%4$))~C^_8{56OZr;B zdLO{nHX7^mPdkVnn+Ur=aqtsZbq?(S|)7H_KUlpl~hJP-}D zM~!*lqQe`7;bqMthDLf{aRIecxcN;HHI@UXQlqh$W58dMlX21+NPO%?6ot+=Ab!i5 ztYmdP6S6TO5{d7UlTf*`=LZMk%z&VcZE_~k{$*c>QJE#RxB^d<2E$2PhQb=XMni#X_$Wc zxQPq~*K={TB`q&#sylZVMERvXi#$)H$?<8K>N9aIrR!Q~QKcghUTKu%I&*mMGVD*E zE$!KJj0%#;dKR^xDd`R*NaeY?gvql!gu2@hCwA?mNbOAQ5wS+5E>^M|xMg6MI%i*y zQ845O_lE)n?U$;$(f+H6EI{WiTMi3Dtz#aI#gtTqUHqvjs;km-K*;eLR80z-iX}S= zvzlrj(_7cjNxgM?$aCGfk8~-fsIWespTt;nw3;?!ieF=5$_+z45#*sZ17l8?EB|@J zob$y@sz2B+0fbFA@`5#LUmd=6*BpM-k)?7jm_8xIVAraHdM7&y8}OsXU4*kRw8=SA zGHtqDg;NYxGDA(>ype8S5XYU33J3xT?H8DisfI+q*9ky9VA=>TY z0Q)V6ZQvP^LVdEUMtmvNuM)z(EY)b*!-NN3V3=< z3VvqzYCiHO{i?+(0^rxdwwxi2<)pq?H1xrM(E-$q|5u~2q?p#;)c2iki(MV6KA=1$ z6Q6Y@-!_9PGT};C?3GoCG=eRkv0y-9Nfg@N0;@e`Pre3?a*7P8f->0^dt%tvx{G+6 zRf(P&RjE8&j5sfhT23``I6|`^9J@YAKJ%bweuw34K2=_G4$v0Qmt+lwRxgW!A?4>M zVO2t&5{U-Fv;HVL&?HO(v4vzo97N2-myBI%AtEtl`d5u(Xc~z-gY_UEDsvNw&n(D# zrPw;tyx8g{-b8$8en`4rS{lyExEU1#ZiB2! zLY%UAy|T#07*MTQ8vazEzRP^?Xd_2ygpsLey%{DND;^!M$m)duEf-O?Aj(%`;`L0) z5T%=$PQGP}DEBdxyh0jnrzl!T&K?%s6%%MXn9&B-N@JYZMbJ7AeL_c`;N578SfA$Q z%;;nixRU45VO3RKnX7O>$FAqc@PdnYY&gfGCvie41L&rIm}lZ!%D|NyjSg}nT59k; zl67R|&XB)1uBM^v3?BKLqG76l_s~4zLi?AfF%n;AuFUAjeYki5uhLObag$4Y_uPv$ z0++rjitfqFhfB1$T3zc2#O6JWfmKKm%5|F%apaK@8kq3_q9;!=NNnQ{{dftd2< z=gy%*Mn0NLeY_iN(Ki6s;G&^$zs<$OFm`R$$XbQ3hY+egj~RRBOet03SyyeZZ}f=0 zVSOSY{Xk=$XV>7w$v)2=Ssj3ux8=G`XH(*!1Bj@X5wBj@^TmzO37hcwA-K^3tbTRQwb1vdl5e!({ zjvxT>gE0kx;)c}j*#k?r5lpXDZW2tc0aBd+lokf^Fhm55y0sLfa9o<8V(=)x5Z5U~ z+tD}rlG}b)9uo?VB7LV21|k{9Yi8xQDG%W14h7bXNYP#%?_Z<~&)tGWWcmpiK#c#+ zt36eE4aI8nZWj1657&g{m=2aIbNic0HLjtdol=w33Ip5^9t$iZl0s>z3IK*C z99gO;mo$t;JC;ZOH?er?I}dO`8tB|u)owaSN^hcYy3Zc8l|o7E5;yB-av4o7ZPp;YgW+~X8F zW>C(6SsVO@BV@)MvF#|9Zn%qOGr*7I`Zd&3;%b*~z~TV&ODhms^o{qUh9)M$K=uvRrL|LAUMQ?+ka@z@pI6Zh}Ls8K4N7(tHS zH*c3gT%ua=&+1}|QbnH4UuBtsU!9A~j zF=WUX9gA<2E;032X9dD5$pN=fE;Y>6C~fambd?D`?VC%cWM)8LLGVc20oHKLZU~Iw zHG5ZlX;1oWBJMajV(-%AQ;m1H17G)Qm*?-SBAP=xMCaI+6M23PgD8}ZPiKxvt7D5> zOG}b+?*FDOEUOFMM%X5`L#wlcg*DL@nMd&FFz?e>%`@JfQ$92C9{}p6+5Y)4yJrSR zw8Y-b9iK~s(VVGAidQw^sR>OW>om#AvF7thH2t1HB?qJRYomc{vj%A#9LoIo zlx?96vuNw#hg;tP4WxGv@_IsZD!yA`9&xJ8v-R#7dA;{~BE^LM9v{UkQW}mAmeWN3 zT+tud!|cl@N}^~pSkuxHu~;GFd}Lfmr+TJ>_d>q%LdZ zi{T&8|I20@QwRz{{(EsW39m064*~@A29cOYfR!jWhTZ6-l?n2{{arjW9k8c=Tf2$A zW;96uQ6%QfFBATGXMqC&u_Vs9lP1Q+LnOweLnPLwAOIE+Taudf##1RX0@c>(%&7J$ z!bY%BNPtn`Ab#MlG*fInGPj0L3tz#$lSK*Vh9GbAqdZDzgg3xmT~4-nT(0>}rYCO% z1pI-^_SXn&@{-6+O5%mILR_d+=hH%qjfmjk&8#ZsX-gb6a`fgM4F*9&IA1d1+MD^l z<8=@`G6BoxryKSz=|+7vp)Dr~jmDksZR3nOmwYRkRCY|H*7_ohrYp7@RX45fK|d)s zoWkz+=bLN$J#+_@=};b50YW>9@H}RezDFGcwOqVVU{~5UIXg`m{0^K06+A6!588Cs z?52?%n}|UMoY54(=_ODGt3n%lxhr0g?@{P7Ux1(z;o1Wm&%Zz+D;V=${J9kwVwVen ztZG*1STGpIa@1^CR9 zSpWeR?+Gz3`@&4TGX&x5(0(4CO*703m-gb9$8oPtx=o0=D~~)1G^>*Gr%xI|xQ zi9hTi)3&}md#r>u^+v-YH;d7pjBls~Iq22S3|9C;HxRM8AQU`?A`w#(yYLAT1NrGk z?IuGA9lIHUnb{;1EVGPwQ-Xt08NVOx^8?!A2kbV_jKudl(yc7gn}^sP$*Z0( zQMhzLI6)tx8EYSC;Oo1Fa~@hQQOhF`Ig%xg>I9rjoXezFpAB7uD$9dsMe{d5j=zvY#oE=M9 zm(|o+FA)y32ScQ+ZGdqxWkbn|IS-p1;1lOFBu!rsN%yi7dq4BG-Es3(PX3|+;o-BC zg3Ev}HLM1~SoLpel{j`(hnAEL{zlCri)#k`r)AF}vg4~SzM5(Mh=n0?k|eatS8t+_ zAR~e-p*d%AS-lW(+N{aSnWkCov}(p`MZ6M80hZafna{HB(E9G(@&+Ej}srDB=L#?Dy@oge@1IzBckcP^T* zZVMEvC(JDE%#pbb)jl(coDs|1l}ndPi~{`BRh}9SE`G%dd#30JakdYf3|oe^AgvgX z_nXVI7x@2zl-PSrJKCH3daOPwMr=|UD4KMA9}=;6r+61x_m@yNU2Bjj zNerLPS<2aR@aW~cCjk5l9RaC#cDOu@WG37(?6Pi#Jlm&zaOS~}C7zRHj-U_Fn?nG) zJ5QOB4d~4fY7-%G{+Q|W^1wJ&qHdC+0#DkJyirF9%AM%`Uln9d%czJl;!-0%$flKt zrzu(~vuyqn-Id4GG4_WgtQMNWqe=R#YNf_D$j{5Yc;)u+OSH!&xH=q>gA`uEN>|2a zQY_hLkYxDlzv{5r7M;_{GqK%Bu$%zQO0(l$Iv)L!k|A3vTC>tEDH_3JRo0n{(qR|o zJq?1{tCAd09hN%D^HtZh(wv)6>kX0Z1=Z+qbg3MVn`O;SMH#_PTZ`mdf9;XykhT`H z6OonAfTEZr8kfLDaPZUOe_=JlWKd!$$g8HHv-)Uvq4ZUESx=U=&_CxeTYCYln$N!c zfpryYR7M-H*!F49F9&ikOsZ=0V`YRD{2W{QKxb)V(eWm0*3=h?^cSiS3zj~{?iTf93~-dNey$opA+=~gKsF?|M4m)>|p{>F!e3lCGnj^ zSk{fbFl*siD%gN|HtG#jxGfI^6@G`yjl9BmWHPW3-Z3O#Xx4$5$28nKvGKrjGcZ=| z*LcyBhN%7ECo~+t;H<;Aq_8~~m>GY1_gE0U{Htz7Ss-Jc1M$|PQ zt4qnnzV{LCoGC+E&^rf&7Q=*xuB<2pU@isbnQ+_EK;fy$kWCf!8!lK`@!2bhutWy- zSM{d_U7gMSG{kVJtC10-!{8DjxWrW#rWpN7%qxPOSWc{@q>6e}oL#EAF1i+Fyc)SeF4{mLojQE3&bv(j*{6 z`oOZxC)89D-$)ZC)#mI7j)#nIj1$~8^bj6C$q)utBWN{vS@`eREqr@D{=fy%*!Q~V z2eo51692d%Q!^y|h_{$YyGt|@jxHpA_a^;|H~lzM!!hkO3`T+xtZiN%m+amo39UwL z%1NMBgDN{O)mk0EbsaRt4SZE^6Xz01ne?%lr$%wn1*Aqnve+Gxn3HIu3l7DVh?eYm zd4lG#1j?J`r1zvcAGDzZN!Ro!26mC&HTpYj}MN zBE`A2IQDKXkI?y=!Nv7QX=W@}e_)-(wc$+fpi2M6g;EPpPj50vyK?AK)Ht#FinqUZ z-D75(F-6W1=`lcg1~Y~~!~XQEJG!O2W{kOI5h#a{tY3X(b%_4jdo5ItcGlnBI1UTn zD5n)0{ASC|2Oyw(eP*fG-mL>DA$6r7=1rC;AY^j`y5U%utEIE{Mm zlK4&A&3ynsxYt+1MO>gL1j1OunWMnSp>Uaj70eP5NzBd3#s~$0C31{lGVQ zo=v0Uo8kY4Zf0AJ7U_S~80=s87XL3bex4!&6szbtAPb@LvG~&N8ppT1Y7IxEFmx8b z8xuxL8w-DC<9Na>>o`sdHbsBODKa^Z*17@ z-o@-Ko}8d9W#lS@_{c`*IioBD^CxsB9<|t~u#)f)Px}q+y3z=d3%9 zX4XoFWGY(%4|_y@$UE7Y@N#(6F>u7Rsg-lAXo5=*k$n@2PZvMG(pRDj1yQL`_Hwc{ zi1WsnD0iV@pNP0h&@o~B6(MMZj!$#ze_yf@%D)D4I4^E zpMJ??`dqyJx5fb%UH9SsOl{Nb^nU<7zdJ#_=62@Qo__ZOe_OTH`gctJr{v_I503H& z>Or%mZUhAeMt}$uvyuY16KG()pdcx7B=3FA=B6o^L&AnYE^n}A=8~V8H5!&K4zp%- z^Mg;uvT(Erm3j?0tJwAac!X%Lub`FrO#Fi4n(0qwR+X>Qv!#Fg)AH;S;3>`be!KD` z0M-#&RF*GfnIeHYt)F7Fn3 zM;bXYQ>^co2_`l^YZwT(85ZpNKkzK*4LRaXbfR!abcNy@?bPTOQwvlzl=Rff&2vAf zUQ_V4+U>(qsgFYedbQ<*H3e3RmQu1gBSR>YeRsve60zH{ek>IfB+9z>JTyEJyvLzBt!9IiNH5NE)|&Q21a0RRtlH~|6Di%HcWj6nbXm5OyeLb zA>cW*PV&)25Vv9|ao99yMpx3$N$vEdacFVV!80kzdF7A*9O!pbT0T^!l$i5>gJ@s8 zwsP)s2`T2Hma0Z3iCjb)I7E*kBo0uww@fBY1MW|_k*4(?UTikcm#4V&x+o+xb;f&% z+f!g&Ae-}+#=G>p)jVwzUi~aw9-{BAxJ4fN*&MsBh3H1Hg`+xhnCR)8FPM9>y9F@l zG1Ox9EO8_P+}6GuXDV{%&giiM;QIP6$6fHy;Js5>ioakfFdsA0?K8zclSGeAR25Sl zVEU+9&6v}tbt`4XaeE;prSlHD1y1rE_WB50cV!ndK93F3Hz&U{vstI1)HD1Emwrad zubu+_g$#OFw}fmb^QV*Y$@#j{b0@c97D-a#x+0>11|DCcGNTp?@^&S|Zwm6>Ww z9q2c)_V(75mhP|wztVgy#?RB}X2F?N5&@h@teegBig5m$Fz;}D#n*q}MNGL|!Cw~2p*^oJ+k$0XrB*R(x2!>zX5=|0Np5c~dh5e^*_v9BkjPcr=c1g%CUFhZtE zDinZ&mj5YoGRP4-(Tc?g>5dLMG5!AY$^GZ+Pgjs3H$*zE@)riSzx)+&(UGXx)#+iDSUnh=xx8iE^{5o7q3^1?(2GBBy z1%T+GK38wZc*O?ZYLS=6nTrR>L#CJ`Dq$E&v3! zh#ib51=kXjTc_l@-AnkPaD)eSgaC$3K{b(DDV2H$Hs+w$DOT2k+ji9_YrokF z_q&E5__()C^K$_vUDq@Bn&-izR{PiI^u}{+fz-CS!SNjU-%~lY{pBJKz+tzj0L4DD zGPsa(D}$lP{xZCoB#rb7BdQg=7?@sr*Vt%fPMZNr)u={xr3y~d`EbWEgh9a9iw$MQ z)KL0$!}JaZ!I>t7-sRp{17q*c_4rXbQv*%-ja(?=Tm6N}M@9^ecqp9MbFilDp$(R{ zx%M^)-o^G&daB-B1x|t1bp-sPcv1a?tql^DD4Z)0Fr#Jjva=%u3r(EneoF=xvm@Uk zgoZ}(y1qoY*s`Zr+uST+ml6OPxMt^B*K1nbPL_5Px!4}G95~%mGz>0`iWqF_by`a` zQ=P1^4TrcGOc-0s1cy!430&KM!l$eZ80jrWx=UC0?k3kp9A}bqu4tNbYBzCU*q7Qw zq%f10mhfYh$sgOBv)TO|VbO=kfVQB+`l&&>VqZ@+*55~11<9SU$vOtWYS2zsE&Zw9 z;fF6}1 zKTR+LV~*P7QSOMy0ds2TKN(K7t;KYf)!`RtfjQo@BrDM{iiN`8Z9P;~7pndwKF_L% zZ0UgMw2<7+4%;YTZ>WWc>1oJ+Ji$ipG+AM9P-ht&}br`y%t&dy3o6zp%xR}!4ex|J=BcsdSAA#Kb!_QM1oxp z_NjaXdpPztSG^_x#x$qcwsj79anU-sg>2R|Xj}E6eZ?VyBi1v8AVDLxq6sQ1H+V=a zO_KPKZ^+E)%V#_;O3v@WpEJhFv-=3UtAj2c58 zjc)Y~;VJ{j7i9+tJRx-?RL*#Gc4zJ$A-@oT3<=XlqnQIf?LdYGgd+rq{@`WT zK%(brKg7}D-Nq{_TJ(6>8sCLk?}0_?i0?EyxBo32@adNzm=(2xX+C^-f4n)&`Y>$J zK1;yao+Ow(H|q?CLP(#rXIORkc)YpnC>NiSX6k6}lE zc*FZa1Q2kBD=F0Fj`y2P)a<<1XJ~_UMi>SZi^|5QZ=({f(GC`6geQP>yOIWy0<)9) zOGo*6Vx3i2x+d471Fv@F4ge$ zilg3*JMeRGeIf8ir{mdAyk-oD2?x*Iv_uvePytx4m`nhoqPpMdPeEP&4sxj>nH;Ot zfS9jLEr`#C)%&QQvtZBy3)ZyX0uF9++F<1?1({vFdN>YiSaPTJc_S5}&Ec3M9|kLr zo-QDq(%M$344GCY#Xd!QC2}Cb9eVqupOe8toxlZgwd7(Hrn9Hg=68x&-;E++$Z$0u z28t^#uS|~+OVU?cvO+qw>gKfaq;%!I1!JeUu5}IIE#w0nm~)e5(pQj$5k_>HgNY zg`G0Uu;D6K@7Ucv90m4=O`0Cko*lcf?zs~4H#dCua%CP44v0UnKDQl2_m@YDqr%@h zwK-;${SYY9&=K{TWCjGZ>{({xj0jiaV;;vLSZ!~#RJk}Ni&8+gbctdA-r%apyLJKO z=e}|UmF{!RKMceqpY+lN26xDVtaUT;^RQ9oA#T*!oXlbCEbLfM7(ViOU^T5c3=ov9 zI^ARiv`i6eioQ$yE`YuMKx}cR+1xI(J-lqD8YZdJD!xYR=8~MPjUzs7K&H(;Wb@jl z#FaKRezLW)qP;M$O_38JugRCNMM(wNpJ}M-Hb#6MJ6XO+w=k1P!qaJA7$X{R7MrgP z!9i-&ZrwHLiefHDBdv5?OQ|4}r)Hetpk46M{plIT$>>(SlG0w#at&cXxavtCxg=e7QsJ#A~`grXpp9Q$zJbp8Ho&)zbTY z%njIs98<~Skbtj|M2)0I?<^>?>?g0vw4J$;+m(bT=jyl@Y~ssJrIeEn3383x{MlwvzHaM+o# zRyN`?yKLxZ?(i~1rT!j=OPV(6|EgL_?TU&CwcissAL*#kc%>ri719|FnAE8YNC_QM z*v|KO$13A+)^{yE*Gc^96sz?dP{RD(TSWDRubFY{j&5>mDf%q&+?Kt0s@FCxQD$n^q+0!g0_USA460VeMWRD#xLBrQp{ zXn$w)zzcI-pzYqxXR9mRNua?-l8R<_qKM0O`yLf7}bkldx=+gITZEf$ja89Pq%& z3!+`-n;l1iIA?E05DQN_jJ4YS(KXcpk>rGE5O(vVO=-%FxPwEEmVD*ROx8?RK>K`1 z`ZM^v7e=S;1HTuHFlzjjU{xQx+zpXC2kMkJ)Z^xS7obzxfmkL%dH16#sW5En9WDDi zRpHFoa-P0+zZZBfc7Fk9b_)E;_-66~J1{uAjTSD3 z&R8LQ>j0s}**!3r1bVSuas6M}{7G~_@60}#L$dQj&(n}4qc$W%wT?;YA+whGlg{`4 zAl%@ca>xA54ew;+EiFR@z%148y2Nl_xxt~2ybjue z!?8MUr#>g;WKM(}uoO9I(b>*|^eK`5zS8(sEj5i~5W8@Y{gQ}>4C**sm+F4n($yfdrtEftMu|wW7 z{0?9|jj&+Ub@Jop$k!!IVc(L1Y$wa=yKsb?Av{d}D%AmX-AuU9SCzRzYx{cGO>zYm z;taDB(JELR~c3Q%lT-4^WfK`X0^g^eQl( zK*8=QLytq6z|Dk0HF6JX2n8`3T=-)dghYTu>rdH@IXFa2Yr=OarxGdh39G2(%4F9s z(BQYufm2U#iRseLcHk14gTZ0V!g+S$lwG-0hB23e(NP9#z_eRkGRT0qIe+_j%1nxoqOY#>f z(RUd44?2(VT#i$A9k5Gl?;MVgp&yIoIptFLt?Y#X3DZ}g z=KX@G`3;v*57U+ZVOsOrpN7JjDi3F}5}f1}CCigk>?)HE`V}#L`I8mDZ&q71)DqNt zhiArT!rMI=QSe7T20)Z+p4VA#0|f5qzGxRE>`Ks&^aGF~8X#ak_z@MXM&_Uq0RPQC z#N2FwcH{_>Hle9xRr)jxb*e%v*4r&ghP;$kHRArMxW2fGITkEqV0(5=L0p|LZf7~} zYPt4T%m-PfnJLN5UicJQp7AfdU{3>IbXTbIEm>XXVX^M>w(s)7)frmj4Nt`|z}FCw zh*;;iAl5~vtR6YZo+VRM0RHwOfSl3&PjnP7%HC}5%#oiFIYEYb?2FPrwu|H>o~*v( z$;`2*1|XqX{SXIKes#k=_R0V1#)}e&&QP(+hg_JS^(=+3q(YVTjB~H`nSypbMDgLQ z??5|9Q-~7BO*BKpQmZgMg5;6ZIJEy&q0?Rac!Xs-9rv|c_4C9z)hp@q6u_7rRg&ZQ zrf{~rNOv49N;JUj`aPERsfdKb0;jqro}luDCEayh2{}x7pv}&Z(Dh3hm2YSnP9%}E zK~rUz32x46l%O8(65|w$q&N1Gu+`nyLCZUdk6_raEa1iaAH@lpgh5Kmqce>xTYuMp3Fwz5QVtzHK~+gKr(K;vXupv?pk zU{%}J18W!iOQ#u7hXyh@2+UuzFy)(>Gb(t*WF2`^H6Q}*J831rG!L|5mX!nXNYVur6fGLI|KDlp71 z;0xh_m5=^s+pulF-}l7a-}8}*l5OLWd_OnEcdhEVhX>GldeTK^Ufvnw$812!6Tpiurkl&#p9~40LZ&fi1!VtcPi)JB?y}r>2*4=>-S?fv2hro>E=d^ zc7J>dw1}>QxjQv+IxX6qtuuJp>ws2lpJ798RM?R4b-FZvm)-O$LeR@|!VV7$?nc|` zavoc8I+H*!ZyB~u623?3u`DS8Z`Lm04xFQJ4MW=swW1Dhi|-lh;{;KpRve!}j2 zWBnENKqswbRbexZ(!Q+ThmUWTDYH%E0Kl%yEF|rbP7F^QG!JN9*$s59w~{HioJ% z9w`{d@SaHoRSu+>f z;ms7yd}2L+M|`ZO?Rss8?cr5|(Ef=@C_9z%w5YH&(J*lZKX_7CsKZaNJlHTDPWatw zSRi+-XUu+e0+J;!?t?jIZ)agwH#HyS>xE$nBx9YnqI+7(?F5g_Pho}mcziGfkI$R= zmxjayh{M(gh1Y-vh-lWAy4@(~2;naEj%X*`gOxTe7>;NY9=yo9*vH`C*>0vZMF%4B z*eg}&k!aUeyKI(GII%uV=KV!`=PQyhscV+@zLH-)I1O!GJZu((+ck?=iJLutvq&{G z*yFG?0fyaaM&I31BT@U~_1dheaIBE0o(%>xCMX`##IUlYfW4Tc1&%cC9c2&)d`6dy|G_` z)i#!VjtLAPe~Lda*z!G3(52N3R-V-rR?pPoB$lRBDLiB51=X6=QT#WnJ|S=&p>T!^ zJf3i1lYE*)xd&0y7W_53677h#$gK(KhPa)37;N=!K1p9gh)`%bE9KGcwi-Smbxen- zKvZ~0l{LzUqnY`>XBh!YR7Mb&BZ}5o)@A>Ib(u1NROT`Up5;?oe+mXtY*u|CXXD}! z37U#Hh6?beuv#ZgJkbNEeXGnpz_sIc4EgcG8tI!o1gxX8(Kecn$~KRUoPq~|2C&G& zw^o~$EiB$yTXbw<)lop}hM}XwsO0K>zjKB_KQ2}grVurZyns-Cmesv{#@G~#=$^04awcUMZG72C5Z9%{-dwq<=^9&EzSM;+FOfRSWZ4oPgw9jryH91&! zMwkx$;&IO;(3_lw!LI=f{e!Vr0bMRrc=tLhFskq+GR$z*N;Om{CUw=t%>wEMJdjQR z3-Kh)2KI&q4dU2Dm$6NHDMwc+f#RHn3`p3DB>3^kL>b+KaLtTpqYQ zbf2J!c@}dWGy#~t%I&JBxkJ)_$bnrl!3v3^-bx2E>_sLGbe?`V@N%Eb_Az&$_ z_ONYd)_S|$`B=Kww(@tr_&lMI1xurkhjLA0U{8Gwm8}tH4R%!Ms`6Xb=VXxRO7atg z7?AdGQV9%wf&h@f$+FF+ewvja8<|X>j?$;H94hssjvFtH&FiQpw=JdDP{T3H&BAl4 zA<^QVYa3*nJF zykZdC&}Xa0PNR`)WYM4*{tan5vVi^_2P-ZDf=(3QBOZVcC1mT`0+l&NPRWxBNvS1) z-Mm-vQ%Xq%yevoEQkyR}y;6_Y&s1ID`bcbB*)9eC%=>!%HvQ>e$Da5+4;u+lL@N6D zB)EHa~$tDFE`VBBXs&Vy>NFGB3T2F{Bed)eaI`xql>b^_~|ml_Vq`6JjpcWD`Xd$C;e(_)6@a z>Pu@xbn)Z}0Bd#f-@`?|E0zzjv5FLF!!Ll6sT%3E}f|%WgKD~j<@mMyl5Tv(27grKJV)7 z3wQa5h)jk$_xArH96#b&Qkq#)Qb!0D>BUA0a^HNB^~PPYw%-$I2o<=6GE5MM9Tt!U zg~tNKMELbjnNi^PVz-RHd-j9z2&MU&x$y|0a?g0EfA9bJ@RE5B3Vn$ZTR=YKHq}%M z>y*5F(%njg0F*sk*Wx)LYTEkccg(N*6S1z=9BPqqG(F3A%3ly(Uxv52yP2@BnQosB zq6xk+Cifc0KvB)=cb-xI7>a4duaKV-@J)`YU@TcN8%h1pouT_j8rT#K**p{vn;X>4&3kUWTv5hel%ZM*_FAvjlOE3mL+qqs!ijpv$kCf5I&O`%H~jB z^q_8paAXuRI}<7lB+#7jtNeIKU#J7TygVXj1!7~f?`ZU?h61^$=Smqck`gSX>Bptm z3H!NW`j=dh6{Oe)*{&CXnU2eVsT1VHR)K(9F}PJj&gSiXlwSRxHKqL}bx=eBFrVg#;`IADQw=3utQQjShaR{XdGD{(tlF&Dqvh37!(d1fa(hAEEqIpt<|)ENRY^Dr7< zYmP*{rE{vPz9m@iRY&mJYT*v^yZ!OVws<_6=>oUmeG{e)Q`n*Rs}D4xoZ2=O-7yr#KO@CikMbJO<15 z*`)1x$_pMMG9#h+;f`l?mR*C&Cuf=4!LJ+(r4pz8ZoxVddNLmjP_l#QD%HX5fw1!d zV7Enw9Q~D(@5sqY0b)WjTm_#j`PJW%7&53>;QN_X$d>+~`E*pv8 zCm8qv>ZH$+4U(d~yLg|(wxftGijBbpqShRpa#k|shZ8B_SJ zkdIcaS3y=iH<%gnzSCG-sTwuh&Ub+Z8cOT@;FRHp#Fw(-qqahSz+^Ory2RD&k)Gzf zmSVU?{afiJr*QTTK?92q;{T`40AFUnqHKVeA)I)r7#bq_H;gd*?>vi*O4>7XW(z;< zN&wlS*{?klbpZ**w|bV3`LDU6IWx}grf@V>-A)A`Pe+@72>)vSk>P#&a&z{H6)ex` zhOEGL!vA<6iIBcZO#GkDf23m)uwb5N$#0jw0Eux0TWuwvd9Yqrr=&I4Mp5^K_^!+fOlKCPrW1g3cGt96_;V>ah zGjN1CgVY`Hdn}Q}$~<*j5CF{}Phpb0S@J8ECx&m*@eX=3@vt|Zw-mM=?Xx6{s3!9X zTXrsvh02%i14GZkqw28juXsG(3=-{z3_8q-^|?S+kJ)cejprL;aqit8+d8No>CfSk6OA=J#G z+v_{87z>WOE9bbcN9NLuNtA&ksh)(N!62*|VF7oK>35%AeARkt z!d{uC#p_32m`R!T22?;Xo=TPQwSE5=|1iDC`O*FBeVyh+mbEy50wBWpAwtGTHb z1vu;i)*|>rUd$7y;p@@CI@5q@Dd_V(G>9lw@36;yvI?FJ- zWodRg_Tr?ovExo7^s*})a$33!PboyQY@7b_)_3yJ?+=-+{N`qP!0(g6qMJa0L~8{Za&o*)K!Nja zq(I{|60)upbuLU^A~v2wA5J_as+6Q}_V5;{-mPN2E#LK=mzjZ?X;gs0cLd8k9E%e< zHrx1aOtZ{faLHO3*EtJ;>g`SvY=YgB)MakM2PB4(PZf`Jk0Rdkt43tMF|&p2Rnjb6 z_JRUes^4dqdc}q=Ccl#9mkM;iNhYG|t%^mZ#bQXVyTWw*a`}3pJ(OMXZAYVUdO5I1 z+vlLwu6Tc6Z3jB8%J2-35uvboFA<$)m?y+bIh!`g-*2hTmtWVr>$=$|H0Tctop z^N74w=o~&q-`bRpZ@2diamSdfa;PJH;m5Qy!jAfoAb;H?mEZeP)?fjvBYVQkOw5v3 zOrVFWi8qhq2u zKD|h>aep0uZtxQmX{{9b6Yk$?&{n3z@yB&D0BDq~1ZXigw$HxIHLCxroBiI5o=jFg zG%pOk8XXfUY^~s=07=Jf_%z|ZvTHaM*82h?jAoz~@cm-ktz5#^hRMYYKzhLV6B!L8t6g$$h4*GSvu6T>n)^;Kva#l4}}nV6N#kB zf)i7v9pZW;T%(Rtd+^V5snv$D6lSF!62!ualy;nqPoB+d@$yJs%qyxh%|5%bX$Uho z%Dr}!3ahaX1_Il`bK&8>xLH6$a`fMl3y5%oYk=pqGJV@RE#Vp)@nXRof{VLREpI9Q zc=G%OJhX(Pr-%NymcW%)F#OK z(tn7g>CWh;fB-R zs8A=4PB~;e?t7{x8#lM=rc#Yi9PlQAa}~w~VW8M3`jTA;<)StT(VoQAj1!Ag0z8*& zN0=;PmTc7sT;w(gzI$H-j3|K3Jbl8T}d@k2FF(@W5uPLbZqoR}C(b}n$= zJAL_m^9<|fSw{P<4;fjY=F(asH#3!hhCQDgR|xfYN0kAk-Kync?I@tIf!{P?hef=QBZRb0Lx{ z3qj3h231s_tDF9>P%_W5pHI*GJ%S=@1)6SpITj8&mmVC#`#Qy0ltFdTwc3;Hp_~E^ zrt1AU(bP<(+Edlx+`&QbccUyj=o^?eA9gjlWjT@V5EbeLkvM6$g@i~6lGaY-0VqrL z{c026$X{74i?>K1@o0Lr1O?X(SDSW;k=>Z=7Vu#_+g~=KSUrN4nXgz!)erIyRST1^ zbjPpTj(dmCm#rJM6uUq<7F4}RL+6{Tm`3K11XP7!`6bhm`+{oL>GqRS#Io%7x* zCfKUx*AOE*g*=bF;#mOxF(bvhF96ah6>;XGgi9vWsByA>3wDWWq}`(6W9h7CDsGBC zPxxH$D})COY|esCv4_dc2=NMy>ImBT&9F_5iuW0t3SdQf%SYb-xV(c5 z_ZOyA1@JzpokL3@5q>iFBSS(@Gr_@SOD4ZC#UE!n(4BVc%iKiWjQH3kYjS@aLy@t} z<6I@bDd`QGYV-eSzH6%kRD5}cdEXTs$+c&8eW``IN6j>ZR!wILKZ;=}uN@n^^@L?8 zr@ejd3NH;$h+)X-Vvm=wY0p9R`N0L_UQ-LFCop%2Z0&QDwPv2}weDEMtMGJ!F9@5L~Xv)jEt=o^v#35N7)o z1g;8KDMGpNuf+8S_yv!ZNQ4(UOH?+^HoWO69j50ELvDeYzh)6Q_O;Go^e`ImHP03? z#1ocN842w-eyd@uG0<%iyY7xl0NCyNgPE)=3>)-UKO_I(n-VmQ=_kXA+z{^d(4XgX z_@3=}*4*S)o%I<>QZ+vpC*~6(gMq=_S2C_5kgbOvp}Ol@T;mG0kujb_%%>EW0zVe< z0CDRd8ac;P$Xa7EQT_E(2)`=SfUKte9iQ5{gnX}EvB=L8a#z7l)OD>Zz5&uiLe2xA zzyq#Nx8&V|$m8O{{EUU5GQ}8F_kX7k#nn}erI9;wO8Pu zAQDQwEdLY$z1;s4ntFxblEE##gn$pifq{Joaijyn^ihGrPrw2zhY863q>B4>tnFL^ zs%9B_fv;R-x&OxOcxZa;$Lb|NfZM( z)i3@AvLUniRtMV5)dVf6`ThcdA#ib&)fYg zp59+Xy&v9)j3{t{%>)040#)p_st=M|71Sz!w@A6cf50%nPEsti|E&c`G)w@YZuEvx z8m9T@-He0ov6%uH&8dMXBS`-!JIM$EM2sm=V1$_LPxt>o5h12U7l5*b^A+ z|E}~8@jsC!F2=ASvMt`gjN>G4T>tg%2Lq$|i)*|!2uK9-_eTN}k0HH*|MDmO3vB!8 zjqB|=`#-WXj}buNe}21XH-`B}{Kq4(5Tw-w|39sUc76l?3ENWk9Ua&?^`8cqnkImN za0SM62m!y%{38J^lq?cHh>0br{_8jI_9kvy2kQTU|8*<`0~7o&C`jKufb%1A zZ({wo?~mwTpfjI0v6?bS{)qGj{?`fUe_M;$4+N$FB2Qzy0sl3_00R^Li|b+>2q^l0 z9RK&==3ne%3Q%K4=8fCG2RHxwAmeFoGTyim09XF=l7Q)L*lnQZAp?C-O#iY2l}xjM z)wL9Vz0rR+ssHzZtaCwNy1%}WKZ^9%&h=m1#Y^8r$%r5Xo=+gXIf4G!7X+$~<3LDO zy!{98CHy}z|98XSUtS?KZ(#AMfAs$UmXx69`MW9C>fV6=g!{n(cK!J0CB04UK@Cs> z>e&7!7-{@J0_h(VZ%w;TiF_#oQYZxw0sFr)fJ*HxATSY7Z H{_y^Poz%}0 delta 32243 zcmZ6yV{m0rw>6xOZFFqgM#r{o+ddtgIO*87ZFSr+JGPyi*m?Ut&sX);y+3xXS-a-i zRl91{m~)OX*6%Wij&cZOWjP2)OfWE5STHcKA7BZ{l>dSsVA4d;!3q4DIGHCIH?APp zZ(#o?t(*k%Kk1Xy|6QM$|FbqZ(sDulCrT=3+WF6y#+~@wk_hod!3~^}Oz=qo9AR+P zt5?5Fe%(gP`_JR7TkoOVNa0?CX^6u84M_Jp&UL#M^s;VIE59MtmY6ylh7~Bc{PgMy<|*k^XRIsn zW=AzN0x3$-T!&qR2OUgJH9^rKPB0dD(eyBDxPjkU{Haf1UfjMz*+2+;v`nJIzGC}n zA}HME)nN)9PmuE6^%xcR!eCVm2{g~WU#3`4n6O6@CQ<1U#{e8|UCJ>9jK;jT(kF-c zAxGVu5PX4`bwJbV(D1j%!;}t+A;f==`tnLg%n+_D{rR^8gS|LB@*9fY)>VGhFsa!5 zMs(uPA_TC;KOnd;g}9Y2tcesz%^vZUo|zk$0Ly6SP+KYMf{r$U^Js^-ip%(DcjT*e z6cfq$YDbXH92L()DZUu=s*7t% zA@oF`)O`*`PU|^(RNh(8FNdow=046hg z6F0XU9Ry>{We-86wN2buNn%audgB|@-`KBs_#upllIY-&iKx01jmGxz&Ez&Foa8gp z;I4YyabkNM3LDKXLW-u;in>om7eFjH#fwr#$AzU2Zil46d9II6n^y&4oB6w~z-CljrOp zqakLSXA1~u$M4=)eWp8FAfMIu%;Fc1)puafIw%vky?CPsoq4kkJ@8Bj(HFg)G||VL zB|Hm)f&fGaCr%Mh97RL-h6=OZls&VrzWX3a1n7(!eSemFPXX4QJljD4^g!G{{s8d4 z5d!RXu5X@No?*HjcZfk6gzTkIw(mk z_1YKwp~!3$B_3(W6y=c^mzbA|1RCn>)qwg^FHYE`gw3<1xkv=yu>D*h24RLW0%PH*Sw<%`pQulKN6v1hw7FOW41Xaav!OOnM zx-G}YuFusjVB&XLd=ASo?ROPpRkk2D*6hUZdN(bbMeNSZN4qQ=lbYbxH`^maeR_>^ zVrL*xlag7Ty~+w8MLqGtSnM{TIb9*o=#W|Gw^1lv)Y+h==QQz=;hk23eqW_f=&|8U zsVMBKwA`L@**;-)%yi8;J&+%1no!A~G~A?%ycai&`8`$B5kRnhO+<`8d7bIrg+i&; zx~9^E4p#xs+MJ!NEVE)Ge0uOyYcwqvj-sF0czj5ffsX)SgCX30B%qhDU^A?=UnXt* zYc=1x%x`vVA|s__Sz1OZS~-2MLQKuhZ7H{T?yadiO5B)(3rOvyH?G{Ck|u?GQBh6k zHP+11|K_T){xC7bhDzWkTPX`wxf#Pet12)JiV@BO*_f|q?z?IvUQ7-D{ZZzwBB!_T z*q(;DqHhUUB|Kc(2PI`%mr&@o&&X1jjrX(^6}o9wGHja5V~x7kbL{4`U$XJa>)QA| z)qb;*-F;hHf^V|NIsleR4!M$NeIDJT<~!Z&in$#m^z;9^iaGf(@d)|E z$;bLUUu^N@gsIWMMLHm%B3CBO^+g%2JrzH^Cs9r}AGlckUm0+MjCPtiGP{ znwkIzkZ>*!A*(g-@&?svu+6llw80!kcq+K37pl426s}{oMdy^Zi*4BK!F3N0!GM}+ zJtMo)1L0NX%0!nGlShz4YB|J`nPkwqESjV+yt4L)=FIlUy+?)+yc2-G&b;U*>`d!u zudv?a8;mxrq96*jFakS+OS(!;rlIQkB%N8gy)uh-!e2snpXSt(}K z5jXcG%HhP}u_Fwd=jYHzm@05q4_3n!Sjpn-Ocyb!htjD`OL=HV6j(`t@-DJ?n+#zY zv|FJ#3TSClHgk4S?2TT1_S22Ky(sC=xbM{>%CB?|Q82?|;Au(^aj}ST1aWa?a8-bl zgd}RIBDx>qX;u;Ce*KSysbUTbkC<+O?zC{?0o=OM9V%=RDD(g+jBb_g19QoFcL^yq zu7wbDIci*iIe8W1>ge>OJ$>dEX(8eodMSS+stncs@8cEJHDdOGh%*_cs=2PR6!Ip~ zHb)p^>k5=<*G@SxZ zrgVm>;tga!C@Gu|jzw#dxrn}=OXH6yxC*ad#reE`r5)QTMJKXu?;-Q#x_rO;&rX}A zNjC`LGF{?2ai^dcSDPkQL+LTzF7uftsCJnUts4bCU)Ix^+Pyb(zO(i~jvPQno>zq! z*?0#ORm{m;qzTk&ct)q|kF69GS6s<%$5f@bBaEE;9IL2iM4pt6PNsvq^bF#|J2f#! zo;Hr6j?-HGHI5ZME{6*FRu{icKR>>;PQf0nkG7&>J9r~==|)*aQ^SgSzV_yBo0ibl zq^vY(3;TXhjT~hy&2T^XIU|6oQdcxF^4Hrl!r861#?Q{5dQoiSvQFd zY-;om7)}$9t&-=yD*|L<8w%uy8qq6DZsE~n%wkqith9NUR-anoC1e1Hx2?I@w6yK% ziL&yI-RMbB@?W>$30!y#3STAoPy!li(0ViXGKJ{!+1U@bhn6Ery)-dtXvX!pWSNEw1ufy3?E6*)5pq{d}=n z{AZN29xXR+70b71iT>zUpV)t>`1(i_wPj)Rml>{?5wins+&4 zFBQpIshntp-?K7XEDYyXg!f86^qrF7n75mXjXWL|&FwSXEOv-)t21~tN~Zcqjcc-T z-@h8h*h8&t=~I~QjC*fVNY`F~bT{u)bkVAP-VI}Jm2xV&zES|6k1lQ;BFdI}#2YO0 zVYZHrJ@88=!YrJo4}KawRE7WznhzB99p0wkGWRsB_{fKC$Jj>&KAera&>=yr3%}Cf zF?vDaV$wHk{}($Mxe|6fB6}{{t{0 zfPAj8vBM$EiAH5EcOX&;)vzy`rTz3&>ZA}yz+Gu?W*W4ln9<41US9d)}7UWD(Xwg85{>Riz$ytHkaNf_Ix6`IgrKzmd zQpteg`&`os=C*;_1H)0Ri5oUI0CkF)3~wuOm~k1CKT3+%17?&;iiCnIRiM) zi3)!_kAZX&iHB@DIqME;oo49F8(qo;j-O}h$8&VQ2M?^-dFN315gKW1XP*Mnt--I3 z%EJMePxJ3@5z!w*%K`V--}p*!{N_dhZ>$mDV$exh2}U5}Se~JAt)(KX&BSL}2-$+E zT?mwt&M%DPcZ&xdy^u!8Jq^SNA>9IB?xHC1U#9}n$~ zhH@x{+UN6=0U6mV6sC~}Q%L^Re3juO1f<#S^E+Z9+4$nk!O9((jB-F4!+k zf_`x3+}$bYFA%MQ9@8C+q4ftZshWC1oBW$fWH+@l;XddlH0Dl?SxqMA55ayP>rwZp z`mMJ(;i~bQW^FIhxlg%cX);lvQ_OQTn#*xS$7n>`Xe5VC;oIrUL-8|Df+0ZRtmawe z5j@MHfO?$I=+KF?gKw3RygC_ptM5r^&Y6SD}Yo!l3Gz<$fm zlX$g)8;HSv>&!FlS-cPJXzA}X>6aY@$Zw#IUdZ8%HzF09W-zIhFhEe6Bfl=9yS7UF z1PggPMK`);plebqNO)pj0|DI5UfFO(wUX7P*RgR}*HE3sggrI~@0Lj@VpqlOt7PHQ2EP+s7yBDm&lwvQM_Bmq6v$E z^Wn66eGXEf7mkMRHxO*Xw&3Gh)?iXso3eH zRu2n@vAiDLQZXYh$B>_+!xA==htGyB2;Jj(?gaiHrX?_f1{lmoYjoKU6o`@g@>O~D?`ljyX~&p(=I;$Z4%j~S z(*k^4OA$lxgs$`D4s;+3M8a{(+w#JUI2$ z2Pu)5+Xhu9a0vxzPB}D|NY-6+Ml~sWv6}dfjH|Nf`Hps*iwZ9~E^qi$hPmCJ%THmI zl|()~hy!Xdv|JPhJ&+LadTD3X1agFZY^s$7JZ<*gSG0Gbg0}Xs&MQ+q7`(Xn0cg*y z{QL~FDNh@^#vT31hl?d5QpQ@vS|}rS;Dsdh6=%GP{Yb@tzpjfWu0x)eI}sve1~lfS zkb6FL^21k!m*Z*=<1zQtHMmlA0K+lYQig5Kw<8mQ^d=ihz5Dmoi)yD7!i=6Hy}yqf>A)Uab9**kE4vL9)la&D>TvSrwO#+Y|>Dvel# z7)|J5QInN(lUH9MQuzii(J}Uhx%IZjlzAxjC$oC z86bI+Abp4oo6CkL!EjouJ1}KUzX99Qd<$fIYrmNqH0b^yc#mc%EK#-QidH`H%RBU1WUTf zwt^z_kPkSinT;7E&1Od`p=cQ?`?pLGHIW2mPhH~w=20GRjvnRbgqd8i$j zhx^PMNIJ`l+XB7NWnZZsIA&#!E^eckI%Sti$g(y2b}PqP#BB#{2uo#U`aqI91~8(()an}v}UDrg?*EJu7Y0}Uo>p*B3% zT2g^?3crikIcF+hZey?};p`1izF(duPcnN%f0mqZo#60uV;a|j0}8%-&KSfuFJ0s@ zQf6e6+oku3PbD;t<0J?b%w9_4aE)(GBW1zV)Hm@~MYnDMKy89}1cNsvZkJah|kNOX&uGjZOlnnej6b2`D)DUbZWIAO}lI%kxqa} zycUve)behE_)#I&g~jcSN5ifCgw=&GD~EX>-8MpyFNUcu1{VZa$vORrj3NRdLLJ51 zRpU(c0cb{mLd?yfap`;n)ENdcp`N~=A+p2;uY8x)EfJ}@>4KnXeilWfTP_@>Vf>TM zFfrS$dt|=98vzI((I**>XOE7h=p}w>?!;Zpu5bx*Y{`re#3Y^zeASWqQkDD6-!-fP z*7Vw3ywUW^VEo>$c0l@MDb_oY`fMroBv|l5&wg|OADnenIAo4F&pW2pzPB9=3)A|) z56G|TOn57+UD4+s^u`43;hW&Rg2NE(9Mb9q3gG@HBqd+8%N@P)#~;~qWY!y2pI?zm z65MVpj9gW?7HAk5&V5Exlg*XOcGXzYVS>d$WCL#16B3$3rgIa?<&D0aOBWiN#|lfw z4g@0r2Y=i?DP+KJmaRcpyhYt18bPALGM+drA=@WVAoqA?&P<&!L@|6qD; zGgdl`pCC{I9v_QMN>VHgl~pMzt9>yXYd@=h#?%J+tx(@E?F~Qq5R@6?Y)T%z{(?2q zBwz-;lQ}Wntafjh_Tra0>q^Xs)1q2^!Tj$!3t8d2sSgeYrUD7pG-8krj{ZLiz(y$+rJGfQt=$7xd!J9*t(x#z|9hwN2zI%&@ z5yy{zn88n1dJ_<9g3$cchevN*09bjyG2n$NcGT!vcVw{gMy%eStBYTpk7`i ze4dj9-V@F5lZlN|V|w>SwXpmZ)?C~4d#^?bZ=di3{ndusZXBStLHk{a|BiicJn^5y zaJs-y;;Lu3z{(vfI%tqv&>G>#Wlln^*c)``E6U}?`6=IGn^k>RofZiyfVYx(dC*0W z7mui3wc)@zOGF|(Ltf8!9&dghSBykmd~20+WsC6iY!X!Asq%PreuX#rBW)@e8!g2# zmeOpAE9m6`NesLf*)4RwlB}V4E=z`hOEu(mx1BVFqsZ4^T50%T3+lDHL0i|@U`Rd| zD5dr)y#bpieY(FdN!L9H*t+ua6!c|~De{N=glDJ~*0yhCG*F67G-?@b_<82KRZ<2? zM;MciyG0a@FHl3Elp)Y;Dyb_9nVf8+o5Q-78h2jN+#mn<#aD8_!8trb`eY2v=7I=6 zJZ8Mm@|FizCRh#u4qCBmTU?6iCgbnYfXQ9K`Cg2p0}Rm7iP6-zUOqxn9_?7jX(+_T^Jmo42IG;#^x8V!aRj zU6}2-IR=V3{3%mOI6bsS{vo*-5v#|`krmKOg@4YRO(k(;#7SLvcNofNoVB|+u~!)E zkO0o9AAQadv!{vFwquDT<-*=I7X~jg$b7?LpmCxo2?QVz0OpSnS+hpdG4TQ;jcA`+ zfZIE5L%dYVt_&FLCrt`pQgF7X50zVicwOnvZSbXYN?qr~G^rWz0qaK%Kliq9n6j`s|!vl%2Cdo&jfN zsen4E6bp~_Bn}dT6f^ex^qxl$pU<>Zw6>FUi=cpS6*$&x8ZyHh^uXh^i#)To%qhg2xYWFcUx*egI$ai|3 z*H+tRNsDeJRicO;OHiFH;lZS_&06c=A>E5R?S;2pq}&^mV3gd!@?Tjx<0!B zF+EISrz6)sd{v|C;FyE0!KK9a<0wjK(>?n>M;^>8u1t>vQ}70}C;g2#xtn9^krSY@ zOkVF@+s2N-<&-eFQK$iB1QP_79uH3njy;5ufC?XS@Q;4L(B zryJs#kd?Kb>a`D3Ny<#~mYV-*`s>Ynb=()qscF;K5xCvfI~j*fLF**%CjOX(qSj2yXZ*1d^C`SnLY)?{E@e zecs>==f;#6?$e-;U&ec|1A6oVrk3K$eo{J)P3F)$5mWCLZ8D-#e)C_Pdy9e#lvi1zFo1Vp zzP<4ZjxtOm&5UT)H!W%B63FX3Q7l@V=2S>IipzogI@V|ryHkovy_9@_sP!qPZA2qY z^svq%v`=I4U*daiB{CXrIlYM`rM*H;&T=kAlU3(>d-#bCXia(3Lr76IZBBxFCF2K3 zrrZHMSKX}PPTVdp(%&A8o857#OLGQDNFYqP#4$M(JTiefs zEQlf?5aNq{tR$HLdGEWbGEG&^;PLnO=$deH%A ze4oet0p=MHAL0SSIvsLT?>sp3R)ih7qS#b~x^hk;&Au&G_o5y!pr8)^xU8~HqtP2` z5R}&GqoL@jFx|%vwfZ+F&ET-rNCdm>K)boiyQOtNr~25)EuRu~dM^>qp2mDRX|$GW zG_KA)ZS%uDXVFiKlgqM!HhM}&KXcfk>sn0099|EYMdduKGj5I4Y|-#w$dK^+cS^5R zgM)YA{%?xf%-`&Q>CW+HrJXbO)@rExsl!?-dK!rDB=!-rKNgLN)vSb*PVh9Zzv&I4 z3U>YkwC(C_{AKZ;8FBk#!<%W4ZqyrZP?KlLBKOQMUIRg><9_An502GpX%NS^o-xEv zrm$#ZrIybhZ6J7F#_A~-^Uxy@#gS)|(t-*1I(^kTs+}c&sy9mGs4arz=9jvWIGsuSk&}=aj#o^5vBW81+B5u?BgudU&xrl(fVq&kn_O zgc$zXtR$Qnyn{26IYCID4o*M3|BY~IUE)$^_e8`Wc{(>DqJ!;s^&>W^b>m{H(8w2n z4#Cd5b5J260Ef$9K{|Ob0N?eK!VAHxW23EogT9PKx)dv!B`6>a*F%jcO*SpscuuAo z=L_Y3_q$2l@JIi3wdj(e!XW)mx0{2|Awq!x2KJZ)5T*xU9kvKlKOId^P1Qq*wpWv* zj}dut(BLJKG?0>*u#)UicqPVcP)_H_p`U9KYwBJWdbDAAm6vF!qjS);dMvN$*0e4y zS=j|#Rt3~Ko%+=|(Ov^A9UUDLfBZg3bF%C`tp0NAy$kSpa8eSK6GwO{LVa)%!IQ|$ z=kS>iy`2Rd$Q6wrx1*-qdWTUzM{EZ&iIe8im?ag{!h+0m$rMZ?%3M_<9QSSJL$Pv+ z3TXwzj%L)oHGf%!dn4Py=b;y#3UCjV-3px2rXF#G9fw;Z$D_Ewr2)%RCk~qQGvRIM z?mD8XunbWT!r++`aihgJ^3tTg=1G{7j$P57+;IW?Z^J4Ktw&>UC+d@eerX7s_vZ-~mj36n+@e6Hbxxg)hrA2@M_JL5Jyy zHUmdte2N6PWz=x@rn)6|5ilK7Wc0+E~1VPrK@hnr1 znJe0PL^w>Fotqj6Xl4#71p>=<{jV3i+8moF4)LXlM@(idxSY1@>#^ppHAKsVtCfHr z8V&-tZ-1bsIrd9?5>E>gmFCVDIC*}o zG(9605ZDFq_BUzq-H`-=DnMLthl)7lAm8a$jfmD(A#bBLk5T~^4@%=qF3C!bX}a0; zRhyL-&>zb|HvZQ}hZfQVFd%l!yi>KWS-x8G<+?BVs$<4x?Zi9ULNFi3Cf4_OP40}i zTs0}t-a0?n$F=eftGI(!)g{1{tA&!3kwMyAFFS3ojxL+#+P-bbZ*|jJ9AmMbO~q4{ z(FLC|@o`&j0)b=vo=wRv2l4C#Hz&BZ3%_u%TS+AcjN!;|K!KVy{f6daoBmo;eF&r}C;C6h)Kf1#N{PA^*o zJ4rx8PDhRKXzNxuei!zW{i6VBht4{SdmOk(Y04@XN2At2W>Pcd{a4CP5oxAv~`60j7FNA6=h^83gXRe zNWP5FCwJ5fz%}CW9GSO0D2B#Opn#Gxcl`-Djhf)0^O1NQnoOG&pn}~1^ro{kM{k)y zn;>R2Z&PN%m-Ux0>nJ1TD-fL9OiKw#uap&VOKMYRS~6zL3!wrSsWafr6Gl(#)f<0P zOFB;FZ0^f(ryD;tAej=i!A5G*rK#@r8YR`teKRO6$0ci)hRyN04Q-6hCDo0NS2}O+ zu!vYfFVOH|Yi>nmHl&N55e^!r&eC%8#X)h?q0-mPZtiL-vWQr`OgoeEIjD#wlX>%_wBk68cngpPoTn_G+(fLH4fLGJyQVJJNyZ{-FDDn*QzgB?~Eze zM?G}ggHN($~WryB6sIXs8-SXZvDeln*f&K2aQrQgg&S=>au2Um0 z;wiHKu?q0+ur<;AkuF;7L)}kSFf5b>NhdtHtzyHxS#*Ui*7Z>i*(t(j{u!mgF*JQYdrob|G{a<5(OmmcfX)w}}- zkZZeXBe%{&500VvjYGRr$-6_kN}jxiP7t|;lNO-M$qu)#T}V!VkwBU0_@mjK3qq2> z^YlG_vyPpP?>`q_3d{*%3d&s)oiL?S$PMm? z{4W53E&Ki{EatO7?BGeq%)nj@_YWzj)6Yq7r`H+%r76La`6>&>YrHtlYQ71lLUav z7!UHOHk(yiUO(ygo1k_my;ikE-vxHw#4{aw0N@HTV z9vf+g?2F^7MX4NI<8GgDhOqgzLuhUkACZ(LMNW{Vv6;ypBe|-3K9x&xWw;A*Ngdx_ z*TYz zlh$P66K4~=h+>JGwB&K5vEqb`u@1_~HViu;vmCq}o*)SOw@b;wmFu2}cO)R^(4Dua z*zw|h@y z%iL|cFpvK?edzTTy4IQBX9D8F4dVAFWCDC#naO{8)(Xmw>bDsH5F+rhm}<{Tk(AQc&6T*nROM2h-8g0WSo=-8pb*h_yBjszj%)%Wo|8w z1|%CtU)?Ll-PhnU%!g5@H^34X8M)Q7blJXk|KMrw9{em7M?t5Ck2N7$brbNRDJO~9 z@*o_AEt5QUWH{~IzKf#KPjm?WCr5|nLcmrq33hOq;3BDz11AxGAB@Ht@_+F94o(hL zgR^%o>j$kUKGAUrTmVK`xjFx?a(#C}@L=ec2NhCcIdhOoPF?=6)X6Q`_q$2)0QJlF${osXU&DRf63ALjogAs z;T1k0<&O_W#)=O{g=;oDy?@d!*v;)-JHBVlV9-2zJ+S6@Wpjm zaHhVGd@Wo)K%a+2T1|IiAjsKK!sieS>v3W6xcp>J#WhuQlufzzXLSlkNF~V&xYRT! zQ(H_n{i$Rp96I1|9`_!p6IWfdIn*&IAV6DBvTdGl)*kx4JLzhmx`QLBH?j>Z0HNwb z+lPB;r~B+|F!lt&CY-k0^H*tGD#~n(#CKwPMv>HcqS^^L%MR9@ZZ?2Sa6bSPhk2>|_>3%u#sH5&&aq09OlhgZ!e?+(AHkxgaiTVF!+cNJ-kIWO%RBlTgU@syxJW= zqN33s*KqfhaahI2sJ@LJXJtXniZj2#2U-elB`WEwzUQCe0ZQ@%`*WJV|I}_TF;3Wv zFx;9ylN#MiUD_B=T@qPgu3S72l9Yo~lKTj^S#_SA_Q-aH`fe!k5-~~}@rR`llKd3HYVd}F9Fw9DIIRvA!R5q1p`||lleHr}>VxmTN1<0yRuEIQnB^^7 z{TF%O)%e97?uz{?f7pAGLrbV@@>(xdFT%P#zIl9LLxMBNIX_QxG1MK-a=}is5oofgW{suk&;~TYfnKG}SoK$@vp7UpR zNGI;i=@TfGe!v2=TH%cq)^@KaJLYL4SM1~^$ZU;x@7l+=U!m+>sQsYe%Z%iV;UFp` zM14`$u-^6OwBf{5h`XZQ4sNBx16FnLIsDlU&vRX`#ZSDA_g1_Yq+0$bMZSL~f81gK zCyS<8zt6`#uL}p!$Ks-r-P7FJ4_imVVvia&zz0~4un0bdTC;Kg2%f}bTSW`iGZ|J` zO7IlZ;$VMj;94V;j|BPv)YO}G<%B1_;oaskLe{sgdHbVvDfYDf;OHAy)J`0-!YA_h zKX)z%XgKybDrjqd#vgtr4Q~yn0zYv9D08Ob0Z2!6qLXc;1AeH-TI9WTQu5alLjn;r zD=2&@gIn=?A1>OjsHSG9&H~^hy(l{$$o1&ko)FoB5hFOKl-eJ*_QK2y^gHe0mUC4< zO;I-(d}9s6)9kFNKO(k%rV)>95HBdrdj0Y7TL^j_#hn4j3wsC%XKW2z8^i$tPV?)? z&29&5^gS+)!)d<*ef#4E-9cu>PilH%!-mJ3` z-qp2v8?R5M2Hex!p>x`tZ~pwSZYIP}Kcw(j_W}MwDPihF=A82=YW?HI`bwk_x@BT5 zguU6Z|(m=x`e0+Xes(2S7E^YWg0(b7;AG zK1Xd#n|mPTF{f`BSy||j@x_E^q;k55Dfkxm30Hq2Ay6in=Jpl*xLxpQq`df!1K-sr zdh#_b0xr%@hAr0r5f?G63?jEm%i6!#6ap)a_*@;U#zmusKAp)2Tt%(?NCG^M5f#HIls{<&Jc`W7g5*oSsM{f zM#PF(%wf=^_5D5Jge#=pHd!4wS6y0#|6u!rlb9w9-X&P4s9e1jOKsmhns((abJ+Qx zz2s1QRb3W~Q>EHE(!IY?p~TuLLsEg$L7_!6)>dOqZsVe|fEZnkGYJu}Z}A|0V%=nE z2b^X>i?l>Z7Nb;AxpyVA%E~mPnv;n?G5D+59HncTeg&GO%ha9NQ=XfBYIfbE__O=R zrk-%N6?1`1UjPk)^J$Xh$<`;4OSg79(UFYYreQ_?+aMtd-m-ax82zfelrt7=7+U2JBBZYl!p3VoK4LoVB<37r^}ihT$SIaf%7ulT;i zD9PV7jU$|6j?U;!oa1s&SD#w1=+bVMo@}fury3RYELaJF(zB!H#@ZD}4}kZj|Kll_ zuVVev8}xy#BR2A4VNQ&%4r0mIS)*Z33LlOk_rI#{i2c_OuTBL}-KS`H&}!ZtDFbX+ z@cd^}#>H()M+3#icqQO~YGSBKVtGG{e-=id0}7*7l2k@|VHHNcv6C$iFbem4sP}UmGsx?EKo-@+cIL zeI45O6K_#t+*`dho4hAt-QB)Jw=AU>cPy36vI>P5GEJ$EZv)rrH=i!VeBI8N=00le z+B(ZmDO(ykMp4gFq7d_5JXHH|LAFo43czZKQnG~zZK962~il!ipWz)ofsxT$@xpI%1Al@nk@IfYYcDDrO60cdK>TiKY%yUnfUF$kaggx|Ls2r)O@+{ZSWsBaU&-M6=5Yg*CHfM*`NTtF#aJC z6;cKV?i#xFf-4SuF`UDqu88grnl@WzX*+s}P#d<=kOld4`SysYr*r0=VeZ3W7-zWZ zab2c7{~N1kvBhio(j*zG1SVo%%e;xtN3X}vN1M<0x8-fH?w{ADD?w1WPQ$1JqWrD< zru^70GTKhjyRHP+JF)~?1yKMK8A+x%0S?^jahjo7l?PqyRHkY>m2RBneF#Vz&fSHdsY z0lA3NVSNjk7TzQh#zdojHu@5%O~X`{jXyKZ@T4mu}I?%zRba;$@^u{dcMDr&QAr9o&r#MZGsB?Z`AjGis|DY?iWDFhZxY zZ6~WznU1bZhurHh=HCE4(fo*n%InS2r1s3`lb^X(7_~DwqjI830nVjcl(QE^jC5%_ zPdW+V+CQ4CmO`6oIZ=O2_l~q+o9s{6zJylc!jV_}G=^SEN+bU!Oj_yD@mRLxArAr_ zr0{!xsRi~s>U25vn3Jb!)_(8SF*1HKm*Bq5RQ@g5qCOw>LR$mS*F>n+<@$SjW6Bai zBUK#r+tE-5;*?~U4;UU?em?LUO{YU`-zNQLc|GQ>u3Dc<}4ROj#d`>2R$sk+t z`Bkgnd{y@?4)UR~7Fw|wub6t?h2}xHocM7B z8}C%1x7~mbjxV-pUz}xR(_eR_(}7a>1Mj`5f#9?sm<7>FvyZU5_cJRuunB8X**X&H z1B?9{&2sJG4jiWFANvcZMyN#kVFSc0PhT(Rq;qS(4%=Z=;`k%;#HoGfLL3fy5Q+}m zflH7|0y7vkx!)zS`+$!N?87-Ytnz{8VQDPjJWBvY0wzdT15bhR+NE|+X7`Nd z&`=5ChV4X}-$G$AC=??g^O_88%@njCL1%#ZV<7qx@4s0#_LbK+nR@`?$fW8%~Z#;Fy*3sK&-bj$vr&g zEsN{oa`6AUx(cW`lBbUag1fuBySqEV-QC?cXmDHHo#5`0;O_3hA-F>z$+wr>_rJ^a zd;4~F=GRrdJvH6aRb5r?PpD`?Y7drmVFdzd$h zcj26}K7HRg_*O>lb+mPspbdlG2 zk@36YI7eq#3|Jju2~S58*%`ds85ublg2Dj6cW9Cz3)t#}ESpGq>kx)S`;iYO8|bWL zyF$w`vM8)fyFn4KutExQ30E=$W~j7)aH-Q~O}If^-}!Kz1o+YhL-hlHRbW|cHKU}F zvRy|!nv46&g`qp58W)PWs>5W z61Ae}qsp%XbdC=$*xXAEbt-s^GAQX=8#Tktucl8sY?ZK6)MP0uRkeu4sdrQW**&jD z8IS=m>_Y_;;RuP$l5+EBIB>Sdoqmdo zh#(}H-E*Rgujo1oR&y2M=I&`05F{T6HN&)9PRyQ;$$B&_kjr}4W)Whtv6zVct<>@C zD|NESqYa&K%?_WJeWLC1eQ?;jFCk^LrXEYl@7Naf`hE zd+mbcbZ`{WxAE3lzxQt-{PR(df<7PNPo65RP0ntKFA&H12cyJEJnlS;_<&#FI>hfZHfeaaX8?8RYeDm>!? z=E5nKS<135eY*u-tl{VdwrxuxM+P`kS#9vzmxF;ZkG8hLb+2a-vtRY3KGS#KSAuJu zm3MT$Kyrb2Ln!^$YX{aj`A0*v4qR*=#(Dbcb~^sE3D-MtCZeEd91>j~OE(jK+bKzu z=0?0mR%n;7V+@P@6hr+@igww%R4p-LRjABk35cRE%GFRw#gC`~Z-2;7Zi;Ti_KcRHproAqJm+ZH%^ zF#xYTI(7=J4Z2>pxw;m;?UpVp|8>%Foo~q zD^OBfcdw-S$rc6hc+uEp`tYM`%BpTXegv-TKDHlm$0CRWOSE1Yxe1wU4?8Yb3tKpv z2NS*+DpD-&dEduHmgEmMt{ZSq4+kZNy1BNi|YM$OH9@ZkH z@-Jc$Gvmn)dO)*O5$&b#jSl8xCU^5b)3L=6TET|2TwM5Ko)$3bnYB$?X<}taLhC$t zBuX-KV8SCr*WV#t>$Y7=e3-{S;i5F#Pl#qWrh8U92@M0XejD7G>(Z5kU^3$5G=8Xiv7EFO@nNCowz+l)LACksld zA!DpsnV*oKquRj5;^q*F%*HayoB=EH^R~Xr%#0l!n`F(bV7Z#(J9d!AzY`&mWhgr0 z2p2nsh@F#{^|!BAOGvwt3@vEFfdlAFLB*hEBjd)~ypfc?;7`g5|A7meVKQAt{#g!; zfx|%Wv;N!Uxi?7|NzA*h5r#;h(Qff6DmhSQaUWq_G;=jky%|f#F6p-6YBs?u&)@tt z*^%J=Iq|47d6G%RpzMxZor4-)zjwmyqVWM#4o3bwZ#fH#h@q8@Kw7e}2qbNqHN#AV zf98)MXv_TX{|T4!u9WNKDYzLgu8qsJ^JyYNuPFHvi7fvbzRv-Dh*g zu~JjK(KXa?330P$!Z~0K{|8kctCQCkSN1G~xy<%z)@+pUSj+Az9j^t~ScZZw9aX!m zijrubaT?eTgdL6Z0vnrU_evA&tbm^-)q5}sWLI{ndM zKG|x7xf}dAUe7?vm2ic*fKY^gDJ>6#Y$c3$m(j2uMJrFEX{k(j z-4)lSM6yAuEh5V;v3zuBfkE7vSs4C6T6gde@T3_O)exa=(st}qd=H7lvF0cGRPxPv z=lrXvaOg$?y|RY z>9+dJ7DM?>wY-Sk_Gyu@s)|*FBR-psj2mC4GMji&DVFrJ54~70C%7wR7s%b}J}@O^ zfJUjuN}DT1D)nAk&QrS4q?6v;tsS}MN{_Z-L)6Q>R+@gIPtccu&p#<0cWDe!3t%+T zw@estFb;C00-q$B%RVi`aCC~g3E#^x{DAkb_cn$3k!O9;|6zd$+s+;w(jFDulZZIc zA$jR-yvq%umBeDIJp%Eb{`l!OP9NC)8i1)-O`zA4r4IE4w+9g}m#=AG^O~#^nT4DfxAD7aq!s<>rM+jIy4bm#SN;=dnxik%MP; z5@nHLNCyes9v9XVme(_EE4mWtyJVVnR!=ys0=ffhWfh{u-y6x_0RB`Gd}@KM5ClzN zOCUvo6v)lh$rbqEi34OAX8@GETX&onK@mLF-+=xQ-h`;4t}B<{uF4%CN}~!TAr^%J zu2#|GloY!D2 zE!WdvnvF3Y*}(+K-UiKcBB!9@TasVTRg^ppKEgMWE>--Ok_%elqtZ#j@tB0zXPI_! z-U}TPgR+{t32@8!cp1Q|N}Lozm0RR@$)D;7!9)JV8?)E%!AS$lJAB0v_51=xR9>+; z`fZhUk&vn6oNkp76(MZ0K7}u2FRzeQC`{*gLtZOXXlbX@d*vq~m^%-C23LUmz=G?V zR*q0*CJqyObN#btVta*L6ahaPgY}Ft53Ap|3vbwQ*i~Qo<2M9A7W|R~$-2&% z+|q)1X-S>C49bFX-r33gEZI~pu<|i}Yp2oKgcA1Z;4}7`Bqs^5DpKTTdX7FGABkg% zRsUwsAPKt{M78yI2h?TkrCnlm%rcF&BXv$JEAa`oVwgfA`w*a+aKj0CAW4O7IA*w)*&XnT-COnj5y;qpB8 zf#@Xtf%G8ehrQgF%ZcZbQDMJ>rL(UY2=S++IqCC$+6L*=>rjDLNs@q*zjRJNySdIo z-9MwzXsg7`&2eqQ2fx*nmn?4rXAH({CB>cZbuXP#SPQ17yWo#VUVI~|FX|xwW;vvd z;3sHR{UrVIaY|v1GN{S_ZanMpqI3Oa({DRq^zx_wE#Z5q7-*F@7SM?65O2xpNU`1{ z)4e0wC!G@KM#e*4&-e)-g@qONr8ov>2uFP%W0)&=_CW^%Cbp+beCb_&wMyAGY@f-ch)D4|}+!XH0#K-fHsdB{>%`_-3Ycz5eXs6o3F0|rXb_qEG=;}jti50EytEH6V z3y0S@4K_cfr`o2*rWsMH9P6UA9g-E+Ah=*l4oB!n5TMt)1XHLPgEU=oE8=rC@Hq-7 zAIHy6c>+C~m1QZOlLyb&Q-n%{Z0sVxc}_OiI7yXZEo1WAB<(iHu2*h)h|TWZZ?$LX z!SRi5xx1WLo+-jHHCmpePj54wUGF3-n{T=hmU@R9c!Hp_W$(xwWQe_&fvTPmI zS|}sX?70i&OdCyYyB;Dy)??!>-_7G?gIX#HHw#CYhG?`FaB(Nry-^~K);CM)mf@AQ z9p$@PbKin9zCu~DK1A6_FMww$z;mc8tq)bT+19?RVx7JP&{tk~B8ew;!=|XxI;&}t zDAS{-^D{B8+b^oyhp<vK?dea1JozWFA=#lX7(LnVyY+}qI-BQ+yP!-tsXOlBJv-n$ zO-V9*l zdkpiX=r(0=pkCEy;{fBkuaL3r%1lqDY-|HBiL(RHU_~?jUqFk?ibT@=Q7TW zbqBy$%R((A7B>0jq7gyD&6oM6eVNzD)@v$_FZZ^@QKmNO)F$_X#^B(F7~!bE#m6Q$ z^y&xFJQ@+jHs7~CCal4)SGZ3dQYtK=ea@38#m?s_uRChnD3+n}k$5}@*7gN1s1&|W z1R^45(vdt7Z+1~?&_1X##pUY~4C3wTghK$9;x((@WaGZ%98Ij;`dbb4ykz708HsFd z2J6iW$sqwK1Y!yywY{NTwVX>Y^(MZKAp;Q0Z#kIoMXw(h`_psQkSrbNyXt%~+-~Z^ zFeU{vga#p`M7oe=3CJ&n2hdyyCU>FM28O3#58IdKsUwUD*G9O5*6X%zUEqC`<3#|; zK+K;ka?q+{4^phk#whI5#(~%&e$S(krB>J1gV+NeXr$LAW=fuzK8H}B3{fu`u-qa;6jMUV zKT#mMB9zbZSEYl{vWWjolY>skS=0u|oJ^hB#|t8^<54rl)Xq(~zd&DU_Z zU9VTNAI?{{RCf<*V-ETGhi2GVrsR&)IaaX!{Mk@~qLCMKZ~2jzExV$W?1O0lhtF8d zVpJzdJkUE|GuPCNYV=1(p;1?9&kUHyeM_$hZOQKrrFt>y4HP#8iY-s&n4fqt_|3wO@)kmA;BN zs2jc{8VcD=)vt<#v=bGLg-M6I>G6A5A%|z)spPxb#yEjHbip*m2-OT^kvA9C%sO@f7U2OxI0Dvuh)jC|nrpl4Oc83+?K z^71@rd0tVAX7ik|)V%Nij57DN#ad(-7t$gIU%QVGGR=AQGaD6Pmt@Hl;5WeHmWjna zk=GN10PJ4xWeEu0fr?eqzSu!J`SIDy{#{tcc&@LB`zOp!#CP5Z8HQ6MGcXLW&2r?n zcoa4fA7N)lS!|SLqG#AstY9Mc;e}B*sX4_CNp5L;E{xxU92hC4=2o?h5E(=bwJ zJ&5*5-FZW8pT*Dt^-her(9H{e4g}SMv(Dhy0Z0zABR*2sw2%mg0Ft!<5tCBb^B2?& zYT`6l1iiLilroB(;7X5=VS$e0tgFFPdc2m-j1nmUf)c86wLe>x zwJy%!(atL4*&+JD(x4Sh=t2c3#;s@SAnU%9k8-Th**mT9d3?H->j<*>R9JPHQIr`Z zJ7CR2iNku2PH%$o6IuPQDXm!pP}sv#%Shv8S8uwmz|h`EPzt?|7n@L2lu02; zi%N^JI-KAI^1GcA3x5iLsf*}@rC===l~xi`w7GLr?B}?_gJV&juvTF$Gc^>4fTzRK zNXAL>XkFY@0umMS*V=t3G!xIV5XBb+tqalR8c2ETVSYp25x zi;Rlz>H%Ll+ze~8a?|v5^P~AaVk&9U?w$ed4a0(2=R(auH;aCkF{o}*4__}S7CJ2g znX-eqcNB1857wbne&Jngq=n}5LlZ*jy*(tR6MzfyZ>%5REUM*N6x7QWYa^LqjH|@i zj^x7dDXWo-Wn;4tvD79ptFoFMvL`{zv_{EmEBQw+7*e#;*nP^i@s}(o3k?&p7&A`3%ufL_p|w;D7AbN^5OmDEK9 zxLBH1<-(~Q^A~j)gNtDkL5X@hWu3}k%qG4&%$DgRyPVWQ{sRH<*60;N3a#JjXRPWc zylDgcYgRfkiIU^Is~W|^gS zXZZM_kh$dRAHiYs9hb+fYHi2o10nC54#8IBihFb7o2y8Li=bbvRaU&^J)7ua0*7~4l!aL=8=jq)40+OF^_00cPF z;g-0b29@8KT2FnA$w$)fb_d##LS~ zPkx>niyq-fbu`C8^ZGJ;^zfKR4xaHKn5c9xQ{fEwKGq1ufKYUP%^2+pcf8B-L;b#SY15iq5|KxOXQvPYrNDyo%H3qA z)3E8_iCq-Gi~fX-79@dA{262}vg#n2p$ZfBy69#<+H$*?c>VFRhy5Nd_i+y{3J>?4 zI5Z{dRI%z33%vYbHZ&%s30>brnTv9^fy%YWpm;bGG9JQe3gM4PJ*G!Iz>+TpkD*y& z!L*ZP++||pzPD1-1dGA3z;XtyBMU`k;HD*xzKejLM{BzU%;i(6U9?hQY$v{evjhP( zaJB`V?bxotq!S^mR&W}rf(cnX%d;9&*jhXG{j$M&MSGmaeU{?IqGWWdz}s^Y0G=`g z8zR5&Nho6)K<7a5E4w}oz!N<)?zN?M7Znm`OJByyNeGh{{@^y71=HjZ_XfL{72!&E z5~<(c!X)m?VjtzA7iLBEOQ+~$;6X$|yr+6PCJLdJ$?=G(O!_b%v z4!_a2!J56LbCKb945w|8u+W-IE|BPSxva^|k~zIkMgRx9;TlN5l#g7}ck($QE3w4t>XK$Zppy+f~DyV^98>#3;^rb+_&|QfXl(@lP5Bk#jtw<59Hp znMv)WzHa>(4rG)UAy!e&Zh&-Jj9uqYKwMlwxn+6D|1F}aB1NLiqi0tprfo!)3-YRDYV$Z+hC z6c;85ZxOy9exu$rYK#%piD0?7orXZ}aWHyRT_lLxh2h8KBXt@m-quN`vUb5Yc`Oo! zuzJ2H^Sq^mK~t-9A0H=4LMCi1vnZept)UfKK(PVv-9*k*Vn=zYamTB1ed|Zj6<}}{ z_Erpczjj*Pqz z|Fc8#GfJutA63&F?HXlqvtAn^aHEfKjwexX2#f;BM2tFGyoFW%%3RUls6=cf_g+a zf=o&_iz0FYY*Q1JQo;W};i@8a6kmWD4e}&!TFc#3H&l%67oIIyGG#beN!QUPh#owH z!aZnP4_nxQP>mFTWhpFvF4vXOBHKOKT-}d))+nyb0Vl(?Z!>)NLXAE93Z%8qzs>P? z;XDf7i{3##BzNwJKv9c5ujTSgK25~G4KphsQ@%GvZESoplvDPAK$RpSZs{n%YbU1+ z4?04E*gg;4t4|O&Af2pKDrtqC()K^`voC)-Haq)}RA+bz$c`~*&TKiw^=;NA1O54#?n)v3v_3H``|b^S%b=*t)xRAV1N3+Y?E z@iFQZnq&Pz!+tDD=L_Tzw!b}eFHN1H0;F~g1Qoj|EjV4Hg6LYdh4rx|?=9is zGCqqP?1U6vQXj<{VO0>0GvOoJmzR~$9s=Z=6;AXl`R%NUmeO=pxD)G<55NIzhFDoW z_R%Sfyfe%^2BLzbVnL;DmH(${wNzaDMT+F$NEsLb+pJMzTtNBnecfI9PCA*O4dAsjfA6Y9{a@w@A7k~!_MZV62TG1iq)-qsa1t^U zeqfYhD+nl@au7IB{bXAd+@qga(5G?|Sj2ZO>o%Ap%DFiLa>%`L>o5qlN9BqT~Gi6Fz*}?H70@ z7E+5h%S_nSO?UsEnEqPqX}7+a9U$97O9p4OI9nB-k~GzOG; zCRG@p+%=PO>PhCrjB2V1{EZ!O#i!1lgJ3dru> zMB9t_l)$btjzZJ8W}Zp~QqCK$E`Bs?%`UgJdb4kTkV9oKmFVWNN-_ylR;B0l{fH@%~+`x^tN$kSKol)P0X{VSDD-U!KxZc=1GayMn zY}lZpu|*o(6Ifeyi11j~Ybq(AHyO-cY@=F#!+w^+E?)0l*j$_Ad(KXtgHgBiHEO7e z^)&NLhCkor6K-R})F$o7xb6xl4q-QCdXLL|YH2KErygD=zL%3NV5Ontx(iFxxu573 zt+9m}6>fQ`%JEd>9P|WLlhH%HD~fBddwIuJYN^7V)m=R5faoDTAz>7Q#btR}<8Ih* zS=_mVT4yTGv1G7L$j;xd=^)Lcp4H?aPGibDR->($F+btV)A5Pd{qt9a4*C37&P~JV zC~U9Nw2x;It4^ol0GCEV``O4JDFre#^}1hZ>8+BxPYZKW=klnV@6PR7P4zGe@}0$- z`VpKs%}DQa_3x;B#gYYnnk{%_D_R6}+fwm#+YfvDjStJ!t@5$&tB4s6AJb2|po(kT z3e1?4s2z#*HZ&kqPz}k`3bpSc== zNJ|iLi@*YMX9}#F(ZTW-pe>0>U93FR327ClHBOp`-^FoGQ0h7kopPBqkl9gj39cV! ztd7oYXUXBTTDKK{lDj|zmgcB)9K|ld)stn&UWboZA0#KoqVJ~;cQ9I$!`It2jGj>q z*$tT@lyTcj0(cZoarC|r8)?X*$WX&CG80gf<;IFvYX&2fS=Lr%6U-fVH!-*bZk$=7 zgk&Vz9G_c+^J_@HvJ~oQ^O577Hkp=_xoW29cC%KFBT3qpkcd|!7PQSRG%kOow%0ce zfARh}9YtaKwR;vfx`DN6z)(|vwkK3hL<> zMjgeO(B?oPL$NTFLp%1&>vTD6xQoU4d?K{JiULrov#w5e*N$l~92I>L0y!S78cvVTB0v$-}JcHvNm|+0`Hf(uX|sU31>-{dNo3HQCjLC)EQq>ycEyAgxy>?e0Aw0^%}{c z$eQg6z# z53XUyzA35hS}b;2?Y@ z_7YATc;4(jez*WxyzPym2I>nGKNW2~4<76zwwDAsEIUR)VYi@V=;44E;UJ-4j5f?W zhN)L|tJVICFizsEI;AVl=Ty>oT1kKs-Fo}sO-^?jXDIDs6yb@^{e=PMLAU^u@=Q7U zA)4P6I~7Idl~A|880v7Rt}@m3Ci7M>W!`HC8!nB|R7t?e{ulQR!oY@mfd?w)kKaH6 zmqxz?Jk)}v43~M)b_cVziMiirxr8xQV6L$Ch|&>nUn-44V8hk%8_8uFXa)khi0Hht zk(8Qu8#iiuHdgr~vCMY)7YEY%1|Mv~_L_~O(d4!aU;}jyEjDc6hilPz{U*GlJxEM` z8uvnv;ny2kCZ}|I6ufzv_~Gdh8%wFSTv5oD_QSEW<0B~3OZcAITeTfB(RrTQ@8?3Z zPnhS&s=br3kIlnCUM=;d{WTy!N!2F9q|Xx@{YR?Z$5Uji=h6OT;5ji9mg26Vz~PVD zFtVH_a1YUkxne5JJu0txcYKL6SF|b*_(^I(e&%P5$h^v$_`vy|@AW?nEQrhU3e!c% zGJ6J6+beRn9Vl1QVk&C+1r=A+y!Va}in@HA)c z94ZEWrON0WjlQ{2F1GVj>ntP}uUY?Yv>{s^^B{0qcEwRMcxHF@G2i3tL^rZlv$%ik zCb56(jHTK+aU(m4n^QdV8#fGV$$ZoYQ%$RHrNt=u@%Xwh^NT%KfIx-W&ew!^U_Hzc z_|*>7;+AV_k>enW|5EPugs@@4`E#``LwdENi+`RN-d5&wSB{h2&Q8oaruda+%;#k; zsGsvAJ{yN!A=Cb9VDdYIYzmXtUzB=qk&rL?HVJAEDPKs+Q@S(=+;|Q()ro?*B0ihh zhz4er&tkF6lgh!V02;;HKD-$1Zj4_W{)&l zBNrM&HLhWto~44fr;YcDW;>%$C$JrpUq^=Uly4E=A)6w>G6AT2^|SJ+j_I{IBYZpp zKQu&O3`S|f+lu!1FgN%pQ_bs`XF9Rx*w6b0$f`vletWg)@KHAICB;bW2wnJ)z#Xg> zzL$KN5GHXSXyG{{923TS_ozTQo+mK7ge0suRwSDkYch9V9Bcb=Hbr>kW5#WI474W$Pi z`nWs~8(>Q+*rV#)?ZWTpBJb2BItUviL6M^wD~JYm=~9%5`15i_F!Qolv%>1Ys;xg` zWry58Z@{6i*I{Gl6Fan_t?MB1r+e{VgL&@I>PLL)cYFolVDDfT`$L|46BF`;D`h~) zTNcP4=Icexk{_&)mzmWzkumVsDL;_VbswkDJJ)Z7rVB*03G_Xd)f@H12Ks=fja5D+ zcZJa(c(rN%cz=3O+a@a17t71bpq%m&LQ`xQxbflTxeNXF3X|aQ3|ygknZwqSr*mPj zVBUMp-yaiT6vE_EMS5GA7W6J+y za^4qGfeBkPgOaZajp9$xc1|r_vC>yGmF_{Wc-sT5$G5|3VNUM^b2X}wjs<$3fp@i# zjPmV;bcU5zLWs(PG$_ZO*V|&0j*}wjjOC%uiyEPT7<3nY$&DSdU0VS~=5?|G`AN>2 zbM-dXP|C>^#zpDVu3SE&#M%+RbV{9lQ2feTxy7Y&UYsEt-WAWB_~#ejMV3@J-3mgM z-m0$@sSC8B<#+=pki%P5IFqB#cU;G5U;%7tPt6f#gl2UatXo6r4ps;$J^Z+}?GupH zbbRappNOX;(v{SmwWY%^K-u!xLumGA2h#F)J&$#)km>={fdt z8D4s62kO8Na_dCb_Qe8)<*&|A<7;#u>awqNl(h|Jr7-k)Lp2x|ZTty`Y&%S$?2bFw zzjiOSaDR<7kp*-WTFQQSB4kCBo6wD_PfWlBd}5+B7YyTQXyBBVb7bMBwW!RbB-Pa- zQ9JD>z6}BAj=>$uz~FlCQ?xF**BUQ~gMg9i0cCZIQ880I(DPnE?}5}h?8vzne**Dq zKhJW}F*Ymd!Uxlk1|6Fttx;n;Zmr3rH5*BxFy&_H8T}(OUz*g^Yld!{)Yvij{uT2^ z!1{+gZH>0o7ltXj+mErDqNgM+Gx-M^w0=`%w31NW)nV%dMgBVb4qL?%AFfv>75d?c zl*_)9C@|D{yXo|ZraJOQd%?alMVDVPkCf6be9< zb^|_tK<=;X?w^6gv1R!=Y{V1GfX-u3+MZx4}0Uff9%U+5oc0 zFB*OIX{mzp-5MF?g}kvvMMuKL_pj2y6>dw)ZHFT~nW@+BQcG$AV-+8SKkdp0I#0b_ z!&KUb?qL zDuuE6?Ui~C_2C|8-@x=+B4O&8*Iw(&H>#9;N4f|HZ{!cS4BuBC{ zM`brgqwszYZr?O}2X*D1DH&&Ik37iSp^w+^oSfbBe`rCig6HnMw?`H%suI#&)%S33 zE}PQZ&vCwWG0+X>R9#(q`Ft;DrUg3g}+D29WK z8c}y*xw*TTlJ+V2&pj?s9u5`v1Y#fC$Ds2RUUT(wm@I0m(^~1mz?{@$0}a2fP(nJH zKyOhMf9jul^wUUNkhr)Y0NU5y`cZXDgRAMt zIWP?Ioao!L8va`Mevau;bK0aMKo)N;zO>-GHQJh!iNA*8J_gj4)6?Vra(!x1RLo7? zQ6g)=!(7Z|A@a`xsHA6M9oM}Kw;`^Ri;15Hz6}by=9#bCC-l-e-H_QVgnrQVY0hVa z@0V{WurR{ojkkeyM6K)ZXD?sXN__~eewyXoeL8M7ailA-kFVB-9FF!uRgH3qantW* z?X8dBqfD;P+XHufaO+yA++&MNa|^&4rsoNa+DqA(KJvyKuH-e`o9t~Ss3re?Pav$= z5&J}Lcysha_)q;$qgT38!UywrepFIm zPyGi929^c;|H)K=yTfR|z<*}N`8W6k`~Sg6f9A*m_6}hDs{3cs znSa+^#raj&8I1%;H;C}}A0EMjh#>xTetLxJ7lA*s0{oi*Guhw3zj6c+{sJGJX}eW` zFzcWX*}t)1gp43C%Wp2mLwFD{OrYObz(6u2VE)kWKKWlnR$4GH5Ve05e9phY&_I?E zwBJPZL3bcP=2r`9nGyc^3w(ok5GeA%f&nt1FfI--VemI`(rjWk^bVi7dB%=1gZ#qV5tX~EB@9*DV zjuyb)(cfMFM&wiZ=^xy zOnDG*)<1xg_P}}@0-(Sg`R{v?Fo6eQ=J@Lzk{9y-IQ`@M{@*_DcLITF{^=R}aXg4I z4>KN!={MpPF&tJeVmT!R6)1<$^e|Uxc(NuZgzrkn>{~ZSY zaLW0kl1RX>N<}l&zo`Fr%l<#u(4b$y3MWdS{`l|i{b$!TNRIwNf{rLde}Pq|Xnt9N zf9*>H{+z~yFpBc0;64^hg7{r0Vv_RxGEFjU}gUKJeEB;`q zn)nO+aqjmJ^@oA_51>^t2*~$8ioYz>Aokgy$OY_w0L@c>QKTNjA^A&2{;?4Lx1F*X zzkqJDWWRuanQ&l06gxo@!}bS7vTP8L9EdpkTaN!y`|p5&jvxm=;Xi;rxxaw%lXSl* z{$m69uXME*fPiGcm&xD5r=GWCdNPRGFla9L^U+Uf1OoEOfcw*bk0}b%cn}VqpmR)r ziRLdZ(W0F8{-B2d9wdrBIf2T0^0@RzXvehB=h@F1i=1JkFZe^o^O*{=nfa=<_# yZor8DsEF4GB~awIlTzZrr4!a(0&m;Mh0Bgr)Y diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 293fd09..0cd056e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Wed May 30 12:43:00 PDT 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/gradlew b/gradlew index cccdd3d..4453cce 100755 --- a/gradlew +++ b/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn () { +warn ( ) { echo "$*" } -die () { +die ( ) { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save () { +save ( ) { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index 0f41aaa..847b126 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -50,6 +50,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.factory.ControllersStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.state.factory.HandlersStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.state.factory.RegionsStateFieldFactory; +import net.foxdenstudio.sponge.foxguard.plugin.util.DebugManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongepowered.api.Game; @@ -241,9 +242,14 @@ public void registerCommands(GameInitializationEvent event) { fgDispatcher.register(new CommandPriority(), "priority", "prio", "level", "rank"); - fgDispatcher.register(new CommandTest(), "test"); fgDispatcher.register(new CommandLink2(true), "link2", "connect2", "attach2"); fgDispatcher.register(new CommandLink2(false), "unlink2", "disconnect2", "detach2"); + + // DEBUG USE + //fgDispatcher.register(new CommandTest(), "test"); + //fgDispatcher.register(DebugManager.INSTANCE, "debug"); + + registerCoreCommands(fgDispatcher); game.getCommandManager().register(this, fgDispatcher, "foxguard", "foxg", "fguard", "fg"); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java index 87b53b2..3e229eb 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandHere.java @@ -35,7 +35,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.listener.PlayerMoveListenerNew; +import net.foxdenstudio.sponge.foxguard.plugin.listener.PlayerMoveListener; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.Sponge; @@ -85,7 +85,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm } AdvCmdParser.ParseResult parse = AdvCmdParser.builder().arguments(arguments).flagMapper(MAPPER).parse(); boolean hud = false; - PlayerMoveListenerNew.HUDConfig hudConfig = new PlayerMoveListenerNew.HUDConfig(false, false, false); + PlayerMoveListener.HUDConfig hudConfig = new PlayerMoveListener.HUDConfig(false, false, false); String worldName = parse.flags.get("world"); World world = null; @@ -239,7 +239,7 @@ public CommandResult process(CommandSource source, String arguments) throws Comm if (hud) { Player player = (Player) source; if (CommandHUD.instance().getIsHUDEnabled().get(player)) { - PlayerMoveListenerNew instance = PlayerMoveListenerNew.getInstance(); + PlayerMoveListener instance = PlayerMoveListener.getInstance(); instance.getHudConfigMap().put(player, hudConfig); instance.renderHUD(player, regionList, handlerList, hudConfig); instance.showScoreboard(player); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/config/ListenerModule.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/config/ListenerModule.java index 0f8d2c2..fe0bf35 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/config/ListenerModule.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/config/ListenerModule.java @@ -1,7 +1,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.config; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; -import net.foxdenstudio.sponge.foxguard.plugin.listener.PlayerMoveListenerNew; +import net.foxdenstudio.sponge.foxguard.plugin.listener.PlayerMoveListener; import org.spongepowered.api.event.entity.MoveEntityEvent; import javax.annotation.Nonnull; @@ -25,7 +25,7 @@ public String setup(String setting) { setting = getDefaultValue(); full = true; } - PlayerMoveListenerNew pml = new PlayerMoveListenerNew(true); + PlayerMoveListener pml = new PlayerMoveListener(true); plugin.registerListener(MoveEntityEvent.class, pml); //plugin.registerListeners(pml.new Listeners()); return setting; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java index 28701ad..ae7647e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/BlockChangeListener.java @@ -31,6 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.util.DebugManager; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.spongepowered.api.block.BlockSnapshot; @@ -67,6 +68,9 @@ public void handle(ChangeBlockEvent event) throws Exception { || tr.getOriginal().getState().getType().equals(BlockTypes.GRASS) && tr.getFinal().getState().getType().equals(BlockTypes.DIRT)) return; } + + DebugManager.INSTANCE.printEvent(event); + //DebugHelper.printBlockEvent(event); /*FlagOld typeFlag; if (event instanceof ChangeBlockEvent.Modify) typeFlag = FlagOld.BLOCK_MODIFY; @@ -105,6 +109,7 @@ public void handle(ChangeBlockEvent event) throws Exception { } if(handlerSet.size() == 0) return; + User user; if (event.getCause().containsType(Player.class)) { user = event.getCause().first(Player.class).get(); @@ -114,6 +119,8 @@ public void handle(ChangeBlockEvent event) throws Exception { user = null; } + + boolean[] flags = BASE_FLAG_SET.clone(); if (event instanceof ChangeBlockEvent.Modify) flags[MODIFY.id] = true; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index 0e70da3..be2d6d5 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -26,10 +26,12 @@ package net.foxdenstudio.sponge.foxguard.plugin.listener; import com.flowpowered.math.vector.Vector3d; +import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EntityFlagCalculator; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.FGListenerUtil; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; @@ -51,6 +53,7 @@ public class InteractEntityListener implements EventListener { + private static final EntityFlagCalculator ENTITY_FLAG_CALCULATOR = EntityFlagCalculator.getInstance(); private static final boolean[] BASE_FLAG_SET = FlagSet.arrayFromFlags(ROOT, DEBUFF, INTERACT, ENTITY); @Override @@ -91,8 +94,7 @@ public void handle(InteractEntityEvent event) throws Exception { if (event instanceof InteractEntityEvent.Secondary.MainHand) flags[MAIN.id] = true; else if (event instanceof InteractEntityEvent.Secondary.OffHand) flags[OFF.id] = true; } - Entity entity = event.getTargetEntity(); - FGListenerUtil.applyEntityFlags(entity, flags); + ENTITY_FLAG_CALCULATOR.applyEntityFlags(ImmutableList.of(event.getTargetEntity()), flags); FlagSet flagSet = new FlagSet(flags); List handlerList = new ArrayList<>(handlerSet); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java similarity index 98% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java index d7eb237..c126671 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListenerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/PlayerMoveListener.java @@ -61,11 +61,11 @@ * Created by Fox on 1/4/2016. * Project: SpongeForge */ -public class PlayerMoveListenerNew implements EventListener { +public class PlayerMoveListener implements EventListener { private static final boolean[] BASE_FLAG_SET = FlagSet.arrayFromFlags(ROOT, DEBUFF, MOVE); - private static PlayerMoveListenerNew instance; + private static PlayerMoveListener instance; public final boolean full; @@ -84,7 +84,7 @@ public class PlayerMoveListenerNew implements EventListener { }); private final Map hudConfigMap = new WeakCacheMap<>((k, m) -> new HUDConfig()); - public PlayerMoveListenerNew(boolean full) { + public PlayerMoveListener(boolean full) { this.full = full; if (instance == null) instance = this; } @@ -360,7 +360,7 @@ public void showScoreboard(Player player) { player.setScoreboard(this.scoreboardMap.get(player)); } - public static PlayerMoveListenerNew getInstance() { + public static PlayerMoveListener getInstance() { return instance; } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java index 6d68854..bb52149 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/SpawnEntityListener.java @@ -30,6 +30,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EntityFlagCalculator; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; @@ -54,25 +55,20 @@ public class SpawnEntityListener implements EventListener { + private static final EntityFlagCalculator ENTITY_FLAG_CALCULATOR = EntityFlagCalculator.getInstance(); private static final boolean[] BASE_FLAG_SET = FlagSet.arrayFromFlags(ROOT, DEBUFF, SPAWN, ENTITY); @Override public void handle(SpawnEntityEvent event) throws Exception { if (event.isCancelled()) return; - if (event.getEntities().isEmpty()) return; - for (Entity entity : event.getEntities()) { + List entities = event.getEntities(); + if (entities.isEmpty()) return; + + for (Entity entity : entities) { if (entity instanceof Player) return; } - User user; - if (event.getCause().containsType(Player.class)) { - user = event.getCause().first(Player.class).get(); - } else if (event.getCause().containsType(User.class)) { - user = event.getCause().first(User.class).get(); - } else { - user = null; - } - Entity oneEntity = event.getEntities().get(0); + //Entity oneEntity = event.getEntities().get(0); /*if (oneEntity instanceof Arrow) { Optional creator = oneEntity.getCreator(), notifier = oneEntity.getNotifier(); @@ -89,29 +85,10 @@ public void handle(SpawnEntityEvent event) throws Exception { } }*/ - boolean[] flags = BASE_FLAG_SET.clone(); - - if (oneEntity instanceof Living) { - flags[LIVING.id] = true; - if (oneEntity instanceof Agent) { - flags[AGENT.id] = true; - if (oneEntity instanceof Hostile) { - flags[HOSTILE.id] = true; - } else if (oneEntity instanceof Human) { - flags[HUMAN.id] = true; - } else { - flags[PASSIVE.id] = true; - } - } - } else if (oneEntity instanceof Hanging) { - flags[HANGING.id] = true; - } - - FlagSet flagSet = new FlagSet(flags); Set handlerSet = new HashSet<>(); - for (Entity entity : event.getEntities()) { + for (Entity entity : entities) { Location loc = entity.getLocation(); Vector3d pos = loc.getPosition(); World world = loc.getExtent(); @@ -122,10 +99,24 @@ public void handle(SpawnEntityEvent event) throws Exception { .forEach(handlerSet::add)); } - - //TODO maybe throw a warning if(handlerSet.size() == 0) return; + + User user; + if (event.getCause().containsType(Player.class)) { + user = event.getCause().first(Player.class).get(); + } else if (event.getCause().containsType(User.class)) { + user = event.getCause().first(User.class).get(); + } else { + user = null; + } + + boolean[] flags = BASE_FLAG_SET.clone(); + + ENTITY_FLAG_CALCULATOR.applyEntityFlags(entities, flags); + + FlagSet flagSet = new FlagSet(flags); + ArrayList handlerList = new ArrayList<>(handlerSet); Collections.sort(handlerList); int currPriority = handlerList.get(0).getPriority(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EntityFlagCalculator.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EntityFlagCalculator.java index e82828b..9857e8c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EntityFlagCalculator.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/EntityFlagCalculator.java @@ -51,7 +51,6 @@ public void applyEntityFlags(Collection entities, boolean[] flags) { mini.apply(flags); } - @SuppressWarnings("Duplicates") private MiniFlagSet getMiniFlag(Map, Entity> types) { MiniFlagSet mini = new MiniFlagSet(); Set totalFlags = new HashSet<>(); @@ -210,7 +209,7 @@ public void apply(boolean[] flagset) { } } - public static void main(String[] args) { + /*public static void main(String[] args) { EntityFlagCalculator calculator = EntityFlagCalculator.getInstance(); FlagRegistry registry = FlagRegistry.getInstance(); Entity entity = (Entity) Proxy.newProxyInstance(EntityFlagCalculator.class.getClassLoader(), @@ -220,5 +219,5 @@ public static void main(String[] args) { for (Flag flag : flags) { System.out.println(flag.name); } - } + }*/ } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java deleted file mode 100644 index dede305..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugHelper.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is part of FoxGuard, licensed under the MIT License (MIT). - * - * Copyright (c) gravityfox - https://gravityfox.net/ - * Copyright (c) contributors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package net.foxdenstudio.sponge.foxguard.plugin.util; - -import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; -import org.spongepowered.api.data.Transaction; -import org.spongepowered.api.event.Event; -import org.spongepowered.api.event.block.ChangeBlockEvent; - -public class DebugHelper { - - public static void printEvent(Event event) { - StringBuilder sb = new StringBuilder().append("-----------------------------------\n"); - sb.append(event.getClass()).append("\n\n"); - for (Object o : event.getCause().all()) { - sb.append(o).append("\n"); - } - FoxGuardMain.instance().getLogger().info(sb.toString()); - } - - public static void printBlockEvent(ChangeBlockEvent event) { - StringBuilder sb = new StringBuilder().append("-----------------------------------\n"); - sb.append(event.getClass()).append("\n"); - for (Transaction t : event.getTransactions()) { - sb.append(t).append("\n"); - } - sb.append("\n"); - for (Object o : event.getCause().all()) { - sb.append(o).append("\n"); - } - sb.append("\n"); - event.getContext().asMap().forEach((k, v) -> sb.append(k).append("::").append(v).append("\n")); - FoxGuardMain.instance().getLogger().info(sb.toString()); - } -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java new file mode 100644 index 0000000..ce6f8f5 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java @@ -0,0 +1,127 @@ +/* + * This file is part of FoxGuard, licensed under the MIT License (MIT). + * + * Copyright (c) gravityfox - https://gravityfox.net/ + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package net.foxdenstudio.sponge.foxguard.plugin.util; + +import net.foxdenstudio.sponge.foxcore.plugin.command.FCCommandBase; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import org.spongepowered.api.command.CommandException; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.data.Transaction; +import org.spongepowered.api.event.Event; +import org.spongepowered.api.event.block.ChangeBlockEvent; +import org.spongepowered.api.event.cause.EventContextKey; +import org.spongepowered.api.text.Text; + +import java.util.Map; + +public class DebugManager extends FCCommandBase { + + public static final DebugManager INSTANCE = new DebugManager(); + + private boolean enabled = false; + private int armCount = 0; + + @Override + public CommandResult process(CommandSource source, String arguments) throws CommandException { + String[] parts = arguments.split(" +"); + if (parts.length == 0) return CommandResult.empty(); + + switch (parts[0]) { + case "on": + enabled = true; + armCount = 0; + source.sendMessage(Text.of("Enabled printing")); + break; + case "off": + enabled = false; + armCount = 0; + source.sendMessage(Text.of("Disabled printing")); + case "arm": + enabled = true; + int count = 1; + if (parts.length > 1) { + try { + count = Integer.parseInt(parts[1]); + } catch (NumberFormatException ignored) { + } + } + armCount = count; + source.sendMessage(Text.of("Armed for " + count + " prints")); + default: + return CommandResult.empty(); + } + return CommandResult.empty(); + } + + @Override + public boolean testPermission(CommandSource source) { + return source.hasPermission("foxguard.command.debug"); + } + + private boolean print() { + boolean ret = enabled; + if (armCount > 0) { + if (--armCount == 0) enabled = false; + } + return ret; + } + + public void printEvent(Event event) { + if (print()) { + StringBuilder sb = new StringBuilder().append("-----------------------------------\n"); + sb.append(event.getClass()).append("\n\n"); + + for (Object o : event.getCause().all()) { + sb.append(o).append("\n"); + } + + sb.append("\n"); + + for (Map.Entry, Object> entry : event.getContext().asMap().entrySet()) { + sb.append(entry).append("\n"); + } + FoxGuardMain.instance().getLogger().info(sb.toString()); + } + } + + public void printBlockEvent(ChangeBlockEvent event) { + if (print()) { + StringBuilder sb = new StringBuilder().append("-----------------------------------\n"); + sb.append(event.getClass()).append("\n"); + for (Transaction t : event.getTransactions()) { + sb.append(t).append("\n"); + } + sb.append("\n"); + for (Object o : event.getCause().all()) { + sb.append(o).append("\n"); + } + sb.append("\n"); + event.getContext().asMap().forEach((k, v) -> sb.append(k).append("::").append(v).append("\n")); + FoxGuardMain.instance().getLogger().info(sb.toString()); + } + } +} From 3ef2ebc76f9735c52863ca6ba78435db8340293e Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Fri, 20 Jul 2018 11:28:30 -0700 Subject: [PATCH 29/30] Removed old flag calculator. --- .../plugin/listener/DamageListener.java | 14 +++---- .../listener/InteractEntityListener.java | 2 - .../plugin/listener/util/FGListenerUtil.java | 41 ------------------- 3 files changed, 7 insertions(+), 50 deletions(-) delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/FGListenerUtil.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java index eb917b0..cdbe987 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/DamageListener.java @@ -26,20 +26,17 @@ package net.foxdenstudio.sponge.foxguard.plugin.listener; import com.flowpowered.math.vector.Vector3d; +import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; -import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; -import net.foxdenstudio.sponge.foxguard.plugin.listener.util.FGListenerUtil; +import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EntityFlagCalculator; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; import org.spongepowered.api.entity.Entity; -import org.spongepowered.api.entity.hanging.Hanging; -import org.spongepowered.api.entity.living.*; +import org.spongepowered.api.entity.living.Living; import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.vehicle.Boat; -import org.spongepowered.api.entity.vehicle.minecart.Minecart; import org.spongepowered.api.event.EventListener; import org.spongepowered.api.event.cause.Cause; import org.spongepowered.api.event.cause.entity.damage.DamageModifier; @@ -65,6 +62,7 @@ */ public class DamageListener implements EventListener { + private static final EntityFlagCalculator ENTITY_FLAG_CALCULATOR = EntityFlagCalculator.getInstance(); private static final boolean[] BASE_FLAGS_SOURCE = FlagSet.arrayFromFlags(ROOT, DEBUFF, DAMAGE, ENTITY); private static final boolean[] INVINCIBLE_FLAGS = FlagSet.arrayFromFlags(ROOT, BUFF, INVINCIBLE); private static final FlagSet INVINCIBLE_FLAG_SET = new FlagSet(INVINCIBLE_FLAGS); @@ -115,7 +113,9 @@ public void handle(DamageEntityEvent event) throws Exception { flags = BASE_FLAGS_SOURCE.clone(); - FGListenerUtil.applyEntityFlags(entity, flags); + //FGListenerUtil.applyEntityFlags(entity, flags); + ENTITY_FLAG_CALCULATOR.applyEntityFlags(ImmutableList.of(entity), flags); + flagSet = new FlagSet(flags); currPriority = handlerList.get(0).getPriority(); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java index be2d6d5..268877a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/InteractEntityListener.java @@ -32,10 +32,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EntityFlagCalculator; -import net.foxdenstudio.sponge.foxguard.plugin.listener.util.FGListenerUtil; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import net.foxdenstudio.sponge.foxguard.plugin.util.ExtraContext; -import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.User; import org.spongepowered.api.event.EventListener; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/FGListenerUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/FGListenerUtil.java deleted file mode 100644 index 88f5d16..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/listener/util/FGListenerUtil.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.listener.util; - -import org.spongepowered.api.entity.Entity; -import org.spongepowered.api.entity.hanging.Hanging; -import org.spongepowered.api.entity.living.*; -import org.spongepowered.api.entity.living.player.Player; -import org.spongepowered.api.entity.vehicle.Boat; -import org.spongepowered.api.entity.vehicle.minecart.Minecart; - -import java.util.Collection; - -import static net.foxdenstudio.sponge.foxguard.plugin.flag.Flags.*; - -public class FGListenerUtil { - - public static void applyEntityFlags(Entity entity, boolean[] flags){ - if (entity instanceof Living) { - flags[LIVING.id] = true; - if (entity instanceof Agent) { - flags[AGENT.id] = true; - if (entity instanceof Hostile) { - flags[HOSTILE.id] = true; - } else if (entity instanceof Human) { - flags[HUMAN.id] = true; - } else { - flags[PASSIVE.id] = true; - } - } else if (entity instanceof Player) { - flags[PLAYER.id] = true; - } else if (entity instanceof ArmorStand) { - flags[ARMORSTAND.id] = true; - } - } else if (entity instanceof Hanging) { - flags[HANGING.id] = true; - } else if (entity instanceof Boat) { - flags[BOAT.id] = true; - } else if (entity instanceof Minecart) { - flags[MINECART.id] = true; - } - } -} From b464475fbb84069431a6a00325e747263179ac2f Mon Sep 17 00:00:00 2001 From: "Mike \"Fox\" Liu" Date: Fri, 17 Aug 2018 16:25:38 -0700 Subject: [PATCH 30/30] Stuff --- .../sponge/foxguard/plugin/FoxGuardMain.java | 8 +- .../plugin/command/CommandCreate.java | 67 ++++++++------- .../plugin/command/CommandDelete.java | 2 - .../plugin/command/CommandDetail.java | 5 +- .../foxguard/plugin/command/CommandTest.java | 6 +- .../plugin/controller/IController.java | 6 +- .../foxguard/plugin/handler/BasicHandler.java | 2 + .../foxguard/plugin/handler/GroupHandler.java | 33 ++++--- .../foxguard/plugin/handler/IHandler.java | 5 +- .../foxguard/plugin/object/IFGObject.java | 16 ++-- .../foxguard/plugin/object/IGuardObject.java | 11 --- .../plugin/object/filter/IObjectFilter.java | 4 - .../{owner => ownerold}/OwnerManager.java | 6 +- .../provider/IDisplayableOwnerProvider.java | 2 +- .../provider/IOwnerProvider.java | 2 +- .../provider/OfflineUserProvider.java | 2 +- .../provider/OnlinePlayerProvider.java | 2 +- .../provider/UUIDProvider.java | 2 +- .../foxguard/plugin/object/path/FoxPath.java | 14 +-- .../plugin/object/path/IExtensionAdapter.java | 16 ---- .../plugin/object/path/PathManager.java | 85 +++++++++++++++---- .../element/group/ExtendedGroupElement.java | 21 +++++ .../element/{ => group}/GroupElement.java | 4 +- .../path/element/group/LocalGroupElement.java | 28 ++++++ .../ServerGroupElement.java} | 46 +++------- .../{ => group}/StructuredGroupElement.java | 3 +- .../{ => owner}/DirectLocalOwnerElement.java | 11 ++- .../{ => owner}/DirectOwnerElement.java | 3 +- .../{ => owner}/IOwnerPathElement.java | 3 +- .../element/{ => owner}/OwnerPathElement.java | 13 ++- .../DynamicPathOwnerProviderBase.java | 22 +++++ ...java => LiteralPathOwnerProviderBase.java} | 11 ++- .../owner/provider/PathOwnerProvider.java | 30 ++++++- .../object/path/owner/types/BaseOwner.java | 24 ++---- .../object/path/owner/types/IOwner.java | 70 +++++++++++++++ .../object/path/owner/types/NameOwner.java | 7 +- .../object/path/owner/types/NumberOwner.java | 7 +- .../object/path/owner/types/ServerOwner.java | 12 +++ .../owner/types/SingleKeyComparableOwner.java | 1 + .../path/owner/types/SingleKeyOwner.java | 5 +- .../object/path/owner/types/UUIDOwner.java | 9 +- .../object/provider/FGBaseProvider.java | 81 ++++++++++++++++++ .../object/provider/IObjectProvider.java | 26 ++++++ .../foxguard/plugin/region/IRegion.java | 6 +- .../plugin/region/world/IWorldRegion.java | 5 ++ .../plugin/storage/FGSLegacyLoader.java | 6 +- .../plugin/storage/FGSObjectIndex.java | 17 ++++ .../plugin/storage/FGSObjectMeta.java | 16 ++++ .../plugin/storage/FGSObjectPath.java | 15 ++++ .../plugin/storage/FGStorageManagerNew.java | 52 +++++++----- .../foxguard/plugin/storage/FoxConfig.java | 1 + .../plugin/storage/FoxConfigStub.java | 1 + .../foxguard/plugin/util/DebugManager.java | 10 ++- .../sponge/foxguard/plugin/util/FGUtil.java | 11 ++- 54 files changed, 639 insertions(+), 234 deletions(-) delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/OwnerManager.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/provider/IDisplayableOwnerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/provider/IOwnerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/provider/OfflineUserProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/provider/OnlinePlayerProvider.java (96%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/{owner => ownerold}/provider/UUIDProvider.java (97%) delete mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ExtendedGroupElement.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => group}/GroupElement.java (93%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/LocalGroupElement.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{RootGroupElement.java => group/ServerGroupElement.java} (77%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => group}/StructuredGroupElement.java (87%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => owner}/DirectLocalOwnerElement.java (90%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => owner}/DirectOwnerElement.java (93%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => owner}/IOwnerPathElement.java (81%) rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/{ => owner}/OwnerPathElement.java (91%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/DynamicPathOwnerProviderBase.java rename src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/{LiteralPathProviderBase.java => LiteralPathOwnerProviderBase.java} (53%) create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/FGBaseProvider.java create mode 100644 src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/IObjectProvider.java diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java index d8d2d41..dfb4627 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/FoxGuardMain.java @@ -51,6 +51,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.state.factory.HandlersStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.state.factory.RegionsStateFieldFactory; import net.foxdenstudio.sponge.foxguard.plugin.storage.FGStorageManagerNew; +import net.foxdenstudio.sponge.foxguard.plugin.util.DebugManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongepowered.api.Game; @@ -97,6 +98,7 @@ url = "https://github.com/FoxDenStudio/FoxGuard") public final class FoxGuardMain { + public static final String LOGGER_NAME = FoxCoreMain.FOX_BASE_LOGGER_NAME + ".guard"; public final Cause pluginCause = Cause.builder().append(this).build(EventContext.empty()); /** @@ -104,7 +106,7 @@ public final class FoxGuardMain { */ private static FoxGuardMain instanceField; - private Logger logger = LoggerFactory.getLogger("fox.guard"); + private Logger logger = LoggerFactory.getLogger(LOGGER_NAME); @Inject private Game game; @@ -249,8 +251,8 @@ public void registerCommands(GameInitializationEvent event) { fgDispatcher.register(new CommandLink2(false), "unlink2", "disconnect2", "detach2"); // DEBUG USE - //fgDispatcher.register(new CommandTest(), "test"); - //fgDispatcher.register(DebugManager.INSTANCE, "debug"); + fgDispatcher.register(new CommandTest(), "test"); + fgDispatcher.register(DebugManager.INSTANCE, "debug"); registerCoreCommands(fgDispatcher); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java index e1dcf95..28dcf80 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandCreate.java @@ -32,15 +32,15 @@ import net.foxdenstudio.sponge.foxcore.plugin.command.util.FlagMapper; import net.foxdenstudio.sponge.foxcore.plugin.state.FCStateManager; import net.foxdenstudio.sponge.foxcore.plugin.state.PositionStateField; -import net.foxdenstudio.sponge.foxguard.plugin.config.FGConfigManager; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; +import net.foxdenstudio.sponge.foxguard.plugin.config.FGConfigManager; import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider.IOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import org.spongepowered.api.Sponge; @@ -50,22 +50,19 @@ import org.spongepowered.api.text.Text; import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.util.GuavaCollectors; -import org.spongepowered.api.util.Identifiable; import org.spongepowered.api.util.StartsWithPredicate; import org.spongepowered.api.util.Tristate; import org.spongepowered.api.world.Locatable; import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.function.Supplier; import java.util.stream.Stream; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; public class CommandCreate extends FCCommandBase { @@ -85,9 +82,9 @@ public class CommandCreate extends FCCommandBase { map.put("priority", value); } /*else if (isIn(STATE_ALIASES, key) && !map.containsKey("state")) { map.put("state", value); - }*/ else if (isIn(OWNER_ALIASES, key) && !map.containsKey("owner")) { + }*/ /*else if (isIn(OWNER_ALIASES, key) && !map.containsKey("owner")) { map.put("owner", value); - } + }*/ return true; }; @@ -129,7 +126,7 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu if (lengthLimit > 0 && name.length() > lengthLimit) throw new CommandException(Text.of("Name is too long! Max " + lengthLimit + " characters.")); - UUID owner = FGManager.SERVER_UUID_DEPRECATED; + /*UUID owner = FGManager.SERVER_UUID_DEPRECATED; if (parse.flags.containsKey("owner")) { String ownerString = parse.flags.get("owner"); if (ownerString.isEmpty()) { @@ -151,7 +148,9 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu throw new CommandException(Text.of("\"" + ownerString + "\" is not a valid owner!")); } } - } + }*/ + + IOwner owner = FGManager.SERVER_OWNER; World world = null; if (fgCat == FGCat.WORLDREGION) { @@ -221,9 +220,13 @@ public CommandResult process(@Nonnull CommandSource source, @Nonnull String argu .append(": Name: ") .append(object.getName()); - if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { + /*if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { logMessage.append(" Owner: ").append(OwnerManager.getInstance().getKeyword(owner, null)) .append(" (").append(owner).append(")"); + }*/ + + if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { + logMessage.append(" Owner: ").append(owner.toString()); } if (object instanceof IWorldRegion) { @@ -354,7 +357,7 @@ else if (parse.current.type.equals(AdvCmdParser.CurrentElement.ElementType.LONGF .collect(GuavaCollectors.toImmutableList()); } else if (isIn(OWNER_ALIASES, parse.current.key)) { String[] parts = parse.current.token.split(":", 2); - System.out.println(parts.length ); + System.out.println(parts.length); if (parts.length == 1) { ImmutableList collect = OwnerManager.getInstance().getProviders().stream() .map(IOwnerProvider::getPrimaryAlias) @@ -430,8 +433,8 @@ public Text getUsage(@Nonnull CommandSource source) { private enum FGCat { REGION(REGIONS_ALIASES, FGFactoryManager.getInstance()::getRegionTypeAliases) { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { - return FGManager.getInstance().isRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)); + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { + return FGManager.getInstance().isRegionNameAvailable(name, owner); } @Override @@ -440,17 +443,17 @@ public IGuardObject create(String name, String type, String arguments, CommandSo } @Override - public boolean add(IGuardObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, IOwner owner, @Nullable World world) { return object instanceof IRegion - && FGManager.getInstance().addRegion(((IRegion) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); + && FGManager.getInstance().addRegion(((IRegion) object), owner, world); } }, WORLDREGION(WORLDREGIONS_ALIASES, FGFactoryManager.getInstance()::getWorldRegionTypeAliases) { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { if (world == null) - return FGManager.getInstance().isWorldRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)) == Tristate.TRUE; - else return FGManager.getInstance().isWorldRegionNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); + return FGManager.getInstance().isWorldRegionNameAvailable(name, owner) == Tristate.TRUE; + else return FGManager.getInstance().isWorldRegionNameAvailable(name, owner, world); } @Override @@ -459,16 +462,16 @@ public IGuardObject create(String name, String type, String arguments, CommandSo } @Override - public boolean add(IGuardObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, IOwner owner, @Nullable World world) { return world != null && object instanceof IWorldRegion - && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner), world); + && FGManager.getInstance().addWorldRegion(((IWorldRegion) object), owner, world); } }, HANDLER(HANDLERS_ALIASES, FGFactoryManager.getInstance()::getHandlerTypeAliases) { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { - return FGManager.getInstance().isHandlerNameAvailable(name, new UUIDOwner(UUIDOwner.USER_GROUP, owner)); + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { + return FGManager.getInstance().isHandlerNameAvailable(name, owner); } @Override @@ -477,14 +480,14 @@ public IGuardObject create(String name, String type, String arguments, CommandSo } @Override - public boolean add(IGuardObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, IOwner owner, @Nullable World world) { return object instanceof IHandler - && FGManager.getInstance().addHandler(((IHandler) object), new UUIDOwner(UUIDOwner.USER_GROUP, owner)); + && FGManager.getInstance().addHandler(((IHandler) object), owner); } }, CONTROLLER(CONTROLLERS_ALIASES, FGFactoryManager.getInstance()::getControllerTypeAliases) { @Override - public boolean isNameAvailable(String name, UUID owner, @Nullable World world) { + public boolean isNameAvailable(String name, IOwner owner, @Nullable World world) { return HANDLER.isNameAvailable(name, owner, world); } @@ -494,7 +497,7 @@ public IGuardObject create(String name, String type, String arguments, CommandSo } @Override - public boolean add(IGuardObject object, UUID owner, @Nullable World world) { + public boolean add(IGuardObject object, IOwner owner, @Nullable World world) { return HANDLER.add(object, owner, world); } }; @@ -516,10 +519,10 @@ public static FGCat from(String category) { return null; } - public abstract boolean isNameAvailable(String name, UUID owner, @Nullable World world); + public abstract boolean isNameAvailable(String name, IOwner owner, @Nullable World world); public abstract IGuardObject create(String name, String type, String arguments, CommandSource source) throws CommandException; - public abstract boolean add(IGuardObject object, UUID owner, @Nullable World world); + public abstract boolean add(IGuardObject object, IOwner owner, @Nullable World world); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java index 1d6adb9..97c035a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDelete.java @@ -36,7 +36,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; @@ -55,7 +54,6 @@ import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Stream; import javax.annotation.Nullable; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java index c5423e6..89456b8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandDetail.java @@ -37,7 +37,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.OwnerManager; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; @@ -61,14 +61,13 @@ import java.util.Collection; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.stream.Stream; import javax.annotation.Nullable; import static net.foxdenstudio.sponge.foxcore.plugin.util.Aliases.*; -public class CommandDetail extends FCCommandBase { +public class CommandDetail extends FCCommandBase { private static final FlagMapper MAPPER = map -> key -> value -> { map.put(key, value); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java index 2ab9b4a..5b52c0d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/command/CommandTest.java @@ -142,9 +142,11 @@ public Text getUsage(CommandSource source) { @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { - Optional ownerOpt = FoxPath.getOwner(arguments, source); +// Optional ownerOpt = FoxPath.getOwner(arguments, source); +// +// source.sendMessage(Text.of(ownerOpt)); + - source.sendMessage(Text.of(ownerOpt)); return CommandResult.empty(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java index dc4af2d..8f1a7de 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/controller/IController.java @@ -29,7 +29,6 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import java.nio.file.Path; -import java.util.Collection; import java.util.List; public interface IController extends IHandler, ILinkable { @@ -58,4 +57,9 @@ default boolean canLinkToItself() { default boolean saveLinks(){ return false; } + + @Override + default String getFilter() { + return "c"; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java index e5e483d..f0eb22c 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/BasicHandler.java @@ -1723,6 +1723,7 @@ public IHandler create(Path directory, HandlerData data) { if (gsonData != null) { groupNames.addAll(gsonData.groups.keySet()); } else { + // Legacy code Path dbFile = directory.resolve("groups.foxdb"); if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) try (DB flagMapDB = FGSLegacyLoader.openFoxDB(dbFile)) { @@ -1759,6 +1760,7 @@ public IHandler create(Path directory, HandlerData data) { } defaultPermissions = gsonData.defaultGroup; } else { + // Legacy Code Path dbFile = directory.resolve("flags.foxdb"); if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) { try (DB flagMapDB = FGSLegacyLoader.openFoxDB(dbFile)) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java index fc2bf4f..165a7f8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/GroupHandler.java @@ -40,8 +40,8 @@ import net.foxdenstudio.sponge.foxcore.plugin.util.FCPUtil; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.flag.Flag; -import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagRegistry; +import net.foxdenstudio.sponge.foxguard.plugin.flag.FlagSet; import net.foxdenstudio.sponge.foxguard.plugin.handler.util.Operation; import net.foxdenstudio.sponge.foxguard.plugin.handler.util.TristateEntry; import net.foxdenstudio.sponge.foxguard.plugin.listener.util.EventResult; @@ -60,7 +60,6 @@ import org.spongepowered.api.command.CommandException; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.User; -import org.spongepowered.api.service.user.UserStorageService; import org.spongepowered.api.text.Text; import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColor; @@ -921,7 +920,6 @@ public List detailsSuggestions(CommandSource source, String arguments, @ @Override public void save(Path directory) { FGStorageManagerNew storageManager = FGStorageManagerNew.getInstance(); - UserStorageService userStorageService = FoxGuardMain.instance().getUserStorage(); Logger logger = FoxGuardMain.instance().getLogger(); /*try (DB flagMapDB = FGStorageManagerOld.openFoxDB(directory.resolve("groups.foxdb"))) { List groupNames = flagMapDB.indexTreeList("names", Serializer.STRING).createOrOpen(); @@ -1303,6 +1301,7 @@ public IHandler create(Path directory, HandlerData data) { if (gsonData != null) { groupNames.addAll(gsonData.groups.keySet()); } else { + // Legacy Code Path dbFile = directory.resolve("groups.foxdb"); if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) try (DB flagMapDB = FGSLegacyLoader.openFoxDB(directory.resolve("groups.foxdb"))) { @@ -1330,15 +1329,29 @@ public IHandler create(Path directory, HandlerData data) { Map> groupPermissions = new HashMap<>(); List defaultPermissions; - try (DB flagMapDB = FGSLegacyLoader.openFoxDB(directory.resolve("flags.foxdb"))) { + + if (gsonData != null) { for (Group group : groups) { - List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); - groupPermissions.put(group, stringEntries.stream() - .map(TristateEntry::deserialize) - .collect(Collectors.toList())); + groupPermissions.put(group, gsonData.groups.get(group.name)); + } + defaultPermissions = gsonData.defaultGroup; + } else { + // Legacy Code + Path dbFile = directory.resolve("flags.foxdb"); + if (Files.exists(dbFile) && !Files.isDirectory(dbFile)) { + try (DB flagMapDB = FGSLegacyLoader.openFoxDB(dbFile)) { + for (Group group : groups) { + List stringEntries = flagMapDB.indexTreeList(group.name, Serializer.STRING).createOrOpen(); + groupPermissions.put(group, stringEntries.stream() + .map(TristateEntry::deserialize) + .collect(Collectors.toList())); + } + List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); + defaultPermissions = stringEntries.stream().map(TristateEntry::deserialize).collect(Collectors.toList()); + } + } else { + defaultPermissions = new ArrayList<>(); } - List stringEntries = flagMapDB.indexTreeList("default", Serializer.STRING).createOrOpen(); - defaultPermissions = stringEntries.stream().map(TristateEntry::deserialize).collect(Collectors.toList()); } return new GroupHandler(data, diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java index 3534b5a..edcd1ad 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/handler/IHandler.java @@ -37,7 +37,6 @@ public interface IHandler extends IGuardObject { Comparator PRIORITY = Comparator.comparingInt(IHandler::getPriority); - String EXTENSION = "h"; EventResult handle(@Nullable User user, FlagSet flags, ExtraContext extra); @@ -46,7 +45,7 @@ public interface IHandler extends IGuardObject { void setPriority(int priority); @Override - default String getPathExtension() { - return EXTENSION; + default String getFilter(){ + return "h"; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java index 4264bb9..5b493e4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IFGObject.java @@ -1,7 +1,9 @@ package net.foxdenstudio.sponge.foxguard.plugin.object; +import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import javax.annotation.Nonnull; import java.util.Comparator; import java.util.UUID; @@ -31,15 +33,13 @@ public interface IFGObject { void setOwner(IOwner owner); - /** - * Gets the path suffix when storing references in paths. - * This allows objects of completely disparate types to be stored under the same name. - * Any types that share any hierarchy or can otherwise be used in place of another should have the same suffix. - * @return the path suffix. - */ - String getPathExtension(); + default String getFullName(){ + IOwner owner = getOwner(); + if(owner == null) owner = FGManager.SERVER_OWNER; + return owner.getCommandPath() + ":" + getFilter() + ":" + getName(); + } - String getFullName(); + String getFilter(); boolean stillExists(); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java index 7ffab13..16fef0a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/IGuardObject.java @@ -156,17 +156,6 @@ default boolean shouldSave() { return FGStorageManagerNew.getInstance().defaultModifiedMap.get(this); } - @Override - default String getFullName(){ - // TODO Rewrite full name impl to use paths with full owners or static IDs - IOwner owner = this.getOwner(); - String fullName = this.getName(); - if (owner != null && !owner.equals(FGManager.SERVER_OWNER)) { - fullName = owner + ":" + fullName; - } - return fullName; - } - default boolean stillExists(){ return FGManager.getInstance().contains(this); } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java deleted file mode 100644 index f927bcd..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/filter/IObjectFilter.java +++ /dev/null @@ -1,4 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.filter; - -public interface IObjectFilter { -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/OwnerManager.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/OwnerManager.java index 29b6487..f17340b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/OwnerManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/OwnerManager.java @@ -23,16 +23,14 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.plugin.util.Aliases; -import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.*; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider.*; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.text.Text; -import java.security.SecureRandom; import java.util.*; import java.util.function.BiFunction; import java.util.function.Function; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IDisplayableOwnerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IDisplayableOwnerProvider.java index 40c2784..058cd9b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IDisplayableOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IDisplayableOwnerProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.entity.living.player.Player; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IOwnerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IOwnerProvider.java index 54825e4..196f207 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/IOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/IOwnerProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider; import java.util.List; import java.util.Optional; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OfflineUserProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OfflineUserProvider.java index 7e7be40..a3aeb8f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OfflineUserProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OfflineUserProvider.java @@ -1,4 +1,4 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import org.spongepowered.api.command.CommandSource; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OnlinePlayerProvider.java similarity index 96% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OnlinePlayerProvider.java index 26b910a..c9e7c7f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/OnlinePlayerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/OnlinePlayerProvider.java @@ -1,4 +1,4 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider; import org.spongepowered.api.Sponge; import org.spongepowered.api.command.CommandSource; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/UUIDProvider.java similarity index 97% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/UUIDProvider.java index 989aa2a..5b60df7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/owner/provider/UUIDProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/ownerold/provider/UUIDProvider.java @@ -23,7 +23,7 @@ * THE SOFTWARE. */ -package net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider; +package net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider; import com.google.common.collect.ImmutableList; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java index 774b07a..cb364f1 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/FoxPath.java @@ -1,10 +1,10 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.DirectLocalOwnerElement; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IOwnerPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.OwnerPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner.DirectLocalOwnerElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner.IOwnerPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner.OwnerPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.world.World; @@ -29,10 +29,10 @@ public final class FoxPath { public static final String LOCAL_GROUP_PREFIX = "/"; public static final String WORKING_PATH_PREFIX = "./"; - public static final Root DEFAULT_ROOT = Root.SERVER_OWNER; - private static final PathManager PATH_MANAGER = PathManager.getInstance(); + public static final Root DEFAULT_ROOT = Root.SERVER_OWNER; + private int depth = 0; private Root root; private List pathNames = new ArrayList<>(); @@ -82,7 +82,7 @@ public IPathElement getCurrentElement() { } - public static Optional getObject(@Nonnull String input, @Nullable CommandSource source, @Nullable String extension, @Nullable World world) { + public static Optional getObjects(@Nonnull String input, @Nullable CommandSource source) { if (input.isEmpty()) return Optional.empty(); Root rootPath = Root.from(input); @@ -203,7 +203,7 @@ public enum Root implements Function { SERVER_OWNER(new DirectLocalOwnerElement.Suppier(true), SERVER_OWNER_PREFIX), // -> :// LOCAL_OWNER(new DirectLocalOwnerElement.Suppier(false), LOCAL_OWNER_PREFIX, LOCAL_OWNER_PREFIX_ALT), // -> :/ :~/ LITERAL_OWNER(source -> new OwnerPathElement.Literal(LITERAL_PREFIX), LITERAL_PREFIX), // -> :: - DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX), DYNAMIC_PREFIX, LOCAL_ALT_CHAR + DYNAMIC_PREFIX), // -> : ~: + DYNAMIC_OWNER(source -> new OwnerPathElement.Dynamic(DYNAMIC_PREFIX, source), DYNAMIC_PREFIX, LOCAL_ALT_CHAR + DYNAMIC_PREFIX), // -> : ~: SERVER_GROUP(source -> PATH_MANAGER.getServerGroup(), SERVER_GROUP_PREFIX), // -> // LOCAL_GROUP(PATH_MANAGER::getLocalGroup, LOCAL_GROUP_PREFIX, LOCAL_ALT_CHAR + LOCAL_GROUP_PREFIX), // -> / ~/ //WORKING_PATH(), diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java deleted file mode 100644 index edc90dd..0000000 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/IExtensionAdapter.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path; - -import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; - -import javax.annotation.Nonnull; -import java.util.Optional; - -/** - * Adapter used when trying to resolve object using an owner. - * Because owners don't hold onto references to objects - */ -public interface IExtensionAdapter { - - Optional getObject(@Nonnull String nameWithExtension); - -} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java index e6b1a0e..f4ab819 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/PathManager.java @@ -1,7 +1,10 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path; +import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.RootGroupElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group.LocalGroupElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group.ServerGroupElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.OwnerAdapterFactory; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.*; @@ -12,7 +15,9 @@ import javax.annotation.Nullable; import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; +import java.util.function.Function; /** * Created by fox on 3/7/18. @@ -22,28 +27,37 @@ public class PathManager { private Map> typeClassMap = new HashMap<>(); private Map, OwnerAdapterFactory> adapterMap = new HashMap<>(); private Map, PathOwnerProvider.Literal.Factory> literalPathProviderMap = new HashMap<>(); - private Map> dynamicPathProviderMap = new HashMap<>(); + private Map> dynamicPathProviderMap = new HashMap<>(); - private Map userLocalGroups = new CacheMap<>((key, map) -> { + private Map userLocalGroups = new CacheMap<>((key, map) -> { if (key instanceof UUID) { - RootGroupElement element = RootGroupElement.createLocal(); - map.put(((UUID) key), element); + UUID user = ((UUID) key); + LocalGroupElement element = new LocalGroupElement(user); + map.put(user, element); return element; } else return null; }); - private RootGroupElement serverLocalGroup = RootGroupElement.createLocal(); - private RootGroupElement serverGroup = RootGroupElement.createServer(this); + private LocalGroupElement serverLocalGroup = new LocalGroupElement(null); + private ServerGroupElement serverGroup = new ServerGroupElement(); + + private Map serverGroupExtensions = new HashMap<>(); + private Map> localGroupExtensions = new HashMap<>(); private PathManager() { registerOwnerType(UUIDOwner.TYPE, UUIDOwner.class, UUIDOwner.Adapter::new, - UUIDOwner.LiteralPathProvider::new); + UUIDOwner.LiteralPathOwnerProvider::new); registerOwnerType(NameOwner.TYPE, NameOwner.class, NameOwner.Adapter::new, - NameOwner.LiteralPathProvider::new); + NameOwner.LiteralPathOwnerProvider::new); registerOwnerType(NumberOwner.TYPE, NumberOwner.class, NumberOwner.Adapter::new, - NumberOwner.LiteralPathProvider::new); + NumberOwner.LiteralPathOwnerProvider::new); + + registerServerGroupExtension("s", this.serverLocalGroup); + registerServerGroupExtension("p", new ServerGroupElement.PlayerAccessNameElement()); + registerServerGroupExtension("o", new ServerGroupElement.PlayerAccessOfflineElement()); + registerServerGroupExtension("u", new ServerGroupElement.PlayerAccessUUIDElement()); } public static PathManager getInstance() { @@ -62,6 +76,18 @@ public boolean registerOwnerType( return true; } + public boolean registerServerGroupExtension(String name, IPathElement provider) { + if (this.serverGroupExtensions.containsKey(name)) return false; + this.serverGroupExtensions.put(name, provider); + return true; + } + + public boolean registerLocalGroupExtension(String name, Function provider) { + if (this.localGroupExtensions.containsKey(name)) return false; + this.localGroupExtensions.put(name, provider); + return true; + } + @SuppressWarnings("unchecked") public OwnerAdapterFactory getOwnerTypeAdapterFactory(Class tClass) { return (OwnerAdapterFactory) this.adapterMap.get(tClass); @@ -84,29 +110,56 @@ public PathOwnerProvider.Literal.Factory getLiteralPathOwne return this.getLiteralPathOwnerProvider(this.typeClassMap.get(type)); } - public PathOwnerProvider.Factory getDynamicPathOwnerProvider(String type) { + public PathOwnerProvider.Dynamic.Factory getDynamicPathOwnerProvider(String type) { return this.dynamicPathProviderMap.get(type); } - public RootGroupElement getServerLocalGroup() { + public LocalGroupElement getServerLocalGroup() { return serverLocalGroup; } - public RootGroupElement getServerGroup() { + public ServerGroupElement getServerGroup() { return serverGroup; } - public RootGroupElement getUserLocalGroup(@Nonnull UUID user) { + public LocalGroupElement getUserLocalGroup(@Nonnull UUID user) { return this.userLocalGroups.get(user); } - public RootGroupElement getLocalGroup(@Nullable UUID user) { + public LocalGroupElement getLocalGroup(@Nullable UUID user) { return user == null ? getServerLocalGroup() : getUserLocalGroup(user); } - public RootGroupElement getLocalGroup(@Nullable CommandSource source){ + public LocalGroupElement getLocalGroup(@Nullable CommandSource source) { return source instanceof User ? getUserLocalGroup(((User) source).getUniqueId()) : getServerLocalGroup(); } + public Optional getServerGroupExtension(String name) { + return Optional.ofNullable(this.serverGroupExtensions.get(name)); + } + + public Map getServerGroupExtensions() { + return ImmutableMap.copyOf(serverGroupExtensions); + } + + public Optional getLocalGroupExtension(String name, @Nullable UUID user) { + Function func = this.localGroupExtensions.get(name); + if (func != null) return Optional.ofNullable(func.apply(user)); + else return Optional.empty(); + } + + public Map> getLocalGroupExtensions() { + return ImmutableMap.copyOf(localGroupExtensions); + } + public Map getLocalGroupExtensions(@Nullable UUID user) { + ImmutableMap.Builder map = ImmutableMap.builder(); + for (Map.Entry> entry : this.localGroupExtensions.entrySet()) { + IPathElement element = entry.getValue().apply(user); + if (element != null) { + map.put(entry.getKey(), element); + } + } + return map.build(); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ExtendedGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ExtendedGroupElement.java new file mode 100644 index 0000000..52d28a6 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ExtendedGroupElement.java @@ -0,0 +1,21 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; + +import java.util.Map; +import java.util.Optional; + +public abstract class ExtendedGroupElement extends GroupElement { + + public Optional getExtension(String name){ + return Optional.ofNullable(this.getExtensions().get(name)); + } + + public abstract Map getExtensions(); + + @Override + public Optional resolve(String name, boolean create) { + if (name.startsWith(">")) return getExtension(name.substring(1)); + else return super.resolve(name, create); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/GroupElement.java similarity index 93% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/GroupElement.java index 410f59d..78be169 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/GroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/GroupElement.java @@ -1,7 +1,9 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group; import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IModifiablePathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.world.World; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/LocalGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/LocalGroupElement.java new file mode 100644 index 0000000..cf3959b --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/LocalGroupElement.java @@ -0,0 +1,28 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public class LocalGroupElement extends ExtendedGroupElement { + + public final UUID user; + + public LocalGroupElement(@Nullable UUID user) { + this.user = user; + } + + @Override + public Optional getExtension(String name) { + return PathManager.getInstance().getLocalGroupExtension(name, user); + } + + @Override + public Map getExtensions() { + return PathManager.getInstance().getLocalGroupExtensions(this.user); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ServerGroupElement.java similarity index 77% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ServerGroupElement.java index 179461b..800f0b7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/RootGroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/ServerGroupElement.java @@ -1,8 +1,9 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group; -import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.object.path.PathManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathOnlyElement; import org.spongepowered.api.Sponge; import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.User; @@ -11,44 +12,21 @@ import org.spongepowered.api.util.GuavaCollectors; import org.spongepowered.api.util.Identifiable; -import javax.annotation.Nullable; import java.util.*; -public class RootGroupElement extends StructuredGroupElement { - - public RootGroupElement() { - this(ImmutableMap.of()); - } - - public RootGroupElement(Map fixedChildren) { - super(fixedChildren); - } +public class ServerGroupElement extends ExtendedGroupElement { @Override - public boolean isPersistent() { - return true; - } - - public static RootGroupElement createServer(@Nullable PathManager manager) { - if(manager == null) manager = PathManager.getInstance(); - Map fixed = new HashMap<>(); - - fixed.put("s", manager.getServerLocalGroup()); - - fixed.put("p", new PlayerAccessNameElement()); - - fixed.put("o", new PlayerAccessOfflineElement()); - - fixed.put("u", new PlayerAccessUUIDElement()); - - return new RootGroupElement(fixed); + public Optional getExtension(String name) { + return PathManager.getInstance().getServerGroupExtension(name); } - public static RootGroupElement createLocal() { - return new RootGroupElement(); + @Override + public Map getExtensions() { + return PathManager.getInstance().getServerGroupExtensions(); } - private static class PlayerAccessNameElement implements IPathOnlyElement, IPathElement { + public static class PlayerAccessNameElement implements IPathOnlyElement { @Override public Optional resolve(String name) { @@ -66,7 +44,7 @@ public Collection getPathSuggestions() { } } - private static class PlayerAccessOfflineElement implements IPathOnlyElement, IPathElement { + public static class PlayerAccessOfflineElement implements IPathOnlyElement { @Override public Optional resolve(String name) { @@ -88,7 +66,7 @@ public Collection getPathSuggestions() { } } - private static class PlayerAccessUUIDElement implements IPathOnlyElement, IPathElement { + public static class PlayerAccessUUIDElement implements IPathOnlyElement { public static final String UUID_REGEX = "[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}"; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/StructuredGroupElement.java similarity index 87% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/StructuredGroupElement.java index 15c1908..864ef9d 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/StructuredGroupElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/group/StructuredGroupElement.java @@ -1,6 +1,7 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.group; import com.google.common.collect.ImmutableMap; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectLocalOwnerElement.java similarity index 90% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectLocalOwnerElement.java index 7c8ebe3..e65dbe0 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectLocalOwnerElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectLocalOwnerElement.java @@ -1,9 +1,10 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner; import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxcore.common.util.CacheMap; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import org.spongepowered.api.command.CommandSource; @@ -25,7 +26,7 @@ public class DirectLocalOwnerElement implements IOwnerPathElement { public DirectLocalOwnerElement(@Nullable UUID uuid) { this.uuid = uuid; - owner = uuid == null ? FGManager.SERVER_OWNER :new UUIDOwner(UUIDOwner.USER_GROUP, this.uuid); + owner = uuid == null ? FGManager.SERVER_OWNER : new UUIDOwner(UUIDOwner.USER_GROUP, uuid); } @Override @@ -57,7 +58,11 @@ public boolean isFinished() { @Override public boolean isValid() { - return false; + return true; + } + + public UUID getUuid() { + return uuid; } @Override diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectOwnerElement.java similarity index 93% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectOwnerElement.java index b48db0a..b41749a 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/DirectOwnerElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/DirectOwnerElement.java @@ -1,6 +1,7 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import org.spongepowered.api.world.World; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/IOwnerPathElement.java similarity index 81% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/IOwnerPathElement.java index 9f5f3e7..5c6ead4 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/IOwnerPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/IOwnerPathElement.java @@ -1,5 +1,6 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.element.IPathElement; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.Optional; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/OwnerPathElement.java similarity index 91% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/OwnerPathElement.java index f20333f..365d243 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/OwnerPathElement.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/element/owner/OwnerPathElement.java @@ -1,4 +1,4 @@ -package net.foxdenstudio.sponge.foxguard.plugin.object.path.element; +package net.foxdenstudio.sponge.foxguard.plugin.object.path.element.owner; import com.google.common.collect.ImmutableMap; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; @@ -6,6 +6,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.PathOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.world.World; import javax.annotation.Nonnull; @@ -123,25 +124,29 @@ public Optional resolve(String name) { } } - public static class Dynamic extends OwnerPathElement> { + public static class Dynamic extends OwnerPathElement> { public final String type; + public final CommandSource source; - public Dynamic(String prefix) { + public Dynamic(String prefix, CommandSource source) { super(prefix); this.type = null; + this.source = source; } private Dynamic(Dynamic parent, String next) { super(parent, next); + this.source = parent.source; int size = this.currentPath.size(); this.type = size > 0 ? this.currentPath.get(0) : null; if (size > 0) { - PathOwnerProvider.Factory providerFactory = MANAGER.getDynamicPathOwnerProvider(this.type); + PathOwnerProvider.Dynamic.Factory providerFactory = MANAGER.getDynamicPathOwnerProvider(this.type); if (providerFactory != null) { this.provider = providerFactory.get(); + this.provider.setSource(source); for (int i = 1; i < size; i++) { String element = this.currentPath.get(i); this.provider.apply(element); diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/DynamicPathOwnerProviderBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/DynamicPathOwnerProviderBase.java new file mode 100644 index 0000000..722dab5 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/DynamicPathOwnerProviderBase.java @@ -0,0 +1,22 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider; + +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; +import org.spongepowered.api.command.CommandSource; + +import javax.annotation.Nullable; +import java.util.Optional; + +public abstract class DynamicPathOwnerProviderBase implements PathOwnerProvider.Dynamic { + + protected CommandSource source; + + @Override + public void setSource(@Nullable CommandSource source) { + this.source = source; + } + + @Override + public Optional getSource() { + return Optional.ofNullable(source); + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathOwnerProviderBase.java similarity index 53% rename from src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java rename to src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathOwnerProviderBase.java index e0e75b1..578db09 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathProviderBase.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/LiteralPathOwnerProviderBase.java @@ -4,14 +4,19 @@ import javax.annotation.Nonnull; -public abstract class LiteralPathProviderBase implements PathOwnerProvider.Literal { +public abstract class LiteralPathOwnerProviderBase implements PathOwnerProvider.Literal { - protected String group; + protected String group = "null"; @Override public boolean setGroup(@Nonnull String group) { - if(group.isEmpty()) return false; + if (group.isEmpty()) return false; this.group = group; return true; } + + @Override + public String getGroup() { + return this.group; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java index db4bab6..3ac5556 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/provider/PathOwnerProvider.java @@ -3,9 +3,13 @@ import com.google.common.collect.ImmutableList; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import org.spongepowered.api.command.CommandSource; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collection; import java.util.Optional; +import java.util.function.Function; import java.util.function.Supplier; public interface PathOwnerProvider { @@ -25,19 +29,37 @@ default Collection getSuggestions() { Optional getOwner(); - interface Factory extends Supplier>{ + interface Dynamic extends PathOwnerProvider{ + void setSource(@Nullable CommandSource source); + + Optional getSource(); + + /** + * Interface for Provider factory. This class does not normally need to be fully implemented, + * as a method reference to a single arg constructor of type {@code CommandSource} is usually sufficient. + * + * @param The particular type of {@code IOwner} this factory generates providers for. + */ + + interface Factory extends Supplier< Dynamic> { + + @Override + Dynamic get(); + } } interface Literal extends PathOwnerProvider { - boolean setGroup(String group); + boolean setGroup(@Nonnull String group); + + String getGroup(); /** - * Interface for Provider factory. This class does not normally need to be fully implemented, + * Interface for a Literal Provider factory. This class does not normally need to be fully implemented, * as a method reference to a no-args constructor is usually sufficient. * - * @param + * @param The particular type of {@code BaseOwner} this factory generates providers for. */ interface Factory extends Supplier> { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java index 05eaa58..e90d3d8 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/BaseOwner.java @@ -47,8 +47,15 @@ public final Path getDirectory() { return Paths.get(FGStorageManagerNew.OWNERS_DIR_NAME, group, type).resolve(getPartialDirectory()); } + @Override + public String getCommandPath() { + return "::" + this.group + "/" + this.type + "/" + getPartialCommandPath(); + } + protected abstract Path getPartialDirectory(); + protected abstract String getPartialCommandPath(); + @Override public boolean equals(Object o) { if (this == o) return true; @@ -149,6 +156,8 @@ public BaseOwner read(JsonReader in) throws IOException { } in.endObject(); + if (owner != null) return owner; + if (group == null || group.isEmpty() || type == null || type.isEmpty()) return null; if (tree != null) { @@ -160,21 +169,6 @@ public BaseOwner read(JsonReader in) throws IOException { return owner; } - public static class Factory implements TypeAdapterFactory { - - public static final Factory INSTANCE = new Factory(); - - private Factory(){} - - @SuppressWarnings("unchecked") - @Override - public TypeAdapter create(Gson gson, TypeToken type) { - if (!BaseOwner.class.isAssignableFrom(type.getRawType())) return null; - TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); - Adapter adapter = new Adapter(jsonElementTypeAdapter, gson); - return (TypeAdapter) adapter; - } - } } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java index 5f9b113..6f820d2 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/IOwner.java @@ -1,11 +1,21 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; +import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; import org.spongepowered.api.world.World; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.io.IOException; import java.nio.file.Path; import java.util.Optional; @@ -16,6 +26,12 @@ public interface IOwner extends Comparable { @Override String toString(); + /** + * Get the absolute string to reference this owner, including prefix + * @return + */ + String getCommandPath(); + @Override boolean equals(Object owner); @@ -30,4 +46,58 @@ default Optional getObject(@Nonnull String name, @Nullable return Optional.empty(); } + class Adapter extends TypeAdapter { + + private final TypeAdapter baseOwnerTypeAdapter; + private final Gson gson; + + public Adapter(TypeAdapter baseOwnerTypeAdapter, Gson gson) { + this.baseOwnerTypeAdapter = baseOwnerTypeAdapter; + this.gson = gson; + } + + @Override + public void write(JsonWriter out, IOwner value) throws IOException { + if (value == null || value instanceof ServerOwner) { + out.nullValue(); + } else if (value instanceof BaseOwner) { + baseOwnerTypeAdapter.write(out, (BaseOwner) value); + } else { + out.nullValue(); + FoxGuardMain.instance().getLogger().warn("Failed to serialize an IOwner that isn't a BaseOwner or ServerOwner. Defaulting to server owner"); + } + } + + @Override + public IOwner read(JsonReader in) throws IOException { + if(in.peek() == JsonToken.NULL){ + in.nextNull(); + return ServerOwner.SERVER; + } else { + return baseOwnerTypeAdapter.read(in); + } + } + } + + class Factory implements TypeAdapterFactory { + + public static final Factory INSTANCE = new Factory(); + + private Factory() { + } + + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (BaseOwner.class.isAssignableFrom(type.getRawType())) { + TypeAdapter jsonElementTypeAdapter = gson.getAdapter(JsonElement.class); + BaseOwner.Adapter adapter = new BaseOwner.Adapter(jsonElementTypeAdapter, gson); + return (TypeAdapter) adapter; + } else if (IOwner.class.equals(type.getRawType()) || ServerOwner.class.equals(type.getRawType())) { + TypeAdapter baseOwnerAdapter = gson.getAdapter(BaseOwner.class); + IOwner.Adapter adapter = new IOwner.Adapter(baseOwnerAdapter, gson); + return (TypeAdapter) adapter; + } else return null; + } + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java index 5bbe686..0eb4b29 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NameOwner.java @@ -24,6 +24,11 @@ public Path getPartialDirectory() { return Paths.get(key); } + @Override + protected String getPartialCommandPath() { + return key; + } + @Override public String toString() { return "NameOwner{" + this.group + ", " + this.key + '}'; @@ -47,7 +52,7 @@ public NameOwner read(JsonReader in) throws IOException { } } - public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { + public static class LiteralPathOwnerProvider extends SingleKeyOwner.LiteralPathOwnerProvider { @Override protected String process(String element) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java index 03a4db5..78d7b3e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/NumberOwner.java @@ -23,6 +23,11 @@ protected Path getPartialDirectory() { return Paths.get(key.toString()); } + @Override + protected String getPartialCommandPath() { + return key.toString(); + } + @Override public String toString() { return "NumberOwner{" + this.group + ", " + this.key + '}'; @@ -47,7 +52,7 @@ public NumberOwner read(JsonReader in) { } - public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { + public static class LiteralPathOwnerProvider extends SingleKeyOwner.LiteralPathOwnerProvider { @Override protected Integer process(String element) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java index fc98edd..df0505e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/ServerOwner.java @@ -1,5 +1,7 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.FoxPath; + import javax.annotation.Nonnull; import java.nio.file.Path; import java.nio.file.Paths; @@ -21,8 +23,18 @@ public String toString() { return "Server-Owner"; } + @Override + public String getCommandPath() { + return FoxPath.SERVER_OWNER_PREFIX; + } + @Override public int compareTo(@Nonnull IOwner o) { return equals(o) ? 0 : -1; } + + @Override + public int hashCode() { + return 42; + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java index d04fb48..5ac512b 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyComparableOwner.java @@ -14,6 +14,7 @@ public int compareTo(@Nonnull IOwner o) { if (o instanceof BaseOwner) { BaseOwner baseOwner = ((BaseOwner) o); int compare = super.compareTo(baseOwner); + if (compare != 0) return compare; if (o instanceof SingleKeyComparableOwner) { SingleKeyComparableOwner comparableOwner = ((SingleKeyComparableOwner) o); if (this.key.getClass() == comparableOwner.key.getClass()) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java index 218275d..4a518a7 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/SingleKeyOwner.java @@ -1,6 +1,6 @@ package net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.LiteralPathProviderBase; +import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.provider.LiteralPathOwnerProviderBase; import javax.annotation.Nonnull; import java.util.Objects; @@ -35,11 +35,10 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(super.hashCode(), this.key); } - public static abstract class LiteralPathProvider extends LiteralPathProviderBase { + public static abstract class LiteralPathOwnerProvider extends LiteralPathOwnerProviderBase { T key = null; boolean valid = false; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java index dc37a88..3ea7496 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/path/owner/types/UUIDOwner.java @@ -22,7 +22,7 @@ public UUIDOwner(@Nonnull String group, @Nonnull UUID uuid) { super(TYPE, group, uuid); } - public UUIDOwner(User user){ + public UUIDOwner(User user) { this(USER_GROUP, user.getUniqueId()); } @@ -31,6 +31,11 @@ public Path getPartialDirectory() { return Paths.get(key.toString()); } + @Override + protected String getPartialCommandPath() { + return key.toString(); + } + @Override public String toString() { return "UUIDOwner{" + this.group + ", " + this.key + '}'; @@ -54,7 +59,7 @@ public UUIDOwner read(JsonReader in) { } } - public static class LiteralPathProvider extends SingleKeyOwner.LiteralPathProvider { + public static class LiteralPathOwnerProvider extends SingleKeyOwner.LiteralPathOwnerProvider { @Override protected UUID process(String element) { diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/FGBaseProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/FGBaseProvider.java new file mode 100644 index 0000000..9e50737 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/FGBaseProvider.java @@ -0,0 +1,81 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.provider; + +import com.google.common.collect.ImmutableList; +import net.foxdenstudio.sponge.foxguard.plugin.controller.IController; +import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; +import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.util.GuavaCollectors; +import org.spongepowered.api.util.StartsWithPredicate; +import org.spongepowered.api.world.World; + +import javax.annotation.Nonnull; +import java.util.Collection; +import java.util.stream.Stream; + +public class FGBaseProvider implements IObjectProvider { + + public static final String[] PREFIXES = {"r", "wr", "sr", "h", "c"}; + + + @Override + public Collection filter(@Nonnull Collection objects, @Nonnull String prefix, @Nonnull String[] args, @Nonnull CommandSource source) { + Stream stream = objects.stream(); + + switch (prefix) { + case "r": + stream = stream.filter((ifgObject -> { + if (ifgObject instanceof IRegion) { + if (ifgObject instanceof IWorldRegion && args.length > 0 && !args[0].isEmpty()) { + return ((IWorldRegion) ifgObject).getWorld().getName().equalsIgnoreCase(args[0]); + } + return true; + } else return false; + })); + break; + case "wr": + stream = stream.filter((ifgObject -> { + if (ifgObject instanceof IWorldRegion) { + if (args.length > 0 && !args[0].isEmpty()) { + return ((IWorldRegion) ifgObject).getWorld().getName().equalsIgnoreCase(args[0]); + } + return true; + } else return false; + })); + break; + case "sr": + stream = stream.filter((ifgObject -> { + if (ifgObject instanceof IRegion) { + return !(ifgObject instanceof IWorldRegion); + } else return false; + })); + break; + case "h": + stream = stream.filter((ifgObject -> ifgObject instanceof IHandler)); + break; + case "c": + stream = stream.filter((ifgObject -> ifgObject instanceof IController)); + break; + } + + return stream.collect(GuavaCollectors.toImmutableList()); + } + + @Override + public Collection getFilterSuggestions(@Nonnull String prefix, @Nonnull String[] args, @Nonnull CommandSource source) { + if (args.length == 1 && (prefix.equalsIgnoreCase("r") || prefix.equalsIgnoreCase("wr"))) { + return Sponge.getServer().getWorlds().stream() + .map(World::getName) + .filter(new StartsWithPredicate(args[0])) + .collect(GuavaCollectors.toImmutableList()); + } else return ImmutableList.of(); + } + + @Override + public String[] getPrefixes() { + return PREFIXES; + } +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/IObjectProvider.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/IObjectProvider.java new file mode 100644 index 0000000..cd2a239 --- /dev/null +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/object/provider/IObjectProvider.java @@ -0,0 +1,26 @@ +package net.foxdenstudio.sponge.foxguard.plugin.object.provider; + +import net.foxdenstudio.sponge.foxguard.plugin.object.IFGObject; +import org.spongepowered.api.command.CommandSource; + +import javax.annotation.Nonnull; +import java.util.Collection; + +public interface IObjectProvider { + + /** + * Method for filtering out objects by filter query. + * + * @param objects the collection to filter. + * @param args the filter arguments + * @param source the command source of the command. + * @return + */ + Collection filter(@Nonnull Collection objects, @Nonnull String prefix, @Nonnull String[] args, @Nonnull CommandSource source); + + + + Collection getFilterSuggestions(@Nonnull String prefix, @Nonnull String[] args, @Nonnull CommandSource source); + + String[] getPrefixes(); +} diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java index 811aa0c..d279c81 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/IRegion.java @@ -37,8 +37,6 @@ */ public interface IRegion extends IGuardObject, ILinkable, IBounded { - String SUFFIX = "r"; - @Override Set getLinks(); @@ -48,7 +46,7 @@ default boolean saveLinks() { } @Override - default String getPathExtension() { - return SUFFIX; + default String getFilter(){ + return "r"; } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/IWorldRegion.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/IWorldRegion.java index e622df1..c3d8614 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/IWorldRegion.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/region/world/IWorldRegion.java @@ -35,4 +35,9 @@ public interface IWorldRegion extends IRegion, IWorldBounded { World getWorld(); void setWorld(World world); + + @Override + default String getFilter() { + return "wr/" + getWorld().getName(); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java index 595ef8d..de24a6f 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSLegacyLoader.java @@ -1,12 +1,12 @@ package net.foxdenstudio.sponge.foxguard.plugin.storage; import net.foxdenstudio.sponge.foxguard.plugin.FGManager; -import net.foxdenstudio.sponge.foxguard.plugin.FoxGuardMain; import net.foxdenstudio.sponge.foxguard.plugin.config.FGConfigManager; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.Serializer; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.nio.file.Files; import java.nio.file.Path; @@ -20,10 +20,12 @@ */ public class FGSLegacyLoader { + public static String LOGGER_NAME = FGStorageManagerNew.LOGGER_NAME + ".legacy"; + private static final int VERSION = 1; private static FGSLegacyLoader instance = new FGSLegacyLoader(); - private final Logger logger = FoxGuardMain.instance().getLogger(); + private final Logger logger = LoggerFactory.getLogger(LOGGER_NAME); public static FGSLegacyLoader getInstance() { return instance; diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java index 2145e33..1034935 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectIndex.java @@ -31,6 +31,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import java.util.List; +import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -90,4 +91,20 @@ public List getLinks() { public void setLinks(List links) { this.links = links; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + FGSObjectIndex that = (FGSObjectIndex) o; + return Objects.equals(enabled, that.enabled) && + Objects.equals(priority, that.priority) && + Objects.equals(links, that.links); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), enabled, priority, links); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java index 8f53b81..45a2d1e 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectMeta.java @@ -29,6 +29,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; +import java.util.Objects; import java.util.UUID; /** @@ -83,4 +84,19 @@ public String toString() { sb.append('}'); return sb.toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + FGSObjectMeta that = (FGSObjectMeta) o; + return Objects.equals(category, that.category) && + Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), category, type); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java index 3aed483..98aa6c6 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGSObjectPath.java @@ -29,6 +29,7 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; +import java.util.Objects; import java.util.UUID; /** @@ -72,4 +73,18 @@ public IOwner getOwner() { public void setOwner(IOwner owner) { this.owner = owner; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FGSObjectPath that = (FGSObjectPath) o; + return Objects.equals(name, that.name) && + Objects.equals(owner, that.owner); + } + + @Override + public int hashCode() { + return Objects.hash(name, owner); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java index 97a2faa..abd9a60 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FGStorageManagerNew.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableList; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; @@ -46,12 +47,12 @@ import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; import net.foxdenstudio.sponge.foxguard.plugin.object.ILinkable; import net.foxdenstudio.sponge.foxguard.plugin.object.factory.FGFactoryManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.BaseOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.IRegion; import net.foxdenstudio.sponge.foxguard.plugin.region.world.IWorldRegion; import net.foxdenstudio.sponge.foxguard.plugin.util.FGUtil; import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.spongepowered.api.Server; import org.spongepowered.api.Sponge; import org.spongepowered.api.entity.living.player.User; @@ -88,13 +89,15 @@ public class FGStorageManagerNew { public static final String METADATA_FILE_NAME = "metadata.foxcf"; public static final String OWNERS_DIR_NAME = "owners"; public static final Charset CHARSET = StandardCharsets.UTF_8; + public static final String LOGGER_NAME = FoxGuardMain.LOGGER_NAME + ".storage"; + private static final Type INDEX_LIST_TYPE = new TypeToken() { }.getType(); private static FGStorageManagerNew instance; public final HashMap defaultModifiedMap; private final FGConfigManager config; private final UserStorageService userStorageService; - private final Logger logger = FoxGuardMain.instance().getLogger(); + private final Logger logger = LoggerFactory.getLogger(LOGGER_NAME); private final FGManager manager = FGManager.getInstance(); private final Map worldDirectories; private Gson gson; @@ -161,7 +164,7 @@ private void saveIndex(Set objects, Path file) { boolean autoSave = object.autoSave(); if (autoSave || saveLinks) { FGSObjectIndex index = new FGSObjectIndex(object); - if (index.owner.equals(SERVER_OWNER)) index.owner = null; + //if (index.owner.equals(SERVER_OWNER)) index.owner = null; if (!autoSave) { index.type = null; index.enabled = null; @@ -207,7 +210,7 @@ public void saveObject(IGuardObject object, boolean force) { boolean shouldSave = object.shouldSave(); if (force || shouldSave) { - Path directory = getObjectDirectory(object); + Path directory = getObjectDirectory(object, true); String category = FGUtil.getCategory(object); logger.info((shouldSave ? "S" : "Force s") + "aving " + category + " " + logName + " in directory: " + directory); try { @@ -245,7 +248,7 @@ public void saveObjects(Set objects, boolean force) { public void addObject(IGuardObject object) { if (reentry) return; - Path directory = getObjectDirectory(object); + Path directory = getObjectDirectory(object, false); if (Files.exists(directory)) { if (Files.isDirectory(directory)) { deleteDirectory(directory, true); @@ -258,15 +261,14 @@ public void addObject(IGuardObject object) { return; } } - saveObject(object); - updateIndexFor(object); - } + saveObject(object); + updateIndexFor(object); } public void removeObject(IGuardObject object) { if (reentry) return; - Path directory = getObjectDirectory(object); + Path directory = getObjectDirectory(object, false); if (config.cleanOnDelete()) { if (Files.exists(directory)) { if (Files.isDirectory(directory)) { @@ -315,7 +317,7 @@ private RegionEntry(IRegion region, FGSObjectIndex index) { for (FGSObjectIndex index : regionConfig.data) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.REGION) { - Path directory = getObjectDirectory(index, null); + Path directory = getObjectDirectory(index, null, false); Optional fgObjectOptional = loadObject(directory, index, null); if (fgObjectOptional.isPresent()) { IGuardObject fgObject = fgObjectOptional.get(); @@ -358,7 +360,7 @@ private ControllerEntry(IController controller, FGSObjectIndex index, Path direc for (FGSObjectIndex index : handlerConfig.data) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.HANDLER || fgCat == FGCat.CONTROLLER) { - Path directory = getObjectDirectory(index, null); + Path directory = getObjectDirectory(index, null, false); Optional fgObjectOptional = loadObject(directory, index, null); if (fgObjectOptional.isPresent()) { IGuardObject fgObject = fgObjectOptional.get(); @@ -445,7 +447,7 @@ public void loadWorld(World world) { for (FGSObjectIndex index : worldRegionConfig.data) { FGCat fgCat = FGCat.from(index.category); if (fgCat == FGCat.WORLDREGION) { - Path directory = getObjectDirectory(index, world); + Path directory = getObjectDirectory(index, world, false); Optional fgObjectOptional = loadObject(directory, index, world); if (fgObjectOptional.isPresent()) { IGuardObject fgObject = fgObjectOptional.get(); @@ -490,6 +492,8 @@ public Optional loadIndex(Path indexFile) { index = gson.fromJson(jsonReader, INDEX_LIST_TYPE); } catch (IOException e) { logger.error("Failed to open index for reading: " + indexFile, e); + } catch (JsonParseException e) { + logger.error("Failed to parse index JSON: " + indexFile, e); } } else { logger.warn("Index file does not exist: " + indexFile); @@ -507,6 +511,8 @@ public Optional loadObject(Path directory, @Nullable FGSObjectInde metadata = gson.fromJson(jsonReader, FGSObjectMeta.class); } catch (IOException e) { logger.error("Failed to open metadata for reading: " + metadataFile, e); + } catch (JsonParseException e) { + logger.error("Failed to parse metadata JSON: " + metadataFile, e); } } @@ -573,7 +579,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectInde data.setEnabled(index.enabled); StringBuilder infoMessage = new StringBuilder(); - infoMessage.append("Foxguard object info loaded! Category: \"").append(category).append("\", "); + infoMessage.append("FoxGuard object info loaded! Category: \"").append(category).append("\", "); infoMessage.append("Type: \"").append(type).append("\", "); infoMessage.append("Name: \"").append(name).append("\", "); if (isOwned) infoMessage.append("Owner: \"").append(ownerName).append("\", "); @@ -597,7 +603,7 @@ public Optional loadObject(Path directory, @Nullable FGSObjectInde public GsonBuilder getGsonBuilder() { GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapterFactory(BaseOwner.Adapter.Factory.INSTANCE); + builder.registerTypeAdapterFactory(IOwner.Factory.INSTANCE); if (prettyPrint) builder.setPrettyPrinting(); return builder; @@ -990,7 +996,7 @@ private boolean isEmptyDirectory(Path directory) { } } - private Path getObjectDirectory(IGuardObject object) { + private Path getObjectDirectory(IGuardObject object, boolean construct) { World world = null; boolean flag = false; if (object instanceof IWorldBound) { @@ -1001,19 +1007,21 @@ private Path getObjectDirectory(IGuardObject object) { object.getOwner(), object.getName(), flag, - world); + world, + construct); } - private Path getObjectDirectory(FGSObjectMeta meta, @Nullable World world) { + private Path getObjectDirectory(FGSObjectMeta meta, @Nullable World world, boolean construct) { FGCat fgCat = FGCat.from(meta.category); return getObjectDirectory(fgCat, meta.owner, meta.name, fgCat == FGCat.WORLDREGION, - world); + world, + construct); } - private Path getObjectDirectory(FGCat fgCat, IOwner owner, String name, boolean inWorld, @Nullable World world) { + private Path getObjectDirectory(FGCat fgCat, IOwner owner, String name, boolean inWorld, @Nullable World world, boolean construct) { if (fgCat == null) fgCat = FGCat.OBJECT; Path dir; if (inWorld) { @@ -1033,8 +1041,8 @@ private Path getObjectDirectory(FGCat fgCat, IOwner owner, String name, boolean if (ownerFirst) dir = dir.resolve(fgCat.pathName); dir = dir.resolve(name.toLowerCase()); - - constructDirectories(dir); + if (construct) + constructDirectories(dir); return dir; } @@ -1192,7 +1200,7 @@ public String getIndexFile() { public abstract IGuardObject loadInstance(Path directory, String type, FGObjectData data); } - public static class IndexConfig extends FoxConfig>{ + public static class IndexConfig extends FoxConfig> { public IndexConfig() { } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java index d5bc1c8..64e0390 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfig.java @@ -9,5 +9,6 @@ public FoxConfig() { public FoxConfig(T data, Integer version) { super(version); this.data = data; + this.hash = data.hashCode(); } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java index b730063..bc4a976 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/storage/FoxConfigStub.java @@ -2,6 +2,7 @@ public class FoxConfigStub { public Integer version; + public Integer hash; public FoxConfigStub() { } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java index ce6f8f5..c802992 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/DebugManager.java @@ -48,7 +48,10 @@ public class DebugManager extends FCCommandBase { @Override public CommandResult process(CommandSource source, String arguments) throws CommandException { String[] parts = arguments.split(" +"); - if (parts.length == 0) return CommandResult.empty(); + if (parts.length == 0) { + source.sendMessage(getUsage(source)); + return CommandResult.empty(); + } switch (parts[0]) { case "on": @@ -124,4 +127,9 @@ public void printBlockEvent(ChangeBlockEvent event) { FoxGuardMain.instance().getLogger().info(sb.toString()); } } + + @Override + public Text getUsage(CommandSource source) { + return Text.of("debug "); + } } diff --git a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java index 6553262..1b57c61 100644 --- a/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java +++ b/src/main/java/net/foxdenstudio/sponge/foxguard/plugin/util/FGUtil.java @@ -36,8 +36,8 @@ import net.foxdenstudio.sponge.foxguard.plugin.handler.IHandler; import net.foxdenstudio.sponge.foxguard.plugin.object.IGlobal; import net.foxdenstudio.sponge.foxguard.plugin.object.IGuardObject; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.OwnerManager; -import net.foxdenstudio.sponge.foxguard.plugin.object.owner.provider.IOwnerProvider; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.OwnerManager; +import net.foxdenstudio.sponge.foxguard.plugin.object.ownerold.provider.IOwnerProvider; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.IOwner; import net.foxdenstudio.sponge.foxguard.plugin.object.path.owner.types.UUIDOwner; import net.foxdenstudio.sponge.foxguard.plugin.region.GlobalRegion; @@ -281,7 +281,10 @@ public static IRegion getRegionFromCommand(CommandSource source, OwnerResult qua public static OwnerResult processUserInput(String input) throws CommandException { - if (input.startsWith(":")) input = input.substring(1); + + return new OwnerResult(input, FGManager.SERVER_OWNER, FGManager.SERVER_OWNER.toString()); + + /*if (input.startsWith(":")) input = input.substring(1); String[] parts = input.split(":", 3); String name = null; @@ -312,7 +315,7 @@ else if (name.isEmpty()) String errorName = (provider != null ? provider + ":" : "") + ownerQualifier; throw new CommandException(Text.of("\"" + errorName + "\" is not a valid owner!")); } - return new OwnerResult(name, new UUIDOwner(UUIDOwner.USER_GROUP, ownerOpt.get()), ownerQualifier); + return new OwnerResult(name, new UUIDOwner(UUIDOwner.USER_GROUP, ownerOpt.get()), ownerQualifier);*/ } public static OwnerTabResult getOwnerSuggestions(String input) {