Hush/src/main/java/com/zerohighdef/hush/listeners/HushAsyncChatListener.java

100 lines
3.4 KiB
Java

package com.zerohighdef.hush.listeners;
import com.zerohighdef.hush.Hush;
import com.zerohighdef.hush.WatchList;
import org.apache.commons.lang.ObjectUtils;
import org.bukkit.BanList;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import xyz.etztech.Javacord;
import xyz.etztech.Webhook;
import xyz.etztech.embed.Author;
import xyz.etztech.embed.Embed;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.regex.Pattern;
interface Action {
void action();
}
public class HushAsyncChatListener implements Listener {
private final Hush plugin;
public HushAsyncChatListener(Hush plugin) {
this.plugin = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = false)
public boolean onChat(AsyncPlayerChatEvent event) {
String chatMessage = event.getMessage();
Player sender = event.getPlayer();
for (WatchList list : plugin.getWatchLists()) {
if (sender.hasPermission(list.getPermission())) {
boolean phraseFound = checkPhraseList(list.getBanPatterns(), sender, chatMessage, (() -> {
banPlayer(sender, list.getBanMessage());
}));
if (phraseFound) {
event.setCancelled(true);
return true;
}
checkPhraseList(list.getMonitorPatterns(), sender, chatMessage, null);
}
}
return true;
}
private void banPlayer(Player player, String banMessage) {
Bukkit.getBanList(BanList.Type.NAME)
.addBan(player.getName(), banMessage, null, null);
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.kickPlayer("You have been banned: " + banMessage);
}
});
}
private boolean checkPhraseList(List<Pattern> patternList, Player player, String chatMessage, Action action) {
for (Pattern pattern: patternList) {
if (pattern.matcher(chatMessage).find()) {
if (action != null) {
action.action();
}
String playerName = player.getName();
String webhook = plugin.getConfig().getString("webhook");
if (webhook != null) {
String message = playerName + " said: " + "`" + Javacord.escapeFormat(chatMessage) + "`";
Embed embed = new Embed()
.color(0xC70039)
.description(message)
.author(new Author(playerName, "", String.format("https://minotar.net/helm/%s/100.png", playerName), ""))
.timestamp(OffsetDateTime.now());
this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, () -> {
try {
Javacord.sendWebhook(webhook, new Webhook("@here", embed));
} catch (Exception e) {
this.plugin.log("Webhook failed to send");
}
});
}
return true;
}
}
return false;
}
}