/* * This file is part of Libelula Minecraft Edition Project. * * Libelula Minecraft Edition is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Libelula Minecraft Edition is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Libelula Minecraft Edition. * If not, see <http://www.gnu.org/licenses/>. * */ package me.libelula.networkmanager; import java.util.Date; import java.util.TreeMap; import java.util.concurrent.locks.ReentrantLock; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; /** * * @author Diego D'Onofrio <ddonofrio@member.fsf.org> */ public class PlayerManager { private final Main plugin; private final TreeMap<String, PlayerInfo> players; private final ReentrantLock _players_mutex; public PlayerManager(Main plugin) { this.plugin = plugin; players = new TreeMap<>(); _players_mutex = new ReentrantLock(true); } public class PlayerInfo { private final ServerManager.Server server; private final String name; private final String DisplayName; private PlayerInfo lastPrivateChatContact; private long lastTimeChatCmd; private final long loggedIn; private int totalPlayedMs; private boolean banned; private String banReason; public PlayerInfo(ServerManager.Server server, String name, String CustomName) { this.server = server; this.name = name; this.DisplayName = CustomName; lastPrivateChatContact = null; lastTimeChatCmd = 0; loggedIn = new Date().getTime(); } public String getBanReason() { return banReason; } public boolean isBanned() { return banned; } public void setBanReason(String banReason) { this.banReason = banReason; } public void setBanned(boolean banned) { this.banned = banned; } public void setTotalPlayedMs(int totalPlayedMs) { this.totalPlayedMs = totalPlayedMs; } public int getTotalPlayedMs() { return totalPlayedMs; } public long getLoggedInTime() { return loggedIn; } public String getName() { return name; } public ServerManager.Server getServer() { return server; } public String getDisplayName() { return DisplayName; } public PlayerInfo getLastPrivateChatContact() { return lastPrivateChatContact; } public void sendMessage(Player source, String message) { String[] args = {source.getName(), getName(), source.getDisplayName(), message}; server.sendMessage(plugin.cm.formatMessage(CommunicationManager.MessageType.WHISPER, args)); PlayerInfo sourcePi = plugin.pm.getPlayerInfo(source.getName()); if (sourcePi != null) { sourcePi.lastPrivateChatContact = this; this.lastPrivateChatContact = sourcePi; } } private void setLastPrivateChatContact(PlayerInfo lastPrivateChatContact) { this.lastPrivateChatContact = lastPrivateChatContact; } public void sendNotification(String message) { String[] args = {getName(), message}; server.sendMessage(plugin.cm.formatMessage(CommunicationManager.MessageType.NOTIFY_PLAYER, args)); } } public void chatProcess(AsyncPlayerChatEvent e) { Player player = e.getPlayer(); PlayerInfo pi = players.get(player.getName().toLowerCase()); if (pi != null) { long now = new Date().getTime(); if (pi.lastTimeChatCmd != 0) { int delay = plugin.config.getChatDelay(player); int timeToWait = (int) ((pi.lastTimeChatCmd + delay) - now) / 1000; if (timeToWait > 0) { e.setCancelled(true); player.sendMessage(plugin.getPrefix() + ChatColor.RED + "Debido a tu rango debes esperar " + timeToWait + " segundos para hablar."); } else { pi.lastTimeChatCmd = now; } } else { pi.lastTimeChatCmd = now; } } if (!e.isCancelled()) { plugin.chat.processChat(e); } } public void start() { for (Player player : plugin.getServer().getOnlinePlayers()) { addPlayer(player); } } public void addPlayer(Player player) { _players_mutex.lock(); try { PlayerInfo pi = new PlayerInfo(plugin.sm.getThisServer(), player.getName(), player.getDisplayName()); players.put(player.getName().toLowerCase(), pi); String[] args = {player.getName(), player.getDisplayName()}; plugin.cm.broadCast(plugin.cm.formatMessage(CommunicationManager.MessageType.ENTER, args)); } finally { _players_mutex.unlock(); } } public void addRemotePlayer(ServerManager.Server server, String playerName, String playerDisplayName) { PlayerInfo pi = new PlayerInfo(server, playerName, playerDisplayName); _players_mutex.lock(); try { players.put(playerName.toLowerCase(), pi); } finally { _players_mutex.unlock(); } } public PlayerInfo getPlayerInfo(String playerName) { PlayerInfo pi = null; _players_mutex.lock(); try { pi = players.get(playerName.toLowerCase()); } finally { _players_mutex.unlock(); } return pi; } public void processRemoteMessage(ServerManager.Server server, Player player, String sender, String senderDisplayName, String message) { player.sendMessage(ChatColor.YELLOW + "[" + ChatColor.GRAY + ChatColor.ITALIC + "{" + server.getServerId() + "} " + ChatColor.YELLOW + "<" + senderDisplayName + ChatColor.YELLOW + "> -> yo] " + ChatColor.WHITE + message); PlayerInfo senderPi = getPlayerInfo(sender); if (senderPi != null) { senderPi.sendNotification(ChatColor.YELLOW + "[yo -> " + ChatColor.GRAY + ChatColor.ITALIC + "{" + plugin.sm.getServerId() + "} " + ChatColor.YELLOW + player.getDisplayName() + ChatColor.YELLOW + "] " + ChatColor.WHITE + message); PlayerInfo recieverPi = getPlayerInfo(player.getName()); if (recieverPi != null) { recieverPi.setLastPrivateChatContact(senderPi); senderPi.setLastPrivateChatContact(recieverPi); } } } public boolean isConnectedToThisServer(String playerName) { boolean isOnLine = false; for (Player player : plugin.getServer().getOnlinePlayers()) { if (player.getName().equalsIgnoreCase(playerName)) { isOnLine = true; break; } } return isOnLine; } public Player getOnlinePlayer(String playerName) { Player result = null; for (Player player : plugin.getServer().getOnlinePlayers()) { if (player.getName().equalsIgnoreCase(playerName)) { result = player; break; } } return result; } public void sendSyncMessage(final CommandSender cs, final String message) { Bukkit.getScheduler().runTask(plugin, () -> { cs.sendMessage(message); }); } public void sendSyncMessage(final CommandSender cs, final String message, final boolean prefix) { Bukkit.getScheduler().runTask(plugin, () -> { if (prefix) { cs.sendMessage(plugin.getPrefix() + message); } else { cs.sendMessage(message); } }); } public void playerLeft(Player player) { _players_mutex.lock(); try { PlayerInfo pi = players.remove(player.getName()); if (pi != null) { pi.setTotalPlayedMs((int)(new Date().getTime() - pi.getLoggedInTime())); if (player.isBanned()) { pi.setBanned(true); pi.setBanReason(plugin.essentials.getBanReason(player.getName())); } if (pi.isBanned() || pi.getTotalPlayedMs() > 60000) { plugin.xrm.storePlayerInfo(pi); } } } finally { _players_mutex.unlock(); } } public void syncPlayerKick(final Player player, final String message) { Bukkit.getScheduler().runTask(plugin, () -> { player.kickPlayer(message); }); } public void announce(PlayerJoinEvent e) { if (e.getPlayer().hasPermission("lnm.announce")) { enterExitAnnounce(e.getPlayer(), true); } e.setJoinMessage(""); } public void announce(PlayerQuitEvent e) { if (e.getPlayer().hasPermission("lnm.announce")) { enterExitAnnounce(e.getPlayer(), false); } e.setQuitMessage(""); } private void enterExitAnnounce(Player player, boolean enter) { String announce; if (player.hasPermission("lnm.staff-member")) { announce = "El miembro del staff #PLAYER#"; } else { announce = "El jugador #PLAYER#"; } if (enter) { announce = announce + ChatColor.YELLOW + " ha llegado."; } else { announce = announce + ChatColor.YELLOW + " se ha ido."; } final String announceFinal = announce; Bukkit.getScheduler().runTaskLater(plugin, () -> { String announString = announceFinal.replace("#PLAYER#", player.getDisplayName()); for (Player player1 : plugin.getServer().getOnlinePlayers()) { player1.sendMessage(plugin.getPrefix() + announString); } plugin.getLogger().info(ChatColor.stripColor(announString)); }, 10); } }