Chat/galaxy/src/main/java/com/alttd/chat/handler/ChatHandler.java

357 lines
16 KiB
Java
Raw Normal View History

2021-05-13 12:11:29 +00:00
package com.alttd.chat.handler;
import com.alttd.chat.ChatPlugin;
import com.alttd.chat.config.Config;
2021-05-15 19:16:01 +00:00
import com.alttd.chat.managers.ChatUserManager;
2021-06-13 11:53:49 +00:00
import com.alttd.chat.managers.RegexManager;
2022-09-30 09:20:59 +00:00
import com.alttd.chat.objects.ChatFilter;
2021-05-15 19:16:01 +00:00
import com.alttd.chat.objects.ChatUser;
import com.alttd.chat.objects.ModifiableString;
2022-01-05 14:25:17 +00:00
import com.alttd.chat.objects.channels.CustomChannel;
import com.alttd.chat.util.GalaxyUtility;
import com.alttd.chat.util.Utility;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
2021-05-13 12:11:29 +00:00
import net.kyori.adventure.text.Component;
2022-05-26 22:31:36 +00:00
import net.kyori.adventure.text.TextReplacementConfig;
2021-07-27 16:46:58 +00:00
import net.kyori.adventure.text.format.NamedTextColor;
2022-09-30 09:20:59 +00:00
import net.kyori.adventure.text.minimessage.MiniMessage;
2022-02-19 14:14:41 +00:00
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
2021-06-13 11:53:49 +00:00
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
2021-05-13 12:11:29 +00:00
import org.bukkit.Bukkit;
import org.bukkit.Material;
2021-05-13 12:11:29 +00:00
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
2021-05-13 12:11:29 +00:00
2022-02-05 20:16:20 +00:00
import java.util.*;
2021-06-06 19:32:13 +00:00
import java.util.concurrent.TimeUnit;
2021-05-13 12:11:29 +00:00
public class ChatHandler {
2021-06-06 19:32:13 +00:00
private final ChatPlugin plugin;
private final Component GCNOTENABLED;
2021-05-13 12:11:29 +00:00
public ChatHandler() {
plugin = ChatPlugin.getInstance();
GCNOTENABLED = Utility.parseMiniMessage(Config.GCNOTENABLED);
2021-05-13 12:11:29 +00:00
}
2022-04-21 13:45:50 +00:00
public void continuePrivateMessage(Player player, String target, String message) {
// ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
// user.setReplyTarget(target);
TagResolver placeholders = TagResolver.resolver(
Placeholder.component("message", parseMessageContent(player, message)),
Placeholder.component("sendername", player.name()),
Placeholder.parsed("receivername", target)
);
Component component = Utility.parseMiniMessage("<message>", placeholders);
ModifiableString modifiableString = new ModifiableString(component);
2022-04-21 13:45:50 +00:00
// todo a better way for this
2022-05-30 20:10:54 +00:00
if(!RegexManager.filterText(player.getName(), player.getUniqueId(), modifiableString, "privatemessage")) {
2022-04-21 13:45:50 +00:00
GalaxyUtility.sendBlockedNotification("DM Language",
player,
Utility.parseMiniMessage(Utility.parseColors(modifiableString.string())),
target);
return; // the message was blocked
}
component = modifiableString.component();
2022-04-21 13:45:50 +00:00
sendPrivateMessage(player, target, "privatemessage", component);
Component spymessage = Utility.parseMiniMessage(Config.MESSAGESPY, placeholders);
for(Player pl : Bukkit.getOnlinePlayers()) {
if(pl.hasPermission(Config.SPYPERMISSION) && ChatUserManager.getChatUser(pl.getUniqueId()).isSpy() && !pl.equals(player) && !pl.getName().equalsIgnoreCase(target)) {
pl.sendMessage(spymessage);
}
}
}
2021-06-23 19:16:48 +00:00
public void privateMessage(Player player, String target, String message) {
2021-08-23 09:56:31 +00:00
// ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
// user.setReplyTarget(target);
Component messageComponent = parseMessageContent(player, message);
TagResolver placeholders = TagResolver.resolver(
Placeholder.component("message", messageComponent),
Placeholder.component("sendername", player.name()),
Placeholder.parsed("receivername", target)
);
ModifiableString modifiableString = new ModifiableString(messageComponent);
// todo a better way for this
if(!RegexManager.filterText(player.getName(), player.getUniqueId(), modifiableString, "privatemessage")) {
GalaxyUtility.sendBlockedNotification("DM Language",
player,
Utility.parseMiniMessage(Utility.parseColors(modifiableString.string())),
target);
return; // the message was blocked
}
2021-08-17 20:54:24 +00:00
messageComponent = modifiableString.component();
2021-06-23 19:16:48 +00:00
2022-05-30 20:10:54 +00:00
// Component component = Utility.parseMiniMessage("<message>", placeholders)
// .replaceText(TextReplacementConfig.builder().once().matchLiteral("[i]").replacement(ChatHandler.itemComponent(player.getInventory().getItemInMainHand())).build());
2021-06-23 19:16:48 +00:00
2022-05-30 20:10:54 +00:00
sendPrivateMessage(player, target, "privatemessage", messageComponent);
2022-02-05 20:16:20 +00:00
Component spymessage = Utility.parseMiniMessage(Config.MESSAGESPY, placeholders);
2021-07-30 01:16:41 +00:00
for(Player pl : Bukkit.getOnlinePlayers()) {
2021-08-25 10:41:47 +00:00
if(pl.hasPermission(Config.SPYPERMISSION) && ChatUserManager.getChatUser(pl.getUniqueId()).isSpy() && !pl.equals(player) && !pl.getName().equalsIgnoreCase(target)) {
2021-07-30 01:16:41 +00:00
pl.sendMessage(spymessage);
}
}
2021-06-23 19:16:48 +00:00
}
2021-06-02 17:55:55 +00:00
public void globalChat(Player player, String message) {
ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
2021-07-30 01:16:41 +00:00
if(!Utility.hasPermission(player.getUniqueId(), Config.GCPERMISSION)) {
2021-06-06 19:32:13 +00:00
player.sendMessage(GCNOTENABLED);// GC IS OFF INFORM THEM ABOUT THIS and cancel
return;
}
2021-08-04 13:46:45 +00:00
if (isMuted(player, message, "[GC Muted] ")) {
return;
}
2021-06-06 19:32:13 +00:00
long timeLeft = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - user.getGcCooldown());
2021-07-30 01:16:41 +00:00
if(timeLeft <= Config.GCCOOLDOWN && !player.hasPermission("chat.globalchat.cooldownbypass")) { // player is on cooldown and should wait x seconds
2022-02-19 14:14:41 +00:00
player.sendMessage(Utility.parseMiniMessage(Config.GCONCOOLDOWN, Placeholder.parsed("cooldown", Config.GCCOOLDOWN-timeLeft+"")));
2021-06-02 17:55:55 +00:00
return;
}
2021-05-13 12:11:29 +00:00
2021-07-17 22:48:55 +00:00
Component senderName = user.getDisplayName();
Component prefix = user.getPrefix();
2021-06-02 17:55:55 +00:00
TagResolver placeholders = TagResolver.resolver(
Placeholder.component("sender", senderName),
Placeholder.component("prefix", prefix),
Placeholder.component("message", parseMessageContent(player, message)),
Placeholder.parsed("server", Bukkit.getServerName())
);
Component component = Utility.parseMiniMessage(Config.GCFORMAT, placeholders);
ModifiableString modifiableString = new ModifiableString(component);
// todo a better way for this
if (!RegexManager.filterText(player.getName(), player.getUniqueId(), modifiableString, "globalchat")) {
GalaxyUtility.sendBlockedNotification("GC Language",
player,
Utility.parseMiniMessage(Utility.parseColors(modifiableString.string())),
"");
return; // the message was blocked
}
component = modifiableString.component();
2021-06-13 11:53:49 +00:00
2021-07-27 16:46:58 +00:00
user.setGcCooldown(System.currentTimeMillis());
2021-06-06 19:32:13 +00:00
sendPluginMessage(player, "globalchat", component);
}
2021-06-02 17:55:55 +00:00
public void chatChannel(Player player, CustomChannel channel, String message) {
2021-08-05 09:40:42 +00:00
if (!player.hasPermission(channel.getPermission())) {
player.sendMessage(Utility.parseMiniMessage("<red>You don't have permission to use this channel.</red>"));
2021-08-04 13:46:45 +00:00
return;
}
2021-08-05 09:40:42 +00:00
if (isMuted(player, message, "[" + channel.getChannelName() + " Muted] ")) return;
2021-08-04 13:46:45 +00:00
ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
Component senderName = user.getDisplayName();
TagResolver placeholders = TagResolver.resolver(
Placeholder.component("sender", senderName),
Placeholder.component("message", parseMessageContent(player, message)),
Placeholder.parsed("server", Bukkit.getServerName()),
Placeholder.parsed("channel", channel.getChannelName())
);
Component component = Utility.parseMiniMessage(channel.getFormat(), placeholders);
ModifiableString modifiableString = new ModifiableString(component);
if(!RegexManager.filterText(player.getName(), player.getUniqueId(), modifiableString, channel.getChannelName())) {
GalaxyUtility.sendBlockedNotification(channel.getChannelName() + " Language",
player,
Utility.parseMiniMessage(Utility.parseColors(modifiableString.string())),
"");
2021-08-04 13:46:45 +00:00
return; // the message was blocked
}
component = modifiableString.component();
2021-08-05 09:40:42 +00:00
if (channel.isProxy()) {
sendChatChannelMessage(player, channel.getChannelName(), "chatchannel", component);
} else {
2021-08-08 05:11:00 +00:00
sendChatChannelMessage(channel, player.getUniqueId(), component);
2021-08-05 09:40:42 +00:00
}
2021-08-04 13:46:45 +00:00
}
public void partyMessage(Player player, String message) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("party");
out.writeUTF(player.getUniqueId().toString());
out.writeUTF(message);
out.writeUTF(GsonComponentSerializer.gson().serialize(
itemComponent(player.getInventory().getItemInMainHand())
));
player.sendPluginMessage(plugin, Config.MESSAGECHANNEL, out.toByteArray());
// if (isMuted(player, message, "[" + party.getPartyName() + " Muted] ")) return;
//
// ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
// Component senderName = user.getDisplayName();
//
// String updatedMessage = RegexManager.replaceText(player.getName(), player.getUniqueId(), message);
// if(updatedMessage == null) {
// GalaxyUtility.sendBlockedNotification("Party Language", player, message, "");
// return; // the message was blocked
// }
//
// if(!player.hasPermission("chat.format")) {
// updatedMessage = Utility.stripTokens(updatedMessage);
// }
//
2022-05-26 22:31:36 +00:00
// if(updatedMessage.contains("[i]")) updatedMessage = updatedMessage.replaceFirst("[i]", "<item>");
//
// updatedMessage = Utility.formatText(updatedMessage);
//
2022-03-14 15:48:35 +00:00
// List<Placeholder> Placeholders = new ArrayList<>(List.of(
2022-02-05 20:16:20 +00:00
// Placeholder.miniMessage("sender", senderName),
// Placeholder.miniMessage("sendername", senderName),
// Placeholder.miniMessage("partyname", party.getPartyName()),
// Placeholder.miniMessage("message", updatedMessage),
// Placeholder.miniMessage("server", Bukkit.getServerName()),
// Placeholder.miniMessage("[i]", itemComponent(player.getInventory().getItemInMainHand()))));
//
2022-03-14 15:48:35 +00:00
// Component component = Utility.parseMiniMessage(Config.PARTY_FORMAT, Placeholders);
//// sendPartyMessage(player, party.getPartyId(), component);
//
2022-03-14 15:48:35 +00:00
// Component spyMessage = Utility.parseMiniMessage(Config.PARTY_SPY, Placeholders);
// for(Player pl : Bukkit.getOnlinePlayers()) {
// if(pl.hasPermission(Config.SPYPERMISSION) && !party.getPartyUsersUuid().contains(pl.getUniqueId())) {
// pl.sendMessage(spyMessage);
// }
// }
}
private void sendChatChannelMessage(CustomChannel chatChannel, UUID uuid, Component component) {
2021-08-05 09:40:42 +00:00
if (!chatChannel.getServers().contains(Bukkit.getServerName())) return;
2021-08-04 13:46:45 +00:00
2021-08-05 09:40:42 +00:00
Bukkit.getServer().getOnlinePlayers().stream()
.filter(p -> p.hasPermission(chatChannel.getPermission()))
2021-08-08 05:11:00 +00:00
.filter(p -> !ChatUserManager.getChatUser(p.getUniqueId()).getIgnoredPlayers().contains(uuid))
2021-08-05 09:40:42 +00:00
.forEach(p -> p.sendMessage(component));
2021-08-04 13:46:45 +00:00
}
2021-06-06 19:32:13 +00:00
private void sendPluginMessage(Player player, String channel, Component component) {
2021-06-02 17:55:55 +00:00
ByteArrayDataOutput out = ByteStreams.newDataOutput();
2021-06-06 19:32:13 +00:00
out.writeUTF(channel);
2021-07-30 21:22:38 +00:00
out.writeUTF(player.getUniqueId().toString());
2021-06-23 19:16:48 +00:00
out.writeUTF(GsonComponentSerializer.gson().serialize(component));
player.sendPluginMessage(plugin, Config.MESSAGECHANNEL, out.toByteArray());
}
private void sendPrivateMessage(Player player, String target, String channel, Component component) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF(channel);
out.writeUTF(player.getUniqueId().toString());
out.writeUTF(target);
out.writeUTF(GsonComponentSerializer.gson().serialize(component));
2021-06-02 17:55:55 +00:00
player.sendPluginMessage(plugin, Config.MESSAGECHANNEL, out.toByteArray());
}
2021-05-13 12:11:29 +00:00
2021-08-05 09:40:42 +00:00
public void sendChatChannelMessage(Player player, String chatChannelName, String channel, Component component) {
2021-08-04 13:46:45 +00:00
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF(channel);
2021-08-05 09:40:42 +00:00
out.writeUTF(chatChannelName);
2021-08-08 05:11:00 +00:00
out.writeUTF(player.getUniqueId().toString());
2021-08-04 13:46:45 +00:00
out.writeUTF(GsonComponentSerializer.gson().serialize(component));
player.sendPluginMessage(plugin, Config.MESSAGECHANNEL, out.toByteArray());
}
2021-06-06 19:32:13 +00:00
// Start - move these to util
2021-08-04 13:46:45 +00:00
2021-08-05 09:40:42 +00:00
private boolean isMuted(Player player, String message, String prefix) {
2022-01-05 14:25:17 +00:00
ChatUser user = ChatUserManager.getChatUser(player.getUniqueId());
if (user == null) return false;
if (user.isMuted() || (ChatPlugin.getInstance().serverMuted() && !player.hasPermission("chat.bypass-server-muted"))) {
// if (Database.get().isPlayerMuted(player.getUniqueId(), null) || (ChatPlugin.getInstance().serverMuted() && !player.hasPermission("chat.bypass-server-muted"))) {
GalaxyUtility.sendBlockedNotification(prefix, player, Utility.parseMiniMessage(Utility.stripTokens(message)), "");
2021-08-05 09:40:42 +00:00
return true;
}
return false;
}
2021-06-13 11:53:49 +00:00
public static Component itemComponent(ItemStack item) {
2021-07-27 16:46:58 +00:00
Component component = Component.text("[i]", NamedTextColor.AQUA);
if(item.getType().equals(Material.AIR))
return component.color(NamedTextColor.WHITE);
2021-06-06 19:32:13 +00:00
boolean dname = item.hasItemMeta() && item.getItemMeta().hasDisplayName();
if(dname) {
component = component.append(item.getItemMeta().displayName());
} else {
2021-07-27 16:46:58 +00:00
component = component.append(Component.text(materialToName(item.getType()), NamedTextColor.WHITE));
2021-06-06 19:32:13 +00:00
}
2021-07-27 16:46:58 +00:00
component = component.append(Component.text(" x" + item.getAmount(), NamedTextColor.AQUA));
2021-06-06 19:32:13 +00:00
component = component.hoverEvent(item.asHoverEvent());
return component;
}
private static String materialToName(Material m) {
if (m.equals(Material.TNT)) {
return "TNT";
}
String orig = m.toString().toLowerCase();
String[] splits = orig.split("_");
StringBuilder sb = new StringBuilder(orig.length());
int pos = 0;
for (String split : splits) {
sb.append(split);
int loc = sb.lastIndexOf(split);
char charLoc = sb.charAt(loc);
if (!(split.equalsIgnoreCase("of") || split.equalsIgnoreCase("and") ||
split.equalsIgnoreCase("with") || split.equalsIgnoreCase("on")))
sb.setCharAt(loc, Character.toUpperCase(charLoc));
if (pos != splits.length - 1)
sb.append(' ');
++pos;
}
return sb.toString();
}
// end - move these to util
2022-09-30 09:20:59 +00:00
private Component parseMessageContent(Player player, String rawMessage) {
TagResolver.Builder tagResolver = TagResolver.builder();
Utility.formattingPerms.forEach((perm, pair) -> {
if (player.hasPermission(perm)) {
tagResolver.resolver(pair.getX());
}
});
MiniMessage miniMessage = MiniMessage.builder().tags(tagResolver.build()).build();
Component component = miniMessage.deserialize(rawMessage);
for(ChatFilter chatFilter : RegexManager.getEmoteFilters()) {
component = component.replaceText(
TextReplacementConfig.builder()
.times(Config.EMOTELIMIT)
.match(chatFilter.getRegex())
.replacement(chatFilter.getReplacement()).build());
}
component = component
.replaceText(
TextReplacementConfig.builder()
.once()
.matchLiteral("[i]")
.replacement(ChatHandler.itemComponent(player.getInventory().getItemInMainHand()))
.build());
return component;
}
2021-05-13 12:11:29 +00:00
}