private void ShowRankings()
{
// Check cache
if (!base.CacheFileExpired($"{Pid}_rankings", 30))
{
base.SendCachedResponse($"{Pid}_rankings");
return;
}
// Load our Model
PlayerRankingsModel Model = new PlayerRankingsModel(Client);
Model.Player = Rows[0];
Model.SearchBarValue = Pid.ToString();
string value;
#region Player Rankings
// Global Score
RankingPosition Score = new RankingPosition() { RankingType = "score" };
string query = "SELECT COUNT(id) FROM player WHERE score > @P0";
Score.Value = Model.FormatInteger(Int32.Parse(Model.Player["score"].ToString()));
Score.Position = Database.ExecuteScalar<int>(query, Model.Player["score"]) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P1", Model.Player["score"], Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Score Per Min
Score = new RankingPosition() { RankingType = "spm" };
query = "SELECT score / (time / 60.0) AS spm FROM player WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND(score / (time / 60.0), 8) AS spm FROM player WHERE spm > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P0", Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Win-Loss Ratio
Score = new RankingPosition() { RankingType = "wlr" };
query = "SELECT (wins * 1.0 / losses) AS wlr FROM player WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND(wins * 1.0 / losses, 8) AS wlr FROM player WHERE wlr > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P0", Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// K/D Ratio
Score = new RankingPosition() { RankingType = "kdr" };
query = "SELECT (kills * 1.0 / deaths) AS value FROM player WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND(kills * 1.0 / deaths, 8) AS value FROM player WHERE value > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P0", Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Knife Ratio
Score = new RankingPosition() { RankingType = "knife_kdr" };
query = "SELECT (knifekills * 1.0 / knifedeaths) AS value FROM weapons WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND(knifekills * 1.0 / knifedeaths, 8) AS value FROM weapons WHERE value > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
query = "SELECT COUNT(w.id), ROUND(w.knifekills * 1.0 / w.knifedeaths, 8) AS value "
+ "FROM weapons AS w "
+ "JOIN player AS p "
+ "WHERE p.id = w.id AND p.country=@P0 AND value > " + Score.Value;
Score.CtrPosition = Database.ExecuteScalar<int>(query, Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Sniper Accuracy
Score = new RankingPosition() { RankingType = "sniper_acc" };
query = "SELECT (hit4 * 1.0 / fired4) AS value FROM weapons WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND(hit4 * 1.0 / fired4, 8) AS value FROM weapons WHERE value > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
query = "SELECT COUNT(w.id), ROUND(w.hit4 * 1.0 / w.fired4, 8) AS value "
+ "FROM weapons AS w "
+ "JOIN player AS p "
+ "WHERE p.id = w.id AND p.country=@P0 AND value > " + Score.Value;
Score.CtrPosition = Database.ExecuteScalar<int>(query, Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Hours Per Day
// Timeframe: ((Last Online timstamp - Joined Timestamp) / 1 day (86400 seconds)) Gets the timespan of days played
// Divide Timeframe by: hours played (seconds played (`time` column) / 1 hr (3600 seconds))
Score = new RankingPosition() { RankingType = "hpd" };
query = "SELECT (time / 3600.0) / ((lastonline - joined) / 86400.0) AS value FROM player WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), ROUND((time / 3600.0) / ((lastonline - joined) / 86400.0), 8) AS value FROM player WHERE value > " + value;
Rows = Database.Query(query);
Score.Position = Database.ExecuteScalar<int>(query) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P0", Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Command Score
Score = new RankingPosition() { RankingType = "command" };
query = "SELECT COUNT(id) FROM player WHERE cmdscore > @P0";
Score.Value = Model.FormatInteger(Int32.Parse(Model.Player["cmdscore"].ToString()));
Score.Position = Database.ExecuteScalar<int>(query, Model.Player["cmdscore"]) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P1", Model.Player["cmdscore"], Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
// Relative Command Score
Score = new RankingPosition() { RankingType = "rcmds" };
query = "SELECT COALESCE((cmdscore * 1.0 / cmdtime), 0.0) AS value FROM player WHERE id=@P0";
try
{
value = Database.ExecuteScalar<string>(query, Pid);
Score.Value = Math.Round(Decimal.Parse(value, CultureInfo.InvariantCulture), 4);
}
catch
{
value = "0.000";
Score.Value = 0.0000m;
}
query = "SELECT COUNT(id), COALESCE((cmdscore * 1.0 / cmdtime), 0.0) AS value FROM player WHERE value > " + value;
Score.Position = Database.ExecuteScalar<int>(query) + 1;
Score.CtrPosition = Database.ExecuteScalar<int>(query + " AND country=@P0", Model.Player["country"]) + 1;
Score.PageNumber = GetPage(Score.Position);
Score.CtrPageNumber = GetPage(Score.CtrPosition);
Model.Rankings.Add(Score);
#endregion
#region Player Stats
// Define our play time
TimeSpan PlayerTime = TimeSpan.FromSeconds(Int32.Parse(Model.Player["time"].ToString()));
int Kills = Int32.Parse(Model.Player["kills"].ToString());
int Deaths = Int32.Parse(Model.Player["deaths"].ToString());
int Rounds = Int32.Parse(Model.Player["wins"].ToString()) + Int32.Parse(Model.Player["losses"].ToString());
decimal Result;
// Player Stats
foreach (string Query in StatsQueries)
{
PlayerRankingStats Stats = new PlayerRankingStats();
Result = Database.ExecuteScalar<decimal>(Query, Pid);
Stats.PerMinute = (PlayerTime.TotalMinutes > 0) ? Math.Round(Result / (decimal)PlayerTime.TotalMinutes, 4) : Result;
Stats.PerDay = (PlayerTime.TotalDays > 0) ? Math.Round(Result / (decimal)PlayerTime.TotalDays, 4) : Result;
Stats.PerHour = (PlayerTime.TotalHours > 0) ? Math.Round(Result / (decimal)PlayerTime.TotalHours, 4) : Result;
Stats.PerRound = (Rounds > 0) ? Math.Round(Result / Rounds, 4) : Result;
Stats.PerKill = (Kills > 0) ? Math.Round(Result / Kills, 4) : Result;
Stats.PerDeath = (Deaths > 0) ? Math.Round(Result / Deaths, 4) : Result;
Model.Stats.Add(Stats);
}
#endregion
// Send the response
base.SendTemplateResponse("player_rankings", typeof(PlayerRankingsModel), Model, Pid + "_rankings");
}