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();