1
0
Files
aetheria-anarchy-plugin/src/main/java/cc/fascinated/chat/ChatManager.java

87 lines
3.3 KiB
Java
Raw Normal View History

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 lombok.Getter;
import lombok.RequiredArgsConstructor;
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.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.HashMap;
import java.util.regex.Pattern;
@RequiredArgsConstructor @Getter
enum BlockReason {
DOMAIN("Domain was detected in the message."),
2024-03-29 17:46:05 +00:00
DUPLICATE("Duplicate message was detected."),
IP("IP address was detected in the message.");
private final String reason;
}
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-29 17:46:05 +00:00
private final Pattern ipPattern = Pattern.compile("\\b(?:\\d{1,3}\\.){1,3}\\d{1,3}\\b");
2024-03-28 19:01:11 +00:00
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();
BlockReason blockReason = null;
2024-03-28 19:01:11 +00:00
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")) {
blockReason = BlockReason.DOMAIN;
2024-03-29 17:46:05 +00:00
}
// Check if the message contains an IP address.
if (ipPattern.matcher(messageContent).find()) {
blockReason = BlockReason.IP;
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)) {
blockReason = BlockReason.DUPLICATE;
2024-03-28 19:01:11 +00:00
}
if (blockReason != null) {
2024-03-28 19:01:11 +00:00
event.setCancelled(true);
2024-03-29 17:46:05 +00:00
account.sendMessage(Lang.BLOCKED_MESSAGE.getAsString()
.replace("%reason%", blockReason.getReason())
);
if (blockReason != BlockReason.DUPLICATE) {
MessageUtils.messageOps(Lang.BLOCKED_MESSAGE_ALERT.getAsString()
.replace("%player%", account.getName())
.replace("%message%", messageContent)
);
}
2024-03-28 19:01:11 +00:00
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
}
}