Adding match mode for id search to MassiveCraftCore and improving the faction argument readers.

This commit is contained in:
Olof Larsson 2011-10-22 14:39:01 +02:00
parent e6d45a6aa2
commit 5bf38ab0aa
7 changed files with 97 additions and 45 deletions

View File

@ -66,19 +66,4 @@ public class FPlayers extends PlayerEntityCollection<FPlayer>
} }
} }
} }
// TODO: Intressant.... denna skulle jag kanske behöva undersöka lite mer... lägga till i core?
// En form av match player name...
public FPlayer find(String playername)
{
for (FPlayer fplayer : this.get())
{
if (fplayer.getId().equalsIgnoreCase(playername) || fplayer.getId().toLowerCase().startsWith(playername.toLowerCase()))
{
return fplayer;
}
}
return null;
}
} }

View File

@ -12,6 +12,7 @@ import org.bukkit.ChatColor;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import com.massivecraft.factions.util.MiscUtil; import com.massivecraft.factions.util.MiscUtil;
import com.massivecraft.factions.zcore.persist.EntityCollection; import com.massivecraft.factions.zcore.persist.EntityCollection;
import com.massivecraft.factions.zcore.util.TextUtil;
public class Factions extends EntityCollection<Faction> public class Factions extends EntityCollection<Faction>
{ {
@ -132,7 +133,7 @@ public class Factions extends EntityCollection<Faction>
return errors; return errors;
} }
public Faction findByTag(String str) public Faction getByTag(String str)
{ {
String compStr = MiscUtil.getComparisonString(str); String compStr = MiscUtil.getComparisonString(str);
for (Faction faction : this.get()) for (Faction faction : this.get())
@ -145,9 +146,24 @@ public class Factions extends EntityCollection<Faction>
return null; return null;
} }
public Faction getBestTagMatch(String pattern)
{
Map<String, Faction> tag2faction = new HashMap<String, Faction>();
// TODO: Slow index building
for (Faction faction : this.get())
{
tag2faction.put(faction.getTag(), faction);
}
String tag = TextUtil.getWhereLongestCommonStartCI(tag2faction.keySet(), pattern);
if (tag == null) return null;
return tag2faction.get(tag);
}
public boolean isTagTaken(String str) public boolean isTagTaken(String str)
{ {
return this.findByTag(str) != null; return this.getByTag(str) != null;
} }
} }

View File

@ -311,7 +311,7 @@ public class P extends MPlugin
public Set<String> getPlayersInFaction(String factionTag) public Set<String> getPlayersInFaction(String factionTag)
{ {
Set<String> players = new HashSet<String>(); Set<String> players = new HashSet<String>();
Faction faction = Factions.i.findByTag(factionTag); Faction faction = Factions.i.getByTag(factionTag);
if (faction != null) if (faction != null)
{ {
for (FPlayer fplayer : faction.getFPlayers()) for (FPlayer fplayer : faction.getFPlayers())
@ -326,7 +326,7 @@ public class P extends MPlugin
public Set<String> getOnlinePlayersInFaction(String factionTag) public Set<String> getOnlinePlayersInFaction(String factionTag)
{ {
Set<String> players = new HashSet<String>(); Set<String> players = new HashSet<String>();
Faction faction = Factions.i.findByTag(factionTag); Faction faction = Factions.i.getByTag(factionTag);
if (faction != null) if (faction != null)
{ {
for (FPlayer fplayer : faction.getFPlayersWhereOnline(true)) for (FPlayer fplayer : faction.getFPlayersWhereOnline(true))

View File

@ -148,12 +148,11 @@ public abstract class FCommand extends MCommand<P>
// Argument Readers // Argument Readers
// -------------------------------------------- // // -------------------------------------------- //
// ARG AS FPLAYER // FPLAYER ======================
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg) public FPlayer strAsFPlayer(String name, FPlayer def, boolean msg)
{ {
FPlayer ret = def; FPlayer ret = def;
String name = this.argAsString(idx);
if (name != null) if (name != null)
{ {
FPlayer fplayer = FPlayers.i.get(name); FPlayer fplayer = FPlayers.i.get(name);
@ -165,11 +164,15 @@ public abstract class FCommand extends MCommand<P>
if (msg && ret == null) if (msg && ret == null)
{ {
this.sendMessage(p.txt.parse("<b>The player \"<p>%s<b>\" could not be found.", name)); this.msg("<b>No player \"<p>%s<b>\" could not be found.", name);
} }
return ret; return ret;
} }
public FPlayer argAsFPlayer(int idx, FPlayer def, boolean msg)
{
return this.strAsFPlayer(this.argAsString(idx), def, msg);
}
public FPlayer argAsFPlayer(int idx, FPlayer def) public FPlayer argAsFPlayer(int idx, FPlayer def)
{ {
return this.argAsFPlayer(idx, def, true); return this.argAsFPlayer(idx, def, true);
@ -179,15 +182,14 @@ public abstract class FCommand extends MCommand<P>
return this.argAsFPlayer(idx, null); return this.argAsFPlayer(idx, null);
} }
// ARG AS BEST FPLAYER MATCH // BEST FPLAYER MATCH ======================
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg) public FPlayer strAsBestFPlayerMatch(String name, FPlayer def, boolean msg)
{ {
FPlayer ret = def; FPlayer ret = def;
String name = this.argAsString(idx);
if (name != null) if (name != null)
{ {
FPlayer fplayer = FPlayers.i.find(name); FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null) if (fplayer != null)
{ {
ret = fplayer; ret = fplayer;
@ -196,11 +198,15 @@ public abstract class FCommand extends MCommand<P>
if (msg && ret == null) if (msg && ret == null)
{ {
this.sendMessage(p.txt.parse("<b>The player \"<p>%s<b>\" could not be found.", name)); this.msg("<b>No player match found for \"<p>%s<b>\".", name);
} }
return ret; return ret;
} }
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def, boolean msg)
{
return this.strAsBestFPlayerMatch(this.argAsString(idx), def, msg);
}
public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def) public FPlayer argAsBestFPlayerMatch(int idx, FPlayer def)
{ {
return this.argAsBestFPlayerMatch(idx, def, true); return this.argAsBestFPlayerMatch(idx, def, true);
@ -210,37 +216,43 @@ public abstract class FCommand extends MCommand<P>
return this.argAsBestFPlayerMatch(idx, null); return this.argAsBestFPlayerMatch(idx, null);
} }
// ARG AS FACTION // FACTION ======================
public Faction argAsFaction(int idx, Faction def, boolean msg) public Faction strAsFaction(String name, Faction def, boolean msg)
{ {
Faction ret = def; Faction ret = def;
String name = this.argAsString(idx);
if (name != null) if (name != null)
{ {
// First we search faction names // First we match faction tags
Faction faction = Factions.i.findByTag(name); Faction faction = Factions.i.getBestTagMatch(name);
// Next we match player names
if (faction == null)
{
FPlayer fplayer = FPlayers.i.getBestIdMatch(name);
if (fplayer != null)
{
faction = fplayer.getFaction();
}
}
if (faction != null) if (faction != null)
{ {
ret = faction; ret = faction;
} }
// Next we search player names
FPlayer fplayer = FPlayers.i.find(name);
if (fplayer != null)
{
ret = fplayer.getFaction();
}
} }
if (msg && ret == null) if (msg && ret == null)
{ {
this.sendMessage(p.txt.parse("<b>The faction or player \"<p>%s<b>\" could not be found.", name)); this.msg("<b>The faction or player \"<p>%s<b>\" could not be found.", name);
} }
return ret; return ret;
} }
public Faction argAsFaction(int idx, Faction def, boolean msg)
{
return this.strAsFaction(this.argAsString(idx), def, msg);
}
public Faction argAsFaction(int idx, Faction def) public Faction argAsFaction(int idx, Faction def)
{ {
return this.argAsFaction(idx, def, true); return this.argAsFaction(idx, def, true);

View File

@ -7,6 +7,7 @@ import java.util.Map.Entry;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.massivecraft.factions.zcore.util.DiscUtil; import com.massivecraft.factions.zcore.util.DiscUtil;
import com.massivecraft.factions.zcore.util.TextUtil;
public abstract class EntityCollection<E extends Entity> public abstract class EntityCollection<E extends Entity>
{ {
@ -16,7 +17,7 @@ public abstract class EntityCollection<E extends Entity>
// These must be instantiated in order to allow for different configuration (orders, comparators etc) // These must be instantiated in order to allow for different configuration (orders, comparators etc)
private Collection<E> entities; private Collection<E> entities;
private Map<String, E> id2entity; protected Map<String, E> id2entity;
// If the entities are creative they will create a new instance if a non existent id was requested // If the entities are creative they will create a new instance if a non existent id was requested
private boolean creative; private boolean creative;
@ -94,6 +95,13 @@ public abstract class EntityCollection<E extends Entity>
return id2entity.get(id) != null; return id2entity.get(id) != null;
} }
public E getBestIdMatch(String pattern)
{
String id = TextUtil.getWhereLongestCommonStartCI(this.id2entity.keySet(), pattern);
if (id == null) return null;
return this.id2entity.get(id);
}
// -------------------------------------------- // // -------------------------------------------- //
// CREATE // CREATE
// -------------------------------------------- // // -------------------------------------------- //

View File

@ -42,5 +42,4 @@ public abstract class PlayerEntityCollection<E extends Entity> extends EntityCol
} }
return entities; return entities;
} }
} }

View File

@ -280,4 +280,36 @@ public class TextUtil
return ""+num+" "+unit+" "+agofromnow; return ""+num+" "+unit+" "+agofromnow;
} }
// -------------------------------------------- //
// String comparison
// -------------------------------------------- //
public static int commonStartLength(String a, String b)
{
int len = a.length() > b.length() ? a.length() : b.length();
int i;
for (i = 0; i < len; i++)
{
if (a.charAt(i) != b.charAt(i)) break;
}
return i;
}
public static String getWhereLongestCommonStartCI(Collection<String> candidates, String pattern)
{
String ret = null;
int best = 0;
pattern = pattern.toLowerCase();
for (String candidate : candidates)
{
int csl = commonStartLength(pattern, candidate.toLowerCase());
if (csl > best)
{
best = csl;
ret = candidate;
}
}
return ret;
}
} }