2011-10-30 22:29:56 +01:00
|
|
|
package com.earth2me.essentials.chat;
|
|
|
|
|
|
|
|
import com.earth2me.essentials.User;
|
2013-07-13 18:40:50 +02:00
|
|
|
import net.ess3.api.IEssentials;
|
2013-07-13 18:24:40 +02:00
|
|
|
import net.ess3.api.events.LocalChatSpyEvent;
|
|
|
|
import org.bukkit.Location;
|
2011-10-30 22:29:56 +01:00
|
|
|
import org.bukkit.Server;
|
2013-07-13 18:24:40 +02:00
|
|
|
import org.bukkit.World;
|
|
|
|
import org.bukkit.entity.Player;
|
2012-01-20 05:20:37 +01:00
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.EventPriority;
|
2012-08-04 10:25:54 +02:00
|
|
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
2011-10-30 22:29:56 +01:00
|
|
|
|
2020-10-03 19:46:05 +02:00
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.Locale;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
2015-04-15 06:06:16 +02:00
|
|
|
import java.util.logging.Level;
|
|
|
|
|
|
|
|
import static com.earth2me.essentials.I18n.tl;
|
|
|
|
|
|
|
|
public class EssentialsChatPlayerListenerNormal extends EssentialsChatPlayer {
|
2019-01-05 19:42:09 +01:00
|
|
|
EssentialsChatPlayerListenerNormal(final Server server, final IEssentials ess, final Map<AsyncPlayerChatEvent, ChatStore> chatStorage) {
|
2015-04-15 06:06:16 +02:00
|
|
|
super(server, ess, chatStorage);
|
|
|
|
}
|
|
|
|
|
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
|
|
|
@Override
|
|
|
|
public void onPlayerChat(final AsyncPlayerChatEvent event) {
|
|
|
|
if (isAborted(event)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-05 19:42:09 +01:00
|
|
|
// This file should handle detection of the local chat features; if local chat is enabled, we need to handle it here
|
2015-04-15 06:06:16 +02:00
|
|
|
long radius = ess.getSettings().getChatRadius();
|
|
|
|
if (radius < 1) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
radius *= radius;
|
|
|
|
|
|
|
|
final ChatStore chatStore = getChatStore(event);
|
|
|
|
final User user = chatStore.getUser();
|
|
|
|
chatStore.setRadius(radius);
|
|
|
|
|
2021-09-29 03:26:47 +02:00
|
|
|
if (event.getMessage().length() > 1) {
|
|
|
|
if (chatStore.getType().isEmpty()) {
|
|
|
|
if (!user.isAuthorized("essentials.chat.local")) {
|
|
|
|
user.sendMessage(tl("notAllowedToLocal"));
|
|
|
|
event.setCancelled(true);
|
|
|
|
return;
|
|
|
|
}
|
2021-09-29 03:43:22 +02:00
|
|
|
event.getRecipients().removeIf(player -> !ess.getUser(player).isAuthorized("essentials.chat.receive.local"));
|
2021-09-29 03:26:47 +02:00
|
|
|
} else {
|
2021-09-29 03:43:22 +02:00
|
|
|
final String permission = "essentials.chat." + chatStore.getType();
|
2015-04-15 06:06:16 +02:00
|
|
|
|
2021-09-29 03:43:22 +02:00
|
|
|
if (user.isAuthorized(permission)) {
|
2021-09-29 03:26:47 +02:00
|
|
|
if (event.getMessage().charAt(0) == ess.getSettings().getChatShout() || event.getMessage().charAt(0) == ess.getSettings().getChatQuestion()) {
|
|
|
|
event.setMessage(event.getMessage().substring(1));
|
|
|
|
}
|
|
|
|
event.setFormat(tl(chatStore.getType() + "Format", event.getFormat()));
|
2021-09-29 03:43:22 +02:00
|
|
|
event.getRecipients().removeIf(player -> !ess.getUser(player).isAuthorized("essentials.chat.receive." + chatStore.getType()));
|
2021-09-29 03:26:47 +02:00
|
|
|
return;
|
2021-02-20 17:37:16 +01:00
|
|
|
}
|
2021-09-29 03:26:47 +02:00
|
|
|
|
|
|
|
user.sendMessage(tl("notAllowedTo" + chatStore.getType().substring(0, 1).toUpperCase(Locale.ENGLISH) + chatStore.getType().substring(1)));
|
|
|
|
event.setCancelled(true);
|
2015-04-15 06:06:16 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
final Location loc = user.getLocation();
|
|
|
|
final World world = loc.getWorld();
|
|
|
|
|
2015-04-22 17:58:04 +02:00
|
|
|
if (!charge(event, chatStore)) {
|
2015-04-15 06:06:16 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-10-03 19:46:05 +02:00
|
|
|
final Set<Player> outList = event.getRecipients();
|
|
|
|
final Set<Player> spyList = new HashSet<>();
|
2015-04-15 06:06:16 +02:00
|
|
|
|
|
|
|
try {
|
|
|
|
outList.add(event.getPlayer());
|
2020-10-03 19:46:05 +02:00
|
|
|
} catch (final UnsupportedOperationException ex) {
|
2015-04-15 06:06:16 +02:00
|
|
|
if (ess.getSettings().isDebug()) {
|
2019-01-05 19:42:09 +01:00
|
|
|
logger.log(Level.INFO, "Plugin triggered custom chat event, local chat handling aborted.", ex);
|
2015-04-15 06:06:16 +02:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
final String format = event.getFormat();
|
|
|
|
event.setFormat(tl("chatTypeLocal").concat(event.getFormat()));
|
|
|
|
|
|
|
|
final Iterator<Player> it = outList.iterator();
|
|
|
|
while (it.hasNext()) {
|
|
|
|
final Player onlinePlayer = it.next();
|
|
|
|
final User onlineUser = ess.getUser(onlinePlayer);
|
|
|
|
if (!onlineUser.equals(user)) {
|
|
|
|
boolean abort = false;
|
|
|
|
final Location playerLoc = onlineUser.getLocation();
|
|
|
|
if (playerLoc.getWorld() != world) {
|
|
|
|
abort = true;
|
|
|
|
} else {
|
|
|
|
final double delta = playerLoc.distanceSquared(loc);
|
|
|
|
if (delta > chatStore.getRadius()) {
|
|
|
|
abort = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (abort) {
|
|
|
|
if (onlineUser.isAuthorized("essentials.chat.spy")) {
|
|
|
|
spyList.add(onlinePlayer);
|
|
|
|
}
|
|
|
|
it.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (outList.size() < 2) {
|
|
|
|
user.sendMessage(tl("localNoOne"));
|
|
|
|
}
|
|
|
|
|
2020-10-03 19:46:05 +02:00
|
|
|
final LocalChatSpyEvent spyEvent = new LocalChatSpyEvent(event.isAsynchronous(), event.getPlayer(), format, event.getMessage(), spyList);
|
2015-04-15 06:06:16 +02:00
|
|
|
server.getPluginManager().callEvent(spyEvent);
|
|
|
|
|
|
|
|
if (!spyEvent.isCancelled()) {
|
2020-10-03 19:46:05 +02:00
|
|
|
for (final Player onlinePlayer : spyEvent.getRecipients()) {
|
2015-04-15 06:06:16 +02:00
|
|
|
onlinePlayer.sendMessage(String.format(spyEvent.getFormat(), user.getDisplayName(), spyEvent.getMessage()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-10-30 22:29:56 +01:00
|
|
|
}
|