ProjectAres/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/nick/IdentityImpl.java

165 lines
4.9 KiB
Java

package tc.oc.commons.bukkit.nick;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Objects;
import javax.annotation.Nullable;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import tc.oc.api.bukkit.friends.OnlineFriends;
import tc.oc.api.bukkit.users.OnlinePlayers;
import tc.oc.api.docs.PlayerId;
import tc.oc.api.docs.UserId;
import tc.oc.commons.bukkit.util.PlayerStates;
/**
* Functionality common to real and nicked identities
*/
public class IdentityImpl implements Identity {
protected final OnlinePlayers onlinePlayers;
protected final OnlineFriends friendMap;
protected final IdentityProvider identityProvider;
protected final PlayerStates playerStates;
protected final PlayerId playerId;
private final @Nullable String nickname;
IdentityImpl(OnlinePlayers onlinePlayers, OnlineFriends friendMap, PlayerStates playerStates, IdentityProvider identityProvider, PlayerId playerId, @Nullable String nickname) {
this.onlinePlayers = onlinePlayers;
this.friendMap = friendMap;
this.playerStates = playerStates;
this.identityProvider = identityProvider;
this.playerId = checkNotNull(playerId);
this.nickname = nickname == null || nickname.equalsIgnoreCase(playerId.username()) ? null : nickname;
}
@Override
public PlayerId getPlayerId() {
return playerId;
}
public @Nullable Player getPlayer() {
return onlinePlayers.find(getPlayerId());
}
@Override
public String getRealName() {
return playerId.username();
}
@Override
public @Nullable String getNickname() {
return nickname;
}
@Override
public String getPublicName() {
return getNickname() != null ? getNickname() : getRealName();
}
@Override
public String getName(CommandSender viewer) {
return isRevealed(viewer) ? getRealName() : getNickname();
}
@Override
public boolean isCurrent() {
final Player player = getPlayer();
return player != null && equals(identityProvider.currentIdentity(player));
}
@Override
public boolean isConsole() {
return false;
}
@Override
public boolean isDead(CommandSender viewer) {
if(!isOnline(viewer)) return false;
Player player = onlinePlayers.find(playerId);
return player != null && playerStates.isDead(player);
}
@Override
public boolean isFriend(CommandSender viewer) {
return friendMap.areFriends(viewer, playerId);
}
@Override
public boolean belongsTo(CommandSender sender) {
return sender.getName().equals(getPlayerId().username());
}
@Override
public Familiarity familiarity(CommandSender viewer) {
return belongsTo(viewer) ? Familiarity.SELF
: isFriend(viewer) ? Familiarity.FRIEND
: Familiarity.PERSON;
}
@Override
public boolean isRevealed(CommandSender viewer) {
return getNickname() == null || identityProvider.reveal(viewer, getPlayerId());
}
@Override
public boolean isDisguised(CommandSender viewer) {
return !isRevealed(viewer);
}
@Override
public boolean isOnline(CommandSender viewer) {
return getPlayer(viewer) != null;
}
/**
* Get the online {@link Player} for this identity, if they are online,
* and the given viewer is allowed to know this. That is true if this
* is the player's current identity, or if both this and their current
* identity can be revealed to the viewer.
*/
@Override
public @Nullable Player getPlayer(CommandSender viewer) {
final Player player = getPlayer();
if(player == null) return null;
final Identity current = identityProvider.currentIdentity(player);
return current.equals(this) || (isRevealed(viewer) && current.isRevealed(viewer)) ? player : null;
}
@Override
public boolean belongsTo(UserId userId, CommandSender viewer) {
return playerId.equals(userId) && isRevealed(viewer);
}
@Override
public boolean isSamePerson(Identity identity, CommandSender viewer) {
if(isRevealed(viewer) && identity.isRevealed(viewer)) {
return playerId.equals(identity.getPlayerId());
}
if(isDisguised(viewer) && identity.isDisguised(viewer)) {
return getNickname().equals(identity.getNickname());
}
return false;
}
@Override
public boolean equals(Object o) {
if(this == o)
return true;
if(!(o instanceof Identity))
return false;
Identity identity = (Identity) o;
return Objects.equals(getPlayerId(), identity.getPlayerId()) &&
Objects.equals(getNickname(), identity.getNickname());
}
@Override
public int hashCode() {
return Objects.hash(getPlayerId(), getNickname());
}
}