/*
* 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 .
*/
package com.l2jserver.communityserver.communityboard;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.logging.Logger;
import javolution.util.FastMap;
import com.l2jserver.communityserver.Config;
import com.l2jserver.communityserver.L2DatabaseFactory;
import com.l2jserver.communityserver.communityboard.boards.ClanBoard;
import com.l2jserver.communityserver.communityboard.boards.ErrorBoard;
import com.l2jserver.communityserver.communityboard.boards.FriendBoard;
import com.l2jserver.communityserver.communityboard.boards.MailBoard;
import com.l2jserver.communityserver.communityboard.boards.MemoBoard;
import com.l2jserver.communityserver.communityboard.boards.RegionBoard;
import com.l2jserver.communityserver.communityboard.boards.TopBoard;
import com.l2jserver.communityserver.communityboard.boards.ClanPostBoard;
import com.l2jserver.communityserver.model.Forum;
import com.l2jserver.communityserver.model.L2Castle;
import com.l2jserver.communityserver.model.L2Player;
import com.l2jserver.communityserver.model.L2Clan;
import com.l2jserver.communityserver.network.GameServerThread;
import com.l2jserver.communityserver.network.netcon.BaseWritePacket;
import com.l2jserver.communityserver.network.writepackets.RequestWorldInfo;
public final class CommunityBoardManager
{
private static Logger _log = Logger.getLogger(CommunityBoardManager.class.getName());
private static FastMap _instances;
public static CommunityBoardManager getInstance(final int sqlDPId)
{
if (_instances == null)
_instances = new FastMap();
CommunityBoardManager mgr = _instances.get(sqlDPId);
if (mgr == null)
{
mgr = new CommunityBoardManager(sqlDPId);
_instances.put(sqlDPId, mgr);
}
return mgr;
}
private FastMap _forumRoot;
private FastMap _players;
private FastMap _clans;
private FastMap _castles;
private final FastMap _boards;
private final int _sqlDPId;
private GameServerThread _gst;
private int _lastForumId = 1;
private boolean _isLoaded = false;
private CommunityBoardManager(final int sqlDPId)
{
_sqlDPId = sqlDPId;
_boards = new FastMap();
_boards.put("_bbsloc", new RegionBoard(this));
_boards.put("_bbsfriend", new FriendBoard(this));
_boards.put("_bbsclan", new ClanBoard(this));
_boards.put("_bbscpost", new ClanPostBoard(this));
_boards.put("_bbsmail", new MailBoard(this));
_boards.put("_bbsmemo", new MemoBoard(this));
_boards.put("_bbshome", new TopBoard(this));
_boards.put("_bbserror", new ErrorBoard(this));
_forumRoot = new FastMap();
_players = new FastMap();
_clans = new FastMap();
_castles = new FastMap();
}
private void loadDataBase()
{
java.sql.Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT forum_id, forum_type, forum_owner_id FROM forums WHERE serverId=?");
statement.setInt(1, _sqlDPId);
ResultSet result = statement.executeQuery();
while (result.next())
{
Forum f = new Forum(_sqlDPId, Integer.parseInt(result.getString("forum_id")));
int type = result.getInt("forum_type");
if (type == Forum.CLAN)
{
if (getClan(result.getInt("forum_owner_id")) == null)
{
// delete this forum
}
else
{
getClan(result.getInt("forum_owner_id")).setForum(f);
_forumRoot.put(Integer.parseInt(result.getString("forum_id")), f);
}
}
else if (type == Forum.PLAYER)
{
if (getPlayer(result.getInt("forum_owner_id")) == null)
{
// delete this forum
}
else
{
getPlayer(result.getInt("forum_owner_id")).setForum(f);
_forumRoot.put(Integer.parseInt(result.getString("forum_id")), f);
}
}
if (f.getID() > _lastForumId)
_lastForumId = f.getID();
}
result.close();
statement.close();
}
catch (Exception e)
{
// _log.warning("data error on Forum (root): " + e);
e.printStackTrace();
}
finally
{
try
{
con.close();
}
catch (Exception e)
{
}
}
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("SELECT introduction,clanId FROM clan_introductions WHERE serverId=?");
statement.setInt(1, _sqlDPId);
ResultSet result = statement.executeQuery();
while (result.next())
getClan(result.getInt("clanId")).setIntroduction(result.getString("introduction"));
result.close();
statement.close();
}
catch (Exception e)
{
// _log.warning("data error on Forum (root): " + e);
e.printStackTrace();
}
finally
{
try
{
con.close();
}
catch (Exception e)
{
}
}
int requestedClanNotices = 0;
try
{
for(L2Clan c : _clans.values())
{
if (c == null)
continue;
if (_players.containsKey(c.getLordObjId()) && _players.get(c.getLordObjId()).isOnline())
{
getGST().sendPacket(new RequestWorldInfo(RequestWorldInfo.CLAN_NOTICE_DATA,c.getClanId(), "", false));
requestedClanNotices++;
}
}
_log.info("Requesting " + requestedClanNotices + " clan notices from GS.");
}
catch (Exception e)
{
_log.warning("Data error on Notice Load: " + e);
// e.printStackTrace();
}
}
private int getNewForumId()
{
return ++_lastForumId;
}
public void clean()
{
_forumRoot.clear();
_players.clear();
_clans.clear();
_lastForumId = 0;
}
public void addPlayer(L2Player player)
{
if (!_players.containsKey(player.getObjId()))
_players.put(player.getObjId(), player);
}
public void updatePlayer(int playerObjId, String name, String accountName, int playerLevel, int accessLevel, int playerClanId, boolean isOnline, int[] friendIDs)
{
if (_players.containsKey(playerObjId))
{
L2Player player = _players.get(playerObjId);
if (player.getName() != name)
player.setName(name);
if (player.getLevel() != playerLevel)
player.setLevel(playerLevel);
if (player.getAccessLevel() != accessLevel)
player.setAccessLevel(accessLevel);
if (player.getClanId() != playerClanId)
player.setClanId(playerClanId);
if (player.isOnline() != isOnline)
player.setIsOnline(isOnline);
player.removeAllFriends();
for(int i : friendIDs)
{
player.addFriend(i);
}
}
else
{
L2Player player = new L2Player(playerObjId, name, accountName, playerLevel, accessLevel, playerClanId, isOnline);
for(int i : friendIDs)
{
player.addFriend(i);
}
_players.put(playerObjId, player);
_log.info("New player is successfully created with " + player.getName() + " name.");
}
}
public L2Player getPlayer(int playerObjId)
{
if (!_players.containsKey(playerObjId))
return null;
return _players.get(playerObjId);
}
public L2Player getPlayerByName(String playerName)
{
for (L2Player p : _players.values())
if (p.getName().equalsIgnoreCase(playerName.toLowerCase()))
return p;
return null;
}
public Collection getPlayerList()
{
return _players.values();
}
public Forum getPlayerForum(int playerObjId)
{
if (!_players.containsKey(playerObjId))
return null;
L2Player p = _players.get(playerObjId);
Forum ret = p.getForum();
if (ret == null && p.getLevel() >= Config.MIN_PLAYER_LVL_FOR_FORUM)
{
ret = new Forum(_sqlDPId, getNewForumId(), p.getName(), Forum.PLAYER, p.getObjId());
p.setForum(ret);
}
return ret;
}
public void addClan(L2Clan clan)
{
if (!_clans.containsKey(clan.getClanId()))
_clans.put(clan.getClanId(), clan);
}
public void updateClan(int clanId, String clanName, int level, int lordObjId, String lordName, int members, String allyName, int[] alliance, boolean isNoticeEnabled)
{
if (_clans.containsKey(clanId))
{
L2Clan clan = _clans.get(clanId);
if (clan.getName() != clanName)
clan.setName(clanName);
if (clan.getClanLevel() != level)
clan.setLevel(level);
if (clan.getLordObjId() != lordObjId)
{
clan.setLordObjId(lordObjId);
clan.setLordName(lordName);
}
if (clan.getLordName() != lordName)
clan.setLordName(lordName);
if (clan.getMembersCount() != members)
clan.setMembersCount(members);
if (clan.getAllianceName() != allyName)
clan.setAllianceName(allyName);
clan.setAllianceClanIdList(alliance);
if (clan.isNoticeEnabled() != isNoticeEnabled)
clan.setNoticeEnabled(isNoticeEnabled);
}
else
{
L2Clan clan = new L2Clan(clanId, clanName, level, lordObjId, lordName, members, allyName, alliance, isNoticeEnabled);
_clans.put(clan.getClanId(), clan);
_log.info("New clan is successfully created with " + clan.getName() + " name.");
}
}
public L2Clan getClan(int clanId)
{
if (!_clans.containsKey(clanId))
return null;
return _clans.get(clanId);
}
public L2Clan getPlayersClan(int playerObjId)
{
if (!_players.containsKey(playerObjId))
return null;
int clanId = _players.get(playerObjId).getClanId();
if (!_clans.containsKey(clanId))
return null;
return _clans.get(clanId);
}
public Collection getClanList()
{
return _clans.values();
}
public Forum getClanForum(int clanId)
{
if (!_clans.containsKey(clanId))
return null;
L2Clan c = _clans.get(clanId);
Forum ret = c.getForum();
if (ret == null && c.getClanLevel() >= Config.MIN_CLAN_LVL_FOR_FORUM)
{
ret = new Forum(_sqlDPId, getNewForumId(), c.getName(), Forum.CLAN, c.getClanId());
c.setForum(ret);
}
return ret;
}
public void addCastle(L2Castle castle)
{
_castles.put(castle.getId(), castle);
}
public L2Castle getCastle(int castleId)
{
return _castles.get(castleId);
}
public Collection getCastleList()
{
return _castles.values();
}
public boolean isLoaded()
{
return _isLoaded;
}
public void setLoaded()
{
loadDataBase();
_isLoaded = true;
}
public void storeClanIntro(int clanId, String intro)
{
java.sql.Connection con = null;
try
{
con = L2DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("INSERT INTO clan_introductions (serverId,clanId,introduction) values (?,?,?) ON DUPLICATE KEY UPDATE introduction = ?");
statement.setInt(1, _sqlDPId);
statement.setInt(2, clanId);
statement.setString(3, intro);
statement.setString(4, intro);
statement.execute();
statement.close();
}
catch (Exception e)
{
_log.warning("error while saving new Topic to db " + e);
}
finally
{
try
{
con.close();
}
catch (Exception e)
{
}
}
}
public final void parseCmd(final int playerObjId, final String cmd)
{
String board = cmd.split(";")[0];
try
{
if (_boards.containsKey(board))
_boards.get(board).parseCmd(playerObjId, cmd);
else
_boards.get("_bbserror").parseCmd(playerObjId, "noBoard;" + cmd);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public final void parseWrite(final int playerObjId, final String url, final String arg1, final String arg2, final String arg3, final String arg4, final String arg5)
{
try
{
if (_boards.containsKey(url))
_boards.get(url).parseWrite(playerObjId, arg1, arg2, arg3, arg4, arg5);
else
_boards.get("_bbserror").parseCmd(playerObjId, "noBoard;" + url);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public final int getSQLDPId()
{
return _sqlDPId;
}
protected final void sendPacket(final BaseWritePacket packet)
{
_gst.sendPacket(packet);
}
public final void setGST(final GameServerThread gst)
{
_gst = gst;
}
public final GameServerThread getGST()
{
return _gst;
}
}