package regalowl.hyperconomy;
import java.util.ArrayList;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import regalowl.databukkit.QueryResult;
import regalowl.databukkit.SQLRead;
public class Hyperlog {
private CommandSender sender;
private String statement;
private ArrayList<String> result;
private HyperConomy hc;
Hyperlog(String args[], CommandSender csender) {
sender = csender;
hc = HyperConomy.hc;
LanguageFile L = hc.getLanguageFile();
try {
if (args.length % 2 != 0 || args.length == 0) {
sender.sendMessage(L.get("HYPERLOG_INVALID"));
return;
}
statement = "SELECT * FROM hyperconomy_log WHERE";
for (int i = 0; i < args.length; i += 2) {
String type = args[i];
String value = args[i + 1];
if (i >= 2) {
statement += " AND";
}
if (type.equalsIgnoreCase("player") || type.equalsIgnoreCase("p")) {
statement += " CUSTOMER LIKE '%" + value + "%'";
} else if (type.equalsIgnoreCase("since") || type.equalsIgnoreCase("s")) {
String increment = value.substring(value.length() - 1, value.length());
Integer quantity = Integer.parseInt(value.substring(0, value.length() - 1));
if (increment.equalsIgnoreCase("m")) {
// do nothing
} else if (increment.equalsIgnoreCase("h")) {
quantity = quantity * 60;
} else if (increment.equalsIgnoreCase("d")) {
quantity = quantity * 60 * 24;
} else {
sender.sendMessage(L.get("HYPERLOG_INVALID_INCREMENT"));
return;
}
if (hc.gDB().useMySQL()) {
statement += " TIME > DATE_SUB(NOW(), INTERVAL " + quantity + " MINUTE)";
} else {
statement += " TIME > date('now','" + formatSQLiteTime(quantity * -1) + " minute')";
}
} else if (type.equalsIgnoreCase("before") || type.equalsIgnoreCase("b")) {
String increment = value.substring(value.length() - 1, value.length());
Integer quantity = Integer.parseInt(value.substring(0, value.length() - 1));
if (increment.equalsIgnoreCase("m")) {
// do nothing
} else if (increment.equalsIgnoreCase("h")) {
quantity = quantity * 60;
} else if (increment.equalsIgnoreCase("d")) {
quantity = quantity * 60 * 24;
} else {
sender.sendMessage(L.get("HYPERLOG_INVALID_INCREMENT"));
return;
}
if (hc.gDB().useMySQL()) {
statement += " TIME < DATE_SUB(NOW(), INTERVAL " + quantity + " MINUTE)";
} else {
statement += " TIME < date('now','" + formatSQLiteTime(quantity * -1) + " minute')";
}
} else if (type.equalsIgnoreCase("action") || type.equalsIgnoreCase("a")) {
statement += " ACTION LIKE '%" + value + "%'";
} else if (type.equalsIgnoreCase("object") || type.equalsIgnoreCase("o")) {
statement += " OBJECT LIKE '%" + value + "%'";
} else if (type.equalsIgnoreCase(">amount") || type.equalsIgnoreCase(">a")) {
statement += " AMOUNT > '" + value + "'";
} else if (type.equalsIgnoreCase("<amount") || type.equalsIgnoreCase("<a")) {
statement += " AMOUNT < '" + value + "'";
} else if (type.equalsIgnoreCase(">money") || type.equalsIgnoreCase(">m")) {
statement += " MONEY > '" + value + "'";
} else if (type.equalsIgnoreCase("<money") || type.equalsIgnoreCase("<m")) {
statement += " MONEY < '" + value + "'";
} else if (type.equalsIgnoreCase(">tax") || type.equalsIgnoreCase(">t")) {
statement += " TAX > '" + value + "'";
} else if (type.equalsIgnoreCase("<tax") || type.equalsIgnoreCase("<t")) {
statement += " TAX < '" + value + "'";
} else if (type.equalsIgnoreCase("store") || type.equalsIgnoreCase("st")) {
statement += " STORE LIKE '%" + value + "%'";
} else if (type.equalsIgnoreCase("type") || type.equalsIgnoreCase("ty")) {
statement += " TYPE LIKE '%" + value + "%'";
} else if (type.equalsIgnoreCase(">id")) {
statement += " ID > '" + value + "'";
} else if (type.equalsIgnoreCase("<id")) {
statement += " ID < '" + value + "'";
} else {
sender.sendMessage(L.get("HYPERLOG_INVALID"));
return;
}
}
statement += " ORDER BY TIME DESC";
hc.getServer().getScheduler().runTaskAsynchronously(hc, new Runnable() {
public void run() {
result = getHyperLog(statement);
hc.getServer().getScheduler().runTask(hc, new Runnable() {
public void run() {
int m = result.size();
if (m > 100) {
m = 100;
}
sender.sendMessage(hc.getLanguageFile().get("LINE_BREAK"));
for (String message:result) {
sender.sendMessage(message);
}
if (result.size() == 0) {
sender.sendMessage(hc.getLanguageFile().get("HYPERLOG_NORESULT"));
}
}
});
}
});
} catch (Exception e) {
sender.sendMessage(L.get("HYPERLOG_INVALID"));
}
}
/**
* This function must be called from an asynchronous thread!
* @param statement
* @return a display of the selected HyperLog entry
*/
private ArrayList<String> getHyperLog(String statement) {
SQLRead sr = HyperConomy.hc.getSQLRead();
ArrayList<String> entries = new ArrayList<String>();
LanguageFile L = hc.getLanguageFile();
QueryResult result = sr.aSyncSelect(statement);
while (result.next()) {
// int id = result.getInt(1);
String time = result.getString(2);
String customer = result.getString(3);
String action = result.getString(4);
String object = result.getString(5);
String amount = result.getString(6);
double money = result.getDouble(7);
// double tax = result.getDouble(8);
String store = result.getString(9);
// String type = result.getString(10);
String entry = "";
time = time.substring(0, time.indexOf(" "));
time = time.substring(time.indexOf("-") + 1, time.length());
if (action.equalsIgnoreCase("purchase")) {
entry = "[" + ChatColor.RED + time + ChatColor.WHITE + "]" + ChatColor.YELLOW + store + ChatColor.WHITE + "->" + ChatColor.AQUA + customer + ChatColor.WHITE + "[" + ChatColor.BLUE + amount + " " + ChatColor.BLUE + object + ChatColor.WHITE + "]" + "[" + ChatColor.GREEN + L.fC(money) + ChatColor.WHITE + "]";
} else if (action.equalsIgnoreCase("sale")) {
entry = "[" + ChatColor.RED + time + ChatColor.WHITE + "]" + ChatColor.AQUA + customer + ChatColor.WHITE + "->" + ChatColor.YELLOW + store + ChatColor.WHITE + "[" + ChatColor.BLUE + amount + " " + ChatColor.BLUE + object + ChatColor.WHITE + "]" + "[" + ChatColor.GREEN + L.fC(money) + ChatColor.WHITE + "]";
}
entries.add(entry);
}
result.close();
return entries;
}
public String formatSQLiteTime(int time) {
if (time < 0) {
return "-" + Math.abs(time);
} else if (time > 0) {
return "+" + time;
} else {
return "0";
}
}
}