package eu.univento.core.listeners; import eu.univento.commons.player.rank.Rank; import eu.univento.commons.player.warn.WarnReason; import eu.univento.core.Core; import eu.univento.core.api.blocks.MiniBlock; import eu.univento.core.api.customitems.swords.BestSwordEver; import eu.univento.core.api.languages.Messages; import eu.univento.core.api.player.CustomPlayer; import eu.univento.core.api.server.ServerSettings; import eu.univento.core.api.shop.ShopItem; import eu.univento.core.api.shop.ShopMenu; import eu.univento.core.api.shop.entity.ShopVillager; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * manages chat * * @author joethei * @version 1.0 */ public class Chat implements Listener { private List players = new LinkedList<>(); private Map spam = new LinkedHashMap<>(); private Map spamPlayers = new LinkedHashMap<>(); @EventHandler public void onChat(AsyncPlayerChatEvent e) { CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer().getName()); Messages msgs = p.getMessages(); e.setCancelled(true); p.getDatabasePlayer().isMuted().whenComplete((aBoolean, throwable) -> { if (aBoolean) { p.sendMessage(msgs.PREFIX() + msgs.Core_SERVER_MUTED()); } else { //TODO: remove this, used for debugging if (e.getMessage().equalsIgnoreCase("bestswordever")) { new BestSwordEver(p).addItem(); } if (e.getMessage().equalsIgnoreCase("shopvillager")) { ShopMenu menu = new ShopMenu(Core.getInstance(), "Shop Villager", ShopItem.TestItem); new ShopVillager(Core.getInstance(), "Shop Villager", p.getLocation(), Villager.Profession.LIBRARIAN, menu); } if (e.getMessage().equalsIgnoreCase("miniblock")) { new MiniBlock(p.getLocation(), new ItemStack(Material.GRASS), 1); new MiniBlock(p.getEyeLocation(), new ItemStack(Material.DIAMOND_SWORD), 2); new MiniBlock(p.getWorld().getSpawnLocation(), new ItemStack(Material.WOOL), 3); } if (ServerSettings.isMute()) { if (!p.getDatabasePlayer().isAllowed(Rank.Sound)) { e.setCancelled(true); p.sendMessage(msgs.PREFIX() + msgs.Core_SERVER_MUTED()); } } if (players.contains(p)) { e.setCancelled(true); p.sendMessage("§cDu musst dich bewegen bevor du chatten kannst"); } if (System.currentTimeMillis() - spam.get(p) < 5 * 20L) { e.setCancelled(true); p.sendMessage("Nicht spammen"); spamPlayers.put(p, spamPlayers.get(p) + 1); } if (spamPlayers.get(p) > 100) { p.warn(WarnReason.SPAM, null, "https://players.univento.eu/" + p.getUniqueId().toString() + "/chatlog"); } char[] parts = e.getMessage().toCharArray(); int sum = 0; for (char part : parts) { sum += part; } double ratio = sum / parts.length; int percent = (int) (100.0D * ratio); if (percent < 50) { e.setCancelled(true); p.sendMessage("§cKeine Caps verwenden"); } String message = e.getMessage(); if (e.getFormat().contains("%")) message = message.replace("%", "%%"); if (p.getDatabasePlayer().isAllowed(Rank.VIP)) { if (p.getDatabasePlayer().getSettings().isNicked() && !ServerSettings.isLobby()) { e.setFormat(p.getDatabasePlayer().getRank().getPrefix() + p.getDatabasePlayer().getRank().getColor() + p.getDisplayName() + p.getDatabasePlayer().getRank().getSuffix() + ChatColor.translateAlternateColorCodes('&', message)); for(CustomPlayer player : Core.getOnlinePlayers()) player.sendMessage(e.getMessage()); } else { e.setFormat(p.getDatabasePlayer().getRank().getPrefix() + p.getDisplayName() + p.getDatabasePlayer().getRank().getSuffix() + ChatColor.translateAlternateColorCodes('&', message)); for(CustomPlayer player : Core.getOnlinePlayers()) player.sendMessage(e.getMessage()); } } else { e.setFormat(p.getDatabasePlayer().getRank().getPrefix() + p.getDisplayName() + p.getDatabasePlayer().getRank().getSuffix() + message); for(CustomPlayer player : Core.getOnlinePlayers()) player.sendMessage(e.getMessage()); Core.getOnlinePlayers().stream().filter(player -> e.getMessage().toLowerCase().contains(player.getDisplayName().toLowerCase()) || e.getMessage().toLowerCase().contains(player.getName().toLowerCase())).forEach(player -> player.playSound(p.getEyeLocation(), Sound.BLOCK_NOTE_PLING, 100.0F, 1.0F)); } } }); } @EventHandler public void onPlayerJoin(PlayerJoinEvent e) { CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer()); players.add(p); spamPlayers.put(p, 0); spam.put(p, System.currentTimeMillis()); } @EventHandler public void onPlayerQuit(PlayerQuitEvent e) { CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer()); if (players.contains(p)) players.remove(p); if (spam.containsKey(p)) spam.remove(p); } @EventHandler public void onPlayerMove(PlayerMoveEvent e) { CustomPlayer p = CustomPlayer.getPlayer(e.getPlayer()); if (players.contains(p)) players.remove(p); } }