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 * hasPermission("pandacraft.grade.test") revient à appeler * * @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 true si le joueur est dans le groupe spécifié, false 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 true si le joueur n'est pas inscrit, false sinon */ public boolean isGuest() { return isInGroup("default"); } /** * Indique si le joueur s'est inscrit sur le site * @return true si c'est le cas, false sinon */ public boolean isRegistered() { return !isGuest(); } /** * Indique si le joueur fait parti du staff * @return true si c'est le cas, false 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); } } }