Files
WyvernMods/src/main/java/com/wurmonline/server/questions/LeaderboardAchievementQuestion.java
2018-06-22 17:08:29 -04:00

129 lines
4.9 KiB
Java

package com.wurmonline.server.questions;
import com.wurmonline.server.DbConnector;
import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.deities.Deities;
import com.wurmonline.server.players.AchievementTemplate;
import com.wurmonline.server.skills.SkillList;
import com.wurmonline.server.utils.DbUtilities;
import mod.sin.wyvern.AchievementChanges;
import net.coldie.tools.BmlForm;
import org.gotti.wurmunlimited.modsupport.ModSupportDb;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
public class LeaderboardAchievementQuestion extends Question {
protected int achievementNum;
protected AchievementTemplate template;
public LeaderboardAchievementQuestion(Creature aResponder, String aTitle, String aQuestion, long aTarget, int achievementNum){
super(aResponder, aTitle, aQuestion, 79, aTarget);
this.achievementNum = achievementNum;
this.template = AchievementChanges.goodAchievements.get(achievementNum);
}
@Override
public void answer(Properties answer) {
boolean accepted = answer.containsKey("okay") && answer.get("okay") == "true";
if (accepted) {
LeaderboardQuestion lbq = new LeaderboardQuestion(this.getResponder(), "Leaderboard", "Which leaderboard would you like to view?", this.getResponder().getWurmId());
lbq.sendQuestion();
}
}
protected HashMap<String, Integer> optIn = new HashMap<>();
protected void identifyOptIn(){
String name;
int opted;
Connection dbcon;
PreparedStatement ps;
ResultSet rs;
try {
dbcon = ModSupportDb.getModSupportDb();
ps = dbcon.prepareStatement("SELECT * FROM LeaderboardOpt");
rs = ps.executeQuery();
while (rs.next()) {
name = rs.getString("name");
opted = rs.getInt("OPTIN");
optIn.put(name, opted);
}
rs.close();
ps.close();
}
catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
public void sendQuestion() {
BmlForm f = new BmlForm("");
f.addHidden("id", String.valueOf(this.id));
ArrayList<String> names = new ArrayList<>();
ArrayList<Integer> counts = new ArrayList<>();
//ArrayList<Integer> deities = new ArrayList<>();
String name;
int counter;
int deity;
String extra = "";
// Populates HashMap with latest opt-in data.
identifyOptIn();
Connection dbcon;
PreparedStatement ps;
ResultSet rs;
try {
dbcon = DbConnector.getPlayerDbCon();
//ps = dbcon.prepareStatement("SELECT players.name, skills.value, players.deity FROM skills JOIN players ON skills.owner = players.wurmid WHERE skills.number = " + skillNum + " AND (players.power = 0) ORDER BY skills.value DESC LIMIT 20");
ps = dbcon.prepareStatement("SELECT players.name, achievements.counter FROM achievements JOIN players ON achievements.player = players.wurmid WHERE achievements.achievement = " + achievementNum + " AND achievements.counter > 0 AND players.power = 0 ORDER BY achievements.counter DESC LIMIT 20");
rs = ps.executeQuery();
while(rs.next()){
name = rs.getString(1);
counter = rs.getInt(2);
//deity = rs.getInt(3);
names.add(name);
counts.add(counter);
//deities.add(deity);
}
DbUtilities.closeDatabaseObjects(ps, rs);
}
catch (SQLException e) {
throw new RuntimeException(e);
}
f.addBoldText("Top 20 players with achievement "+this.getQuestion(), new String[0]);
f.addBoldText(template.getRequirement(), new String[0]);
f.addText("\n\n", new String[0]);
int i = 0;
DecimalFormat df = new DecimalFormat(".000");
while(i < names.size() && i < counts.size()){
name = names.get(i);
if(!optIn.containsKey(name)){
name = "Unknown";
}else if(optIn.get(name).equals(0)){
name = "Unknown";
}
if(names.get(i).equals(this.getResponder().getName())){
name = names.get(i);
f.addBoldText(counts.get(i) + " - " + name + extra);
}else{
f.addText(counts.get(i) + " - " + name + extra);
}
i++;
}
f.addText(" \n", new String[0]);
f.beginHorizontalFlow();
f.addButton("Ok", "okay");
f.endHorizontalFlow();
f.addText(" \n", new String[0]);
this.getResponder().getCommunicator().sendBml(400, 500, true, true, f.toString(), 150, 150, 200, this.title);
}
}