MailManager.java 9.0 KB

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