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.BuddyListPacket; public class BuddyList implements Serializable { private static final long serialVersionUID = 1413738569L; private final Map<Integer, BuddylistEntry> buddies = new LinkedHashMap(); private byte capacity; private boolean changed = false; public BuddyList(byte capacity) { this.capacity = capacity; } public boolean contains(int characterId) { return this.buddies.containsKey(characterId); } public boolean containsVisible(int characterId) { BuddylistEntry ble = (BuddylistEntry) this.buddies.get(Integer.valueOf(characterId)); if (ble == null) { return false; } return ble.isVisible(); } public byte getCapacity() { return this.capacity; } public void setCapacity(byte capacity) { this.capacity = capacity; } public BuddylistEntry get(int characterId) { return (BuddylistEntry) this.buddies.get(characterId); } public BuddylistEntry get(String characterName) { String lowerCaseName = characterName.toLowerCase(); for (BuddylistEntry ble : this.buddies.values()) { if (ble.getName().toLowerCase().equals(lowerCaseName)) { return ble; } } return null; } public void put(BuddylistEntry entry) { this.buddies.put(entry.getCharacterId(), entry); this.changed = true; } public void remove(int characterId) { this.buddies.remove(characterId); this.changed = true; } public Collection<BuddylistEntry> getBuddies() { return this.buddies.values(); } public boolean isFull() { return this.buddies.size() >= this.capacity; } public int[] getBuddyIds() { int[] buddyIds = new int[this.buddies.size()]; int i = 0; for (BuddylistEntry ble : this.buddies.values()) { if (ble.isVisible()) { buddyIds[(i++)] = ble.getCharacterId(); } } return buddyIds; } public void loadFromTransfer(Map<CharacterNameAndId, Boolean> data) { for (Map.Entry qs : data.entrySet()) { CharacterNameAndId buddyid = (CharacterNameAndId) qs.getKey(); put(new BuddylistEntry(buddyid.getName(), buddyid.getId(), buddyid.getGroup(), -1, ((Boolean) 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)); } } ps.close(); } } public void addBuddyRequest(MapleClient c, int cidFrom, String nameFrom, int channelFrom, int levelFrom, int jobFrom, int AccID) { put(new BuddylistEntry(nameFrom, cidFrom, "未指定群组", channelFrom, false)); c.getSession().write(BuddyListPacket.requestBuddylistAdd(cidFrom, nameFrom, levelFrom, jobFrom, channelFrom, AccID)); } public void setChanged(boolean v) { this.changed = v; } public boolean changed() { return this.changed; } public static enum BuddyAddResult { 好友列表已满, 已经是好友关系, 添加好友成功; } public static enum BuddyOperation { 添加好友, 删除好友; } }