Chroma-Chat/src/buttondevteam/thebuttonmcchat/ChatProcessing.java

397 lines
17 KiB
Java
Raw Normal View History

2016-07-04 22:29:12 +00:00
package buttondevteam.thebuttonmcchat;
2016-06-22 22:08:39 +00:00
import java.util.ArrayList;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scoreboard.Objective;
import com.earth2me.essentials.Essentials;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
import com.palmergames.bukkit.towny.object.Nation;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
2016-07-04 22:29:12 +00:00
import buttondevteam.thebuttonmcchat.ChatFormatter.Priority;
import buttondevteam.thebuttonmcchat.commands.UnlolCommand;
2016-06-22 22:08:39 +00:00
public class ChatProcessing {
2016-06-28 22:45:04 +00:00
private static boolean pingedconsole = false;
2016-06-22 22:08:39 +00:00
// Returns e.setCancelled
public static boolean ProcessChat(CommandSender sender, String message) {
if (PlayerListener.essentials == null)
2016-07-01 21:32:41 +00:00
PlayerListener.essentials = (Essentials) (Bukkit.getPluginManager().getPlugin("Essentials"));
2016-06-22 22:08:39 +00:00
Player player = (sender instanceof Player ? (Player) sender : null);
2016-07-01 21:32:41 +00:00
if (player != null && PlayerListener.essentials.getUser(player).isMuted())
2016-06-22 22:08:39 +00:00
return true;
2016-07-01 21:32:41 +00:00
TBMCPlayer mp = null;
2016-06-22 22:08:39 +00:00
if (player != null) {
2016-07-01 21:32:41 +00:00
mp = TBMCPlayer.AllPlayers.get(player.getUniqueId());
2016-06-22 22:08:39 +00:00
if (message.equalsIgnoreCase("F")) {
if (!mp.PressedF && PlayerListener.ActiveF) {
PlayerListener.FCount++;
mp.PressedF = true;
2016-07-01 21:32:41 +00:00
if (PlayerListener.FPlayer != null && PlayerListener.FPlayer.FCount < Integer.MAX_VALUE - 1)
2016-06-22 22:08:39 +00:00
PlayerListener.FPlayer.FCount++;
}
}
}
String msg = message.toLowerCase();
if (msg.contains("lol")) {
UnlolCommand.Lastlolornot = true;
UnlolCommand.Lastlol = sender;
} else {
for (int i = 0; i < PlayerListener.LaughStrings.length; i++) {
if (msg.contains(PlayerListener.LaughStrings[i])) {
UnlolCommand.Lastlol = sender;
UnlolCommand.Lastlolornot = false;
2016-06-23 23:38:17 +00:00
break;
2016-06-22 22:08:39 +00:00
}
}
}
2016-07-01 21:32:41 +00:00
Channel currentchannel = (mp == null ? PlayerListener.ConsoleChannel : mp.CurrentChannel);
2016-06-22 22:08:39 +00:00
2016-06-25 19:05:00 +00:00
ArrayList<ChatFormatter> formatters = new ArrayList<ChatFormatter>();
ChatFormatter.Color colormode = currentchannel.Color;
if (mp != null && mp.OtherColorMode != null)
2016-06-22 22:08:39 +00:00
colormode = mp.OtherColorMode;
if (mp != null && mp.RainbowPresserColorMode)
2016-06-25 19:05:00 +00:00
colormode = ChatFormatter.Color.RPC;
2016-06-22 22:08:39 +00:00
if (message.startsWith(">"))
2016-06-25 19:05:00 +00:00
colormode = ChatFormatter.Color.Green;
// If greentext, ignore channel or player colors
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile(".+"), colormode, "", Priority.Low));
2016-06-22 22:08:39 +00:00
String formattedmessage = message;
2016-06-25 19:05:00 +00:00
formattedmessage = formattedmessage.replace("\\", "\\\\");
2016-06-22 22:08:39 +00:00
formattedmessage = formattedmessage.replace("\"", "\\\"");
2016-06-25 19:05:00 +00:00
// ^ Tellraw support, needed for both the message and suggestmsg
2016-06-22 22:08:39 +00:00
String suggestmsg = formattedmessage;
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile("(?<!\\\\)\\*\\*((?:\\\\\\*|[^\\*])+[^\\*\\\\])\\*\\*"),
ChatFormatter.Format.Bold, "$1"));
formatters.add(new ChatFormatter(Pattern.compile("(?<!\\\\)\\*((?:\\\\\\*|[^\\*])+[^\\*\\\\])\\*"),
2016-06-29 12:36:25 +00:00
ChatFormatter.Format.Italic, "$1"));
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile("(?<!\\\\)\\_((?:\\\\\\_|[^\\_])+[^\\_\\\\])\\_"),
2016-06-30 22:03:30 +00:00
ChatFormatter.Format.Underlined, "$1"));
2016-06-22 22:08:39 +00:00
// URLs + Rainbow text
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile("(http[\\w:/?=$\\-_.+!*'(),]+)"),
2016-06-29 12:36:25 +00:00
ChatFormatter.Format.Underlined, "$1"));
2016-06-27 17:56:12 +00:00
/*
* formattedmessage = formattedmessage .replace( item, String.format(
* "\",\"color\":\"%s\"},{\"text\":\"%s\",\"color\":\"%s\",\"underlined\":\"true\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"%s\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Open URL\",\"color\":\"blue\"}]}}},{\"text\":\""
* , colormode, url, colormode, url));
*/
2016-06-30 22:31:10 +00:00
if (PluginMain.GetPlayers().size() > 0) {
StringBuilder sb = new StringBuilder();
sb.append("(?i)(");
for (Player p : PluginMain.GetPlayers())
sb.append(p.getName()).append("|");
sb.deleteCharAt(sb.length() - 1);
sb.append(")");
formatters
2016-07-01 21:32:41 +00:00
.add(new ChatFormatter(Pattern.compile(sb.toString()), ChatFormatter.Color.Aqua, (String match) -> {
Player p = Bukkit.getPlayer(match);
if (p == null) {
System.out.println("Error: Can't find player " + match + " but it was reported as online.");
return false;
}
TBMCPlayer mpp = TBMCPlayer.AddPlayerIfNeeded(p.getUniqueId());
if (PlayerListener.NotificationSound == null)
p.playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1.0f, 0.5f); // TODO:
// Airhorn
else
p.playSound(p.getLocation(), PlayerListener.NotificationSound, 1.0f,
(float) PlayerListener.NotificationPitch);
String color = String.format("§%x", (mpp.GetFlairColor() == 0x00 ? 0xb : mpp.GetFlairColor()));
return true; // TODO
}, Priority.High));
2016-06-30 22:31:10 +00:00
formatters
2016-07-01 21:32:41 +00:00
.add(new ChatFormatter(Pattern.compile(sb.toString()), ChatFormatter.Color.Aqua, (String match) -> {
for (String n : PlayerListener.nicknames.keySet()) {
String nwithoutformatting = new String(n);
int index;
while ((index = nwithoutformatting.indexOf("§k")) != -1)
nwithoutformatting = nwithoutformatting
.replace("§k" + nwithoutformatting.charAt(index + 2), ""); // Support
// for
// one
// random
// char
while ((index = nwithoutformatting.indexOf('§')) != -1)
nwithoutformatting = nwithoutformatting
.replace("§" + nwithoutformatting.charAt(index + 1), "");
if (!match.equalsIgnoreCase(nwithoutformatting))
return false; // TODO
Player p = Bukkit.getPlayer(PlayerListener.nicknames.get(n));
if (p == null) {
System.out.println(
"Error: Can't find player " + match + " but it was reported as online.");
return false;
}
TBMCPlayer mpp = TBMCPlayer.AddPlayerIfNeeded(p.getUniqueId());
if (PlayerListener.NotificationSound == null)
p.playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1.0f, 0.5f); // TODO:
// Airhorn
else
p.playSound(p.getLocation(), PlayerListener.NotificationSound, 1.0f,
(float) PlayerListener.NotificationPitch);
String color = String.format("§%x",
(mpp.GetFlairColor() == 0x00 ? 0xb : mpp.GetFlairColor()));
}
return true; // TODO
}, Priority.High));
2016-06-30 22:31:10 +00:00
}
2016-06-22 22:08:39 +00:00
2016-06-28 22:45:04 +00:00
pingedconsole = false;
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile("(?i)" + Pattern.quote("@console")), ChatFormatter.Color.Aqua,
(String match) -> {
if (!pingedconsole) {
System.out.print("\007");
pingedconsole = true;
}
return true;
}, Priority.High));
2016-07-01 21:32:41 +00:00
formatters.add(new ChatFormatter(Pattern.compile("#(\\w+)"), ChatFormatter.Color.Blue,
"https://twitter.com/hashtag/$1", Priority.High));
2016-06-28 22:45:04 +00:00
/*
* if (!hadurls) {
*
* if (formattedmessage.matches("(?i).*" + Pattern.quote("@console") +
* ".*")) { formattedmessage = formattedmessage.replaceAll( "(?i)" +
* Pattern.quote("@console"), "§b@console§r"); formattedmessage =
* formattedmessage .replaceAll( "(?i)" + Pattern.quote("@console"),
* String.format(
* "\",\"color\":\"%s\"},{\"text\":\"§b@console§r\",\"color\":\"blue\"},{\"text\":\""
* , colormode)); System.out.println("\007"); } }
*/
2016-06-22 22:08:39 +00:00
StringBuilder json = new StringBuilder();
json.append("[\"\",");
2016-07-01 21:32:41 +00:00
json.append(String.format(
"%s{\"text\":\"[%s]%s\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"Copy message\",\"color\":\"blue\"}},\"clickEvent\":{\"action\":\"suggest_command\",\"value\":\"%s\"}},",
(mp != null && mp.ChatOnly
? "{\"text\":\"[C]\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Chat only\",\"color\":\"blue\"}]}}},"
// (mp != null && mp.ChatOnly ?
// "{\"text:\":\"\"}," - I have been staring at
// this one line for hours... Hours...
: ""),
currentchannel.DisplayName, (mp != null && !mp.RPMode ? "[OOC]" : ""), suggestmsg));
2016-06-22 22:08:39 +00:00
json.append("{\"text\":\" <\"},");
2016-07-01 21:32:41 +00:00
json.append(String.format("{\"text\":\"%s%s\",", (player != null ? player.getDisplayName() : sender.getName()),
2016-06-22 22:08:39 +00:00
(mp != null ? mp.GetFormattedFlair() : "")));
json.append("\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[");
2016-07-01 21:32:41 +00:00
json.append(String.format("{\"text\":\"%s\n\",", (player != null ? player.getName() : sender.getName())));
json.append(String.format("\"color\":\"aqua\"},{\"text\":\"World: %s\n\",\"color\":\"white\"},",
(player != null ? player.getWorld().getName() : "-")));
json.append(String.format("{\"text\":\"Respect: %s%s%s\",\"color\":\"white\"}]}}},",
(mp != null ? (mp.FCount / (double) mp.FDeaths) : "Infinite"),
(mp != null && mp.UserName != null && !mp.UserName.isEmpty() ? "\nUserName: " + mp.UserName : ""),
(mp != null && mp.PlayerName.equals("\nAlpha_Bacca44") ? "\nDeaths: " + PlayerListener.AlphaDeaths
: "")));
2016-06-29 12:36:25 +00:00
json.append("{\"text\":\"> \",\"color\":\"white\"}");
2016-06-22 22:08:39 +00:00
2016-06-28 22:45:04 +00:00
/*
* int index = -1; ArrayList<String> list = new ArrayList<String>();
* while ((index = message.indexOf("#", index + 1)) != -1) { int index2
* = message.indexOf(" ", index + 1); if (index2 == -1) index2 =
* message.length(); int index3 = message.indexOf("#", index + 1); if
* (index3 != -1 && index3 < index2) // A # occurs before a // space
* index2 = index3; String original = message.substring(index + 1,
* index2); list.add(original); }
*
* if (!hadurls) { for (String original : list) // Hashtags
* formattedmessage = formattedmessage .replace( "#" + original,
* String.format(
* "\",\"color\":\"%s\"},{\"text\":\"#%s\",\"color\":\"blue\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://twitter.com/hashtag/%s\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Open on Twitter\",\"color\":\"blue\"}]}}},{\"text\":\""
* , colormode, original, original)); }
*/
2016-06-22 22:08:39 +00:00
2016-06-29 12:36:25 +00:00
/*
* json.append(String.format("{\"text\":\"%s\",\"color\":\"%s\"}]",
* ChatFormatter.Combine(formatters, formattedmessage), colormode));
*/
json.append(ChatFormatter.Combine(formatters, formattedmessage));
json.append("]");
2016-06-22 22:08:39 +00:00
String jsonstr = json.toString();
if (jsonstr.length() >= 32767) {
2016-07-01 21:32:41 +00:00
sender.sendMessage(
"§cError: Message too large. Try shortening it, or remove hashtags and other formatting.");
2016-06-22 22:08:39 +00:00
return true;
}
2016-07-01 21:32:41 +00:00
if (currentchannel.equals(Channel.TownChat) || currentchannel.equals(Channel.NationChat)) {
2016-06-22 22:08:39 +00:00
if (player == null) {
sender.sendMessage("§cYou are not a player!");
return true;
}
for (Player p : PluginMain.GetPlayers()) {
try {
2016-07-01 21:32:41 +00:00
Resident resident = PluginMain.Instance.TU.getResidentMap().get(p.getName().toLowerCase());
if (!resident.getName().equals(player.getName()) && resident.getModes().contains("spy"))
Bukkit.getPlayer(resident.getName()).sendMessage(String.format("[SPY-%s] - %s: %s",
currentchannel.DisplayName, player.getDisplayName(), message));
2016-06-22 22:08:39 +00:00
} catch (Exception e) {
}
}
}
if (currentchannel.equals(Channel.TownChat)) {
try {
Town town = null;
try {
2016-07-01 21:32:41 +00:00
town = PluginMain.Instance.TU.getResidentMap().get(player.getName().toLowerCase()).getTown();
2016-06-22 22:08:39 +00:00
} catch (NotRegisteredException e) {
}
if (town == null) {
player.sendMessage("§cYou aren't in a town or an error occured.");
return true;
}
2016-06-28 22:45:04 +00:00
int index = PluginMain.Instance.Towns.indexOf(town);
2016-06-22 22:08:39 +00:00
if (index < 0) {
PluginMain.Instance.Towns.add(town);
index = PluginMain.Instance.Towns.size() - 1;
}
Objective obj = PluginMain.SB.getObjective("town");
for (Player p : PluginMain.GetPlayers()) {
try {
2016-07-01 21:32:41 +00:00
if (PluginMain.Instance.TU.getResidentMap().get(p.getName().toLowerCase()).getTown().getName()
.equals(town.getName()))
2016-06-22 22:08:39 +00:00
obj.getScore(p.getName()).setScore(index);
else
obj.getScore(p.getName()).setScore(-1);
} catch (Exception e) {
obj.getScore(p.getName()).setScore(-1);
}
}
2016-07-01 21:32:41 +00:00
PluginMain.Instance.getServer().dispatchCommand(PluginMain.Console,
String.format("tellraw @a[score_town=%d,score_town_min=%d] %s", index, index, json.toString()));
2016-06-22 22:08:39 +00:00
} catch (IllegalStateException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalStateException)");
return true;
} catch (IllegalArgumentException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalArgumentException)");
return true;
}
} else if (currentchannel.equals(Channel.NationChat)) {
try {
Town town = null;
try {
2016-07-01 21:32:41 +00:00
town = PluginMain.Instance.TU.getResidentMap().get(player.getName().toLowerCase()).getTown();
2016-06-22 22:08:39 +00:00
} catch (NotRegisteredException e) {
}
if (town == null) {
player.sendMessage("§cYou aren't in a town or an error occured.");
return true;
}
Nation nation = null;
try {
nation = town.getNation();
} catch (NotRegisteredException e) {
}
if (nation == null) {
player.sendMessage("§cYour town isn't in a nation or an error occured.");
return true;
}
2016-06-28 22:45:04 +00:00
int index = PluginMain.Instance.Nations.indexOf(nation);
2016-06-22 22:08:39 +00:00
if (index < 0) {
PluginMain.Instance.Nations.add(nation);
index = PluginMain.Instance.Nations.size() - 1;
}
Objective obj = PluginMain.SB.getObjective("nation");
for (Player p : PluginMain.GetPlayers()) {
try {
2016-07-01 21:32:41 +00:00
if (PluginMain.Instance.TU.getResidentMap().get(p.getName().toLowerCase()).getTown().getNation()
.getName().equals(nation.getName()))
2016-06-22 22:08:39 +00:00
obj.getScore(p.getName()).setScore(index);
else
obj.getScore(p.getName()).setScore(-1);
} catch (Exception e) {
}
}
2016-07-01 21:32:41 +00:00
PluginMain.Instance.getServer().dispatchCommand(PluginMain.Console, String
.format("tellraw @a[score_nation=%d,score_nation_min=%d] %s", index, index, json.toString()));
2016-06-22 22:08:39 +00:00
} catch (IllegalStateException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalStateException)");
return true;
} catch (IllegalArgumentException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalArgumentException)");
return true;
}
} else if (currentchannel.equals(Channel.AdminChat)) {
try { // TODO: Put message JSON into it's structure
if (player != null && !player.isOp()) {
player.sendMessage("§cYou need to be an OP to use this channel.");
return true;
}
Objective obj = PluginMain.SB.getObjective("admin");
for (Player p : PluginMain.GetPlayers()) {
if (p.isOp())
obj.getScore(p.getName()).setScore(1);
else
obj.getScore(p.getName()).setScore(0);
}
2016-07-01 21:32:41 +00:00
PluginMain.Instance.getServer().dispatchCommand(PluginMain.Console,
String.format("tellraw @a[score_admin=%d,score_admin_min=%d] %s", 1, 1, json.toString()));
2016-06-22 22:08:39 +00:00
} catch (IllegalStateException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalStateException)");
return true;
} catch (IllegalArgumentException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalArgumentException)");
return true;
}
} else if (currentchannel.equals(Channel.ModChat)) {
try {
2016-07-01 21:32:41 +00:00
if (player != null && !PluginMain.permission.playerInGroup(player, "mod")) {
2016-06-22 22:08:39 +00:00
player.sendMessage("§cYou need to be a mod to use this channel.");
return true;
}
Objective obj = PluginMain.SB.getObjective("mod");
for (Player p : PluginMain.GetPlayers()) {
2016-06-23 10:42:22 +00:00
if (PluginMain.permission.playerInGroup(p, "mod"))
2016-06-22 22:08:39 +00:00
obj.getScore(p.getName()).setScore(1);
else
obj.getScore(p.getName()).setScore(0);
}
2016-07-01 21:32:41 +00:00
PluginMain.Instance.getServer().dispatchCommand(PluginMain.Console,
String.format("tellraw @a[score_mod=%d,score_mod_min=%d] %s", 1, 1, json.toString()));
2016-06-22 22:08:39 +00:00
} catch (IllegalStateException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalStateException)");
return true;
} catch (IllegalArgumentException e) {
e.printStackTrace();
player.sendMessage("§cAn error occured while sending the message. (IllegalArgumentException)");
return true;
}
} else
PluginMain.Instance.getServer().dispatchCommand(PluginMain.Console,
String.format("tellraw @a %s", json.toString()));
2016-07-01 21:32:41 +00:00
PluginMain.Instance.getServer().getConsoleSender()
.sendMessage(String.format("[%s] <%s%s> %s", currentchannel.DisplayName,
(player != null ? player.getDisplayName() : sender.getName()),
(mp != null ? mp.GetFormattedFlair() : ""), message));
2016-06-22 22:08:39 +00:00
return true;
}
}