From 714a3aeb98065a87b104ac7f566ec262bac08401 Mon Sep 17 00:00:00 2001 From: Obique Date: Wed, 11 Feb 2015 08:27:37 -0600 Subject: [PATCH] Made a huge refactor to ChatService to improve readability and reduce bugs --- src/services/chat/ChatService.java | 175 ++++++++++++++++------------- 1 file changed, 96 insertions(+), 79 deletions(-) diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 0f0310302..fd276ebd3 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -1,8 +1,9 @@ package services.chat; -import java.util.ArrayList; import java.util.Date; +import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -17,6 +18,7 @@ import intents.chat.ChatBroadcastIntent.BroadcastType; import intents.chat.PersistentMessageIntent; import intents.chat.SpatialChatIntent; import network.packets.Packet; +import network.packets.swg.SWGPacket; import network.packets.swg.zone.ChatRequestRoomList; import network.packets.swg.zone.chat.ChatDeletePersistentMessage; import network.packets.swg.zone.chat.ChatInstantMessageToCharacter; @@ -71,122 +73,146 @@ public class ChatService extends Service { } public void onIntentReceived(Intent i) { - if (i instanceof GalacticPacketIntent) { - Packet p = ((GalacticPacketIntent) i).getPacket(); - long netId = ((GalacticPacketIntent) i).getNetworkId(); - Player player = ((GalacticPacketIntent) i).getPlayerManager().getPlayerFromNetworkId(netId); - if (player != null) { + switch (i.getType()) { + case GalacticPacketIntent.TYPE: + if (i instanceof GalacticPacketIntent) + processPacket((GalacticPacketIntent) i); + break; + case SpatialChatIntent.TYPE: + if (i instanceof SpatialChatIntent) + handleSpatialChat((SpatialChatIntent) i); + break; + case PersistentMessageIntent.TYPE: + if (i instanceof PersistentMessageIntent) + handlePersistentMessageIntent((PersistentMessageIntent) i); + break; + case PlayerEventIntent.TYPE: + if (i instanceof PlayerEventIntent) + handlePlayerEventIntent((PlayerEventIntent) i); + break; + case ChatBroadcastIntent.TYPE: + if (i instanceof ChatBroadcastIntent) + handleChatBroadcast((ChatBroadcastIntent) i); + break; + case ServerStatusIntent.TYPE: + if (i instanceof ServerStatusIntent) + if (((ServerStatusIntent)i).getStatus() == ServerStatus.SHUTDOWN_REQUESTED) + sendShutdownBroadcasts(((ServerStatusIntent) i).getTime()); + break; + } + } + + private void processPacket(GalacticPacketIntent intent) { + Player player = intent.getPlayerManager().getPlayerFromNetworkId(intent.getNetworkId()); + if (player == null) + return; + Packet p = intent.getPacket(); + if (p instanceof SWGPacket) + processSwgPacket(intent.getPlayerManager(), player, intent.getGalaxy().getName(), (SWGPacket) p); + } + + private void processSwgPacket(PlayerManager pm, Player player, String galaxyName, SWGPacket p) { + switch (p.getPacketType()) { + case CHAT_REQUEST_ROOM_LIST: if (p instanceof ChatRequestRoomList) handleChatRoomListRequest(player, (ChatRequestRoomList) p); - else if (p instanceof ChatInstantMessageToCharacter) - handleInstantMessage(((GalacticPacketIntent) i).getPlayerManager(), player, (ChatInstantMessageToCharacter) p); - else if (p instanceof ChatPersistentMessageToServer) - handleSendPersistentMessage(((GalacticPacketIntent) i).getPlayerManager(), player, - ((GalacticPacketIntent) i).getGalaxy().getName(), (ChatPersistentMessageToServer) p); - else if (p instanceof ChatRequestPersistentMessage) - handlePersistentMessageRequest(player, ((GalacticPacketIntent) i).getGalaxy().getName(), (ChatRequestPersistentMessage) p); - else if (p instanceof ChatDeletePersistentMessage) + break; + case CHAT_INSTANT_MESSAGE_TO_CHARACTER: + if (p instanceof ChatInstantMessageToCharacter) + handleInstantMessage(pm, player, (ChatInstantMessageToCharacter) p); + break; + case CHAT_PERSISTENT_MESSAGE_TO_SERVER: + if (p instanceof ChatPersistentMessageToServer) + handleSendPersistentMessage(pm, player, galaxyName, (ChatPersistentMessageToServer) p); + break; + case CHAT_REQUEST_PERSISTENT_MESSAGE: + if (p instanceof ChatRequestPersistentMessage) + handlePersistentMessageRequest(player, galaxyName, (ChatRequestPersistentMessage) p); + break; + case CHAT_DELETE_PERSISTENT_MESSAGE: + if (p instanceof ChatDeletePersistentMessage) deletePersistentMessage(((ChatDeletePersistentMessage) p).getMailId()); - } - } - else if (i instanceof SpatialChatIntent) - handleSpatialChat((SpatialChatIntent) i); - else if (i instanceof PersistentMessageIntent) - handlePersistentMessageIntent((PersistentMessageIntent) i); - else if (i instanceof PlayerEventIntent) - handlePlayerEventIntent((PlayerEventIntent) i); - else if (i instanceof ChatBroadcastIntent) - handleChatBroadcast((ChatBroadcastIntent) i); - else if (i instanceof ServerStatusIntent && ((ServerStatusIntent) i).getStatus() == ServerStatus.SHUTDOWN_REQUESTED) - sendShutdownBroadcasts(((ServerStatusIntent) i).getTime()); + break; + default: + break; + } } private void handlePlayerEventIntent(PlayerEventIntent intent) { - switch(intent.getEvent()) { - case PE_ZONE_IN: - sendPersistentMessageHeaders(intent.getPlayer(), intent.getGalaxy()); - break; - default: break; + switch (intent.getEvent()) { + case PE_ZONE_IN: + sendPersistentMessageHeaders(intent.getPlayer(), intent.getGalaxy()); + break; + default: break; } } private void handleChatBroadcast(ChatBroadcastIntent i) { if (i.getBroadcastType() == BroadcastType.AREA) broadcastAreaMessage(i.getMessage(), i.getBroadcaster()); - else broadcastGalaxyMessage(i.getMessage(), i.getTerrain()); + else + broadcastGalaxyMessage(i.getMessage(), i.getTerrain()); } - + private void handleChatRoomListRequest(Player player, ChatRequestRoomList request) { -// ChatRoomList list = new ChatRoomList(); -// list.addChatRoom(new ChatRoom(1, 0, 0, "SWG.Josh Wifi.Chat.tcpa", "SWG", "Josh Wifi", player.getCreatureObject().getName(), player.getCreatureObject().getName(), "Chat")); -// sendPacket(player, list); + } private void handleSpatialChat(SpatialChatIntent i) { - // TODO: Emotes, also figure out one of the unknown ints. Might be that "Player A says to Player B" is one of the unknowns. (targetId in SpatialChat packet) Player sender = i.getPlayer(); SWGObject actor = sender.getCreatureObject(); - + // Send to self SpatialChat message = new SpatialChat(actor.getObjectId(), 0, i.getMessage(), i.getChatType(), i.getMoodId()); - ObjectController controller = new ObjectController(SpatialChat.CRC, actor.getObjectId(), message); - - sender.sendPacket(controller); + sender.sendPacket(new ObjectController(SpatialChat.CRC, actor.getObjectId(), message)); // Notify observers of the chat message for (Player observer : actor.getObservers()) { if (observer.getCreatureObject() == null) continue; - - controller = new ObjectController(244, observer.getCreatureObject().getObjectId(), message); - observer.sendPacket(controller); + long id = observer.getCreatureObject().getObjectId(); + observer.sendPacket(new ObjectController(SpatialChat.CRC, id, message)); } } private void handleInstantMessage(PlayerManager playerMgr, Player sender, ChatInstantMessageToCharacter request) { - String strReceiver = request.getCharacter().toLowerCase(); - String strSender = sender.getCharacterName().toLowerCase(); + String strReceiver = request.getCharacter().toLowerCase(Locale.ENGLISH); + String strSender = sender.getCharacterName().toLowerCase(Locale.ENGLISH); if (strSender.contains(" ")) strSender = strSender.split(" ")[0]; Player receiver = playerMgr.getPlayerByCreatureFirstName(strReceiver); - + int errorCode = 0; // 0 = No issue, 4 = "strReceiver is not online" if (receiver == null) errorCode = 4; - ChatOnSendInstantMessage response = new ChatOnSendInstantMessage(errorCode, request.getSequence()); - sender.sendPacket(response); + sender.sendPacket(new ChatOnSendInstantMessage(errorCode, request.getSequence())); - if (errorCode == 4) + if (receiver == null) return; receiver.sendPacket(new ChatInstantMessageToClient(request.getGalaxy(), strSender, request.getMessage())); } private void handleSendPersistentMessage(PlayerManager playerMgr, Player sender, String galaxy, ChatPersistentMessageToServer request) { - - String recipientStr = request.getRecipient().toLowerCase(); + String recipientStr = request.getRecipient().toLowerCase(Locale.ENGLISH); if (recipientStr.contains(" ")) recipientStr = recipientStr.split(" ")[0]; Player recipient = playerMgr.getPlayerByCreatureFirstName(recipientStr); - long recId = (recipient == null ? playerMgr.getCharacterIdByName(request.getRecipient()) : recipient.getCreatureObject().getObjectId()); - int errorCode = 0; if (recId == 0) errorCode = 4; - ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(errorCode, request.getCounter()); - sender.sendPacket(response); + sender.sendPacket(new ChatOnSendPersistentMessage(errorCode, request.getCounter())); Mail mail = new Mail(sender.getCharacterName(), request.getSubject(), request.getMessage(), recId); - mail.setId(maxMailId); - maxMailId++; + mail.setId(maxMailId++); mail.setTimestamp((int) (new Date().getTime() / 1000)); mails.put(mail.getId(), mail); @@ -243,9 +269,8 @@ public class ChatService extends Service { private void sendShutdownBroadcasts(final long time) { final AtomicInteger runCount = new AtomicInteger(); + final long interval = (int) (time / 3); - final int interval = (int) (time / 3); - Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(new Runnable() { public void run() { switch(runCount.getAndIncrement()) { @@ -268,14 +293,12 @@ public class ChatService extends Service { } private void sendPersistentMessageHeaders(Player player, String galaxy) { - if (player == null || player.getCreatureObject() == null) return; + final List playersMail = new LinkedList(); final long receiverId = player.getCreatureObject().getObjectId(); - final List playersMail = new ArrayList(); - mails.traverse(new Traverser() { @Override public void process(Mail element) { @@ -284,10 +307,8 @@ public class ChatService extends Service { } }); - if (playersMail.isEmpty()) - return; - - for (Mail mail : playersMail) { sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy); } + for (Mail mail : playersMail) + sendPersistentMessage(player, mail, MailFlagType.HEADER_ONLY, galaxy); } private void sendPersistentMessage(Player receiver, Mail mail, MailFlagType requestType, String galaxy) { @@ -296,18 +317,14 @@ public class ChatService extends Service { ChatPersistentMessageToClient packet = null; - switch(requestType) { - case FULL_MESSAGE: - packet = new ChatPersistentMessageToClient((byte) 0, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), mail.getMessage(), mail.getTimestamp(), mail.getStatus()); - break; - - case HEADER_ONLY: - packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus()); - break; - - default: - packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus()); - break; + switch (requestType) { + case FULL_MESSAGE: + packet = new ChatPersistentMessageToClient((byte) 0, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), mail.getMessage(), mail.getTimestamp(), mail.getStatus()); + break; + case HEADER_ONLY: + default: + packet = new ChatPersistentMessageToClient((byte) 1, mail.getSender(), galaxy, mail.getId(), mail.getSubject(), "", mail.getTimestamp(), mail.getStatus()); + break; } receiver.sendPacket(packet);