001package fr.aumgn.bukkitutils.command.arg.bukkit; 002 003import java.util.List; 004 005import org.bukkit.Bukkit; 006import org.bukkit.command.CommandSender; 007import org.bukkit.entity.Player; 008 009import com.google.common.base.Function; 010 011import fr.aumgn.bukkitutils.command.CommandsMessages; 012import fr.aumgn.bukkitutils.command.arg.impl.AbstractSenderMatchingArg; 013import fr.aumgn.bukkitutils.command.exception.CommandError; 014import fr.aumgn.bukkitutils.command.exception.CommandUsageError; 015import fr.aumgn.bukkitutils.glob.Glob; 016 017public class PlayerArg extends AbstractSenderMatchingArg<Player> { 018 019 public static class NoSuchPlayer extends CommandError { 020 private static final long serialVersionUID = -4832133406864970323L; 021 022 public NoSuchPlayer(CommandsMessages messages, String name) { 023 super(messages.noSuchPlayer(name)); 024 } 025 } 026 027 public static class MoreThanOnePlayerFound extends CommandError { 028 private static final long serialVersionUID = 7101062818304484950L; 029 030 public MoreThanOnePlayerFound(CommandsMessages messages, String name) { 031 super(messages.moreThanOnePlayerFound(name)); 032 } 033 } 034 035 private static class PlayerToString implements Function<Player, String> { 036 @Override 037 public String apply(Player player) { 038 return player.getName(); 039 } 040 } 041 042 private final CommandsMessages messages; 043 044 public PlayerArg(CommandsMessages messages, String string) { 045 super(string); 046 this.messages = messages; 047 } 048 049 @Override 050 public Player value() { 051 List<Player> players = match(); 052 053 if (players.size() > 1) { 054 throw new MoreThanOnePlayerFound(messages, string); 055 } 056 057 return players.get(0); 058 } 059 060 @Override 061 protected Player defaultFor(CommandSender sender) { 062 if (!(sender instanceof Player)) { 063 throw new CommandUsageError(messages.playerNeeded()); 064 } 065 066 return (Player) sender; 067 } 068 069 @Override 070 protected String missingPermOtherMessage(String permission) { 071 return messages.missingPermissionForOther(permission); 072 } 073 074 @Override 075 public List<Player> match() { 076 List<Player> players = new Glob(string) 077 .fromStart().caseInsensitive() 078 .build(new PlayerToString()) 079 .filter(Bukkit.getOnlinePlayers()); 080 081 if (players.isEmpty()) { 082 throw new NoSuchPlayer(messages, string); 083 } 084 085 return players; 086 } 087}