From ba5c703d66ac20ace8ba0bb709b32f1d5f8bf1e6 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Wed, 7 Jan 2015 10:51:52 -0500 Subject: [PATCH] Added sending of persistent messages --- src/resources/encodables/player/Mail.java | 74 +++++++++++++++++++++++ src/services/chat/ChatService.java | 63 ++++++++++++++++++- 2 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 src/resources/encodables/player/Mail.java diff --git a/src/resources/encodables/player/Mail.java b/src/resources/encodables/player/Mail.java new file mode 100644 index 000000000..7aac6ee40 --- /dev/null +++ b/src/resources/encodables/player/Mail.java @@ -0,0 +1,74 @@ +package resources.encodables.player; + +import resources.network.BaselineBuilder.Encodable; + +public class Mail implements Encodable { + private static final long serialVersionUID = 1L; + + private int id; + private String sender; + private long receiverId; + private String subject; + private String message; + private byte status; + private int timestamp; + // TODO: Waypoint attachments + + public static final byte NEW = 0x4E; + public static final byte READ = 0x52; + public static final byte UNREAD = 0x55; + + public Mail(String sender, String subject, String message, long receiverId) { + this.sender = sender; + this.subject = subject; + this.message = message; + this.receiverId = receiverId; + this.status = NEW; + } + + @Override + public byte[] encode() { + // TODO Auto-generated method stub + return null; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getSender() { + return sender; + } + + public long getReceiverId() { + return receiverId; + } + + public String getSubject() { + return subject; + } + + public String getMessage() { + return message; + } + + public byte getStatus() { + return status; + } + + public void setStatus(byte status) { + this.status = status; + } + + public int getTimestamp() { + return timestamp; + } + + public void setTimestamp(int timestamp) { + this.timestamp = timestamp; + } +} diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index e7735deb1..08904a4d8 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -1,5 +1,7 @@ package services.chat; +import java.util.Date; + import intents.GalacticPacketIntent; import intents.chat.SpatialChatIntent; import network.packets.Packet; @@ -7,24 +9,42 @@ import network.packets.swg.zone.ChatRequestRoomList; import network.packets.swg.zone.chat.ChatInstantMessageToCharacter; import network.packets.swg.zone.chat.ChatInstantMessageToClient; import network.packets.swg.zone.chat.ChatOnSendInstantMessage; +import network.packets.swg.zone.chat.ChatOnSendPersistentMessage; +import network.packets.swg.zone.chat.ChatPersistentMessageToClient; +import network.packets.swg.zone.chat.ChatPersistentMessageToServer; import network.packets.swg.zone.object_controller.ObjectController; import network.packets.swg.zone.object_controller.SpatialChat; import resources.control.Intent; import resources.control.Service; +import resources.encodables.player.Mail; import resources.objects.SWGObject; import resources.player.Player; +import resources.server_info.ObjectDatabase; +import resources.server_info.ObjectDatabase.Traverser; import services.player.PlayerManager; public class ChatService extends Service { + private ObjectDatabase mails; + private int maxMailId; + public ChatService() { - + mails = new ObjectDatabase("odb/mails.db"); + maxMailId = 1; } @Override public boolean initialize() { registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(SpatialChatIntent.TYPE); + mails.loadToCache(); + mails.traverse(new Traverser() { + @Override + public void process(Mail mail) { + if (mail.getId() >= maxMailId) + maxMailId = mail.getId() + 1; + } + }); return super.initialize(); } @@ -38,6 +58,9 @@ public class ChatService extends Service { 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 (i instanceof SpatialChatIntent) @@ -95,4 +118,42 @@ public class ChatService extends Service { receiver.sendPacket(new ChatInstantMessageToClient(request.getGalaxy(), strSender, request.getMessage())); } + + private void handleSendPersistentMessage(PlayerManager playerMgr, Player sender, String galaxy, ChatPersistentMessageToServer request) { + ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(0, request.getCounter()); + sender.sendPacket(response); + + String recipientStr = request.getRecipient().toLowerCase(); + + if (recipientStr.contains(" ")) + recipientStr = recipientStr.split(" ")[0]; + + Player recipient = playerMgr.getPlayerByCreatureFirstName(recipientStr); + + if (recipient == null) + return; + + Mail mail = new Mail(sender.getCreatureObject().getName(), request.getSubject(), request.getMessage(), recipient.getCreatureObject().getObjectId()); + mail.setId(maxMailId); + maxMailId++; + mail.setTimestamp((int) new Date().getTime() / 1000); + + mails.put(mail.getId(), mail); + + sendPersistentMessage(recipient, mail, MailFlagType.HEADER_ONLY, galaxy); + } + + private void sendPersistentMessage(Player receiver, Mail mail, MailFlagType requestType, String galaxy) { + int requestFlag = requestType.ordinal(); + + ChatPersistentMessageToClient packet = new ChatPersistentMessageToClient((byte) requestFlag, mail.getSender(), galaxy, mail.getId(), + mail.getSubject(), mail.getMessage(), mail.getTimestamp(), mail.getStatus()); + + receiver.sendPacket(packet); + } + + private enum MailFlagType { + FULL_MESSAGE, + HEADER_ONLY; + } }