/* * 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.tables; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javolution.util.FastMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import silentium.commons.database.DatabaseFactory; import silentium.gameserver.model.actor.instance.L2PcInstance; public class CharNameTable { private static Logger _log = LoggerFactory.getLogger(CharNameTable.class.getName()); private final Map<Integer, String> _chars; private final Map<Integer, Integer> _accessLevels; protected CharNameTable() { _chars = new FastMap<>(); _accessLevels = new FastMap<>(); } public static CharNameTable getInstance() { return SingletonHolder._instance; } public final void addName(L2PcInstance player) { if (player != null) { addName(player.getObjectId(), player.getName()); _accessLevels.put(player.getObjectId(), player.getAccessLevel().getLevel()); } } private final void addName(int objId, String name) { if (name != null) { if (!name.equalsIgnoreCase(_chars.get(objId))) _chars.put(objId, name); } } public final void removeName(int objId) { _chars.remove(objId); _accessLevels.remove(objId); } public final int getIdByName(String name) { if (name == null || name.isEmpty()) return -1; Iterator<Entry<Integer, String>> it = _chars.entrySet().iterator(); Map.Entry<Integer, String> pair; while (it.hasNext()) { pair = it.next(); if (pair.getValue().equalsIgnoreCase(name)) return pair.getKey(); } int id = -1; int accessLevel = 0; try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("SELECT obj_Id,accesslevel FROM characters WHERE char_name=?"); statement.setString(1, name); ResultSet rset = statement.executeQuery(); while (rset.next()) { id = rset.getInt(1); accessLevel = rset.getInt(2); } rset.close(); statement.close(); } catch (SQLException e) { _log.warn("Could not check existing char name: " + e.getMessage(), e); } if (id > 0) { _chars.put(id, name); _accessLevels.put(id, accessLevel); return id; } return -1; // not found } public final String getNameById(int id) { if (id <= 0) return null; String name = _chars.get(id); if (name != null) return name; int accessLevel = 0; try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("SELECT char_name,accesslevel FROM characters WHERE obj_Id=?"); statement.setInt(1, id); ResultSet rset = statement.executeQuery(); while (rset.next()) { name = rset.getString(1); accessLevel = rset.getInt(2); } rset.close(); statement.close(); } catch (SQLException e) { _log.warn("Could not check existing char id: " + e.getMessage(), e); } if (name != null && !name.isEmpty()) { _chars.put(id, name); _accessLevels.put(id, accessLevel); return name; } return null; // not found } public final int getAccessLevelById(int objectId) { if (getNameById(objectId) != null) return _accessLevels.get(objectId); return 0; } public synchronized static boolean doesCharNameExist(String name) { boolean result = true; try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("SELECT account_name FROM characters WHERE char_name=?"); statement.setString(1, name); ResultSet rset = statement.executeQuery(); result = rset.next(); rset.close(); statement.close(); } catch (SQLException e) { _log.warn("Could not check existing charname: " + e.getMessage(), e); } return result; } public static int accountCharNumber(String account) { int number = 0; try (Connection con = DatabaseFactory.getConnection()) { PreparedStatement statement = con.prepareStatement("SELECT COUNT(char_name) FROM characters WHERE account_name=?"); statement.setString(1, account); ResultSet rset = statement.executeQuery(); while (rset.next()) { number = rset.getInt(1); } rset.close(); statement.close(); } catch (SQLException e) { _log.warn("Could not check existing char number: " + e.getMessage(), e); } return number; } private static class SingletonHolder { protected static final CharNameTable _instance = new CharNameTable(); } }