001package fr.aumgn.bukkitutils.command.arg.bukkit;
002
003import java.util.ArrayList;
004import java.util.List;
005import java.util.Locale;
006
007import org.bukkit.Bukkit;
008import org.bukkit.World;
009import org.bukkit.command.CommandSender;
010import org.bukkit.entity.Player;
011
012import fr.aumgn.bukkitutils.command.CommandsMessages;
013import fr.aumgn.bukkitutils.command.arg.impl.AbstractSenderMatchingArg;
014import fr.aumgn.bukkitutils.command.exception.CommandError;
015import fr.aumgn.bukkitutils.command.exception.CommandUsageError;
016
017public class WorldArg extends AbstractSenderMatchingArg<World> {
018
019    public static class NoSuchWorld extends CommandError {
020        private static final long serialVersionUID = -4832133406864970323L;
021
022        public NoSuchWorld(CommandsMessages messages, String name) {
023            super(messages.noSuchWorld(name));
024        }
025    }
026
027    private final CommandsMessages messages;
028
029    public WorldArg(CommandsMessages messages, String string) {
030        super(string);
031        this.messages = messages;
032    }
033
034    @Override
035    public World value() {
036        World world = Bukkit.getWorld(string);
037        if (world == null) {
038            throw new NoSuchWorld(messages, string);
039        }
040
041        return world;
042    }
043
044    @Override
045    protected World defaultFor(CommandSender sender) {
046        if (!(sender instanceof Player)) {
047            throw new CommandUsageError("You have to specify a world.");
048        }
049
050        return ((Player) sender).getWorld();
051    }
052
053    @Override
054    protected String missingPermOtherMessage(String permission) {
055        return messages.missingPermissionForOther(permission);
056    }
057
058    @Override
059    public List<World> match() {
060        if (string.equals("*")) {
061            return Bukkit.getWorlds();
062        }
063
064        String pattern = string.toLowerCase(Locale.ENGLISH);
065        List<World> worlds = new ArrayList<World>();
066
067        for (World world : Bukkit.getWorlds()) {
068            if (world.getName().toLowerCase().contains(pattern)) {
069                worlds.add(world);
070            }
071        }
072
073        if (worlds.isEmpty()) {
074            throw new NoSuchWorld(messages, string);
075        }
076
077        return worlds;
078    }
079}