From 06575f56534147936ad9fd60b2c7a02f6ee28002 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 11 Jan 2015 09:54:02 -0500 Subject: [PATCH] Mails can now be sent to off-line players --- src/services/chat/ChatService.java | 20 +++++++++++++------- src/services/player/LoginService.java | 6 ++++++ src/services/player/PlayerManager.java | 15 +++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 4599a6c98..67fc31ebb 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -126,9 +126,7 @@ public class ChatService extends Service { } 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(" ")) @@ -136,17 +134,25 @@ public class ChatService extends Service { Player recipient = playerMgr.getPlayerByCreatureFirstName(recipientStr); - if (recipient == null) - return; + long recId = (recipient == null ? playerMgr.getCharacterIdByName(request.getRecipient()) : recipient.getCreatureObject().getObjectId()); - Mail mail = new Mail(sender.getCreatureObject().getName(), request.getSubject(), request.getMessage(), recipient.getCreatureObject().getObjectId()); + int errorCode = 0; + + if (recId == 0) + errorCode = 4; + + ChatOnSendPersistentMessage response = new ChatOnSendPersistentMessage(errorCode, request.getCounter()); + sender.sendPacket(response); + + Mail mail = new Mail(sender.getCreatureObject().getName(), request.getSubject(), request.getMessage(), recId); mail.setId(maxMailId); maxMailId++; mail.setTimestamp((int) (new Date().getTime() / 1000)); mails.put(mail.getId(), mail); - sendPersistentMessage(recipient, mail, MailFlagType.HEADER_ONLY, galaxy); + if (recipient != null) + sendPersistentMessage(recipient, mail, MailFlagType.HEADER_ONLY, galaxy); } private void handlePersistentMessageIntent(PersistentMessageIntent intent) { diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 60febea6c..60bf06902 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -160,6 +160,12 @@ public class LoginService extends Service { return getUser.executeQuery(); } + public ResultSet getCharacter(String character) throws SQLException { + PreparedStatement statement = getLocalDatabase().prepareStatement("SELECT * FROM characters WHERE lower(name) = ?"); + statement.setString(1, character.toLowerCase()); + return statement.executeQuery(); + } + private List getGalaxies(Player p) throws SQLException { Config c = getConfig(ConfigFile.PRIMARY); ResultSet set = getGalaxies.executeQuery(); diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 604faa2e7..4421fc619 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -1,5 +1,7 @@ package services.player; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.HashMap; import java.util.Map; @@ -87,6 +89,19 @@ public class PlayerManager extends Manager { return null; } + public long getCharacterIdByName(String name) { + try { + ResultSet result = loginService.getCharacter(name); + if (result.next()) { + return result.getLong(0); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return 0; + } + private Player transitionLoginToZone(final long networkId, final int galaxyId, ClientIdMsg clientId) { final byte [] nToken = clientId.getSessionToken(); synchronized (players) {