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}