package client;
import database.DatabaseConnection;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import tools.Pair;
import tools.data.MaplePacketLittleEndianWriter;
public class MapleKeyLayout implements Serializable {
private static final long serialVersionUID = 9179541993413738569L;
private boolean changed = false;
private final Map<Integer, Pair<Byte, Integer>> keymap;
public MapleKeyLayout() {
keymap = new HashMap<>();
}
public MapleKeyLayout(Map<Integer, Pair<Byte, Integer>> keys) {
keymap = keys;
}
public final Map<Integer, Pair<Byte, Integer>> Layout() {
changed = true;
return keymap;
}
public final void unchanged() {
changed = false;
}
public final void writeData(final MaplePacketLittleEndianWriter mplew) {
mplew.write(keymap.isEmpty() ? 1 : 0);
if (keymap.isEmpty()) {
return;
}
Pair<Byte, Integer> binding;
for (int x = 0; x < 89; x++) {
binding = keymap.get(Integer.valueOf(x));
if (binding != null) {
mplew.write(binding.getLeft());
mplew.writeInt(binding.getRight());
} else {
mplew.write(0);
mplew.writeInt(0);
}
}
}
public final void saveKeys(final int charid) throws SQLException {
if (!changed) {
return;
}
Connection con = DatabaseConnection.getConnection();
PreparedStatement ps = con.prepareStatement("DELETE FROM keymap WHERE characterid = ?");
ps.setInt(1, charid);
ps.execute();
ps.close();
if (keymap.isEmpty()) {
return;
}
boolean first = true;
StringBuilder query = new StringBuilder();
for (Entry<Integer, Pair<Byte, Integer>> keybinding : keymap.entrySet()) {
if (first) {
first = false;
query.append("INSERT INTO keymap VALUES (");
} else {
query.append(",(");
}
query.append("DEFAULT,");
query.append(charid).append(",");
query.append(keybinding.getKey().intValue()).append(",");
query.append(keybinding.getValue().getLeft().byteValue()).append(",");
query.append(keybinding.getValue().getRight().intValue()).append(")");
}
ps = con.prepareStatement(query.toString());
ps.execute();
ps.close();
}
}