Now /top supports timespent

This commit is contained in:
UnknownShadow200 2017-05-12 10:37:22 +10:00
parent 2c9441b9ed
commit 651268bce1
3 changed files with 24 additions and 11 deletions

View File

@ -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++) {

View File

@ -24,19 +24,22 @@ namespace MCGalaxy.DB {
/// <summary> Outputs ordered stats from a column in a database table. </summary>
public sealed class TopStat {
public readonly string Identifier, Table, Column;
public readonly bool Ascending;
public readonly string Identifier, Table, Column, OrderBy;
public readonly Func<string> Title;
public readonly Func<string, string> Formatter;
public TopStat(string identifier, string table, string col, Func<string> title,
Func<string, string> formatter, bool ascending = false) {
Func<string, string> 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");
}
/// <summary> List of stats that can be ordered. </summary>
@ -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;

View File

@ -172,7 +172,7 @@ namespace MCGalaxy.Tasks {
static void DumpPlayerTimeSpents() {
playerIds = new List<int>();
playerSeconds = new List<long>();
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();