From e9b62e3fbcede9587c757889c5ad3876188a1223 Mon Sep 17 00:00:00 2001 From: TheComputerGeek2 Date: Sun, 21 May 2017 22:13:12 -0700 Subject: [PATCH] Add PredicateOnlineTo Provides a predicate for checking if a given SenderEntity is online to a given command sender Allow priority lines to use mson --- .../massivecore/PriorityLines.java | 59 +++++++++++-------- .../PredicateSenderEntityOnlineTo.java | 35 +++++++++++ .../massivecore/util/FlattenUtil.java | 50 ++++++++++++++++ 3 files changed, 120 insertions(+), 24 deletions(-) create mode 100644 src/com/massivecraft/massivecore/predicate/PredicateSenderEntityOnlineTo.java create mode 100644 src/com/massivecraft/massivecore/util/FlattenUtil.java diff --git a/src/com/massivecraft/massivecore/PriorityLines.java b/src/com/massivecraft/massivecore/PriorityLines.java index 36646183..d6122248 100644 --- a/src/com/massivecraft/massivecore/PriorityLines.java +++ b/src/com/massivecraft/massivecore/PriorityLines.java @@ -1,12 +1,13 @@ package com.massivecraft.massivecore; +import com.massivecraft.massivecore.collections.MassiveList; import com.massivecraft.massivecore.comparator.ComparatorIdentity; import com.massivecraft.massivecore.comparator.ComparatorPrioritized; +import com.massivecraft.massivecore.mson.Mson; import com.massivecraft.massivecore.util.MUtil; +import com.massivecraft.massivecore.util.FlattenUtil; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedList; +import java.util.Collection; import java.util.List; import java.util.Objects; @@ -20,30 +21,32 @@ public class PriorityLines implements Prioritized, Comparable @Override public int getPriority() { return this.priority; } public void setPriority(int priority) { this.priority = priority; } - private List lines; - public List getLines() { return this.lines; } - public void setLines(List lines) { this.lines = lines; } - public void setLines(String... lines) { this.setLines(Arrays.asList(lines)); } - public void setLines(String line) { this.setLines(Collections.singletonList(line)); } - + private List lines; + public List getLines() { return Mson.toPlain(this.lines, true); } + public void setLines(Object... lines) + { + Collection linesList = FlattenUtil.flatten(lines); + List msonLines = new MassiveList<>(); + + // Extract the items from the array + for (Object line: linesList) + { + msonLines.add(ensureMson(line)); + } + this.lines = msonLines; + } + + public void setLine(Object line) { this.setLines(line); }; + public List getLinesMson() { return new MassiveList<>(this.lines); } + // -------------------------------------------- // // CONSTRUCT // -------------------------------------------- // - public PriorityLines(int priority, List lines) + public PriorityLines(int priority, Object... lines) { this.priority = priority; - this.lines = lines; - } - - public PriorityLines(int priority, String... lines) - { - this(priority, Arrays.asList(lines)); - } - - public PriorityLines(int priority) - { - this(priority, new LinkedList()); + this.setLines(lines); } // -------------------------------------------- // @@ -71,7 +74,6 @@ public class PriorityLines implements Prioritized, Comparable if (ret != 0) return ret; ret = ComparatorIdentity.get().compare(this, that); - if (ret != 0) return ret; // Return return ret; @@ -80,7 +82,7 @@ public class PriorityLines implements Prioritized, Comparable @Override public boolean equals(Object object) { - if ( ! (object instanceof PriorityLines)) return false; + if (!(object instanceof PriorityLines)) return false; PriorityLines that = (PriorityLines)object; return MUtil.equals( this.getPriority(), that.getPriority(), @@ -97,6 +99,15 @@ public class PriorityLines implements Prioritized, Comparable ); } + // -------------------------------------------- // + // UTIL + // -------------------------------------------- // + + private static Mson ensureMson(Object messageItem) + { + if (messageItem instanceof Mson) return (Mson) messageItem; + if (messageItem instanceof String) return Mson.fromParsedMessage((String) messageItem); + throw new IllegalArgumentException(String.format("messageItem is neither an Mson or String, %s", messageItem)); + } - } diff --git a/src/com/massivecraft/massivecore/predicate/PredicateSenderEntityOnlineTo.java b/src/com/massivecraft/massivecore/predicate/PredicateSenderEntityOnlineTo.java new file mode 100644 index 00000000..906175be --- /dev/null +++ b/src/com/massivecraft/massivecore/predicate/PredicateSenderEntityOnlineTo.java @@ -0,0 +1,35 @@ +package com.massivecraft.massivecore.predicate; + +import com.massivecraft.massivecore.store.SenderEntity; +import com.massivecraft.massivecore.util.IdUtil; + +public class PredicateSenderEntityOnlineTo implements Predicate +{ + // -------------------------------------------- // + // FIELDS + // -------------------------------------------- // + + private final String watcherId; + public String getWatcherId() { return this.watcherId; } + + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + public static PredicateSenderEntityOnlineTo get(Object watcherObject) { return new PredicateSenderEntityOnlineTo(watcherObject); } + public PredicateSenderEntityOnlineTo(Object watcherObject) + { + this.watcherId = IdUtil.getId(watcherObject); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public boolean apply(SenderEntity watchee) + { + return watchee.isOnline(this.getWatcherId()); + } + +} diff --git a/src/com/massivecraft/massivecore/util/FlattenUtil.java b/src/com/massivecraft/massivecore/util/FlattenUtil.java new file mode 100644 index 00000000..dca44c43 --- /dev/null +++ b/src/com/massivecraft/massivecore/util/FlattenUtil.java @@ -0,0 +1,50 @@ +package com.massivecraft.massivecore.util; + +import com.massivecraft.massivecore.collections.MassiveList; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class FlattenUtil +{ + // Did you offer the client varargs? + // Worried about getting an array of a single list instead of an array of the list's contents? + // Throw it in here, we'll flatten it out for you and give you back a nice, nonnull, list. + // NOTE: This should never return null + // No matter what we put it, it should give us a List back + public static List flatten(Object packed) + { + // Null Check + if (packed == null) return Collections.singletonList(null); + + // Is it iterable? + if (packed instanceof Iterable) + { + // Create + List ret = new MassiveList<>(); + + // Fill + for (Object item : (Iterable)packed) + { + // Recurse + ret.addAll(flatten(item)); + } + + // Return + return ret; + } + + // Is it an array? + if (packed.getClass().isArray()) + { + // Send it through again as a list + List asList = Arrays.asList((Object[])packed); + return flatten(asList); + } + + // Doesn't seem to hold elements we care about, just return it in a list + return Collections.singletonList(packed); + } + +}