package client; import database.DatabaseConnection; import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import tools.packet.CWvsContext.BuddylistPacket; public class BuddyList implements Serializable { public static enum BuddyOperation { ADDED, DELETED } public static enum BuddyAddResult { BUDDYLIST_FULL, ALREADY_ON_LIST, OK } private static final long serialVersionUID = 1413738569L; private final Map<Integer, BuddylistEntry> buddies; private byte capacity; private boolean changed = false; public BuddyList(byte capacity) { this.buddies = new LinkedHashMap<>(); this.capacity = capacity; } public boolean contains(int characterId) { return buddies.containsKey(Integer.valueOf(characterId)); } public boolean containsVisible(int characterId) { BuddylistEntry ble = buddies.get(characterId); if (ble == null) { return false; } return ble.isVisible(); } public byte getCapacity() { return capacity; } public void setCapacity(byte capacity) { this.capacity = capacity; } public BuddylistEntry get(int characterId) { return buddies.get(Integer.valueOf(characterId)); } public BuddylistEntry get(String characterName) { String lowerCaseName = characterName.toLowerCase(); for (BuddylistEntry ble : buddies.values()) { if (ble.getName().toLowerCase().equals(lowerCaseName)) { return ble; } } return null; } public void put(BuddylistEntry entry) { buddies.put(Integer.valueOf(entry.getCharacterId()), entry); changed = true; } public void remove(int characterId) { buddies.remove(Integer.valueOf(characterId)); changed = true; } public Collection<BuddylistEntry> getBuddies() { return buddies.values(); } public boolean isFull() { return buddies.size() >= capacity; } public int[] getBuddyIds() { int buddyIds[] = new int[buddies.size()]; int i = 0; for (BuddylistEntry ble : buddies.values()) { if (ble.isVisible()) { buddyIds[i++] = ble.getCharacterId(); } } return buddyIds; } public void loadFromTransfer(final Map<CharacterNameAndId, Boolean> data) { CharacterNameAndId buddyid; for (final Map.Entry<CharacterNameAndId, Boolean> qs : data.entrySet()) { buddyid = qs.getKey(); put(new BuddylistEntry(buddyid.getName(), buddyid.getId(), buddyid.getGroup(), -1, qs.getValue())); } } public void loadFromDb(int characterId) throws SQLException { Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("SELECT b.buddyid, b.pending, c.name as buddyname, b.groupname FROM buddies as b, characters as c WHERE c.id = b.buddyid AND b.characterid = ?")) { ps.setInt(1, characterId); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { put(new BuddylistEntry(rs.getString("buddyname"), rs.getInt("buddyid"), rs.getString("groupname"), -1, rs.getInt("pending") != 1)); } } } } public void addBuddyRequest(MapleClient c, int cidFrom, String nameFrom, int channelFrom, int levelFrom, int jobFrom) { put(new BuddylistEntry(nameFrom, cidFrom, "ETC", channelFrom, false)); c.getSession().write(BuddylistPacket.requestBuddylistAdd(cidFrom, nameFrom, levelFrom, jobFrom)); } public void setChanged(boolean v) { this.changed = v; } public boolean changed() { return changed; } }