2024-03-26 09:32:42 +00:00
|
|
|
package cc.fascinated.chat;
|
|
|
|
|
|
|
|
import cc.fascinated.account.Account;
|
|
|
|
import cc.fascinated.account.AccountManager;
|
2024-03-28 19:01:11 +00:00
|
|
|
import cc.fascinated.config.Lang;
|
2024-03-26 09:32:42 +00:00
|
|
|
import cc.fascinated.utils.Manager;
|
2024-03-28 19:25:04 +00:00
|
|
|
import cc.fascinated.utils.MessageUtils;
|
2024-03-28 19:01:11 +00:00
|
|
|
import cc.fascinated.utils.Style;
|
2024-03-26 09:32:42 +00:00
|
|
|
import io.papermc.paper.event.player.AsyncChatEvent;
|
|
|
|
import net.kyori.adventure.text.Component;
|
2024-03-28 19:01:11 +00:00
|
|
|
import net.kyori.adventure.text.TextComponent;
|
2024-03-26 09:32:42 +00:00
|
|
|
import net.kyori.adventure.text.event.ClickEvent;
|
|
|
|
import net.kyori.adventure.text.format.NamedTextColor;
|
2024-03-28 19:01:11 +00:00
|
|
|
import net.kyori.adventure.text.minimessage.MiniMessage;
|
2024-03-26 09:32:42 +00:00
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
|
2024-03-28 19:01:11 +00:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
2024-03-26 09:32:42 +00:00
|
|
|
public class ChatManager extends Manager {
|
|
|
|
|
2024-03-28 19:01:11 +00:00
|
|
|
private final HashMap<Account, String> lastMessage = new HashMap<>();
|
|
|
|
private final Pattern domainPattern = Pattern.compile("^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,8}$");
|
|
|
|
|
2024-03-26 09:32:42 +00:00
|
|
|
@EventHandler
|
|
|
|
public void onChat(AsyncChatEvent event) {
|
|
|
|
Player player = event.getPlayer();
|
|
|
|
Account account = AccountManager.getAccount(player.getUniqueId());
|
|
|
|
NamedTextColor color = account.getPlayerColorProfile().getColor();
|
|
|
|
|
2024-03-28 19:01:11 +00:00
|
|
|
boolean blockedMessage = false;
|
|
|
|
|
|
|
|
TextComponent textComponent = (TextComponent) event.message();
|
|
|
|
String messageContent = textComponent.content();
|
|
|
|
|
|
|
|
// Check if the message contains a domain and is not the server's domain.
|
|
|
|
if (domainPattern.matcher(messageContent).find() && !messageContent.contains("aetheria.cc")) {
|
|
|
|
blockedMessage = true;
|
2024-03-28 19:25:04 +00:00
|
|
|
MessageUtils.messageOps(Lang.BLOCKED_MESSAGE_ALERT.getAsString()
|
|
|
|
.replace("%player%", account.getName())
|
|
|
|
.replace("%message%", messageContent)
|
|
|
|
);
|
2024-03-28 19:01:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Block the message if it is the same as the last message sent.
|
|
|
|
if (lastMessage.containsKey(account) && lastMessage.get(account).equalsIgnoreCase(messageContent)) {
|
|
|
|
blockedMessage = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blockedMessage) {
|
|
|
|
event.setCancelled(true);
|
|
|
|
account.sendMessage(Lang.BLOCKED_MESSAGE.getAsString());
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2024-03-26 09:32:42 +00:00
|
|
|
event.renderer((source, sourceDisplayName, message, viewer) -> {
|
2024-03-28 19:01:11 +00:00
|
|
|
MiniMessage miniMessage = Style.getMiniMessage();
|
|
|
|
return miniMessage.deserialize(Lang.CHAT_FORMAT.getAsString()
|
|
|
|
.replace("%chatcolor%", color.toString())
|
|
|
|
.replace("%name%", account.getName())
|
|
|
|
.replace("%message%", miniMessage.stripTags(messageContent))
|
|
|
|
);
|
2024-03-26 09:32:42 +00:00
|
|
|
});
|
2024-03-28 19:01:11 +00:00
|
|
|
lastMessage.put(account, messageContent);
|
2024-03-26 09:32:42 +00:00
|
|
|
}
|
|
|
|
}
|