private void ShowRankingType(MvcRoute Route)
{
// Create our model
RankingsTypeModel Model = new RankingsTypeModel(Client);
Model.UrlName = Route.Action;
string CacheName = $"rankings_{Route.Action}_1";
// Parse our country and page filters based on URL
// Url formats:
// - scoreType/country/pageNumber
// - scoreType/pageNumber
if (Route.Params.Length == 1)
{
if (Int32.TryParse(Route.Params[0], out Model.CurrentPage))
{
// Just a page number provided
CacheName = $"rankings_{Route.Action}_{Model.CurrentPage}";
}
else if (Route.Params[0].Length == 2)
{
// Just a country code provided, default to page 1
Model.Country = Route.Params[0];
CacheName = $"rankings_{Route.Action}_{Model.Country}_1";
}
}
else if (Route.Params.Length == 2 && Int32.TryParse(Route.Params[1], out Model.CurrentPage))
{
if (Route.Params[0].Length == 2) // Check valid country code
{
Model.Country = Route.Params[0];
CacheName = $"rankings_{Route.Action}_{Model.Country}_{Model.CurrentPage}";
}
else
CacheName = $"rankings_{Route.Action}_{Model.CurrentPage}";
}
// Check the cache file
if (!base.CacheFileExpired(CacheName, 30))
{
base.SendCachedResponse(CacheName);
return;
}
// NOTE: The HttpServer will handle the DbConnectException
using (StatsDatabase Database = new StatsDatabase())
{
// Get our DISTINCT country list from our player pool
SelectQueryBuilder builder = new SelectQueryBuilder(Database);
builder.SelectColumn("country");
builder.Distinct = true;
builder.SelectFromTable("player");
builder.AddWhere("country", Comparison.NotEqualTo, "xx");
foreach (var Row in builder.ExecuteQuery())
Model.CountryList.Add(Row["country"].ToString());
// Start building our player query
builder = new SelectQueryBuilder(Database);
builder.SelectCount();
builder.SelectFromTable("player");
WhereClause Where = builder.AddWhere("score", Comparison.GreaterOrEquals, 1);
// Add country filter
if (Model.Country.Length == 2)
Where.AddClause(LogicOperator.And, "country", Comparison.Equals, Model.Country);
// Hpd additional Where
if (Route.Action.Equals("hpd", StringComparison.InvariantCultureIgnoreCase))
Where.AddClause(LogicOperator.And, "time", Comparison.GreaterOrEquals, 3600);
// Get our total records
Model.TotalRecords = builder.ExecuteScalar<int>();
Model.TotalPages = 1 + (Model.TotalRecords / PlayersPerPage);
Model.ScoreHeader = GetHeaderName(Route.Action);
// Now, Build Query that will select the players, not just the count
bool isDecimal = false;
FinishQuery(Route.Action, builder, out isDecimal);
// Get our players, limiting to 50 and starting by page
builder.Limit(PlayersPerPage, (Model.CurrentPage * PlayersPerPage) - PlayersPerPage);
var Rows = builder.ExecuteQuery();
// Initialize records based on records returned from Database
Model.Records = new List<RankingsTypeModel.PlayerRow>(Rows.Count);
foreach (Dictionary<string, object> Player in Rows)
{
Model.Records.Add(new RankingsTypeModel.PlayerRow()
{
Pid = Int32.Parse(Player["pid"].ToString()),
Name = Player["name"].ToString(),
Rank = Int32.Parse(Player["rank"].ToString()),
Country = Player["country"].ToString(),
Time = Int32.Parse(Player["time"].ToString()),
ScorePerMin = Double.Parse(Player["spm"].ToString()),
KillDeathRatio = Double.Parse(Player["kdr"].ToString()),
WinLossRatio = Double.Parse(Player["wlr"].ToString()),
ScoreValue = (isDecimal)
? String.Format(CultureInfo.InvariantCulture, "{0:n4}", Player["value"])
: String.Format(CultureInfo.InvariantCulture, "{0:n0}", Player["value"])
});
}
}
// Send response
base.SendTemplateResponse("rankings_type", typeof(RankingsTypeModel), Model, CacheName);
}