diff --git a/scripts/commands/generic/addFriend.js b/scripts/commands/generic/addFriend.js index dd5302bc1..da50e4954 100644 --- a/scripts/commands/generic/addFriend.js +++ b/scripts/commands/generic/addFriend.js @@ -1,10 +1,9 @@ var execute = function(galManager, player, target, args) { var ChatAvatarRequestIntent = Java.type("intents.chat.ChatAvatarRequestIntent"); var RequestType = Java.type("intents.chat.ChatAvatarRequestIntent.RequestType"); - var ghost = player.getPlayerObject(); var name; - if(ghost == null || args == null) { + if(args == null) { return; } diff --git a/scripts/commands/generic/addIgnore.js b/scripts/commands/generic/addIgnore.js new file mode 100644 index 000000000..61c3a5f83 --- /dev/null +++ b/scripts/commands/generic/addIgnore.js @@ -0,0 +1,17 @@ +function execute(galacticManager, player, target, args) { + var ChatAvatarRequestIntent = Java.type("intents.chat.ChatAvatarRequestIntent"); + var RequestType = Java.type("intents.chat.ChatAvatarRequestIntent.RequestType"); + var name; + + if(args == null) { + return; + } + + name = args.split(" ")[0].toLowerCase(java.util.Locale.English); + + if(name == null) { + return; + } + + new ChatAvatarRequestIntent(player, name, RequestType.IGNORE_ADD_TARGET).broadcast(); +} \ No newline at end of file diff --git a/scripts/commands/generic/removeFriend.js b/scripts/commands/generic/removeFriend.js index 50742f2e8..ad7da747e 100644 --- a/scripts/commands/generic/removeFriend.js +++ b/scripts/commands/generic/removeFriend.js @@ -1,12 +1,9 @@ var execute = function(galManager, player, target, args) { var ChatAvatarRequestIntent = Java.type("intents.chat.ChatAvatarRequestIntent"); var RequestType = Java.type("intents.chat.ChatAvatarRequestIntent.RequestType"); - var ProsePackage = Java.type("resources.encodables.ProsePackage"); - var ChatBroadcastIntent = Java.type("intents.chat.ChatBroadcastIntent"); - var ghost = player.getPlayerObject(); var name; - if(ghost == null || args == null) { + if(args == null) { return; } @@ -15,11 +12,6 @@ var execute = function(galManager, player, target, args) { if(name == null) { return; } - - if(!ghost.getFriendsList().contains(name)) { - new ChatBroadcastIntent(player, new ProsePackage("@cmnty:friend_not_found", "TT", name)).broadcast(); - return; - } - + new ChatAvatarRequestIntent(player, name, RequestType.FRIEND_REMOVE_TARGET).broadcast(); }; \ No newline at end of file diff --git a/scripts/commands/generic/removeIgnore.js b/scripts/commands/generic/removeIgnore.js new file mode 100644 index 000000000..46ed7be93 --- /dev/null +++ b/scripts/commands/generic/removeIgnore.js @@ -0,0 +1,17 @@ +function execute(galacticManager, player, target, args) { + var ChatAvatarRequestIntent = Java.type("intents.chat.ChatAvatarRequestIntent"); + var RequestType = Java.type("intents.chat.ChatAvatarRequestIntent.RequestType"); + var name; + + if(args == null) { + return; + } + + name = args.split(" ")[0].toLowerCase(java.util.Locale.English); + + if(name == null) { + return; + } + + new ChatAvatarRequestIntent(player, name, RequestType.IGNORE_REMOVE_TARGET).broadcast(); +} \ No newline at end of file diff --git a/src/intents/chat/ChatAvatarRequestIntent.java b/src/intents/chat/ChatAvatarRequestIntent.java index 2ed8d4538..1e3902148 100644 --- a/src/intents/chat/ChatAvatarRequestIntent.java +++ b/src/intents/chat/ChatAvatarRequestIntent.java @@ -65,6 +65,7 @@ public class ChatAvatarRequestIntent extends Intent{ FRIEND_ADD_TARGET, FRIEND_REMOVE_TARGET, IGNORE_ADD_TARGET, - IGNORE_REMOVE_TARGET + IGNORE_REMOVE_TARGET, + IGNORE_LIST } } diff --git a/src/resources/chat/ChatRoom.java b/src/resources/chat/ChatRoom.java index 1e53efaef..d3749e91f 100644 --- a/src/resources/chat/ChatRoom.java +++ b/src/resources/chat/ChatRoom.java @@ -32,6 +32,7 @@ import network.packets.swg.SWGPacket; import network.packets.swg.zone.chat.ChatRoomMessage; import resources.encodables.Encodable; import resources.encodables.OutOfBandPackage; +import resources.objects.player.PlayerObject; import resources.player.Player; import services.player.PlayerManager; @@ -233,7 +234,22 @@ public class ChatRoom implements Encodable, Serializable { public void sendMessage(ChatAvatar sender, String message, OutOfBandPackage oob, PlayerManager playerManager) { ChatRoomMessage chatRoomMessage = new ChatRoomMessage(sender, getId(), message, oob); - sendPacketToMembers(playerManager, chatRoomMessage); + + String senderName = sender.getName(); + for (ChatAvatar member : members) { + Player player = playerManager.getPlayerFromNetworkId(member.getNetworkId()); + if (player == null) + continue; + + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) + continue; + + if (ghost.isIgnored(senderName)) + continue; + + player.sendPacket(chatRoomMessage); + } } public void sendPacketToMembers(PlayerManager manager, SWGPacket... packets) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index f0d289c4a..946633519 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -360,7 +360,29 @@ public class PlayerObject extends IntangibleObject { } public List getFriendsList() { - return this.friendsList; + return friendsList; + } + + public void addIgnored(String ignored) { + synchronized (ignoreList) { + ignoreList.add(ignored); + } + ignoreList.sendDeltaMessage(this); + } + + public void removeIgnored(String ignored) { + synchronized (ignoreList) { + ignoreList.remove(ignored); + } + ignoreList.sendDeltaMessage(this); + } + + public boolean isIgnored(String target) { + return ignoreList.contains(target); + } + + public List getIgnoreList() { + return ignoreList; } public String getProfWheelPosition() { diff --git a/src/services/chat/ChatManager.java b/src/services/chat/ChatManager.java index 1262ed557..686bc2a9d 100644 --- a/src/services/chat/ChatManager.java +++ b/src/services/chat/ChatManager.java @@ -214,10 +214,6 @@ public class ChatManager extends Manager { sendTargetAvatarStatus(player, new ChatAvatar(0, i.getTarget(), player.getGalaxyName())); break; } - case IGNORE_REMOVE_TARGET: - break; - case IGNORE_ADD_TARGET: - break; case FRIEND_ADD_TARGET: handleAddFriend(i.getPlayer(), i.getTarget()); break; @@ -227,6 +223,15 @@ public class ChatManager extends Manager { case FRIEND_LIST: handleRequestFriendList(i.getPlayer()); break; + case IGNORE_REMOVE_TARGET: + handleRemoveIgnored(i.getPlayer(), i.getTarget()); + break; + case IGNORE_ADD_TARGET: + handleAddIgnored(i.getPlayer(), i.getTarget()); + break; + case IGNORE_LIST: + handleRequestIgnoreList(i.getPlayer()); + break; } } @@ -247,9 +252,14 @@ public class ChatManager extends Manager { if (ghost == null) return; + if (!ghost.getFriendsList().contains(target)) { + sendSystemMessage(player, "@cmnty:friend_not_found", target); + return; + } + ghost.removeFriend(target); - new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_removed", "TT", target)).broadcast(); + sendSystemMessage(player, "@cmnty:friend_removed", target); } private void handleAddFriend(Player player, String target) { @@ -260,18 +270,23 @@ public class ChatManager extends Manager { if (ghost == null) return; + if (ghost.isIgnored(target)) { + sendSystemMessage(player, "@cmnty:friend_fail_is_ignored", target); + return; + } + if (ghost.getFriendsList().contains(target)) { - new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_duplicate", "TT", target)).broadcast(); + sendSystemMessage(player, "@cmnty:friend_duplicate", target); return; } if (!player.getPlayerManager().playerExists(target)) { - new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_not_found", "TT", target)).broadcast(); + sendSystemMessage(player, "@cmnty:friend_not_found", target); return; } ghost.addFriend(target); - new ChatBroadcastIntent(player, new ProsePackage("StringId", "@cmnty:friend_added", "TT", target)).broadcast(); + sendSystemMessage(player, "@cmnty:friend_added", target); Player targetPlayer = player.getPlayerManager().getPlayerByCreatureFirstName(target); @@ -279,6 +294,61 @@ public class ChatManager extends Manager { player.sendPacket(new ChatFriendsListUpdate(new ChatAvatar(0, target, targetPlayer.getGalaxyName()), true)); } + /* Ignore List */ + + private void handleAddIgnored(Player player, String target) { + if (target.equalsIgnoreCase(player.getCharacterName().split(" ")[0])) + return; + + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) + return; + + if (ghost.isIgnored(target)) { + sendSystemMessage(player, "@cmnty:ignore_duplicate", target); + return; + } + + if (!player.getPlayerManager().playerExists(target)) { + sendSystemMessage(player, "@cmnty:ignore_not_found", target); + return; + } + + ghost.addIgnored(target); + sendSystemMessage(player, "@cmnty:ignore_added", target); + } + + private void handleRemoveIgnored(Player player, String target) { + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) + return; + + if (!ghost.isIgnored(target)) { + sendSystemMessage(player, "@cmnty:ignore_not_found", target); + return; + } + + ghost.removeIgnored(target); + + sendSystemMessage(player, "@cmnty:ignore_removed", target); + } + + private void handleRequestIgnoreList(Player player) { + PlayerObject ghost = player.getPlayerObject(); + if (ghost == null) + return; + + SWGList ignored = (SWGList) ghost.getIgnoreList(); + + ignored.sendRefreshedListData(ghost); + } + + /* Misc */ + + private void sendSystemMessage(Player player, String stringId, String target) { + new ChatBroadcastIntent(player, new ProsePackage("StringId", stringId, "TT", target)).broadcast(); + } + private void handleSpatialChat(SpatialChatIntent i) { Player sender = i.getPlayer(); SWGObject actor = sender.getCreatureObject(); @@ -286,10 +356,17 @@ public class ChatManager extends Manager { // Send to self SpatialChat message = new SpatialChat(actor.getObjectId(), actor.getObjectId(), 0, i.getMessage(), (short) i.getChatType(), (short) i.getMoodId()); sender.sendPacket(message); - + + String senderName = ChatAvatar.getFromPlayer(sender).getName(); + // Notify observers of the chat message for (SWGObject aware : actor.getObservers()) { - if (aware.getOwner() != null) + Player owner = aware.getOwner(); + if (owner == null) + continue; + + PlayerObject awareGhost = owner.getPlayerObject(); + if (!awareGhost.isIgnored(senderName)) aware.getOwner().sendPacket(new SpatialChat(aware.getObjectId(), message)); } } @@ -306,10 +383,13 @@ public class ChatManager extends Manager { int errorCode = 0; // 0 = No issue, 4 = "strReceiver is not online" if (receiver == null || receiver.getPlayerState() != PlayerState.ZONED_IN) errorCode = 4; - + + if (errorCode != 4 && receiver.getPlayerObject() != null && receiver.getPlayerObject().isIgnored(strSender)) + errorCode = ChatResult.IGNORED.getCode(); + sender.sendPacket(new ChatOnSendInstantMessage(errorCode, request.getSequence())); - if (errorCode == 4) + if (errorCode != 0) return; receiver.sendPacket(new ChatInstantMessageToClient(request.getGalaxy(), strSender, request.getMessage())); @@ -330,12 +410,15 @@ public class ChatManager extends Manager { if (recId == 0) result = ChatResult.TARGET_AVATAR_DOESNT_EXIST; + if (sender.getPlayerObject().isIgnored(recipientStr)) + result = ChatResult.IGNORED; + sender.sendPacket(new ChatOnSendPersistentMessage(result, request.getCounter())); if (result != ChatResult.SUCCESS) return; - Mail mail = new Mail(sender.getCharacterName(), request.getSubject(), request.getMessage(), recId); + Mail mail = new Mail(sender.getCharacterName().split(" ")[0].toLowerCase(), request.getSubject(), request.getMessage(), recId); mail.setId(maxMailId++); mail.setTimestamp((int) (new Date().getTime() / 1000)); mail.setOutOfBandPackage(request.getOutOfBandPackage()); @@ -449,7 +532,7 @@ public class ChatManager extends Manager { final List playersMail = new LinkedList<>(); final long receiverId = player.getCreatureObject().getObjectId(); - + mails.traverse(element -> { if (element.getReceiverId() == receiverId) playersMail.add(element); @@ -462,7 +545,13 @@ public class ChatManager extends Manager { private void sendPersistentMessage(Player receiver, Mail mail, MailFlagType requestType, String galaxy) { if (receiver == null || receiver.getCreatureObject() == null) return; - + + PlayerObject ghost = receiver.getPlayerObject(); + if (ghost.isIgnored(mail.getSender())) { + mails.remove(mail.getId()); + return; + } + ChatPersistentMessageToClient packet = null; switch (requestType) {