MailManager.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package com.l2jserver.gameserver.instancemanager;
  16. import java.sql.Connection;
  17. import java.sql.PreparedStatement;
  18. import java.sql.ResultSet;
  19. import java.sql.SQLException;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.logging.Level;
  23. import java.util.logging.Logger;
  24. import javolution.util.FastList;
  25. import javolution.util.FastMap;
  26. import com.l2jserver.L2DatabaseFactory;
  27. import com.l2jserver.gameserver.ThreadPoolManager;
  28. import com.l2jserver.gameserver.idfactory.IdFactory;
  29. import com.l2jserver.gameserver.model.L2World;
  30. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  31. import com.l2jserver.gameserver.model.entity.Message;
  32. import com.l2jserver.gameserver.network.SystemMessageId;
  33. import com.l2jserver.gameserver.network.serverpackets.ExNoticePostArrived;
  34. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  35. /**
  36. * @author Migi, DS<br>
  37. */
  38. public class MailManager
  39. {
  40. private static Logger _log = Logger.getLogger(MailManager.class.getName());
  41. private Map<Integer, Message> _messages = new FastMap<Integer, Message>().shared();
  42. public static MailManager getInstance()
  43. {
  44. return SingletonHolder._instance;
  45. }
  46. private MailManager()
  47. {
  48. load();
  49. }
  50. private void load()
  51. {
  52. int count = 0;
  53. Connection con = null;
  54. try
  55. {
  56. con = L2DatabaseFactory.getInstance().getConnection();
  57. PreparedStatement statement = con.prepareStatement("SELECT * FROM messages ORDER BY expiration");
  58. // stmt2 = con.prepareStatement("SELECT * FROM attachments WHERE messageId = ?");
  59. ResultSet rset1 = statement.executeQuery();
  60. while (rset1.next())
  61. {
  62. Message msg = new Message(rset1);
  63. int msgId = msg.getId();
  64. _messages.put(msgId, msg);
  65. count++;
  66. long expiration = msg.getExpiration();
  67. if (expiration < System.currentTimeMillis())
  68. ThreadPoolManager.getInstance().scheduleGeneral(new MessageDeletionTask(msgId), 10000);
  69. else
  70. ThreadPoolManager.getInstance().scheduleGeneral(new MessageDeletionTask(msgId), expiration - System.currentTimeMillis());
  71. }
  72. rset1.close();
  73. statement.close();
  74. }
  75. catch (SQLException e)
  76. {
  77. _log.log(Level.WARNING, "Mail Manager: Error loading from database:" + e.getMessage(), e);
  78. }
  79. finally
  80. {
  81. L2DatabaseFactory.close(con);
  82. }
  83. _log.info("Mail Manager: Successfully loaded " + count + " messages.");
  84. }
  85. public final Message getMessage(int msgId)
  86. {
  87. return _messages.get(msgId);
  88. }
  89. public final boolean hasUnreadPost(L2PcInstance player)
  90. {
  91. final int objectId = player.getObjectId();
  92. for (Message msg : _messages.values())
  93. {
  94. if (msg != null
  95. && msg.getReceiverId() == objectId
  96. && msg.isUnread())
  97. return true;
  98. }
  99. return false;
  100. }
  101. public final int getInboxSize(int objectId)
  102. {
  103. int size = 0;
  104. for (Message msg : _messages.values())
  105. {
  106. if (msg != null
  107. && msg.getReceiverId() == objectId
  108. && !msg.isDeletedByReceiver())
  109. size++;
  110. }
  111. return size;
  112. }
  113. public final int getOutboxSize(int objectId)
  114. {
  115. int size = 0;
  116. for (Message msg : _messages.values())
  117. {
  118. if (msg != null
  119. && msg.getSenderId() == objectId
  120. && !msg.isDeletedBySender())
  121. size++;
  122. }
  123. return size;
  124. }
  125. public final List<Message> getInbox(int objectId)
  126. {
  127. List<Message> inbox = new FastList<Message>();
  128. for (Message msg : _messages.values())
  129. {
  130. if (msg != null
  131. && msg.getReceiverId() == objectId
  132. && !msg.isDeletedByReceiver())
  133. inbox.add(msg);
  134. }
  135. return inbox;
  136. }
  137. public final List<Message> getOutbox(int objectId)
  138. {
  139. List<Message> outbox = new FastList<Message>();
  140. for (Message msg : _messages.values())
  141. {
  142. if (msg != null
  143. && msg.getSenderId() == objectId
  144. && !msg.isDeletedBySender())
  145. outbox.add(msg);
  146. }
  147. return outbox;
  148. }
  149. public void sendMessage(Message msg)
  150. {
  151. _messages.put(msg.getId(), msg);
  152. Connection con = null;
  153. PreparedStatement stmt = null;
  154. try
  155. {
  156. con = L2DatabaseFactory.getInstance().getConnection();
  157. stmt = Message.getStatement(msg, con);
  158. stmt.execute();
  159. stmt.close();
  160. }
  161. catch (SQLException e)
  162. {
  163. _log.log(Level.WARNING, "Mail Manager: Error saving message:" + e.getMessage(), e);
  164. }
  165. finally
  166. {
  167. L2DatabaseFactory.close(con);
  168. }
  169. final L2PcInstance receiver = L2World.getInstance().getPlayer(msg.getReceiverId());
  170. if (receiver != null)
  171. receiver.sendPacket(ExNoticePostArrived.valueOf(true));
  172. ThreadPoolManager.getInstance().scheduleGeneral(new MessageDeletionTask(msg.getId()), msg.getExpiration() - System.currentTimeMillis());
  173. }
  174. class MessageDeletionTask implements Runnable
  175. {
  176. final int _msgId;
  177. public MessageDeletionTask(int msgId)
  178. {
  179. _msgId = msgId;
  180. }
  181. public void run()
  182. {
  183. final Message msg = getMessage(_msgId);
  184. if (msg == null)
  185. return;
  186. if (msg.hasAttachments())
  187. {
  188. try
  189. {
  190. final L2PcInstance sender = L2World.getInstance().getPlayer(msg.getSenderId());
  191. if (sender != null)
  192. {
  193. msg.getAttachments().returnToWh(sender.getWarehouse());
  194. sender.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.MAIL_RETURNED));
  195. }
  196. else
  197. msg.getAttachments().returnToWh(null);
  198. msg.getAttachments().deleteMe();
  199. msg.removeAttachments();
  200. final L2PcInstance receiver = L2World.getInstance().getPlayer(msg.getReceiverId());
  201. if (receiver != null)
  202. {
  203. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.MAIL_RETURNED);
  204. //sm.addString(msg.getReceiverName());
  205. receiver.sendPacket(sm);
  206. }
  207. }
  208. catch (Exception e)
  209. {
  210. _log.log(Level.WARNING, "Mail Manager: Error returning items:" + e.getMessage(), e);
  211. }
  212. }
  213. deleteMessageInDb(msg.getId());
  214. }
  215. }
  216. public final void markAsReadInDb(int msgId)
  217. {
  218. Connection con = null;
  219. PreparedStatement stmt = null;
  220. try
  221. {
  222. con = L2DatabaseFactory.getInstance().getConnection();
  223. stmt = con.prepareStatement("UPDATE messages SET isUnread = 'false' WHERE messageId = ?");
  224. stmt.setInt(1, msgId);
  225. stmt.execute();
  226. stmt.close();
  227. }
  228. catch (SQLException e)
  229. {
  230. _log.log(Level.WARNING, "Mail Manager: Error marking as read message:" + e.getMessage(), e);
  231. }
  232. finally
  233. {
  234. L2DatabaseFactory.close(con);
  235. }
  236. }
  237. public final void markAsDeletedBySenderInDb(int msgId)
  238. {
  239. Connection con = null;
  240. PreparedStatement stmt = null;
  241. try
  242. {
  243. con = L2DatabaseFactory.getInstance().getConnection();
  244. stmt = con.prepareStatement("UPDATE messages SET isDeletedBySender = 'true' WHERE messageId = ?");
  245. stmt.setInt(1, msgId);
  246. stmt.execute();
  247. stmt.close();
  248. }
  249. catch (SQLException e)
  250. {
  251. _log.log(Level.WARNING, "Mail Manager: Error marking as deleted by sender message:" + e.getMessage(), e);
  252. }
  253. finally
  254. {
  255. L2DatabaseFactory.close(con);
  256. }
  257. }
  258. public final void markAsDeletedByReceiverInDb(int msgId)
  259. {
  260. Connection con = null;
  261. PreparedStatement stmt = null;
  262. try
  263. {
  264. con = L2DatabaseFactory.getInstance().getConnection();
  265. stmt = con.prepareStatement("UPDATE messages SET isDeletedByReceiver = 'true' WHERE messageId = ?");
  266. stmt.setInt(1, msgId);
  267. stmt.execute();
  268. stmt.close();
  269. }
  270. catch (SQLException e)
  271. {
  272. _log.log(Level.WARNING, "Mail Manager: Error marking as deleted by receiver message:" + e.getMessage(), e);
  273. }
  274. finally
  275. {
  276. L2DatabaseFactory.close(con);
  277. }
  278. }
  279. public final void removeAttachmentsInDb(int msgId)
  280. {
  281. Connection con = null;
  282. PreparedStatement stmt = null;
  283. try
  284. {
  285. con = L2DatabaseFactory.getInstance().getConnection();
  286. stmt = con.prepareStatement("UPDATE messages SET hasAttachments = 'false' WHERE messageId = ?");
  287. stmt.setInt(1, msgId);
  288. stmt.execute();
  289. stmt.close();
  290. }
  291. catch (SQLException e)
  292. {
  293. _log.log(Level.WARNING, "Mail Manager: Error removing attachments in message:" + e.getMessage(), e);
  294. }
  295. finally
  296. {
  297. L2DatabaseFactory.close(con);
  298. }
  299. }
  300. public final void deleteMessageInDb(int msgId)
  301. {
  302. Connection con = null;
  303. PreparedStatement stmt = null;
  304. try
  305. {
  306. con = L2DatabaseFactory.getInstance().getConnection();
  307. stmt = con.prepareStatement("DELETE FROM messages WHERE messageId = ?");
  308. stmt.setInt(1, msgId);
  309. stmt.execute();
  310. stmt.close();
  311. }
  312. catch (SQLException e)
  313. {
  314. _log.log(Level.WARNING, "Mail Manager: Error deleting message:" + e.getMessage(), e);
  315. }
  316. finally
  317. {
  318. L2DatabaseFactory.close(con);
  319. }
  320. _messages.remove(msgId);
  321. IdFactory.getInstance().releaseId(msgId);
  322. }
  323. @SuppressWarnings("synthetic-access")
  324. private static class SingletonHolder
  325. {
  326. protected static final MailManager _instance = new MailManager();
  327. }
  328. }