001package fr.aumgn.bukkitutils.playerref;
002
003import java.util.HashMap;
004import java.util.Locale;
005import java.util.Map;
006
007import org.bukkit.Bukkit;
008import org.bukkit.OfflinePlayer;
009import org.bukkit.entity.Player;
010
011/**
012 * Hold a reference to a player.
013 */
014public final class PlayerRef {
015
016    private static final Map<String, PlayerRef> playersRef =
017                new HashMap<String, PlayerRef>();
018
019    public static PlayerRef get(OfflinePlayer player) {
020        return get(player.getName());
021    }
022
023    public static PlayerRef get(String name) {
024        String lname = name.toLowerCase(Locale.ENGLISH);
025        if (!playersRef.containsKey(lname)) {
026            playersRef.put(lname, new PlayerRef(lname));
027        }
028
029        return playersRef.get(lname);
030    }
031
032    private final String name;
033
034    private PlayerRef(String name) {
035        this.name = name;
036    }
037
038    public String getName() {
039        return name;
040    }
041
042    public String getDisplayName() {
043        Player player = getPlayer();
044        if (player != null) {
045            return player.getDisplayName();
046        } else {
047            return getName();
048        }
049    }
050
051    public boolean isOnline() {
052        return (getPlayer() != null);
053    }
054
055    public boolean isOffline() {
056        return (getPlayer() == null);
057    }
058
059    public Player getPlayer() {
060        return Bukkit.getPlayerExact(name);
061    }
062
063    public OfflinePlayer getOfflinePlayer() {
064        return Bukkit.getOfflinePlayer(name);
065    }
066
067    @Override
068    public boolean equals(Object other) {
069        if (!(other instanceof PlayerRef)) {
070            return false;
071        }
072
073        return name.equals(((PlayerRef) other).name);
074    }
075
076    @Override
077    public int hashCode() {
078        return name.hashCode();
079    }
080
081    @Override
082    public String toString() {
083        return name;
084    }
085}