package net.diamonddominion.esaych.global; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.diamonddominion.esaych.CustomPlugin; import net.milkbowl.vault.permission.Permission; import net.minecraft.server.v1_6_R3.EntityWolf; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.v1_6_R3.CraftWorld; import org.bukkit.craftbukkit.v1_6_R3.entity.CraftEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.RegisteredServiceProvider; public class Chat implements Listener { public static CustomPlugin plugin; public static ChatSQL sql; public static ChatUtils utils; public static ChatFacsTowns f_t; public static Permission perms = null; public Map<String, String> cusses = new HashMap<String, String>(); public Map<Player, Integer> cussesNum = new HashMap<Player, Integer>(); public ArrayList<String> cussMax = new ArrayList<String>(); public ArrayList<CommandSender> disabledSpys = new ArrayList<CommandSender>(); public Map<Player, String> spamData = new HashMap<Player, String>(); //timestamp;total;lastphrase public Map<String, String> lastMsg = new HashMap<String, String>(); private ArrayList<String> globalPlayerList = new ArrayList<String>(); public boolean marriageEnabled = true; public Chat(CustomPlugin plugin) { Chat.plugin = plugin; } @SuppressWarnings("deprecation") public void enable() { plugin.getServer().getPluginManager().registerEvents(this, plugin); setupPermissions(); addCusses(); createCussLoop(); sql = new ChatSQL(this); utils = new ChatUtils(this); for (Plugin pl : Bukkit.getServer().getPluginManager().getPlugins()) { if (pl.getName().contains("Faction")) { f_t = new ChatFacsTowns(this); log("Factions/Towny Server Detected"); } } Bukkit.getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() { @Override public void run() { ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("PlayerList"); out.writeUTF("ALL"); } catch (Exception e2) {} if (Bukkit.getOnlinePlayers().length > 0) { Bukkit.getOnlinePlayers()[0].sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); } } }, 5, 20*15); log("Enabled"); } private String convertMsg(Player player, String msg) { msg = utils.removeCussWords(msg, true, player, !player.hasPermission("ddchat.censorbypass"), utils.getChannelPrefix(player)); if (player.hasPermission("ddchat.color")) { msg = ChatColor.translateAlternateColorCodes('&', msg); } else { msg = utils.changeCussColors(msg); } if (!player.hasPermission("ddchat.caps")) msg = utils.removeCAPS(msg); msg = utils.getDate(player) + utils.getWorld(player) + " " + utils.getDonorPrefix(player) + utils.getNamePrefix(player) + utils.getName(player) + ChatColor.GRAY + ": " + utils.getChannelPrefix(player) + msg; return msg; } private void addCusses() { cusses.put("fuck", "f<uc>k"); cusses.put("cunt", "c<u>nt"); cusses.put("sex", "s<e>x"); cusses.put("shit", "sh<i>t"); cusses.put("cock", "c<o>ck"); cusses.put("dick", "d<i>ck"); // cusses.put("gay", "g<a>y"); cusses.put("penis", "p<eni>s"); cusses.put("bitch", "b<i>tch"); cusses.put("nigger", "n<igg>er"); cusses.put("nigga", "n<igg>er"); cusses.put("slut", "sl<u>t"); cusses.put("lesbian", "l<e>sbian"); cusses.put("vagina", "vag<i>na"); cusses.put("tits", "t<i>ts"); cusses.put("tittie", "t<i>ttie"); cusses.put("boob", "b<oo>b"); cusses.put("fag", "f<a>g"); cusses.put("cripple", "cr<i>pple"); cusses.put("pussy", "p<u>ssy"); cusses.put("whore", "wh<o>re"); cusses.put("bastard", "b<a>stard"); cusses.put("boner", "b<o>ner"); cusses.put("dilldo", "d<i>lldo"); cusses.put("asshole", "a<ss>hole"); cusses.put(" ass ", " a<ss> "); // cusses.put("asses", "a<ss>es"); cusses.put("queef", "qu<e>ef"); cusses.put("valde", "v�lde"); } public void addToCussNum(final Player player) { plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { if (cussesNum.containsKey(player)) { cussesNum.put(player, cussesNum.get(player) + 1); } else { cussesNum.put(player, 1); } if (cussesNum.get(player) > 5) { String group = perms.getPlayerGroups(player)[0]; String msg = "You may not curse more than 5 times a minute!"; if (!(group.contains("Player") || group.contains("Respected") || group .contains("Owner"))) { if (cussMax.contains(player.getName())) { Bukkit.getServer().dispatchCommand( Bukkit.getConsoleSender(), "manuaddp " + player.getName() + " -ddchat.censorbypass"); msg = "You have lost your donor permissions for cursing freely. No refunds."; } else { msg += "\n\nYou will lose your cursing permissions next time you do that."; cussMax.add(player.getName()); } } Bukkit.getServer().dispatchCommand( Bukkit.getConsoleSender(), "kick " + player.getName() + " " + msg); cussesNum.put(player, 0); } } }, 1); } private Player lastSpammer = null; public void checkSpam(Player player, String msg) { double currTimestamp = System.currentTimeMillis()/1000; String[] data; if (spamData.containsKey(player)) { data = spamData.get(player).split(";"); } else { spamData.put(player, currTimestamp + ";1;" + msg); return; } double timestamp = Double.valueOf(data[0]); int total = Integer.parseInt(data[1]); String lastMessage = data[2]; // System.out.println(timestamp + ";" + total + ";" + lastMessage); // System.out.println(spamData.toString()); if (lastMessage.equals(msg) && currTimestamp-timestamp < 5) { if (currTimestamp-timestamp < .25) { final String name = player.getName(); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mute " + name + " 30s"); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "kick " + name + " SPAM! 1 time only plz"); } }, 1); } total++; } else if (lastSpammer != null && player == lastSpammer && currTimestamp-timestamp < 2) { total++; } else if (player == lastSpammer && currTimestamp-timestamp < .25) { total++; } else { total = 1; } if (total >= 3) { final String name = player.getName(); plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { @Override public void run() { Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "mute " + name); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "kick " + name + " SPAM! Talk less plz"); } }, 1); } String newData = currTimestamp + ";" + total + ";" + msg; // System.out.println(newData); // System.out.println("msg="+msg+";lastMessage="+lastMessage); lastSpammer = player; spamData.put(player, newData); } @SuppressWarnings("deprecation") private void createCussLoop() { plugin.getServer().getScheduler().scheduleAsyncRepeatingTask(plugin, new Runnable() { @Override public void run() { for (Player p : cussesNum.keySet()) { cussesNum.put(p, 0); } } }, 100L, 20 * 60); } public boolean msgCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { if (args.length < 2) { msg(sender, "/msg [Player] [Message]"); return true; } String msg = ""; for (int i = 1; i < args.length; i++) msg += args[i] + " "; if (!(sender instanceof Player)) { Player consoleReciever = Bukkit.getPlayer(args[0]); if (consoleReciever == null) { log("Player not found :("); return true; } msg = "Offline " + ChatColor.DARK_PURPLE + "Esaych" + ChatColor.AQUA + " --" + ChatColor.BLUE + "> " + utils.getNamePrefix(consoleReciever) + "You" + ChatColor.WHITE + ": " + msg; consoleReciever.sendMessage(msg); log(msg); return true; } Player player = (Player) sender; sql.logChat(player, msg, args[0]); Player reciever = Bukkit.getPlayer(args[0]); if (reciever == null) { boolean playerFound = false; for (String playerName : globalPlayerList) { if (playerName.toLowerCase().contains(args[0].toLowerCase())) { if (sql.getIgnoredPlayers(playerName).contains(player.getName())) { msg(player, playerName + " is ignoring you"); return true; } msg = utils.removeCussWords(msg, true, player, !player.hasPermission("ddchat.censorbypass"), utils.getChannelPrefix(player)); if (player.hasPermission("ddchat.color")) msg = ChatColor.translateAlternateColorCodes('&', msg); ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("Forward"); out.writeUTF("ALL"); out.writeUTF("DDCustomPlugin_Chat"); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream msgout = new DataOutputStream(msgbytes); msgout.writeUTF("playermsg"); msgout.writeUTF(utils.getDName(player)); msgout.writeUTF(playerName); msgout.writeUTF(msg); out.writeShort(msgbytes.toByteArray().length); out.write(msgbytes.toByteArray()); } catch (Exception e2) {} player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); player.sendMessage(utils.getNamePrefix(player) + "You" + ChatColor.AQUA + " --" + ChatColor.BLUE + "> " + ChatColor.WHITE + playerName + ChatColor.WHITE + ": " + msg); lastMsg.put(playerName, player.getName()); playerFound = true; break; } } if (!playerFound) { msg(sender, "The player " + args[0] + " does not seem to exist."); } return true; } if (sql.getIgnoredPlayers(player.getName()).contains(reciever.getName())) { msg(player, "You can't message people you are ignoring"); return true; } if (sql.getIgnoredPlayers(reciever.getName()).contains(player.getName())) { msg(player, reciever.getName() + " is ignoring you."); return true; } msg = utils.removeCussWords(msg, true, player, !player.hasPermission("ddchat.censorbypass"), utils.getChannelPrefix(player)); if (player.hasPermission("ddchat.color")) msg = ChatColor.translateAlternateColorCodes('&', msg); reciever.sendMessage(utils.getDName(player) + ChatColor.AQUA + " --" + ChatColor.BLUE + "> " + utils.getNamePrefix(reciever) + "You" + ChatColor.WHITE + ": " + msg); player.sendMessage(utils.getNamePrefix(player) + "You" + ChatColor.AQUA + " --" + ChatColor.BLUE + "> " + utils.getDName(reciever) + ChatColor.WHITE + ": " + msg); // lastMsg.put(player, reciever); lastMsg.put(reciever.getName(), player.getName()); return true; } public boolean rCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { if (!(sender instanceof Player)) { msg(sender, "You realize console's dont have any msg history..."); return true; } if (!lastMsg.containsKey(sender.getName())) { msg(sender, "Nobody has messaged you!"); return true; } // if (Bukkit.getPlayer(lastMsg.get(sender.getName())) == null) { // msg(sender, "They are not online!"); // return true; // } String msg = ""; for (int i = 0; i < args.length; i++) msg += args[i] + " "; return msgCommand(sender, cmd, commandLabel, new String[] { lastMsg.get(sender.getName()), msg }); } public boolean chCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { /* * l = local, 100 blocks * w = world * g = global * f = faction chat * s = staff chat * n = towny nation * t = towns */ if (!(sender instanceof Player)) { msg(sender, "NO CHAT FOR YOU"); return true; } if (args.length == 0 && !(commandLabel.equalsIgnoreCase("sc"))) { msg(sender, "Try /ch <channel>"); if (f_t != null) { msg(sender, "&aFaction: &bSends to faction members"); msg(sender, "&6Town: &bSend to only town members"); msg(sender, "&6&oNation: &bSend to all in your nation"); } msg(sender, "&eLocal: &bOnly receive chat from players within 100 blocks"); msg(sender, "World: Only receive chat from players in your world"); msg(sender, "&fGlobal: &bGet all chat messages from everyone"); msg(sender, "&cBecause you are in a smaller channel doesn't mean others don't get your messages when they are in global"); return true; } if (!(commandLabel.equalsIgnoreCase("sc"))) { char channel = args[0].toLowerCase().charAt(0); if (channel == 'l') { sql.setChannel(sender.getName(), "l"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oLocal"); return true; } if (channel == 'w') { sql.setChannel(sender.getName(), "w"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oWorld"); return true; } if (channel == 'g') { sql.setChannel(sender.getName(), "g"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oGlobal"); return true; } if (channel == 'f') { if (f_t != null) { if (f_t.getFacName((Player)sender).equals("")) { msg(sender, "You are not in a faction"); return true; } sql.setChannel(sender.getName(), "f"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oFaction"); return true; } } if (channel == 't') { if (f_t != null) { if (f_t.testTown((Player)sender)) { sql.setChannel(sender.getName(), "t"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oTown"); return true; } else { msg(sender, "You are not in a town"); return true; } } } if (channel == 'n') { if (f_t != null) { if (f_t.testNation((Player)sender)) { sql.setChannel(sender.getName(), "n"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oNation"); return true; } else { msg(sender, "You are not in a nation"); return true; } } } if (channel == 's') { if (!sender.hasPermission("ddchat.staffchat")) { msg(sender, "You don't have permission for staff chat."); return true; } sql.setChannel(sender.getName(), "s"); msg(sender, "Channel set to " + utils.getChannelPrefix((Player) sender) + "&oStaff Chat"); return true; } } else { if (!sender.hasPermission("ddchat.staffchat")) { msg(sender, "You don't have permission for staff chat."); return true; } String c = sql.getChannel(sender.getName()); if (c != null && c.equals("s")) { sql.setChannel(sender.getName(), "g"); msg(sender, "Channel set to &f&oGlobal Chat"); } else { sql.setChannel(sender.getName(), "s"); msg(sender, "Channel set to &c&oStaff Chat"); } return true; } msg(sender, "Thats not a channel! Try:"); msg(sender, "&aFaction: &bSends to faction members"); msg(sender, "&6Town: &bSend to only town members"); msg(sender, "&6&oNation: &bSend to all in your nation"); msg(sender, "&eLocal: &bOnly receive chat from players within 100 blocks"); msg(sender, "World: Only receive chat from players in your world"); msg(sender, "&fGlobal: &bGet all chat messages from everyone"); msg(sender, "&cBecause you are in a smaller channel doesn't mean others don't get your messages when they are in global"); return true; } public boolean badProfileCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { if (sender.hasPermission("ddchat.givesbadprofiles")) { if (args.length == 0) { msg(sender, "You must specify a player"); return true; } Player player = Bukkit.getPlayer(args[0]); if (player == null) { msg(sender, "Player not found"); return true; } if (sql.getBadProfile(player.getName())) { sql.setBadProfile(player.getName(), false); msg(sender, player.getName() + " has been removed their badprofile"); } else { sql.setBadProfile(player.getName(), true); msg(sender, player.getName() + " has been given a badprofile"); } return true; } else { msg(sender, "You don't have permission for this command"); return true; } } public boolean spyCommand(CommandSender sender) { if (!sender.hasPermission("ddchat.commandsnoop")) { return true; } if (disabledSpys.contains(sender)) { disabledSpys.remove(sender); sender.sendMessage(ChatColor.GREEN + "Command Spy has been enabled"); } else { disabledSpys.add(sender); sender.sendMessage(ChatColor.GREEN + "Command Spy has been disabled"); } return true; } private Map<Player, String> marriageQueue = new HashMap<Player, String>(); //Proposed To, Proposer:ScheduleID public boolean dateCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { if (marriageEnabled) { if (args.length == 0) { mmsg(sender, ChatColor.GREEN + "------- Dating Help -------"); mmsg(sender, "Type /date 'player' to ask someone out"); mmsg(sender, "Type /dump to dump your current date"); mmsg(sender, "Right click next to your date to kiss them"); mmsg(sender, ChatColor.GREEN + "--------------------------"); return true; } final Player player = Bukkit.getPlayer(args[0]); if (sql.getDatingPartner(sender.getName()) != null) { if (sql.getDatingPartner(sender.getName()).equals(player.getName())) { mmsg(sender, "You must dump " + sql.getDatingPartner(sender.getName()) + " before you date another person!"); } else { mmsg(sender, "You are already dating someone."); } return true; } if (sender instanceof Player) { if (sender.isOp()) { if (args[0].equalsIgnoreCase("disable")) { marriageEnabled = false; mmsg(sender, "Dating Disabled"); return true; } if (args[0].equalsIgnoreCase("enable")) { marriageEnabled = false; mmsg(sender, "Dating Enabled"); return true; } } if (marriageQueue.containsKey(sender) && args[0].equalsIgnoreCase("reject")) { Bukkit.broadcastMessage(ChatColor.AQUA + "[" + ChatColor.RED + "Dating" + ChatColor.AQUA + "] " + ChatColor.RED + sender.getName() + " rejected " + marriageQueue.get(sender) + ChatColor.WHITE + "!"); marriageQueue.remove(sender); return true; } //check if actually online if (player == null) { mmsg(sender, "You must specify an online player."); return true; } if (player == sender) { mmsg(sender, "You can't date yourself :/"); return true; } //check if they have a request if (marriageQueue.containsKey(sender)) { if (marriageQueue.get(sender).equalsIgnoreCase(player.getName())) { marry(Bukkit.getPlayer(args[0]), (Player) sender); } else { mmsg(sender, "You have a pending request from " + marriageQueue.get(sender) + "!"); mmsg(sender, "You must '/date reject' them first."); } return true; } //check if they're a dirty cheater for (Player p : marriageQueue.keySet()) { String old = p.getName(); if (sender.getName().equals(marriageQueue.get(p))) { if (!player.getName().equals(old)) { mmsg(sender, "What about " + old + "?"); mmsg(sender, "You dirty cheater!"); marriageQueue.remove(sender); marriageQueue.remove(p); marriageQueue.remove(player); Player dumped = Bukkit.getPlayer(old); if (dumped != null) { mmsg(dumped, sender.getName() + " ditched you for " + utils.getPlayerListName(player)); } } else { mmsg(sender, "You are already requesting them!"); return true; } } } if (!utils.getDate(player).equals("")) { mmsg(sender, player.getName() + " is already dating!"); return true; } marriageQueue.put(player, sender.getName()); mmsg(player, ChatColor.AQUA + "----------------------------------------"); mmsg(player, utils.getPlayerListName((Player) sender)+ ChatColor.AQUA + " wants to date you!"); mmsg(player, "Type '/date " + utils.getPlayerListName((Player) sender) + ChatColor.AQUA + "' to accept!"); mmsg(player, "Or '/date reject' if you want to break their heart."); mmsg(player, ChatColor.AQUA + "----------------------------------------"); mmsg(sender, "Your proposal has been made to " + utils.getPlayerListName(player)); // + ChatColor.AQUA + ", they have 5 minutes to reply."); return true; } else { if (args[0].equalsIgnoreCase("disable")) { marriageEnabled = false; mmsg(sender, "Dating Disabled"); return true; } if (args[0].equalsIgnoreCase("enable")) { marriageEnabled = false; mmsg(sender, "Dating Disabled"); return true; } mmsg(sender, "Consoles may not date!"); return true; } } else { mmsg(sender, "Dating is not enabled"); return true; } } public boolean dumpCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { if (marriageEnabled) { String divorced = sql.getDatingPartner(sender.getName()); if (divorced != null) { divorce((Player) sender, divorced); return true; } else { mmsg(sender, "You are not dating anyone!"); return true; } } else { mmsg(sender, "Dating is not enabled"); return true; } } public boolean ignoreCommand(CommandSender sender, Command cmd, String cmdLabel, String[] args) { if (!(sender instanceof Player)) { log("Console's can't ignore"); return false; } Player player = (Player) sender; if (args.length == 0) { msg(sender, "Toggle ignoring a player with: /ignore <Player>"); return true; } String playerToIgnore = args[0]; Player player2 = Bukkit.getPlayer(playerToIgnore); if (player2 != null && player2.getName().equals(player.getName())) { msg(sender, "You can't ignore yourself!"); } ArrayList<String> alreadyIgnoring = sql.getIgnoredPlayers(player.getName()); //Possibly REMOVING that player if (player2 != null && alreadyIgnoring.contains(player2.getName())) { sql.removeIgnoredPlayer(player.getName(), player2.getName()); msg(player, "You are no longer ignoring " + player2.getName()); return true; } else { for (String name : alreadyIgnoring) { if (name.toLowerCase().contains(playerToIgnore.toLowerCase())) { sql.removeIgnoredPlayer(player.getName(), name); msg(player, "You are no longer ignoring " + name); return true; } } } if (cmdLabel.equalsIgnoreCase("unignore")) { msg(player, "You are not ignoring anyone with that name."); return true; } if (player2 == null) { for (String playerName : globalPlayerList) { if (playerName.toLowerCase().contains(playerToIgnore.toLowerCase())) { sql.addIgnoredPlayer(player.getName(), playerName); msg(player, "You are now ignoring " + playerToIgnore); return true; } } msg(player, playerToIgnore + " not found."); msg(player, "Please use proper caps for cross server ignoring."); return true; } else { sql.addIgnoredPlayer(player.getName(), player2.getName()); msg(player, "You are now ignoring " + player2.getName()); msg(player2, player.getName() + " is now ignoring you"); return true; } } private void marry(Player player, Player spouse) { Bukkit.broadcastMessage(ChatColor.AQUA + "[" + ChatColor.RED + "Dating" + ChatColor.AQUA + "] " + utils.getPlayerListName(player) + ChatColor.WHITE + " is now dating " + ChatColor.AQUA + utils.getPlayerListName(spouse) + ChatColor.WHITE + "!"); sql.setDatingPartner(player.getName(), spouse.getName()); sql.setDatingPartner(spouse.getName(), player.getName()); marriageQueue.remove(player); marriageQueue.remove(spouse); } private void divorce(Player player, String spouse) { Bukkit.broadcastMessage(ChatColor.AQUA + "[" + ChatColor.RED + "Dating" + ChatColor.AQUA + "] " + ChatColor.RED + player.getName() + " dumped " + spouse + "!"); sql.setDatingPartner(player.getName(), null); sql.setDatingPartner(spouse, null); marriageQueue.remove(player); } private ArrayList<Player> getRecievers(Player player) { String channel = sql.getChannel(player.getName()); if (channel == null) channel = "g"; if (channel.equals("f")) { if (f_t != null) { ArrayList<Player> players = f_t.getFacPlayers(player); if (players.size() == 0) { channel = "g"; sql.setChannel(player.getName(), "g"); } else { return players; } } else { channel = "g"; sql.setChannel(player.getName(), "g"); } } if (channel.equals("t")) { if (f_t != null) { ArrayList<Player> players = f_t.getTownPlayers(player); if (players.size() == 0) { channel = "g"; sql.setChannel(player.getName(), "g"); } else { return players; } } else { channel = "g"; sql.setChannel(player.getName(), "g"); } } if (channel.equals("n")) { if (f_t != null) { ArrayList<Player> players = f_t.getNationPlayers(player); if (players.size() == 0) { channel = "g"; sql.setChannel(player.getName(), "g"); } else { return players; } } else { channel = "g"; sql.setChannel(player.getName(), "g"); } } if (channel.equals("s")) { ArrayList<Player> players = new ArrayList<Player>(); for (Player p : Bukkit.getOnlinePlayers()) { if (p.hasPermission("ddchat.staffchat")) players.add(p); } return players; } ArrayList<Player> players = new ArrayList<Player>(); for (Player rec : Bukkit.getOnlinePlayers()) { String c = sql.getChannel(rec.getName()); if (sql.getBadProfile(player.getName()) && !rec.hasPermission("ddchat.getbad")) continue; if (sql.getIgnoredPlayers(rec.getName()).contains(player.getName())) continue; if (c == null) c = "g"; if (c.equals("g") || c.equals("s")) { players.add(rec); } if (c.equals("w") || c.equals("f")) { if (rec.getWorld() == player.getWorld()) players.add(rec); } if (c.equals("l")) { if (rec.getWorld() == player.getWorld()) if (rec.getLocation().distance(player.getLocation()) < 100) players.add(rec); } } return players; } public void onBungeeMessageReceived(String channel, Player player, byte[] message) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(message)); String subchannel = null; try { subchannel = in.readUTF(); } catch (IOException e) { log("Could not read plugin message"); e.printStackTrace(); } if (subchannel.equals("PlayerList")) { try { bungeePlayerListReceived(in.readUTF(), in.readUTF().split(", "), player); } catch (Exception e) {} } if (subchannel.equals("DDCustomPlugin_Chat")) { try { short len = in.readShort(); byte[] msgbytes = new byte[len]; in.readFully(msgbytes); DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes)); String type = msgin.readUTF(); if (type.equals("commandspy")) { String command = msgin.readUTF(); for (Player p : Bukkit.getServer().getOnlinePlayers()) { if (p.hasPermission("ddchat.commandsnoop") && !disabledSpys.contains(p) ) { p.sendMessage(command); } } } if (type.equals("gchat")) { String playerName = msgin.readUTF(); globalPlayerList.add(playerName); String msg = msgin.readUTF(); Boolean isBad = msgin.readBoolean(); ArrayList<Player> players = new ArrayList<Player>(); for (Player rec : Bukkit.getOnlinePlayers()) { String c = sql.getChannel(rec.getName()); if (isBad && !rec.hasPermission("ddchat.getbad")) { continue; } if (c == null) c = "g"; if (c.equals("g") || c.equals("s")) { players.add(rec); } if (c.equals("w") || c.equals("f")) { if (rec.getWorld() == player.getWorld()) players.add(rec); } if (c.equals("l")) { if (rec.getWorld() == player.getWorld()) if (rec.getLocation().distance(player.getLocation()) < 100) players.add(rec); } } for (Player p : players) { if (sql.getIgnoredPlayers(p.getName()).contains(playerName)) continue; p.sendMessage(msg); } } if (type.equals("schat")) { String playerName = msgin.readUTF(); globalPlayerList.add(playerName); String msg = msgin.readUTF(); for (Player rec : Bukkit.getOnlinePlayers()) { if (rec.hasPermission("ddchat.staffchat")) rec.sendMessage(msg); } } if (type.equals("playermsg")) { String sender = msgin.readUTF(); Player reciever = Bukkit.getPlayer(msgin.readUTF()); String msg = msgin.readUTF(); if (reciever != null) { if (sql.getIgnoredPlayers(reciever.getName()).contains(removeFormattingCodes(sender))) return; reciever.sendMessage(sender + ChatColor.AQUA + " --" + ChatColor.BLUE + "> " + utils.getNamePrefix(reciever) + "You" + ChatColor.WHITE + ": " + msg); lastMsg.put(reciever.getName(), removeFormattingCodes(sender)); } } } catch (Exception e) {} } } private String removeFormattingCodes(String input) { return input.replaceAll("�a", "").replaceAll("�b", "").replaceAll("�c", "").replaceAll("�d", "").replaceAll("�e", "").replaceAll("�f", "") .replaceAll("�0", "").replaceAll("�1", "").replaceAll("�2", "").replaceAll("�3", "").replaceAll("�4", "").replaceAll("�5", "") .replaceAll("�6", "").replaceAll("�7", "").replaceAll("�8", "").replaceAll("�9", "") .replaceAll("�k", "").replaceAll("�l", "").replaceAll("�m", "").replaceAll("�n", "").replaceAll("�o", "").replaceAll("�r", ""); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerChatStart(AsyncPlayerChatEvent e) { e.setCancelled(true); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerChatEnd(AsyncPlayerChatEvent e) { if (plugin.fullMute.playerMuted(e.getPlayer().getName())) { if (plugin.fullMute.checkTime(e.getPlayer().getName())) { int left = (int)(sql.getMuteTime(e.getPlayer().getName()) - System.currentTimeMillis() / 1000); plugin.fullMute.msg(e.getPlayer(), "You are muted, and will stay muted for the remaining:"); plugin.fullMute.msg(e.getPlayer(), plugin.fullMute.timeLeft(left)); try { e.setCancelled(true); return; } catch (Exception ignored) {} } } if (e.getMessage().contains("connected with a") && e.getMessage().contains("using MineChat")) { return; } e.setCancelled(true); String channel = sql.getChannel(e.getPlayer().getName()); if (channel == null) { channel = "g"; } System.out.println(e.getPlayer().getName() + ": " + e.getMessage()); sql.logChat(e.getPlayer(), e.getMessage(), channel); checkSpam(e.getPlayer(), e.getMessage()); e.getPlayer().setPlayerListName(utils.getPlayerListName(e.getPlayer())); e.getPlayer().setDisplayName(utils.getDName(e.getPlayer())); sendMessage(convertMsg(e.getPlayer(), e.getMessage()), e.getPlayer()); } @EventHandler (priority = EventPriority.LOW) public void onPlayerJoin(PlayerJoinEvent e) { if (f_t == null) { if (utils.getChannel(e.getPlayer()) == "f" || utils.getChannel(e.getPlayer()) == "t") { sql.setChannel(e.getPlayer().getName(), "g"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oGlobal"); } } e.getPlayer().setPlayerListName(utils.getPlayerListName(e.getPlayer())); e.getPlayer().setDisplayName(utils.getDName(e.getPlayer())); e.getPlayer().setCustomName(utils.getDName(e.getPlayer())); e.setJoinMessage(""); Bukkit.broadcastMessage(" " + ChatColor.GREEN + "+ " + utils.getNamePrefix(e.getPlayer()) + e.getPlayer().getName()); } Map<String, String> quitPlayers = new HashMap<String, String>(); @EventHandler public void onPlayerQuit(PlayerQuitEvent e) { e.setQuitMessage(null); if (Bukkit.getServer().getOnlinePlayers().length > 0) { final ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("PlayerList"); out.writeUTF("ALL"); } catch (Exception e2) {} quitPlayers.put(e.getPlayer().getName(), utils.getNamePrefix(e.getPlayer()) + e.getPlayer().getName()); final Player player = Bukkit.getServer().getOnlinePlayers()[0]; Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){ @Override public void run() { player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); } }, 2); } } @EventHandler (priority = EventPriority.LOW) public void onPlayerKick(PlayerKickEvent e) { e.setLeaveMessage(" " + ChatColor.DARK_RED + "" + ChatColor.BOLD + "! " + utils.getNamePrefix(e.getPlayer()) + e.getPlayer().getName() + ChatColor.WHITE + " - " + ChatColor.RED + "" + ChatColor.ITALIC + e.getReason()); System.out.println("! " + e.getPlayer().getName() + " " + e.getReason()); // for (RegisteredListener list : e.getHandlers().getRegisteredListeners()) { // log(list.getPlugin().toString()); // } // e.setCancelled(true); } @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerDeath(PlayerDeathEvent e) { // if (!(e.getEntity() instanceof Player)) // return; // if (!(e instanceof PlayerDeathEvent)) // return; // PlayerDeathEvent subEvent = (PlayerDeathEvent) e; // Player p = (Player)e.getEntity(); // String msg = utils.getDName(p) + ChatColor.WHITE + " "; // DamageCause cause; // try { // cause = e.getEntity().getLastDamageCause().getCause(); // } catch (Exception e1) { // msg += "died horribly"; // subEvent.setDeathMessage(msg); // return; // } // if (cause == DamageCause.BLOCK_EXPLOSION) // msg += "instantaneously combusted."; // if (cause == DamageCause.CONTACT) // msg += "hugged a cactus."; // if (cause == DamageCause.CUSTOM) // msg += "died horribly."; // if (cause == DamageCause.DROWNING) // msg += "is sleeping with the fishes."; // if (cause == DamageCause.ENTITY_ATTACK) // if (p.getKiller() != null) { // msg = utils.getDName(p.getKiller()) + ChatColor.WHITE + " struck down " + utils.getDName(p); // } else { // String mob = lastEntity.getType().getName().toLowerCase(); // if (mob.startsWith("a") || mob.startsWith("e") || mob.startsWith("i") || mob.startsWith("o") || mob.startsWith("u")) { // msg = "An " + mob + " ate " + utils.getDName(p) + ChatColor.WHITE + "."; // } else { // msg = "A " + mob + " ate " + utils.getDName(p) + ChatColor.WHITE + "."; // } // } // if (cause == DamageCause.ENTITY_EXPLOSION) { // String mob = lastEntity.getType().getName().toLowerCase(); // if (mob.startsWith("a") || mob.startsWith("e") || mob.startsWith("i") || mob.startsWith("o") || mob.startsWith("u")) { // msg += "got too close to an " + lastEntity.getType().getName().toLowerCase() + "."; // } else { // msg += "got too close to a " + lastEntity.getType().getName().toLowerCase() + "."; // } //// msg += "got too close to a " + lastEntity.getType().getName().toLowerCase(); // } // if (cause == DamageCause.FALL) // msg += "fell from too high."; // if (cause == DamageCause.FALLING_BLOCK) // msg += " was under something heavy..."; // if (cause == DamageCause.FIRE) // msg += "tried fighting fire with their face."; // if (cause == DamageCause.FIRE_TICK) // msg += "touched the hot-hot."; // if (cause == DamageCause.LAVA) // msg += "found their melting point in lava."; // if (cause == DamageCause.LIGHTNING) // msg += "was struck from heaven."; // if (cause == DamageCause.MAGIC) // msg += "got avadakadavra''d."; // if (cause == DamageCause.MELTING) // msg += "awkwardly melted...?"; // if (cause == DamageCause.POISON) // msg += "overdoesed on drugs."; // if (cause == DamageCause.PROJECTILE) { // if (p.getKiller() != null) { // msg += "took an arrow to the knee from " + utils.getDName(p.getKiller()) + "."; // } else { // msg += "took an arrow to the knee."; // } // } // if (cause == DamageCause.STARVATION) // msg += "could't get to the kitchen in time."; // if (cause == DamageCause.SUFFOCATION) // msg = utils.getDName(p) + ChatColor.WHITE + " lacked their neccessary oxygen."; // if (cause == DamageCause.SUICIDE) // msg += "hated their life."; // if (cause == DamageCause.THORNS) // msg = utils.getDName(p.getKiller()) + ChatColor.WHITE + " took negative damage. Killing " + utils.getDName(p); // if (cause == DamageCause.VOID) // msg += "fell tried to fight the system."; // if (cause == DamageCause.WITHER) // msg += "took a witherball to seriously."; // subEvent.setDeathMessage(msg); } @EventHandler public void onCommandSent(final PlayerCommandPreprocessEvent e) { sql.logCommand(e.getPlayer(), e.getMessage()); String msg = e.getMessage().toLowerCase(); if (msg.startsWith("/f c ") || msg.equals("/f c") || msg.equals("/f chat")) { String c = sql.getChannel(e.getPlayer().getName()); if (c != null && c.equals("f")) { sql.setChannel(e.getPlayer().getName(), "g"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oGlobal"); } else { sql.setChannel(e.getPlayer().getName(), "f"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oFaction"); } e.setCancelled(true); } if (msg.startsWith("/t c ") || msg.equals("/t c") || msg.equals("/t chat")) { String c = sql.getChannel(e.getPlayer().getName()); if (c != null && c.equals("t")) { sql.setChannel(e.getPlayer().getName(), "g"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oGlobal"); } else { sql.setChannel(e.getPlayer().getName(), "t"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oTown"); } e.setCancelled(true); } if (msg.startsWith("/n c ") || msg.equals("/n c") || msg.equals("/n chat")) { String c = sql.getChannel(e.getPlayer().getName()); if (c != null && c.equals("n")) { sql.setChannel(e.getPlayer().getName(), "g"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oGlobal"); } else { sql.setChannel(e.getPlayer().getName(), "n"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oNation"); } e.setCancelled(true); } if (msg.equalsIgnoreCase("/ac") || msg.equalsIgnoreCase("/a") || msg.toLowerCase().startsWith("/ac ") || msg.toLowerCase().startsWith("/a ")) { if (!e.getPlayer().hasPermission("ddchat.staffchat")) { msg(e.getPlayer(), "You don't have permission for staff chat."); e.setCancelled(true); return; } String c = sql.getChannel(e.getPlayer().getName()); if (c != null && c.equals("s")) { sql.setChannel(e.getPlayer().getName(), "g"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oGlobal"); } else { sql.setChannel(e.getPlayer().getName(), "s"); msg(e.getPlayer(), "Channel set to " + utils.getChannelPrefix(e.getPlayer()) + "&oStaff Chat"); } e.setCancelled(true); } for (Player p : Bukkit.getServer().getOnlinePlayers()) { if (p.hasPermission("ddchat.commandsnoop") && !disabledSpys.contains(p) ) { p.sendMessage(utils.getPlayerListName(e.getPlayer()) + ChatColor.GRAY + ": " + e.getMessage()); } } ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("Forward"); out.writeUTF("ALL"); out.writeUTF("DDCustomPlugin_Chat"); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream msgout = new DataOutputStream(msgbytes); msgout.writeUTF("commandspy"); msgout.writeUTF(utils.getPlayerListName(e.getPlayer()) + ChatColor.GRAY + ": " + e.getMessage()); // You can do anything you want with msgout out.writeShort(msgbytes.toByteArray().length); out.write(msgbytes.toByteArray()); } catch (Exception e2) {} Player p = Bukkit.getOnlinePlayers()[0]; p.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); e.getPlayer().setPlayerListName(utils.getPlayerListName(e.getPlayer())); e.getPlayer().setDisplayName(utils.getDName(e.getPlayer())); e.getPlayer().setCustomName(utils.getDName(e.getPlayer())); } public void bungeePlayerListReceived(String server, String[] playerList, Player player) { updateGlobalPlayerList(playerList); ArrayList<String> playerList2 = new ArrayList<String>(); for (String str : playerList) { playerList2.add(str); } for (String playerName : quitPlayers.keySet()) { // Loops through all players returned by Bungee if (playerList2.contains(playerName)) { Bukkit.getServer().broadcastMessage(" " + ChatColor.YELLOW + "~ " + quitPlayers.get(playerName)); } else { Bukkit.getServer().broadcastMessage(" " + ChatColor.RED + "- " + quitPlayers.get(playerName)); } quitPlayers.remove(playerName); } } public void updateGlobalPlayerList(String[] players) { globalPlayerList.clear(); for (String data : players) { globalPlayerList.add(data); } } @EventHandler public void onPlayerKissEvent(PlayerInteractEntityEvent event) { final Player p = event.getPlayer(); if (!utils.getDate(p).equals("")) { if (event.getRightClicked() instanceof Player) { if (sql.getDatingPartner(p.getName()) != null && sql.getDatingPartner(p.getName()).equals(((Player) event.getRightClicked()).getName())) { playWolfHearts(p.getLocation()); playWolfHearts(event.getRightClicked().getLocation()); } } } } public void playWolfHearts(Location loc) { World world = loc.getWorld(); Wolf wo = (Wolf) world.spawn(loc, Wolf.class); wo.remove(); net.minecraft.server.v1_6_R3.World nmsWorld = ((CraftWorld) world).getHandle(); net.minecraft.server.v1_6_R3.EntityWolf nmsWolf = (EntityWolf) ((CraftEntity) wo).getHandle(); nmsWorld.broadcastEntityEffect(nmsWolf, (byte) 7); } private void sendMessage(String msg, Player player) { String world = player.getWorld().getName(); if (world.equals("Survival")) { for (Player p : getRecievers(player)) { p.sendMessage(ChatColor.translateAlternateColorCodes('&', utils.getFaction(player, p)) + msg); } } else if (world.equals("TownWorld")) { for (Player p : getRecievers(player)) { p.sendMessage(ChatColor.translateAlternateColorCodes('&', utils.getTown(player)) + msg); } } else { for (Player p : getRecievers(player)) { p.sendMessage(msg); } } String channel = sql.getChannel(player.getName()); if (channel == null) channel = "g"; if (channel.equals("g") || channel.equals("s")) { ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("Forward"); out.writeUTF("ALL"); out.writeUTF("DDCustomPlugin_Chat"); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream msgout = new DataOutputStream(msgbytes); msgout.writeUTF(channel + "chat"); msgout.writeUTF(player.getName()); msgout.writeUTF(msg); msgout.writeBoolean(sql.getBadProfile(player.getName())); out.writeShort(msgbytes.toByteArray().length); out.write(msgbytes.toByteArray()); } catch (Exception e2) {} player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); } } private void msg(CommandSender sender, String msg) { if (sender instanceof Player) { ((Player) sender).sendMessage(ChatColor.RESET + "[" + ChatColor.RED + "MSG" + ChatColor.WHITE + "] " + ChatColor.AQUA + ChatColor.translateAlternateColorCodes('&', msg)); } else { log(msg); } } private void mmsg(CommandSender sender, String msg) { if (sender instanceof Player) { ((Player) sender).sendMessage(ChatColor.AQUA + "[" + ChatColor.RED + "Dating" + ChatColor.AQUA + "] " + ChatColor.AQUA + ChatColor.translateAlternateColorCodes('&', msg)); } else { log(msg); } } private boolean setupPermissions() { RegisteredServiceProvider<Permission> rsp = plugin.getServer() .getServicesManager().getRegistration(Permission.class); perms = rsp.getProvider(); return perms != null; } public void log(String info) { plugin.getLogger().info("<Chat> " + info); } }