/*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that
* it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If
* not, see <http://www.gnu.org/licenses/>.
*/
package silentium.gameserver.board.Manager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javolution.util.FastList;
import javolution.util.FastMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import silentium.commons.database.DatabaseFactory;
import silentium.gameserver.model.BlockList;
import silentium.gameserver.model.L2World;
import silentium.gameserver.model.actor.instance.L2PcInstance;
import silentium.gameserver.network.SystemMessageId;
import silentium.gameserver.network.serverpackets.ExMailArrived;
import silentium.gameserver.network.serverpackets.SystemMessage;
import silentium.gameserver.tables.CharNameTable;
/**
* @author JIV, Johan, Vital
*/
public class MailBBSManager extends BaseBBSManager
{
private static Logger _log = LoggerFactory.getLogger(MailBBSManager.class.getName());
private final Map<Integer, FastList<Mail>> _mails = new FastMap<>();
private int _lastid = 0;
private static final String SELECT_CHAR_MAILS = "SELECT * FROM character_mail WHERE charId = ? ORDER BY letterId ASC";
private static final String INSERT_NEW_MAIL = "INSERT INTO character_mail (charId, letterId, senderId, location, recipientNames, subject, message, sentDate, unread) VALUES (?,?,?,?,?,?,?,?,?)";
private static final String DELETE_MAIL = "DELETE FROM character_mail WHERE letterId = ?";
private static final String MARK_MAIL_READ = "UPDATE character_mail SET unread = ? WHERE letterId = ?";
private static final String SET_LETTER_LOC = "UPDATE character_mail SET location = ? WHERE letterId = ?";
private static final String SELECT_LAST_ID = "SELECT letterId FROM character_mail ORDER BY letterId DESC LIMIT 1";
public class Mail
{
int charId;
int letterId;
int senderId;
String location;
String recipientNames;
String subject;
String message;
Timestamp sentDate;
String sentDateString;
boolean unread;
}
public static MailBBSManager getInstance()
{
return SingletonHolder._instance;
}
protected MailBBSManager()
{
initId();
}
private void initId()
{
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement(SELECT_LAST_ID);
ResultSet result = statement.executeQuery();
while (result.next())
{
if (result.getInt(1) > _lastid)
_lastid = result.getInt(1);
}
result.close();
statement.close();
}
catch (Exception e)
{
_log.warn(getClass().getSimpleName() + ": data error on MailBBS (initId): " + e);
e.printStackTrace();
}
}
private synchronized int getNewMailId()
{
return ++_lastid;
}
private FastList<Mail> getPlayerMails(int objId)
{
FastList<Mail> _letters = _mails.get(objId);
if (_letters == null)
{
_letters = new FastList<>();
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement(SELECT_CHAR_MAILS);
statement.setInt(1, objId);
ResultSet result = statement.executeQuery();
while (result.next())
{
Mail letter = new Mail();
letter.charId = result.getInt("charId");
letter.letterId = result.getInt("letterId");
letter.senderId = result.getInt("senderId");
letter.location = result.getString("location");
letter.recipientNames = result.getString("recipientNames");
letter.subject = result.getString("subject");
letter.message = result.getString("message");
letter.sentDate = result.getTimestamp("sentDate");
letter.sentDateString = result.getString("sentDate");
letter.unread = result.getInt("unread") != 0;
_letters.addFirst(letter);
}
result.close();
statement.close();
}
catch (Exception e)
{
_log.warn("couldnt load mail for ID:" + objId + " " + e.getMessage());
}
_mails.put(objId, _letters);
}
return _letters;
}
private Mail getLetter(L2PcInstance activeChar, int letterId)
{
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
if (letter.letterId == letterId)
return letter;
return null;
}
@Override
public void parseCmd(String command, L2PcInstance activeChar)
{
if (command.equals("_maillist_0_1_0_"))
showInbox(activeChar, 1);
else if (command.startsWith("_maillist_0_1_0_ "))
showInbox(activeChar, Integer.parseInt(command.substring(17)));
else if (command.equals("_maillist_0_1_0_sentbox"))
showSentbox(activeChar, 1);
else if (command.startsWith("_maillist_0_1_0_sentbox "))
showSentbox(activeChar, Integer.parseInt(command.substring(24)));
else if (command.equals("_maillist_0_1_0_archive"))
showMailArchive(activeChar, 1);
else if (command.startsWith("_maillist_0_1_0_archive "))
showMailArchive(activeChar, Integer.parseInt(command.substring(24)));
else if (command.equals("_maillist_0_1_0_temp_archive"))
showTempMailArchive(activeChar, 1);
else if (command.startsWith("_maillist_0_1_0_temp_archive "))
showTempMailArchive(activeChar, Integer.parseInt(command.substring(29)));
else if (command.equals("_maillist_0_1_0_write"))
showWriteView(activeChar);
else if (command.startsWith("_maillist_0_1_0_view "))
{
Mail letter = getLetter(activeChar, Integer.parseInt(command.substring(21)));
showLetterView(activeChar, letter);
if (letter.unread)
setLetterToRead(activeChar, letter.letterId);
}
else if (command.startsWith("_maillist_0_1_0_reply "))
{
Mail letter = getLetter(activeChar, Integer.parseInt(command.substring(22)));
showWriteView(activeChar, getCharName(letter.senderId), letter);
}
else if (command.startsWith("_maillist_0_1_0_delete "))
{
Mail letter = getLetter(activeChar, Integer.parseInt(command.substring(23)));
if (letter != null)
deleteLetter(activeChar, letter.letterId);
showLastForum(activeChar);
}
else if (command.startsWith("_maillist_0_1_0_store "))
{
Mail letter = getLetter(activeChar, Integer.parseInt(command.substring(22)));
if (letter != null)
setLetterLocation(activeChar, letter.letterId, "archive");
showMailArchive(activeChar, Integer.parseInt(command.substring(22)));
}
else if (command.startsWith("_maillist_0_1_0_viewlist"))
showLastForum(activeChar);
else
activeChar.sendMessage(command + " not implemented yet.");
}
private static String abbreviate(String s, int maxWidth)
{
return s.length() > maxWidth ? s.substring(0, maxWidth) : s;
}
public int checkUnreadMail(L2PcInstance activeChar)
{
int count = 0;
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
if (letter.unread)
count++;
return count;
}
private void showInbox(L2PcInstance activeChar, int page)
{
int countMails = getCountLetters(activeChar, "inbox");
int maxpage = getMaxPageId(countMails);
if (page > maxpage)
page = maxpage;
if (page < 1)
page = 1;
activeChar.setMailPosition(page);
int index = 0, minIndex = 0, maxIndex = 0;
maxIndex = (page == 1 ? page * 9 : (page * 10) - 1);
minIndex = maxIndex - 9;
final StringBuilder html = new StringBuilder();
html.append("<html><body><center>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$917;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=5></td></tr>");
html.append("</table>");
html.append("<table border=0 cellspacing=0 cellpadding=0 width=755 height=25 bgcolor=A7A19A>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td>");
html.append("<td fixwidth=600>");
html.append("<a action=\"bypass _maillist_0_1_0_\">[&$917;]</a> (").append(getCountLetters(activeChar, "inbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_sentbox\">[&$918;]</a> (").append(getCountLetters(activeChar, "sentbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_archive\">[&$919;]</a> (").append(getCountLetters(activeChar, "archive")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_temp_archive\">[&$920;]</a> (").append(getCountLetters(activeChar, "temparchive")).append(")</td>");
html.append("<td fixWIDTH=5></td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("</table>");
html.append("<br>");
html.append("<table border=0 cellspacing=0 cellpadding=2 bgcolor=A7A19A width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>&$911;</td>");
html.append("<td FIXWIDTH=440>&$413;</td>");
html.append("<td FIXWIDTH=150 align=center>&$910;</td>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("</tr></table>");
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
{
if (letter.location.equals("inbox"))
{
if (index < minIndex)
{
index++;
continue;
}
if (index > maxIndex)
break;
String tempName = getCharName(letter.senderId);
html.append("<table border=0 cellspacing=0 cellpadding=5 width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>").append(abbreviate(tempName, 6)).append("</td>");
html.append("<td FIXWIDTH=440 ><a action=\"bypass _maillist_0_1_0_view ").append(letter.letterId).append("\">");
if (letter.unread)
html.append("<font color=\"LEVEL\">");
html.append(abbreviate(letter.subject, 51));
if (letter.unread)
html.append("</font>");
html.append("</a>");
html.append("</td><td FIXWIDTH=150 align=center>").append(letter.sentDateString.substring(0, letter.sentDateString.length() - 5)).append("</td>");
html.append("<td FIXWIDTH=5 align=center></td></tr></table>");
html.append("<img src=\"L2UI.Squaregray\" width=\"755\" height=\"1\">");
index++;
}
}
html.append("<br>");
html.append("<table width=755 cellspace=0 cellpadding=0><tr><td width=50></td>");
html.append("<td width=510 align=center>");
html.append("<table cellspacing=2 cellpadding=0 border=0><tr>");
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_ ").append(page == 1 ? page : page - 1).append("\" back=\"L2UI_CT1.Button_DF_Left_Down\" fore=\"L2UI_CT1.Button_DF_Left\" width=15 height=15>");
html.append("</td></tr></table></td>");
int i = 0;
if (maxpage > 21)
{
if (page <= 11)
{
for (i = 1; i <= (10 + page); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_ ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if (page > 11 && (maxpage - page) > 10)
{
for (i = (page - 10); i <= (page - 1); i++)
{
if (i == page)
continue;
html.append("<td><a action=\"bypass _maillist_0_1_0_ ").append(i).append("\"> ").append(i).append(" </a></td>");
}
for (i = page; i <= (page + 10); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_ ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if ((maxpage - page) <= 10)
{
for (i = (page - 10); i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_ ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
}
else
{
for (i = 1; i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_ ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_ ").append(page == maxpage ? page : page + 1).append("\" back=\"L2UI_CT1.Button_DF_Right_Down\" fore=\"L2UI_CT1.Button_DF_Right\" width=15 height=15 >");
html.append("</td></tr></table></td></tr></table></td>");
// html.append("<td align=right><button value=\"&$421;\" action=\"bypass _maillist_0_1_0_write\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("</tr><tr><td width=5 height=10></td></tr>");
html.append("<tr>");
html.append("<td></td>");
html.append("<td align=center><table border=0><tr><td>");
html.append("<combobox width=65 var=SearchTarget list=\"Writer;Title\">");
html.append("</td><td><edit var=\"keyword\" width=130 height=15 length=\"16\"></td>");
html.append("<td><button value=\"&$420;\" action=\"bypass _maillist_0_1_0_search $combo $keyword\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td></tr></table></td>");
html.append("</tr>");
html.append("</table>");
html.append("</center></body></html>");
separateAndSend(html.toString(), activeChar);
}
private static void showLetterView(L2PcInstance activeChar, Mail letter)
{
final StringBuilder html = new StringBuilder();
html.append("<html><body><center>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > ");
if (letter.location.equals("inbox"))
html.append("<a action=\"bypass _maillist_0_1_0_\">&$917;</a>");
else if (letter.location.equals("sentbox"))
html.append("<a action=\"bypass _maillist_0_1_0_sentbox\">&$918;</a>");
else if (letter.location.equals("archive"))
html.append("<a action=\"bypass _maillist_0_1_0_archive\">&$919;</a>");
else if (letter.location.equals("temparchive"))
html.append("<a action=\"bypass _maillist_0_1_0_temp_archive\">&$920;</a>");
html.append(" > ").append(abbreviate(letter.subject.replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """), 51));
html.append("</td></tr></table>");
html.append("<br>");
html.append("<table border=0 cellspacing=0 cellpadding=0 bgcolor=A7A19A>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td><td WIDTH=85 valign=top>Sender:</td>");
html.append("<td WIDTH=415 valign=top>").append(getCharName(letter.senderId)).append("</td>");
html.append("<td width=10></td>");
html.append("<td width=90 valign=top>Send Time:</td>");
html.append("<td WIDTH=150 valign=top>").append(letter.sentDateString.substring(0, letter.sentDateString.length() - 5)).append("</td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td><td>Recipient:</td>");
html.append("<td>").append(letter.recipientNames).append("</td>");
html.append("<td></td>");
html.append("<td>Delete date:</td>");
html.append("<td>Unknown</td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td><td valign=top>Title:</td>");
html.append("<td fixwidth=415 valign=top>").append(letter.subject.replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """)).append("</td>");
html.append("<td></td>");
html.append("<td></td>");
html.append("<td></td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("</table><br>");
html.append("<table border=0 cellspacing=0 cellpadding=0><tr>");
html.append("<td width=5></td>");
html.append("<td width=755 align=left>").append(letter.message.replaceAll("\r\n", "<br>").replaceAll("<", "<").replaceAll(">", ">").replaceAll("\"", """)).append("</td>");
html.append("<td width=5></td>");
html.append("</tr></table><br>");
html.append("<img src=\"L2UI.squareblank\" width=\"1\" height=\"5\">");
html.append("<img src=\"L2UI.squaregray\" width=\"755\" height=\"1\">");
html.append("<img src=\"L2UI.squareblank\" width=\"1\" height=\"5\">");
html.append("<table border=0 cellspacing=0 cellpadding=0 FIXWIDTH=755><tr>");
html.append("<td width=70><button value=\"&$422;\" action=\"bypass _maillist_0_1_0_viewlist\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td width=340></td>");
if (letter.location.equals("archive"))
html.append("<td width=70 align=right></td>");
html.append("<td width=70 align=right><button value=\"&$912;\" action=\"bypass _maillist_0_1_0_reply ").append(letter.letterId).append("\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"> </td>");
html.append("<td width=70 align=right><button value=\"&$913;\" action=\"bypass _maillist_0_1_0_deliver\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"> </td>");
html.append("<td width=70 align=right><button value=\"&$425;\" action=\"bypass _maillist_0_1_0_delete ").append(letter.letterId).append("\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"> </td>");
if (!letter.location.equals("archive"))
html.append("<td width=70 align=right><button value=\"&$914;\" action=\"bypass _maillist_0_1_0_store ").append(letter.letterId).append("\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"> </td>");
html.append("<td width=70 align=right><button value=\"&$915;\" action=\"bypass _maillist_0_1_0_write\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\" ></td>");
html.append("</tr></table>");
html.append("</center></body></html>");
separateAndSend(html.toString(), activeChar);
}
private void showSentbox(L2PcInstance activeChar, int page)
{
int countMails = getCountLetters(activeChar, "sentbox");
int maxpage = getMaxPageId(countMails);
if (page > maxpage)
page = maxpage;
if (page < 1)
page = 1;
activeChar.setMailPosition(1 * 1000 + page);
int index = 0, minIndex = 0, maxIndex = 0;
maxIndex = (page == 1 ? page * 9 : (page * 10) - 1);
minIndex = maxIndex - 9;
final StringBuilder html = new StringBuilder();
html.append("<html><body><center>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$918;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=5></td></tr>");
html.append("</table>");
html.append("<table border=0 cellspacing=0 cellpadding=0 width=755 height=25 bgcolor=A7A19A>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td>");
html.append("<td fixwidth=600>");
html.append("<a action=\"bypass _maillist_0_1_0_\">[&$917;]</a> (").append(getCountLetters(activeChar, "inbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_sentbox\">[&$918;]</a> (").append(getCountLetters(activeChar, "sentbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_archive\">[&$919;]</a> (").append(getCountLetters(activeChar, "archive")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_temp_archive\">[&$920;]</a> (").append(getCountLetters(activeChar, "temparchive")).append(")</td>");
html.append("<td fixWIDTH=5></td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("</table>");
html.append("<br>");
html.append("<table border=0 cellspacing=0 cellpadding=2 bgcolor=A7A19A width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>&$911;</td>");
html.append("<td FIXWIDTH=440>&$413;</td>");
html.append("<td FIXWIDTH=150 align=center>&$910;</td>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("</tr></table>");
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
{
if (letter.location.equals("sentbox"))
{
if (index < minIndex)
{
index++;
continue;
}
if (index > maxIndex)
break;
String tempName = getCharName(letter.senderId);
html.append("<table border=0 cellspacing=0 cellpadding=5 width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>").append(abbreviate(tempName, 6)).append("</td>");
html.append("<td FIXWIDTH=440 ><a action=\"bypass _maillist_0_1_0_view ").append(letter.letterId).append("\">");
if (letter.unread)
html.append("<font color=\"LEVEL\">");
html.append(abbreviate(letter.subject, 51));
if (letter.unread)
html.append("</font>");
html.append("</a>");
html.append("</td><td FIXWIDTH=150 align=center>").append(letter.sentDateString.substring(0, letter.sentDateString.length() - 5)).append("</td>");
html.append("<td FIXWIDTH=5 align=center></td></tr></table>");
html.append("<img src=\"L2UI.Squaregray\" width=\"755\" height=\"1\">");
index++;
}
}
html.append("<br>");
html.append("<table width=755 cellspace=0 cellpadding=0><tr><td width=50></td>");
html.append("<td width=510 align=center>");
html.append("<table cellspacing=2 cellpadding=0 border=0><tr>");
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_sentbox ").append(page == 1 ? page : page - 1).append("\" back=\"L2UI_CT1.Button_DF_Left_Down\" fore=\"L2UI_CT1.Button_DF_Left\" width=15 height=15>");
html.append("</td></tr></table></td>");
int i = 0;
if (maxpage > 21)
{
if (page <= 11)
{
for (i = 1; i <= (10 + page); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_sentbox ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if (page > 11 && (maxpage - page) > 10)
{
for (i = (page - 10); i <= (page - 1); i++)
{
if (i == page)
continue;
html.append("<td><a action=\"bypass _maillist_0_1_0_sentbox ").append(i).append("\"> ").append(i).append(" </a></td>");
}
for (i = page; i <= (page + 10); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_sentbox ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if ((maxpage - page) <= 10)
{
for (i = (page - 10); i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_sentbox ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
}
else
{
for (i = 1; i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_sentbox ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_sentbox ").append(page == maxpage ? page : page + 1).append("\" back=\"L2UI_CT1.Button_DF_Right_Down\" fore=\"L2UI_CT1.Button_DF_Right\" width=15 height=15 >");
html.append("</td></tr></table></td></tr></table></td>");
// html.append("<td align=right><button value=\"&$421;\" action=\"bypass _maillist_0_1_0_write\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("</tr><tr><td width=5 height=10></td></tr>");
html.append("<tr>");
html.append("<td></td>");
html.append("<td align=center><table border=0><tr><td>");
html.append("<combobox width=65 var=SearchTarget list=\"Writer;Title\">");
html.append("</td><td><edit var=\"keyword\" width=130 height=15 length=\"16\"></td>");
html.append("<td><button value=\"&$420;\" action=\"bypass _maillist_0_1_0_search $combo $keyword\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td></tr></table></td>");
html.append("</tr>");
html.append("</table>");
html.append("</center></body></html>");
separateAndSend(html.toString(), activeChar);
}
private void showMailArchive(L2PcInstance activeChar, int page)
{
int countMails = getCountLetters(activeChar, "archive");
int maxpage = getMaxPageId(countMails);
if (page > maxpage)
page = maxpage;
if (page < 1)
page = 1;
activeChar.setMailPosition(2 * 1000 + page);
int index = 0, minIndex = 0, maxIndex = 0;
maxIndex = (page == 1 ? page * 14 : (page * 15) - 1);
minIndex = maxIndex - 14;
final StringBuilder html = new StringBuilder();
html.append("<html><body><center>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$919;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=5></td></tr>");
html.append("</table>");
html.append("<table border=0 cellspacing=0 cellpadding=0 width=755 height=25 bgcolor=A7A19A>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td>");
html.append("<td fixwidth=600>");
html.append("<a action=\"bypass _maillist_0_1_0_\">[&$917;]</a> (").append(getCountLetters(activeChar, "inbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_sentbox\">[&$918;]</a> (").append(getCountLetters(activeChar, "sentbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_archive\">[&$919;]</a> (").append(getCountLetters(activeChar, "archive")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_temp_archive\">[&$920;]</a> (").append(getCountLetters(activeChar, "temparchive")).append(")</td>");
html.append("<td fixWIDTH=5></td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("</table>");
html.append("<br>");
html.append("<table border=0 cellspacing=0 cellpadding=2 bgcolor=A7A19A width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>&$911;</td>");
html.append("<td FIXWIDTH=440>&$413;</td>");
html.append("<td FIXWIDTH=150 align=center>&$910;</td>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("</tr></table>");
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
{
if (letter.location.equals("archive"))
{
if (index < minIndex)
{
index++;
continue;
}
if (index > maxIndex)
break;
String tempName = getCharName(letter.senderId);
html.append("<table border=0 cellspacing=0 cellpadding=5 width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>").append(abbreviate(tempName, 6)).append("</td>");
html.append("<td FIXWIDTH=440 ><a action=\"bypass _maillist_0_1_0_view ").append(letter.letterId).append("\">");
if (letter.unread)
html.append("<font color=\"LEVEL\">");
html.append(abbreviate(letter.subject, 51));
if (letter.unread)
html.append("</font>");
html.append("</a>");
html.append("</td><td FIXWIDTH=150 align=center>").append(letter.sentDateString.substring(0, letter.sentDateString.length() - 5)).append("</td>");
html.append("<td FIXWIDTH=5 align=center></td></tr></table>");
html.append("<img src=\"L2UI.Squaregray\" width=\"755\" height=\"1\">");
index++;
}
}
html.append("<br>");
html.append("<table width=755 cellspace=0 cellpadding=0><tr><td width=50></td>");
html.append("<td width=510 align=center>");
html.append("<table cellspacing=2 cellpadding=0 border=0><tr>");
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_archive ").append(page == 1 ? page : page - 1).append("\" back=\"L2UI_CT1.Button_DF_Left_Down\" fore=\"L2UI_CT1.Button_DF_Left\" width=15 height=15>");
html.append("</td></tr></table></td>");
int i = 0;
if (maxpage > 21)
{
if (page <= 11)
{
for (i = 1; i <= (10 + page); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if (page > 11 && (maxpage - page) > 10)
{
for (i = (page - 10); i <= (page - 1); i++)
{
if (i == page)
continue;
html.append("<td><a action=\"bypass _maillist_0_1_0_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
for (i = page; i <= (page + 10); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if ((maxpage - page) <= 10)
{
for (i = (page - 10); i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
}
else
{
for (i = 1; i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_archive ").append(page == maxpage ? page : page + 1).append("\" back=\"L2UI_CT1.Button_DF_Right_Down\" fore=\"L2UI_CT1.Button_DF_Right\" width=15 height=15 >");
html.append("</td></tr></table></td></tr></table></td>");
// html.append("<td align=right><button value=\"&$421;\" action=\"bypass _maillist_0_1_0_write\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("</tr><tr><td width=5 height=10></td></tr>");
html.append("<tr>");
html.append("<td></td>");
html.append("<td align=center><table border=0><tr><td>");
html.append("<combobox width=65 var=SearchTarget list=\"Writer;Title\">");
html.append("</td><td><edit var=\"keyword\" width=130 height=15 length=\"16\"></td>");
html.append("<td><button value=\"&$420;\" action=\"bypass _maillist_0_1_0_search $combo $keyword\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td></tr></table></td>");
html.append("</tr>");
html.append("</table>");
html.append("</center></body></html>");
separateAndSend(html.toString(), activeChar);
}
private void showTempMailArchive(L2PcInstance activeChar, int page)
{
int countMails = getCountLetters(activeChar, "temparchive");
int maxpage = getMaxPageId(countMails);
if (page > maxpage)
page = maxpage;
if (page < 1)
page = 1;
activeChar.setMailPosition(3 * 1000 + page);
int index = 0, minIndex = 0, maxIndex = 0;
maxIndex = (page == 1 ? page * 14 : (page * 15) - 1);
minIndex = maxIndex - 14;
final StringBuilder html = new StringBuilder();
html.append("<html><body><center>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$920;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=5></td></tr>");
html.append("</table>");
html.append("<table border=0 cellspacing=0 cellpadding=0 width=755 height=25 bgcolor=A7A19A>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td fixWIDTH=5></td>");
html.append("<td fixwidth=600>");
html.append("<a action=\"bypass _maillist_0_1_0_\">[&$917;]</a> (").append(getCountLetters(activeChar, "inbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_sentbox\">[&$918;]</a> (").append(getCountLetters(activeChar, "sentbox")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_archive\">[&$919;]</a> (").append(getCountLetters(activeChar, "archive")).append(") ");
html.append("<a action=\"bypass _maillist_0_1_0_temp_archive\">[&$920;]</a> (").append(getCountLetters(activeChar, "temparchive")).append(")</td>");
html.append("<td fixWIDTH=5></td>");
html.append("</tr>");
html.append("<tr><td height=10></td></tr>");
html.append("</table>");
html.append("<br>");
html.append("<table border=0 cellspacing=0 cellpadding=2 bgcolor=A7A19A width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>&$911;</td>");
html.append("<td FIXWIDTH=440>&$413;</td>");
html.append("<td FIXWIDTH=150 align=center>&$910;</td>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("</tr></table>");
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
{
if (letter.location.equals("temparchive"))
{
if (index < minIndex)
{
index++;
continue;
}
if (index > maxIndex)
break;
String tempName = getCharName(letter.senderId);
html.append("<table border=0 cellspacing=0 cellpadding=5 width=755><tr>");
html.append("<td FIXWIDTH=5 align=center></td>");
html.append("<td FIXWIDTH=150 align=center>").append(abbreviate(tempName, 6)).append("</td>");
html.append("<td FIXWIDTH=440 ><a action=\"bypass _maillist_0_1_0_view ").append(letter.letterId).append("\">");
if (letter.unread)
html.append("<font color=\"LEVEL\">");
html.append(abbreviate(letter.subject, 51));
if (letter.unread)
html.append("</font>");
html.append("</a>");
html.append("</td><td FIXWIDTH=150 align=center>").append(letter.sentDateString.substring(0, letter.sentDateString.length() - 5)).append("</td>");
html.append("<td FIXWIDTH=5 align=center></td></tr></table>");
html.append("<img src=\"L2UI.Squaregray\" width=\"755\" height=\"1\">");
index++;
}
}
html.append("<br>");
html.append("<table width=755 cellspace=0 cellpadding=0><tr><td width=50></td>");
html.append("<td width=510 align=center>");
html.append("<table cellspacing=2 cellpadding=0 border=0><tr>");
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_temp_archive ").append(page == 1 ? page : page - 1).append("\" back=\"L2UI_CT1.Button_DF_Left_Down\" fore=\"L2UI_CT1.Button_DF_Left\" width=15 height=15>");
html.append("</td></tr></table></td>");
int i = 0;
if (maxpage > 21)
{
if (page <= 11)
{
for (i = 1; i <= (10 + page); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_temp_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if (page > 11 && (maxpage - page) > 10)
{
for (i = (page - 10); i <= (page - 1); i++)
{
if (i == page)
continue;
html.append("<td><a action=\"bypass _maillist_0_1_0_temp_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
for (i = page; i <= (page + 10); i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_temp_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
else if ((maxpage - page) <= 10)
{
for (i = (page - 10); i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_temp_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
}
else
{
for (i = 1; i <= maxpage; i++)
{
if (i == page)
html.append("<td> ").append(i).append(" </td>");
else
html.append("<td><a action=\"bypass _maillist_0_1_0_temp_archive ").append(i).append("\"> ").append(i).append(" </a></td>");
}
}
html.append("<td><table><tr><td></td></tr><tr><td>");
html.append("<button action=\"bypass _maillist_0_1_0_temp_archive ").append(page == maxpage ? page : page + 1).append("\" back=\"L2UI_CT1.Button_DF_Right_Down\" fore=\"L2UI_CT1.Button_DF_Right\" width=15 height=15 >");
html.append("</td></tr></table></td></tr></table></td>");
// html.append("<td align=right><button value=\"&$421;\" action=\"bypass _maillist_0_1_0_write\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("</tr><tr><td width=5 height=10></td></tr>");
html.append("<tr>");
html.append("<td></td>");
html.append("<td align=center><table border=0><tr><td>");
html.append("<combobox width=65 var=SearchTarget list=\"Writer;Title\">");
html.append("</td><td><edit var=\"keyword\" width=130 height=15 length=\"16\"></td>");
html.append("<td><button value=\"&$420;\" action=\"bypass _maillist_0_1_0_search $combo $keyword\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td></tr></table></td>");
html.append("</tr>");
html.append("</table>");
html.append("</center></body></html>");
separateAndSend(html.toString(), activeChar);
}
private static void showWriteView(L2PcInstance activeChar)
{
final StringBuilder html = new StringBuilder();
html.append("<html><body>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$421;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0><tr><td width=755><img src=\"L2UI.SquareGray\" width=\"755\" height=\"1\"></td></tr></table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td width=5 height=20></td></tr>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td FIXWIDTH=80 height=29>Recipient:</td>");
html.append("<td FIXWIDTH=520><edit var=\"Recipients\" width=670 height=13 length=\"128\"></td>");
html.append("<td width=5></td>");
html.append("</tr>");
html.append("<tr>");
html.append("<td ></td>");
html.append("<td height=29>&$413;:</td>");
html.append("<td><edit var=\"Title\" width=670 height=13 length=\"128\"></td>");
html.append("<td></td>");
html.append("</tr>");
html.append("</table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td FIXWIDTH=80 height=29 valign=top>&$427;:</td>");
html.append("<td FIXWIDTH=510><MultiEdit var=\"Message\" width=670 height=313></td>");
html.append("<td width=5></td>");
html.append("</tr>");
html.append("<tr><td width=5 height=10></td></tr>");
html.append("</table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td align=center FIXWIDTH=80 height=29> </td>");
html.append("<td align=center FIXwidth=70><button value=\"&$1078;\" action=\"Write Mail Send _ Recipients Title Message\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXwidth=70><button value=\"&$141;\" action=\"bypass _maillist_0_1_0_viewlist\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXwidth=70><button value=\"&$658;\" action=\"\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXWIDTH=340> </td><td width=5></td>");
html.append("</tr></table>");
html.append("</body></html>");
separateAndSend(html.toString(), activeChar);
}
private static void showWriteView(L2PcInstance activeChar, String parcipientName, Mail letter)
{
final StringBuilder html = new StringBuilder();
html.append("<html><body>");
html.append("<br><br><br1><br1><table border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td FIXWIDTH=15> </td>");
html.append("<td width=755 height=30 align=left>");
html.append("<a action=\"bypass _bbshome\">Home</a>");
html.append(" > <a action=\"bypass _maillist_0_1_0_viewlist\">&$905;</a> > &$421;");
html.append("</td></tr></table>");
html.append("<table border=0 cellspacing=0 cellpadding=0><tr><td width=755><img src=\"L2UI.SquareGray\" width=\"755\" height=\"1\"></td></tr></table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td width=5 height=20></td></tr>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td FIXWIDTH=80 height=29>Recipient:</td>");
html.append("<td FIXWIDTH=520><combobox var=\"Recipients\" width=670 height=13 list=\"").append(parcipientName).append("\"></td>");
html.append("<td width=5></td>");
html.append("</tr>");
html.append("<tr>");
html.append("<td ></td>");
html.append("<td height=29>&$413;:</td>");
html.append("<td><edit var=\"Title\" width=670 height=13 length=\"128\"></td>");
html.append("<td></td>");
html.append("</tr>");
html.append("</table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td FIXWIDTH=80 height=29 valign=top>&$427;:</td>");
html.append("<td FIXWIDTH=520><MultiEdit var=\"Message\" width=670 height=313></td>");
html.append("<td width=5></td>");
html.append("</tr>");
html.append("<tr><td width=5 height=10></td></tr>");
html.append("</table>");
html.append("<table fixwidth=755 border=0 cellspacing=0 cellpadding=0>");
html.append("<tr><td height=10></td></tr>");
html.append("<tr>");
html.append("<td width=5></td>");
html.append("<td align=center FIXWIDTH=80 height=29> </td>");
html.append("<td align=center FIXwidth=70><button value=\"&$1078;\" action=\"Write Mail Send _ Recipients Title Message\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXwidth=70><button value=\"&$141;\" action=\"bypass _maillist_0_1_0_viewlist\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXwidth=70><button value=\"&$658;\" action=\"\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXwidth=70><button value=\"&$425;\" action=\"bypass _maillist_0_1_0_delete ").append(letter.letterId).append("\" back=\"l2ui_ct1.button.button_df_small_down\" width=70 height=25 fore=\"l2ui_ct1.button.button_df_small\"></td>");
html.append("<td align=center FIXWIDTH=340> </td><td width=5></td>");
html.append("</tr></table>");
html.append("</body></html>");
send1001(html.toString(), activeChar);
send1002(activeChar, " ", "Re: " + letter.subject, "0");
}
private void sendLetter(String recipients, String subject, String message, L2PcInstance activeChar)
{
int countTodaysLetters = 0;
Timestamp ts = new Timestamp(Calendar.getInstance().getTimeInMillis() - 86400000L);
long date = Calendar.getInstance().getTimeInMillis();
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
if (letter.sentDate.after(ts) && letter.location.equals("sentbox"))
countTodaysLetters++;
if (countTodaysLetters >= 10 && !activeChar.isGM())
{
activeChar.sendPacket(SystemMessageId.NO_MORE_MESSAGES_TODAY);
return;
}
if (subject == null || subject.isEmpty())
subject = "(no subject)";
try (Connection con = DatabaseFactory.getConnection())
{
Set<String> recipts = new HashSet<>(5);
String[] recipAr = recipients.split(";");
for (String r : recipAr)
recipts.add(r.trim());
message = message.replaceAll("\n", "<br1>");
boolean sent = false;
int countRecips = 0;
Timestamp time = new Timestamp(date);
PreparedStatement statement = null;
for (String recipient : recipts)
{
int recipId = CharNameTable.getInstance().getIdByName(recipient);
if (recipId <= 0)
activeChar.sendMessage("Could not find " + recipient + ", Therefore will not get mail.");
else if (isGM(recipId) && !activeChar.isGM())
activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CANNOT_MAIL_GM_S1).addString(recipient));
else if (isBlocked(activeChar, recipId) && !activeChar.isGM())
activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_BLOCKED_YOU_CANNOT_MAIL).addString(recipient));
else if (isRecipInboxFull(recipId) && !activeChar.isGM())
{
activeChar.sendPacket(SystemMessageId.MESSAGE_NOT_SENT);
L2PcInstance PCrecipient = L2World.getInstance().getPlayer(recipient);
if (PCrecipient != null)
PCrecipient.sendPacket(SystemMessageId.MAILBOX_FULL);
}
else if (countRecips < 5 && !activeChar.isGM() || activeChar.isGM())
{
int id = getNewMailId();
if (statement == null)
{
statement = con.prepareStatement(INSERT_NEW_MAIL);
statement.setInt(3, activeChar.getObjectId());
statement.setString(4, "inbox");
statement.setString(5, recipients);
statement.setString(6, abbreviate(subject, 128));
statement.setString(7, message);
statement.setTimestamp(8, time);
statement.setInt(9, 1);
}
statement.setInt(1, recipId);
statement.setInt(2, id);
statement.execute();
sent = true;
Mail letter = new Mail();
letter.charId = recipId;
letter.letterId = id;
letter.senderId = activeChar.getObjectId();
letter.location = "inbox";
letter.recipientNames = recipients;
letter.subject = abbreviate(subject, 128);
letter.message = message;
letter.sentDate = time;
letter.sentDateString = String.valueOf(time);
letter.unread = true;
getPlayerMails(recipId).addFirst(letter);
countRecips++;
L2PcInstance PCrecipient = L2World.getInstance().getPlayer(recipient);
if (PCrecipient != null)
{
PCrecipient.sendPacket(SystemMessageId.NEW_MAIL);
PCrecipient.sendPacket(ExMailArrived.STATIC_PACKET);
}
}
}
// Create a copy into activeChar's sent box
if (statement != null)
{
int id = getNewMailId();
statement.setInt(1, activeChar.getObjectId());
statement.setInt(2, id);
statement.setString(4, "sentbox");
statement.setInt(9, 0);
statement.execute();
statement.close();
Mail letter = new Mail();
letter.charId = activeChar.getObjectId();
letter.letterId = id;
letter.senderId = activeChar.getObjectId();
letter.location = "sentbox";
letter.recipientNames = recipients;
letter.subject = abbreviate(subject, 128);
letter.message = message;
letter.sentDate = time;
letter.sentDateString = String.valueOf(time);
letter.unread = false;
getPlayerMails(activeChar.getObjectId()).addFirst(letter);
}
if (countRecips > 5 && !activeChar.isGM())
activeChar.sendPacket(SystemMessageId.ONLY_FIVE_RECIPIENTS);
if (sent)
activeChar.sendPacket(SystemMessageId.SENT_MAIL);
}
catch (Exception e)
{
_log.warn("couldnt send letter for " + activeChar.getName() + " " + e.getMessage());
}
}
private int getCountLetters(L2PcInstance activeChar, String location)
{
return getCountLetters(activeChar.getObjectId(), location);
}
private int getCountLetters(int objId, String location)
{
int count = 0;
for (Mail letter : getPlayerMails(objId))
{
if (letter.location.equals(location))
count++;
}
return count;
}
private static boolean isBlocked(L2PcInstance activeChar, int recipId)
{
for (L2PcInstance player : L2World.getInstance().getAllPlayers().values())
{
if (player.getObjectId() == recipId)
{
if (BlockList.isInBlockList(player, activeChar))
return true;
return false;
}
}
return false;
}
private void deleteLetter(L2PcInstance activeChar, int letterId)
{
for (Mail letter : getPlayerMails(activeChar.getObjectId()))
{
if (letter.letterId == letterId)
{
getPlayerMails(activeChar.getObjectId()).remove(letter);
break;
}
}
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement(DELETE_MAIL);
statement.setInt(1, letterId);
statement.execute();
statement.close();
}
catch (Exception e)
{
_log.warn("couldnt delete letter " + letterId + " " + e);
}
}
private void setLetterToRead(L2PcInstance activeChar, int letterId)
{
getLetter(activeChar, letterId).unread = false;
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement(MARK_MAIL_READ);
statement.setInt(1, 0);
statement.setInt(2, letterId);
statement.execute();
statement.close();
}
catch (Exception e)
{
_log.warn("couldnt set unread to false for " + letterId + " " + e);
}
}
private void setLetterLocation(L2PcInstance activeChar, int letterId, String location)
{
getLetter(activeChar, letterId).location = location;
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement(SET_LETTER_LOC);
statement.setString(1, location);
statement.setInt(2, letterId);
statement.execute();
statement.close();
}
catch (Exception e)
{
_log.warn("couldnt set location to false for " + letterId + " " + e);
}
}
private static String getCharName(int charId)
{
String name = CharNameTable.getInstance().getNameById(charId);
return name == null ? "Unknown" : name;
}
private static boolean isGM(int charId)
{
boolean isGM = false;
try (Connection con = DatabaseFactory.getConnection())
{
PreparedStatement statement = con.prepareStatement("SELECT accesslevel FROM characters WHERE obj_Id = ?");
statement.setInt(1, charId);
ResultSet result = statement.executeQuery();
result.next();
isGM = result.getInt(1) > 0;
result.close();
statement.close();
}
catch (Exception e)
{
_log.warn(e.getMessage());
}
return isGM;
}
private boolean isRecipInboxFull(int charId)
{
return getCountLetters(charId, "inbox") >= 100;
}
@Override
public void parseWrite(String ar1, String ar2, String ar3, String ar4, String ar5, L2PcInstance activeChar)
{
if (ar1.equals("Send"))
{
sendLetter(ar3, ar4, ar5, activeChar);
showSentbox(activeChar, 1);
}
}
private void showLastForum(L2PcInstance activeChar)
{
int page = activeChar.getMailPosition() % 1000;
int type = activeChar.getMailPosition() / 1000;
switch (type)
{
case 0:
showInbox(activeChar, page);
break;
case 1:
showSentbox(activeChar, page);
break;
case 2:
showMailArchive(activeChar, page);
break;
case 3:
showTempMailArchive(activeChar, page);
break;
}
}
private static int getMaxPageId(int letterCount)
{
if (letterCount < 1)
return 1;
if (letterCount % 10 == 0)
return letterCount / 10;
return (letterCount / 10) + 1;
}
private static class SingletonHolder
{
protected static final MailBBSManager _instance = new MailBBSManager();
}
}