/**
* (c) 2014 dmulloy2
*/
package net.t7seven7t.swornguard.handlers;
import net.dmulloy2.util.FormatUtil;
import net.dmulloy2.util.TimeUtil;
import net.dmulloy2.util.Util;
import net.t7seven7t.swornguard.SwornGuard;
import net.t7seven7t.swornguard.types.Permission;
import net.t7seven7t.swornguard.types.PlayerData;
import net.t7seven7t.swornguard.types.TrollType;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.PluginManager;
import com.massivecraft.factions.Conf;
import com.massivecraft.factions.FPlayer;
import com.massivecraft.factions.FPlayers;
import com.massivecraft.factions.types.ChatMode;
/**
* @author dmulloy2
*/
public class TrollHandler implements Listener {
private final SwornGuard plugin;
public TrollHandler(SwornGuard plugin) {
this.plugin = plugin;
this.registerEvents();
}
public final void putInHell(CommandSender sender, PlayerData data, OfflinePlayer troll, TrollType type, String reason) {
String profiler = "&b{0} was put in troll hell by {1} for {2}.";
String broadcast = "&c{0} &eput &c{1} &ein troll hell for &c{2}&e.";
data.setTrollHell(true);
if (type == TrollType.MUTE) {
profiler = "&b{0} was troll muted by {1} for {2}.";
broadcast = "&c{0} &etroll muted &c{1} &efor &c{2}&e.";
data.setTrollMuted(true);
} else if (type == TrollType.BAN) {
profiler = "&b{0} was troll banned by {1} for {2}.";
broadcast = "&c{0} &etroll banned &c{1} &efor &c{2}&e.";
data.setTrollBanned(true);
}
if (troll.isOnline()) {
Player player = troll.getPlayer();
forceIntoPublicChat(data, player);
// Hide players
for (Player online : Util.getOnlinePlayers()) {
PlayerData data1 = plugin.getPlayerDataCache().getData(online);
if (data1.isTrollHell()) {
if (data.isTrollMuted() || data.isTrollBanned()) {
player.hidePlayer(online);
}
} else {
player.hidePlayer(online);
}
}
}
profiler = FormatUtil.format(profiler, troll.getName(), sender.getName(), reason);
data.getProfilerList().add(FormatUtil.format(plugin.getMessage("profiler_event"), TimeUtil.getLongDateCurr(), profiler));
plugin.getLogHandler().log(ChatColor.stripColor(profiler));
for (Player player : Util.getOnlinePlayers()) {
if (plugin.getPermissionHandler().hasPermission(player, Permission.TROLL_SPY)) {
player.sendMessage(FormatUtil.format(broadcast, player.equals(sender) ? "You" : sender.getName(), troll.getName(), reason));
}
}
data.setTrollHells(data.getTrollHells() + 1);
data.setLastTroller(sender.getName());
data.setLastTrollHell(System.currentTimeMillis());
data.setLastTrollReason(reason);
}
public final void freeFromHell(CommandSender sender, PlayerData data, OfflinePlayer troll, TrollType type) {
String profiler = "&b{0} was freed from troll hell by {1}.";
String broadcast = "&c{0} &efreed &c{1} &efrom troll hell.";
data.setTrollBanned(false);
data.setTrollMuted(false);
if (type == TrollType.BAN) {
profiler = "&b{0} was troll unbanned by {1}.";
broadcast = "&c{0} &etroll unbanned &c{1}&e.";
} else if (type == TrollType.MUTE) {
profiler = "&b{0} was troll unmuted by {1}.";
broadcast = "&c{0} &etroll unmuted &c{1}&e.";
} else if (type == TrollType.HELL) {
data.setTrollHell(false);
// Show players
if (troll.isOnline()) {
Player player = troll.getPlayer();
for (Player online : Util.getOnlinePlayers()) {
PlayerData data1 = plugin.getPlayerDataCache().getData(online);
if (! data1.isVanished()) {
player.showPlayer(online);
}
}
}
}
profiler = FormatUtil.format(profiler, troll.getName(), sender.getName());
data.getProfilerList().add(FormatUtil.format(plugin.getMessage("profiler_event"), TimeUtil.getLongDateCurr(), profiler));
plugin.getLogHandler().log(ChatColor.stripColor(profiler));
for (Player player : Util.getOnlinePlayers()) {
if (plugin.getPermissionHandler().hasPermission(player, Permission.TROLL_SPY)) {
player.sendMessage(FormatUtil.format(broadcast, player.equals(sender) ? "You" : sender.getName(), troll.getName()));
}
}
}
public final void forceIntoPublicChat(PlayerData data, Player troll) {
if (data.isTrollHell()) {
try {
PluginManager pm = plugin.getServer().getPluginManager();
if (pm.getPlugin("Factions") != null || pm.getPlugin("SwornNations") != null) {
if (Conf.factionOnlyChat) {
FPlayer fplayer = FPlayers.i.get(troll);
if (fplayer.getChatMode() != ChatMode.PUBLIC) {
fplayer.setChatMode(ChatMode.PUBLIC);
}
}
}
} catch (Throwable ex) {
}
}
}
// ---- Event Listeners
private final void registerEvents() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onAsyncPlayerChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
PlayerData data = plugin.getPlayerDataCache().getData(player);
if (data.isTrollHell()) {
event.getRecipients().clear();
if (data.isTrollMuted() || data.isTrollBanned()) {
event.getRecipients().add(player);
return;
}
String admMsg = FormatUtil.format(plugin.getMessage("troll_format"), player.getName(), event.getMessage());
String node = plugin.getPermissionHandler().getPermissionString(Permission.TROLL_SPY);
for (Player online : Util.getOnlinePlayers()) {
PlayerData data1 = plugin.getPlayerDataCache().getData(online);
if (data1.isTrollHell()) {
event.getRecipients().add(online);
}
if (online.hasPermission(node)) {
online.sendMessage(admMsg);
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerJoin(PlayerJoinEvent event) {
Player troll = event.getPlayer();
PlayerData trollData = plugin.getPlayerDataCache().getData(troll);
if (trollData != null && trollData.isTrollHell()) {
for (Player online : Util.getOnlinePlayers()) {
PlayerData data = plugin.getPlayerDataCache().getData(online);
if (data.isTrollHell()) {
if (! trollData.isTrollMuted() && ! trollData.isTrollBanned()) {
online.sendMessage(event.getJoinMessage());
} else {
troll.hidePlayer(online);
}
} else {
troll.hidePlayer(online);
}
if (plugin.getPermissionHandler().hasPermission(online, Permission.TROLL_SPY)) {
String lastReason = trollData.getLastTrollReason();
online.sendMessage(FormatUtil.format(plugin.getMessage("troll_join"), event.getPlayer().getName(),
lastReason != null ? lastReason : "not applicable"));
}
}
forceIntoPublicChat(trollData, troll);
event.setJoinMessage(null);
} else {
for (Player online : Util.getOnlinePlayers()) {
PlayerData data = plugin.getPlayerDataCache().getData(online);
if (data != null && data.isTrollHell()) {
troll.hidePlayer(online);
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PlayerData data = plugin.getPlayerDataCache().getData(player);
if (! data.isTrollHell()) {
return;
}
for (Player online : Util.getOnlinePlayers()) {
PlayerData data1 = plugin.getPlayerDataCache().getData(online);
if (data1.isTrollHell()) {
if (! data1.isTrollMuted() && ! data1.isTrollBanned()) {
online.sendMessage(event.getQuitMessage());
}
}
if (plugin.getPermissionHandler().hasPermission(online, Permission.TROLL_SPY)) {
online.sendMessage(FormatUtil.format(plugin.getMessage("troll_leave"), event.getPlayer().getName()));
}
}
event.setQuitMessage(null);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerKick(PlayerKickEvent event) {
Player player = event.getPlayer();
PlayerData data = plugin.getPlayerDataCache().getData(player);
if (data.isTrollHell()) {
event.setLeaveMessage(null);
}
}
}