PandacraftUtils/src/net/mc_pandacraft/java/plugin/pandacraftutils/players/OffPlayer.java

263 lines
5.6 KiB
Java

package net.mc_pandacraft.java.plugin.pandacraftutils.players;
import net.mc_pandacraft.java.plugin.pandacraftutils.PandacraftUtils;
import net.mc_pandacraft.java.plugin.pandacraftutils.commands.AbstractCommandExecutor;
import net.mc_pandacraft.java.plugin.pandacraftutils.plugin_interface.EssentialsInterface;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import ru.tehkode.permissions.PermissionUser;
import ru.tehkode.permissions.bukkit.PermissionsEx;
import com.earth2me.essentials.User;
import de.luricos.bukkit.xAuth.xAuth;
import de.luricos.bukkit.xAuth.xAuthPlayer;
/**
* Représente un joueur du serveur, qu'il soit en ligne ou non.
* @author Marc Baloup
*
*/
public class OffPlayer {
private PandacraftUtils plugin = PandacraftUtils.getInstance();
private String playerName;
public OffPlayer(String name) {
if (!AbstractCommandExecutor.isValidPlayerName(name))
throw new RuntimeException("Invalid player name : "+name);
playerName = name;
}
public OffPlayer(OfflinePlayer p) {
this(p.getName());
}
public OffPlayer(User p) {
this(p.getName());
}
public String getName() {
return playerName;
}
public String getCastCorrectedName() {
return getEssentialsUser().getName();
}
/**
* @return l'instance Bukkit du joueur en ligne, ou null si il n'est pas en ligne
*/
public Player getBukkitOnlinePlayer() {
return plugin.getServer().getPlayerExact(playerName);
}
public boolean isOnline() {
return (getBukkitOnlinePlayer() != null);
}
/**
* @return l'instance Bukkit du joueur (en ligne ou non), ou null si il n'a jamais existé sur le serveur
*/
public OfflinePlayer getBukkitOfflinePlayer() {
OfflinePlayer offP = plugin.getServer().getOfflinePlayer(playerName);
if (offP == null || (!offP.hasPlayedBefore() && !offP.isOnline())) return null;
return offP;
}
public boolean hasPlayedBefore() {
return (getBukkitOfflinePlayer() != null && getEssentialsUser() != null);
}
public User getEssentialsUser() {
User u = EssentialsInterface.getPlugin().getOfflineUser(playerName);
if (isOnline())
u.setBase(getBukkitOnlinePlayer());
return u;
}
/**
* @return l'instance xAuth du joueur, ou null si aucune donnée n'est présente à propos du joueur
*/
public xAuthPlayer getXAuthPlayer() {
return xAuth.getPlugin().getPlayerManager().getPlayer(playerName);
}
public PermissionUser getPermissionExUser() {
return PermissionsEx.getUser(playerName);
}
public String getDisplayName() {
Player p = getBukkitOnlinePlayer();
if (p != null)
return p.getDisplayName();
User essU = getEssentialsUser();
return (essU == null) ? getName() : essU.getNick(true);
}
/*
* Grades
*/
/**
* Récupère le groupe parent direct ayant le poids le plus fort
* @return le groupe
*/
public String getGroup() {
String[] groups = getGroups();
return (groups != null && groups.length > 0) ? groups[0] : PermissionsEx.getPermissionManager().getDefaultGroup().getName();
}
/**
* Défini si le joueur à la permission dont le noeux est passé sous forme de
* chaine de caractère. Cette méthode ajoute une surcouche par rapport à la méthode
* Player.hasPermission(String) permettant de tester si un joueur est dans un groupe, de
* la même manière que OnlinePlayer.isInGroup(String). En d'autre terme, appeler
* <code>hasPermission("pandacraft.grade.test")</code> revient à appeler
* <code></code>
* @param permission la permission testée
* @return si le joueur a la permission
*/
public boolean hasPermission(String permission) {
String permissionGroupPrefix = "pandacraft.grade.";
if (permission != null && permission.startsWith(permissionGroupPrefix)) {
String group = permission.substring(permissionGroupPrefix.length());
return isInGroup(group);
}
Player p = getBukkitOnlinePlayer();
if (p != null)
return p.hasPermission(permission);
User u = getEssentialsUser();
if (u != null)
return u.hasPermission(permission);
return false;
}
/**
* Récupère la liste des groupes dans lequel le joueur se trouve
* @return
*/
public String[] getGroups() {
try {
return getPermissionExUser().getGroupsNames();
} catch (NoClassDefFoundError e) {
String[] g = {"default"};
return g;
}
}
/**
* Indique si le joueur est dans le groupe Spécifié
* @param group Le groupe par rapport au plugin de permission
* @return <i>true</i> si le joueur est dans le groupe spécifié, <i>false</i> sinon
*/
public boolean isInGroup(String group) {
if (group == null) return false;
return group.equalsIgnoreCase(getGroup());
}
/**
* Indique si le joueur est un nouveau joueur (si il ne s'est pas inscrit sur le site)
* @return <i>true</i> si le joueur n'est pas inscrit, <i>false</i> sinon
*/
public boolean isGuest() {
return isInGroup("default");
}
/**
* Indique si le joueur s'est inscrit sur le site
* @return <i>true</i> si c'est le cas, <i>false</i> sinon
*/
public boolean isRegistered() {
return !isGuest();
}
/**
* Indique si le joueur fait parti du staff
* @return <i>true</i> si c'est le cas, <i>false</i> sinon
*/
public boolean isInStaff() {
return isInGroup("admins") ||
isInGroup("devs") ||
isInGroup("modos") ||
isInGroup("archis") ||
isInGroup("guides");
}
@SuppressWarnings("serial")
public class PlayerNeverConnectedToServerException extends RuntimeException {
private PlayerNeverConnectedToServerException(String name, String reason) {
super("Never played before : "+name+". Because : "+reason);
}
}
}