Factions/src/com/massivecraft/factions/cmd/type/TypeSelector.java

159 lines
4.5 KiB
Java

package com.massivecraft.factions.cmd.type;
import com.massivecraft.factions.Selector;
import com.massivecraft.factions.SelectorType;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.command.type.Type;
import com.massivecraft.massivecore.command.type.TypeAbstract;
import com.massivecraft.massivecore.mson.Mson;
import org.bukkit.command.CommandSender;
import java.util.Collection;
public class TypeSelector extends TypeAbstract<Selector>
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
private Type<MPlayer> typeMPlayer = TypeMPlayer.get();
private TypeRank typeRank = TypeRank.get();
private TypeRel typeRel = TypeRel.get();
private TypeFaction typeFaction = TypeFaction.get();
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static TypeSelector i = new TypeSelector();
public static TypeSelector get() { return i; }
private TypeSelector()
{
super(Selector.class);
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Selector read(String arg, CommandSender sender) throws MassiveException
{
if (arg == null) throw new MassiveException().setMsg("Selector can't be null.");
if (arg.length() < 2) throw new MassiveException().setMsg("Selector must be longer than two characters.");
// Get Prefix
SelectorType prefix = SelectorType.getFromPrefix(arg);
return prefix != null ? this.readPrefixed(arg, sender, prefix) : this.readPrioritized(arg, sender);
}
private Selector readPrefixed(String arg, CommandSender sender, SelectorType prefix) throws MassiveException
{
// Cut off prefix length
int length = prefix.getPrefix().length();
arg = arg.substring(length);
// Use correct type to read the selector
Type<Selector> type = this.fetchType(prefix);
return type.read(arg, sender);
}
private Selector readPrioritized(String arg, CommandSender sender) throws MassiveException
{
Selector ret;
// Try Relation
ret = readSafe(arg, sender, this.typeRel);
if (ret != null) return ret;
// Try Player
// NOTE: Player before Faction, otherwise players get interpreted as a faction
ret = readSafe(arg, sender, this.typeMPlayer);
if (ret != null) return ret;
// Try Faction
ret = readSafe(arg, sender, this.typeFaction);
if (ret != null) return ret;
// Try Rank
ret = readSafe(arg, sender, this.typeRank);
if (ret != null) return ret;
// Error
throw new MassiveException().setMsg("<h>%s<b> did not match any selector.", arg);
}
@Override
public Collection<String> getTabList(CommandSender sender, String arg)
{
// Create
Collection<String> ret = new MassiveList<>();
// Choose specific if possible
SelectorType prefix = SelectorType.getFromPrefix(arg);
if (prefix != null) return this.fetchType(prefix).getTabList(sender, arg);
// Fill All
ret.addAll(this.typeFaction.getTabList(sender, arg));
ret.addAll(this.typeMPlayer.getTabList(sender, arg));
// TODO: ret.addAll(this.typeRank.getTabList(sender, arg));
ret.addAll(this.typeRel.getTabList(sender, arg));
// Return
return ret;
}
@Override
public Mson getVisualMsonInner(Selector selector, CommandSender sender)
{
// Get Type
SelectorType selectorType = selector.getType();
Type<Selector> type = this.fetchType(selectorType);
// Get Visual
return type.getVisualMson(selector, sender);
}
// -------------------------------------------- //
// Type Fetching
// -------------------------------------------- //
@SuppressWarnings("unchecked")
private <E> Type<E> fetchType(SelectorType selectorType)
{
switch (selectorType)
{
case RANK:
return (Type<E>) typeRank;
case RELATION:
return (Type<E>) typeRel;
case PLAYER:
return (Type<E>) typeMPlayer;
case FACTION:
return (Type<E>) typeFaction;
default:
throw new IllegalStateException("SelectorType " + selectorType + " was not matchable.");
}
}
// -------------------------------------------- //
// SAFE READING
// -------------------------------------------- //
public Selector readSafe(String arg, CommandSender sender) { return readSafe(arg, sender, this); }
private static <T> T readSafe(String arg, CommandSender sender, Type<T> type)
{
try
{
return type.read(arg, sender);
}
catch (MassiveException e)
{
return null;
}
}
}