package server;
import database.DatabaseConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import tools.FileoutputUtil;
public class RankingWorker {
private final static Map<Integer, List<RankingInformation>> rankings = new HashMap<>();
private final static Map<String, Integer> jobCommands = new HashMap<>();
public static Integer getJobCommand(final String job) {
return jobCommands.get(job);
}
public static Map<String, Integer> getJobCommands() {
return jobCommands;
}
public static List<RankingInformation> getRankingInfo(final int job) {
return rankings.get(job);
}
public static void run() {
//System.out.println("Loading Rankings::");
//long startTime = System.currentTimeMillis();
loadJobCommands();
try {
Connection con = DatabaseConnection.getConnection();
updateRanking(con);
} catch (Exception ex) {
FileoutputUtil.outputFileError(FileoutputUtil.ScriptEx_Log, ex);
System.err.println("Could not update rankings");
}
//System.out.println("Done loading Rankings in " + ((System.currentTimeMillis() - startTime) / 1000) + " seconds :::"); //keep
}
private static void updateRanking(Connection con) throws Exception {
StringBuilder sb = new StringBuilder("SELECT c.id, c.job, c.exp, c.level, c.name, c.jobRank, c.rank, c.fame");
sb.append(" FROM characters AS c LEFT JOIN accounts AS a ON c.accountid = a.id WHERE c.gm = 0 AND a.banned = 0 AND c.level >= 30");
sb.append(" ORDER BY c.level DESC , c.exp DESC , c.fame DESC , c.rank ASC");
PreparedStatement ps;
try (PreparedStatement charSelect = con.prepareStatement(sb.toString()); ResultSet rs = charSelect.executeQuery()) {
ps = con.prepareStatement("UPDATE characters SET jobRank = ?, jobRankMove = ?, rank = ?, rankMove = ? WHERE id = ?");
int rank = 0;
final Map<Integer, Integer> rankMap = new LinkedHashMap<>();
for (int i : jobCommands.values()) {
rankMap.put(i, 0); //job to rank
rankings.put(i, new ArrayList<RankingInformation>());
}
while (rs.next()) {
int job = rs.getInt("job");
if (!rankMap.containsKey(job / 100)) { //not supported.
continue;
}
int jobRank = rankMap.get(job / 100) + 1;
rankMap.put(job / 100, jobRank);
rank++;
rankings.get(-1).add(new RankingInformation(rs.getString("name"), job, rs.getInt("level"), rs.getLong("exp"), rank, rs.getInt("fame")));
rankings.get(job / 100).add(new RankingInformation(rs.getString("name"), job, rs.getInt("level"), rs.getLong("exp"), jobRank, rs.getInt("fame")));
ps.setInt(1, jobRank);
ps.setInt(2, rs.getInt("jobRank") - jobRank);
ps.setInt(3, rank);
ps.setInt(4, rs.getInt("rank") - rank);
ps.setInt(5, rs.getInt("id"));
ps.addBatch();
}
ps.executeBatch();
}
ps.close();
}
public static void loadJobCommands() {
//messy, cleanup
jobCommands.put("all", -1);
jobCommands.put("beginner", 0);
jobCommands.put("warrior", 1);
jobCommands.put("magician", 2);
jobCommands.put("bowman", 3);
jobCommands.put("thief", 4);
jobCommands.put("pirate", 5);
jobCommands.put("noblesse", 10);
jobCommands.put("dawnwarrior", 11);
jobCommands.put("blazewizard", 12);
jobCommands.put("windarcher", 13);
jobCommands.put("nightwalker", 14);
jobCommands.put("thunderbreaker", 15);
jobCommands.put("legend", 20);
jobCommands.put("aran", 21);
jobCommands.put("evan", 22);
jobCommands.put("mercedes", 23);
jobCommands.put("phantom", 24);
jobCommands.put("luminous", 27);
jobCommands.put("citizen", 30);
jobCommands.put("battlemage", 32);
jobCommands.put("wildhunter", 33);
jobCommands.put("xenon", 36);
jobCommands.put("mechanic", 35);
jobCommands.put("hayato", 41);
jobCommands.put("kanna", 42);
jobCommands.put("mihile", 50);
jobCommands.put("kaiser", 60);
jobCommands.put("angelicbuster", 65);
}
public static class RankingInformation {
public String toString;
public int rank;
public RankingInformation(String name, int job, int level, long exp, int rank, int fame) {
this.rank = rank;
final StringBuilder builder = new StringBuilder("Rank ");
builder.append(rank);
builder.append(" : ");
builder.append(name);
builder.append(" - Level ");
builder.append(level);
builder.append(" ");
builder.append(MapleCarnivalChallenge.getJobNameById(job));
builder.append(" | ");
builder.append(exp);
builder.append(" EXP, ");
builder.append(fame);
builder.append(" Fame");
this.toString = builder.toString(); //Rank 1 : KiDALex - Level 200 Blade Master | 0 EXP, 30000 Fame
}
@Override
public String toString() {
return toString;
}
}
}