Merge pull request #514 from t00thpick1/patch-2

SQL for mcRank command
This commit is contained in:
nossr50 2013-01-15 16:16:53 -08:00
commit ef69217b81
2 changed files with 110 additions and 52 deletions

View File

@ -1,45 +1,65 @@
package com.gmail.nossr50.commands.mc; package com.gmail.nossr50.commands.mc;
import java.util.Map;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.datatypes.SkillType;
import com.gmail.nossr50.util.Database;
import com.gmail.nossr50.util.Leaderboard; import com.gmail.nossr50.util.Leaderboard;
import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Misc;
public class McrankCommand implements CommandExecutor { public class McrankCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) { public boolean onCommand(CommandSender arg0, Command arg1, String arg2, String[] arg3) {
//I'm being lazy and making this only work on yourself, I or someone else will make this work on other players in the future :D //I'm being lazy and making this only work on yourself, I or someone else will make this work on other players in the future :D
Leaderboard.updateLeaderboards(); //Make sure the information is up to date Leaderboard.updateLeaderboards(); //Make sure the information is up to date
if(arg0 instanceof Player) { if(arg0 instanceof Player) {
Player player = (Player) arg0; Player player = (Player) arg0;
String playerName = player.getName(); String playerName = player.getName();
arg0.sendMessage(ChatColor.GOLD + "-=PERSONAL RANKINGS=-"); arg0.sendMessage(ChatColor.GOLD + "-=PERSONAL RANKINGS=-");
arg0.sendMessage(ChatColor.RED+"TARGET: "+ChatColor.WHITE+playerName); arg0.sendMessage(ChatColor.RED+"TARGET: "+ChatColor.WHITE+playerName);
if(Config.getInstance().getUseMySQL()) { if(Config.getInstance().getUseMySQL()) {
//MySQL Version sqlDisplay(arg0, playerName);
} else { } else {
for(SkillType skillType : SkillType.values()) { flatfileDisplay(arg0, playerName);
if(skillType.equals(SkillType.ALL)) }
continue; //We want the overall ranking to be at the bottom
arg0.sendMessage(ChatColor.YELLOW+Misc.getCapitalized(skillType.name())+ChatColor.GREEN+" - "+ChatColor.GOLD+"Rank "+ChatColor.WHITE+"#"+ChatColor.GREEN+Leaderboard.getPlayerRank(playerName, skillType));
}
arg0.sendMessage(ChatColor.YELLOW+"Overall"+ChatColor.GREEN+" - "+ChatColor.GOLD+"Rank "+ChatColor.WHITE+"#"+ChatColor.GREEN+Leaderboard.getPlayerRank(playerName, SkillType.ALL));
}
} else { } else {
arg0.sendMessage("Command currently not supported for console."); arg0.sendMessage("Command currently not supported for console.");
} }
return true; return true;
} }
public void flatfileDisplay(CommandSender sender, String playerName) {
for (SkillType skillType : SkillType.values()) {
if (skillType.equals(SkillType.ALL))
continue; // We want the overall ranking to be at the bottom
sender.sendMessage(ChatColor.YELLOW + Misc.getCapitalized(skillType.name()) + ChatColor.GREEN + " - " + ChatColor.GOLD + "Rank " + ChatColor.WHITE + "#" + ChatColor.GREEN + Leaderboard.getPlayerRank(playerName, skillType));
}
sender.sendMessage(ChatColor.YELLOW + "Overall" + ChatColor.GREEN + " - " + ChatColor.GOLD + "Rank " + ChatColor.WHITE + "#" + ChatColor.GREEN + Leaderboard.getPlayerRank(playerName, SkillType.ALL));
}
private void sqlDisplay(CommandSender sender, String playerName) {
Database database = mcMMO.getPlayerDatabase();
Map<String, Integer> skills = database.readSQLRank(playerName);
for (SkillType skillType : SkillType.values()) {
if (skillType.equals(SkillType.ALL))
continue; // We want the overall ranking to be at the bottom
sender.sendMessage(ChatColor.YELLOW + Misc.getCapitalized(skillType.name()) + ChatColor.GREEN + " - " + ChatColor.GOLD + "Rank " + ChatColor.WHITE + "#" + ChatColor.GREEN + skills.get(skillType.name()));
}
sender.sendMessage(ChatColor.YELLOW + "Overall" + ChatColor.GREEN + " - " + ChatColor.GOLD + "Rank " + ChatColor.WHITE + "#" + ChatColor.GREEN + skills.get("ALL"));
}
} }

View File

@ -7,6 +7,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -16,6 +17,7 @@ import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config; import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.DatabaseUpdate; import com.gmail.nossr50.datatypes.DatabaseUpdate;
import com.gmail.nossr50.datatypes.McMMOPlayer; import com.gmail.nossr50.datatypes.McMMOPlayer;
import com.gmail.nossr50.datatypes.SkillType;
import com.gmail.nossr50.datatypes.SpoutHud; import com.gmail.nossr50.datatypes.SpoutHud;
import com.gmail.nossr50.runnables.SQLReconnect; import com.gmail.nossr50.runnables.SQLReconnect;
import com.gmail.nossr50.spout.SpoutStuff; import com.gmail.nossr50.spout.SpoutStuff;
@ -56,27 +58,27 @@ public class Database {
* Attempt to connect to the mySQL database. * Attempt to connect to the mySQL database.
*/ */
public static void connect() { public static void connect() {
connectionString = "jdbc:mysql://" + configInstance.getMySQLServerName() + ":" + configInstance.getMySQLServerPort() + "/" + configInstance.getMySQLDatabaseName(); connectionString = "jdbc:mysql://" + configInstance.getMySQLServerName() + ":" + configInstance.getMySQLServerPort() + "/" + configInstance.getMySQLDatabaseName();
try { try {
mcMMO.p.getLogger().info("Attempting connection to MySQL..."); mcMMO.p.getLogger().info("Attempting connection to MySQL...");
// Force driver to load if not yet loaded // Force driver to load if not yet loaded
Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver");
Properties connectionProperties = new Properties(); Properties connectionProperties = new Properties();
connectionProperties.put("user", configInstance.getMySQLUserName()); connectionProperties.put("user", configInstance.getMySQLUserName());
connectionProperties.put("password", configInstance.getMySQLUserPassword()); connectionProperties.put("password", configInstance.getMySQLUserPassword());
connectionProperties.put("autoReconnect", "false"); connectionProperties.put("autoReconnect", "false");
connectionProperties.put("maxReconnects", "0"); connectionProperties.put("maxReconnects", "0");
connection = DriverManager.getConnection(connectionString, connectionProperties); connection = DriverManager.getConnection(connectionString, connectionProperties);
mcMMO.p.getLogger().info("Connection to MySQL was a success!"); mcMMO.p.getLogger().info("Connection to MySQL was a success!");
} catch (SQLException ex) { } catch (SQLException ex) {
connection = null; connection = null;
if (reconnectAttempt == 0 || reconnectAttempt >= 11) mcMMO.p.getLogger().info("Connection to MySQL failed!"); if (reconnectAttempt == 0 || reconnectAttempt >= 11) mcMMO.p.getLogger().info("Connection to MySQL failed!");
} catch (ClassNotFoundException ex) { } catch (ClassNotFoundException ex) {
connection = null; connection = null;
if (reconnectAttempt == 0 || reconnectAttempt >= 11) mcMMO.p.getLogger().info("MySQL database driver not found!"); if (reconnectAttempt == 0 || reconnectAttempt >= 11) mcMMO.p.getLogger().info("MySQL database driver not found!");
} }
} }
/** /**
@ -198,12 +200,12 @@ public class Database {
catch (SQLException ex) { catch (SQLException ex) {
switch (update) { switch (update) {
case BLAST_MINING: case BLAST_MINING:
mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Blast Mining..."); mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Blast Mining...");
write("ALTER TABLE `"+tablePrefix + "cooldowns` ADD `blast_mining` int(32) NOT NULL DEFAULT '0' ;"); write("ALTER TABLE `"+tablePrefix + "cooldowns` ADD `blast_mining` int(32) NOT NULL DEFAULT '0' ;");
break; break;
case FISHING: case FISHING:
mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Fishing..."); mcMMO.p.getLogger().info("Updating mcMMO MySQL tables for Fishing...");
write("ALTER TABLE `"+tablePrefix + "skills` ADD `fishing` int(10) NOT NULL DEFAULT '0' ;"); write("ALTER TABLE `"+tablePrefix + "skills` ADD `fishing` int(10) NOT NULL DEFAULT '0' ;");
write("ALTER TABLE `"+tablePrefix + "experience` ADD `fishing` int(10) NOT NULL DEFAULT '0' ;"); write("ALTER TABLE `"+tablePrefix + "experience` ADD `fishing` int(10) NOT NULL DEFAULT '0' ;");
break; break;
@ -417,6 +419,42 @@ public class Database {
return rows; return rows;
} }
public Map<String, Integer> readSQLRank(String playerName) {
ResultSet resultSet;
Map<String, Integer> skills = new HashMap<String, Integer>();
if (checkConnected()) {
try {
String sql = "SELECT "
+ "(SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing >= (SELECT s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'ALL'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.fishing >= (SELECT s.fishing FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'FISHING'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.taming >= (SELECT s.taming FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'TAMING'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.woodcutting >= (SELECT s.woodcutting FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'WOODCUTTING'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.repair >= (SELECT s.repair FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'REPAIR'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.unarmed >= (SELECT s.unarmed FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'UNARMED'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.herbalism >= (SELECT s.herbalism FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'HERBALISM'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.excavation >= (SELECT s.excavation FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'EXCAVATION'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.archery >= (SELECT s.archery FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'ARCHERY'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.swords >= (SELECT s.swords FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'SWORDS'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.axes >= (SELECT s.axes FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'AXES'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.acrobatics >= (SELECT s.acrobatics FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'ACROBATICS'"
+ ", (SELECT (COUNT(*)+1) AS rank FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE u.id = s.user_id AND s.mining >= (SELECT s.mining FROM " + tablePrefix + "skills as s, " + tablePrefix + "users as u WHERE u.id = s.user_id AND u.user = " + playerName + ")) AS 'MINING'";
PreparedStatement statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();
while (resultSet.next()) {
for (SkillType skillType: SkillType.values()) {
skills.put(skillType.name(), resultSet.getInt(skillType.name()));
}
}
statement.close();
}
catch (SQLException ex) {
printErrors(ex);
}
}
return skills;
}
public void purgePowerlessSQL() { public void purgePowerlessSQL() {
plugin.getLogger().info("Purging powerless users..."); plugin.getLogger().info("Purging powerless users...");
HashMap<Integer, ArrayList<String>> usernames = read("SELECT u.user FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0"); HashMap<Integer, ArrayList<String>> usernames = read("SELECT u.user FROM " + tablePrefix + "skills AS s, " + tablePrefix + "users AS u WHERE s.user_id = u.id AND (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0");