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}