diff --git a/MCGalaxy/Commands/Information/CmdTop.cs b/MCGalaxy/Commands/Information/CmdTop.cs
index 6f5fc16cb..441536d1e 100644
--- a/MCGalaxy/Commands/Information/CmdTop.cs
+++ b/MCGalaxy/Commands/Information/CmdTop.cs
@@ -47,10 +47,9 @@ namespace MCGalaxy.Commands.Info {
return;
}
- string order = stat.Ascending ? "asc" : "desc";
string strLimit = " LIMIT " + offset + "," + limit;
DataTable db = Database.Backend.GetRows(stat.Table, "DISTINCT Name, " + stat.Column,
- "ORDER BY " + stat.Column + " " + order + strLimit);
+ "ORDER BY " + stat.OrderBy + strLimit);
Player.Message(p, "&a{0}:", stat.Title());
for (int i = 0; i < db.Rows.Count; i++) {
diff --git a/MCGalaxy/Database/Stats/TopStat.cs b/MCGalaxy/Database/Stats/TopStat.cs
index 7f240c769..3efef7597 100644
--- a/MCGalaxy/Database/Stats/TopStat.cs
+++ b/MCGalaxy/Database/Stats/TopStat.cs
@@ -24,19 +24,22 @@ namespace MCGalaxy.DB {
/// Outputs ordered stats from a column in a database table.
public sealed class TopStat {
- public readonly string Identifier, Table, Column;
- public readonly bool Ascending;
+ public readonly string Identifier, Table, Column, OrderBy;
public readonly Func Title;
public readonly Func Formatter;
public TopStat(string identifier, string table, string col, Func title,
- Func formatter, bool ascending = false) {
+ Func formatter, bool ascending = false, string orderBy = null) {
Identifier = identifier;
Table = table;
Column = col;
Title = title;
Formatter = formatter;
- Ascending = ascending;
+
+ OrderBy = orderBy;
+ if (OrderBy == null)
+ OrderBy = " " + col + " ";
+ OrderBy += (ascending ? " asc" : " desc");
}
/// List of stats that can be ordered.
@@ -79,6 +82,10 @@ namespace MCGalaxy.DB {
new TopStat("Deleted", PlayerData.DBTable,
PlayerData.ColumnTotalCuboided + " >> " + PlayerData.LowerBits,
() => "Most blocks deleted", FormatInteger),
+ new TopStat("TimeSpent", PlayerData.DBTable,
+ PlayerData.ColumnTimeSpent,
+ () => "Most time spent", FormatTimespan,
+ false, " CAST(TimeSpent as BIGINT) "),
};
public static string FormatInteger(string input) {
@@ -86,6 +93,11 @@ namespace MCGalaxy.DB {
return value.ToString("N0");
}
+ public static string FormatTimespan(string input) {
+ long value = PlayerData.ParseLong(input);
+ return TimeSpan.FromSeconds(value).Shorten(true, true);
+ }
+
public static string FormatDate(string input) {
DateTime time = DateTime.Parse(input);
TimeSpan delta = DateTime.Now - time;
diff --git a/MCGalaxy/Server/Tasks/UpgradeTasks.cs b/MCGalaxy/Server/Tasks/UpgradeTasks.cs
index db6c83a82..d45550a8c 100644
--- a/MCGalaxy/Server/Tasks/UpgradeTasks.cs
+++ b/MCGalaxy/Server/Tasks/UpgradeTasks.cs
@@ -172,7 +172,7 @@ namespace MCGalaxy.Tasks {
static void DumpPlayerTimeSpents() {
playerIds = new List();
playerSeconds = new List();
- Database.ExecuteReader("SELECT ID, TimeSpent FROM Players", AddPlayerTimeSpent);
+ Database.ExecuteReader("SELECT ID, TimeSpent FROM Players", AddPlayerTimeSpent);
}
static void AddPlayerTimeSpent(IDataReader reader) {
@@ -193,14 +193,16 @@ namespace MCGalaxy.Tasks {
using (BulkTransaction bulk = Database.Backend.CreateBulk()) {
IDataParameter idParam = bulk.CreateParam("@0", DbType.Int32);
IDataParameter secsParam = bulk.CreateParam("@1", DbType.Int64);
- IDbCommand cmd = bulk.CreateCommand("UPDATE Players SET TimeSpent = @1 WHERE ID = @0");
- cmd.Parameters.Add(idParam);
- cmd.Parameters.Add(secsParam);
for (int i = 0; i < playerIds.Count; i++) {
idParam.Value = playerIds[i];
secsParam.Value = playerSeconds[i];
- cmd.ExecuteNonQuery();
+
+ using (IDbCommand cmd = bulk.CreateCommand("UPDATE Players SET TimeSpent = @1 WHERE ID = @0")) {
+ cmd.Parameters.Add(idParam);
+ cmd.Parameters.Add(secsParam);
+ cmd.ExecuteNonQuery();
+ }
}
bulk.Commit();